Compare commits

...

2 Commits

Author SHA1 Message Date
luojian f987784ac7 自动打包 2025-10-10 20:53:00 +08:00
luojian 804a89c170 更新工程的代码 2025-09-07 22:43:06 +08:00
48 changed files with 1587 additions and 225 deletions

View File

@ -0,0 +1,22 @@
{
"repo_url": "http://192.168.0.200:3000/Faxing/Lawnchair.git",
"repo_branch": "touka-dev-new-unity",
"repo_commit": "",
"package_name": "com.diy.emoticon.free.zcaqf.game.launcher",
"game_type": "unity_native",
"version_display_name": "1.0.20",
"version_code": 20,
"string": {
"base": {
"gl_splash_title": "Wield your imagination and create your own Emoticons!",
"gl_welcome_wifi": "Drag to Merge diffrent Emoticons for a new one",
"gl_welcome_mag": "Tap and Drag to Create and Edit your own Emoticon",
"s": "Save your Emoticon to your device and share"
},
"zh": {
"gl_splash_title": "描述",
"gl_welcome_wifi": "玩法1",
"gl_welcome_mag": "玩法2"
}
}
}

View File

@ -1,6 +1,6 @@
{
"repo_url": "http://192.168.0.200:3000/Faxing/Lawnchair.git",
"repo_branch": "touka-dev-3.0",
"repo_branch": "touka-dev-new-unity",
"repo_commit": "",
"package_name": "com.emoticon.diy.znfav.launcher.free",
"game_type": "unity_native",

View File

@ -0,0 +1,21 @@
{
"repo_url": "http://192.168.0.200:3000/Faxing/Lawnchair.git",
"repo_branch": "touka-dev-new-unity",
"repo_commit": "",
"package_name": "com.fill.heart.finger.free.puzzle.launcher.lperc",
"game_type": "unity_native",
"version_display_name": "1.0.19",
"version_code": 19,
"string": {
"base": {
"gl_splash_title": "Draw to Fill the Heart and Make them Happy!",
"gl_welcome_wifi": "Drag to Draw Line",
"gl_welcome_mag": "Complete the Heart to Pass Level"
},
"zh": {
"gl_splash_title": "描述",
"gl_welcome_wifi": "玩法1",
"gl_welcome_mag": "玩法2"
}
}
}

View File

@ -0,0 +1,22 @@
{
"repo_url": "http://192.168.0.200:3000/Faxing/Lawnchair.git",
"repo_branch": "touka-dev-new-unity",
"repo_commit": "",
"package_name": "com.human.assemble.launcher.czaeg.free",
"game_type": "unity_native",
"version_display_name": "1.0.8",
"version_code": 8,
"string": {
"base": {
"gl_splash_title": "Assemble body parts, then complete hilarious challenges!",
"gl_welcome_wifi": "Select body parts to put onto torso",
"gl_welcome_mag": "Drag to control the body to defeat enemy",
"s": "Unlock more powerful or wierd body parts"
},
"zh": {
"gl_splash_title": "描述",
"gl_welcome_wifi": "玩法1",
"gl_welcome_mag": "玩法2"
}
}
}

View File

@ -0,0 +1,21 @@
{
"repo_url": "http://192.168.0.200:3000/Faxing/Lawnchair.git",
"repo_branch": "touka-dev-new-unity",
"repo_commit": "",
"package_name": "com.prank.puncher.game.free.puzzle.sgwee",
"game_type": "unity_native",
"version_display_name": "1.0.6",
"version_code": 6,
"string": {
"base": {
"gl_splash_title": "Annoyed by Pranksters? Just Punch'em!",
"gl_welcome_wifi": "Tap on pranksters to punch them",
"gl_welcome_mag": "Punch on items to find out their powers"
},
"zh": {
"gl_splash_title": "描述",
"gl_welcome_wifi": "玩法1",
"gl_welcome_mag": "玩法2"
}
}
}

View File

@ -0,0 +1,9 @@
{
"repo_url": "http://192.168.0.200:3000/Faxing/Lawnchair.git",
"repo_branch": "touka-dev-new-unity",
"repo_commit": "",
"package_name": "com.punch.prankster.puzzle.fwaes.free.launcher.fgsaw",
"game_type": "unity_native",
"version_display_name": "1.0.4",
"version_code": 4
}

View File

@ -0,0 +1,23 @@
{
"repo_url": "http://192.168.0.200:3000/Faxing/Lawnchair.git",
"repo_branch": "touka-dev-new-unity",
"repo_commit": "",
"package_name": "com.satiszen.tidy.asmr.zxffg.free.launcher",
"game_type": "unity_native",
"version_display_name": "1.0.900",
"version_code": 900,
"app_name": "Satiszen: Tidy ASMR Launcher",
"string": {
"base": {
"gl_splash_title": "An awesome way to satisfy your OCD",
"gl_welcome_wifi": "Sort and put away cluttered drawers",
"gl_welcome_mag": "Complete daily cleaning tasks",
"s": "Unlock tips and rewards"
},
"zh": {
"gl_splash_title": "描述",
"gl_welcome_wifi": "玩法1",
"gl_welcome_mag": "玩法2"
}
}
}

View File

@ -0,0 +1 @@
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

View File

@ -0,0 +1,29 @@
{
"project_info": {
"project_number": "567313628193",
"project_id": "ag188b6b33bb-eaf27-gp",
"storage_bucket": "ag188b6b33bb-eaf27-gp.firebasestorage.app"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:567313628193:android:23a2087d32d28371b57760",
"android_client_info": {
"package_name": "com.fill.heart.finger.free.puzzle.launcher.lperc"
}
},
"oauth_client": [],
"api_key": [
{
"current_key": "AIzaSyDqod-zddRoTGKl8SlnvT22-8jgzOnVGbw"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": []
}
}
}
],
"configuration_version": "1"
}

View File

@ -0,0 +1,239 @@
#=================基础配置=============================
#游戏名称
app_name=Fill Heart Finger Launcher
#包名
package_name=com.fill.heart.finger.free.puzzle.launcher.lperc
#闪屏图(&健康提示),值:图片名字,没有填"",详见需求文档(- 新增splash图 部分):https://pic6ktmsyi.feishu.cn/docs/doccnRdYblZyPN2HpIK6nsJmqSb#
splash_img=
#游戏横竖屏,根据游戏横竖屏取值 值: 0 竖屏, 1 横屏
game_screen_orientation=0
#发行主体
publish_account=GLC_003
#渠道
channel=GooglePlay
#子渠道
sub_channel=
#客户端协议上报u8 appid
tk_app_id=55759d500c6ec10cf37a57f27d03bfdc
#外部测试使用facebook id
fb_appid=
fb_client_token=
#adjust_id{}
adjust_id=y5ovnytkzk00
#巨量app id废弃
rangers_applog_id=
#发行人app id
publisher_appid=
publisher_url_scheme=
#调试模式(写死不动,仅供调试使用)
#debug_mode=false
#=================用户协议(弹窗)配置=============================
#游戏类型
TkA_Type=
#游戏题材
TkA_Theme=
#适龄,取值:8|12|16|18
TkA_Age=
#隐私政策url
TkA_Url_Privacy=https://yemgame.com/privacy.html
#用户协议url
TkA_Url_Agreement=
#数数上报地址
ss_url=https://td.yemgame.com
#中台域名
zt_url=
#=================广告通用配置=============================
#广告平台,max|topon|xiaomi
ad_platform=max
#广告appid (包括max applovin.sdk.key)
ad_appid=h1gpba13svkeiu@7d3af77b0803cbc641888cb393e8652e
#广告appkey
ad_appkey=qQ7XVQbkl0J5pGUvq0ZdvhP9RtIwVA2m0SMT_HHzFkEwFdUCovsckr27CKGLamD04hzLWq0m5Iq50E39DkhumR
#admob id
admob_id=ca-app-pub-1392995944739082~3571770572
#GoogleAnalytics跟踪ID
TRACKING_ID=504893697
#
keystore=0
#游戏软著著作人
copyright_holder=
#游戏软著登记号
copyright_id=
#开屏广告位id
ad_splash_id=@disable
ad_native_splash_id=
#插屏广告位id
ad_interstital_id=@disable
#半屏插屏广告位id(小米广告区分全/半屏)
ad_interstital_half_id=
#激励视频广告位id
ad_reward_id=@disable
ad_reward_id_review=
#banner广告位id
ad_banner_id=@disable
ad_native_banner_id=
# 原生模板广告位id [增加]
ad_templete_natvie_id=
# 原生自渲染广告位id [增加]
ad_render_native_id=@disable
#=================TW配置=============================
#[TODO][meta-data]百度 APPID
BaiduMobAd_APP_ID=
#副包下载链接
FB_DOWNLOAD_URL=
FB_POP_CONFIG_DAT_URL=
#更多游戏链接
tka_url_moregame=
#TW广告位
#SDK插屏
ad_sk_interstital_id=
#SDK开屏
ad_sk_splash_id=
#SDK信息流
ad_sk_native_id=
#SDK信息流1
ad_sk_native1_id=
#[TODO][meta-data]游戏主 Activity:
#取值 Unity游戏: com.u8.sdk.U8UnityContext
#flash游戏: com.u8.sdk.ane.U8ANEActivity
#Cocos游戏: com.u8.sdk.U8CocosActivity
MAIN_ACTIVITY=com.u8.sdk.U8UnityContext
#极光 AppKey,默认空
JPUSH_APPKEY=
#客服邮箱
tkg_custom=masiyem186@gmail.com
#ASN接口
asn_url=https://yemgame.com/land/bed
channel_appid=
channel_appkey=
channel_appsecret=
#=================Bugly=============================
Bugly_AppID=
Bugly_AppKey=
#=================YSDK实名认证=============================
#[TODO][ysdkconf.ini]腾讯AppID
OFFER_ID=
#=================Umeng配置=============================
#UM Appkey
UM_APP_KEY=
#json 参数 key
JSON_PARAM_KEY=
#[TODO][文件类型参数]默认 (在线) 参数配置
UMENG_DEFAULT_ONLINE_CONFIG=
#=================GA配置=============================
#GA AppKey
GA_KEY=
#GA AppSecret
GA_SECRETKEY=
#=================热云配置=============================
#AppKey
RN_APP_KEY=
#=================Tenjin配置=============================
#Tenjin ApiKey
TENJIN_API_KEY=PYOTVKJ4XZJHSMZW2V6GBQRCNXAFKWU2
# 数数appid
ss_app_id=703bb2a3d27e414f8bc83fc465a155f4
# 是否有登录系统
has_user_system=
# 微信appKey&appSecret
wechat_app_id=
wechat_app_secret=
#==============亚马逊配置============
AmazonAppId=
AmazonMRECSlotID=
AmazonBannerSlotID=
AmazonLeaderSlotID=
AmazonInterSlotID=
AmazonVideoSlotID=
# Topon插屏
AD_Inter = n1gpba13ube660
# Topon激励视频
AD_Reward = n1gpba13umi2km
# Admob聚合应用ID
Admob_APP_ID = ca-app-pub-1392995944739082~3571770572
# Admob聚合插屏广告单元ID
Admob_IV_ID = ca-app-pub-1392995944739082/3906866392
# Admob聚合激励广告单元ID
Admob_RV_ID = ca-app-pub-1392995944739082/9482626702
# Admob聚合信息流广告单元ID
Admob_NATIVE_ID = ca-app-pub-1392995944739082/8009762936
# 全屏Native
Admob_FULL_NATIVE_ID = ca-app-pub-1392995944739082/9989839261
# 小型广告
ADMOB_SMALL_NATIVE_ID = ca-app-pub-1392995944739082/3065338262
# pangle 聚合APP ID
Pangle_APP_ID = 8712016
# pangle 插屏
Pangle_IV_ID = 982340388
# pangle 激励
Pangle_RV_ID = 982340379
#=========路由配置=================
# Debug IAP日志上报
TF_IAP_REPORT_TMP=https://fds.fnpserver.com/hkoc/report/iaptm
# IAP上报&支付二次认证
TF_IAP_REPORT=https://fds.fnpserver.com/hkoc/report/iap
# 用户绑定
TF_USER_BIND=https://fds.fnpserver.com/hkoc/user/bind
# 云存储详情
TF_USER_PROGRESS_DETAIL=https://fds.fnpserver.com/hkoc/thd/usprogress/detail
# 用户更新
TF_USER_UPDATE=https://fds.fnpserver.com/hkoc/user/update
# 敏感词审核
TF_USER_CENSOR_TEXT=https://fds.fnpserver.com/hkoc/user/censor-text
# 国内省份列表
TF_USER_CN_PROVINCE_LIST=https://fds.fnpserver.com/hkoc/cn/app/provinces
# 国家列表
TF_USER_COUNTRY_LIST=https://fds.fnpserver.com/hkoc/app/countries
# 排行榜用户
TF_USER_RANKING_USER=https://fds.fnpserver.com/hkoc/user/ranking-user
# Google翻译
TF_USER_GOOGLE_TRANSLATE=https://fds.fnpserver.com/hkoc/user/translate
# 归因数据中台
TRACK_EVENT_LOG=https://pu.fnpserver.com/log/event
# 云存储保存
TF_USER_PROGRESS_SAVE=https://fds.fnpserver.com/hkoc/thd/usprogress/save
# 用户详情
TF_USER_DETAIL=https://fds.fnpserver.com/hkoc/user/detail
# 积分上报
TF_USER_SCORE_REPORT=https://fds.fnpserver.com/hkoc/user/score-report
# 用户登录
TF_USER_LOGIN=https://fds.fnpserver.com/hkoc/user/login
# 用户删除
TF_USER_DEL=https://fds.fnpserver.com/hkoc/user/delete
# 排行榜区域
TF_USER_RANKING_AREA=https://fds.fnpserver.com/hkoc/user/ranking-area

View File

@ -0,0 +1,122 @@
#=================基础配置=============================
#游戏名称
app_name=Fill Heart Finger Launcher
#包名
package_name=com.fill.heart.finger.free.puzzle.launcher.lperc
#发行主体
publish_account=GLC_003
#渠道
channel=GooglePlay
#隐私政策
TkA_Url_Privacy=https://yemgame.com/privacy.html
#数数上报地址
ss_url=https://td.yemgame.com
#中台域名
zt_url=
#=========归因统计=================
#Adjust
adjust_id=y5ovnytkzk00
#GoogleAnalytics跟踪ID
TRACKING_ID=504893697
#=========广告配置=================
#广告平台,max|topon|xiaomi
ad_platform=max
#广告appid (包括max applovin.sdk.key)
ad_appid=h1gpba13svkeiu@7d3af77b0803cbc641888cb393e8652e
#广告appkey
ad_appkey=qQ7XVQbkl0J5pGUvq0ZdvhP9RtIwVA2m0SMT_HHzFkEwFdUCovsckr27CKGLamD04hzLWq0m5Iq50E39DkhumR
#admob id
admob_id=ca-app-pub-1392995944739082~3571770572
#开屏广告位id
ad_splash_id=@disable
#插屏广告位id
ad_interstital_id=@disable
#激励视频广告位id
ad_reward_id=@disable
ad_reward_id_review=
#banner广告位id
ad_banner_id=@disable
# 原生模板广告位id
ad_templete_natvie_id=
# 原生自渲染广告位id
ad_render_native_id=@disable
# 数数appid
ss_app_id=703bb2a3d27e414f8bc83fc465a155f4
# 是否有登录系统
has_user_system=
# 微信appKey&appSecret
wechat_app_id=
wechat_app_secret=
#客服邮箱
tkg_custom=masiyem186@gmail.com
#ASN接口
asn_url=https://yemgame.com/land/bed
# Topon插屏
AD_Inter = n1gpba13ube660
# Topon激励视频
AD_Reward = n1gpba13umi2km
# Admob聚合应用ID
Admob_APP_ID = ca-app-pub-1392995944739082~3571770572
# Admob聚合插屏广告单元ID
Admob_IV_ID = ca-app-pub-1392995944739082/3906866392
# Admob聚合激励广告单元ID
Admob_RV_ID = ca-app-pub-1392995944739082/9482626702
# Admob聚合信息流广告单元ID
Admob_NATIVE_ID = ca-app-pub-1392995944739082/8009762936
# 全屏Native
Admob_FULL_NATIVE_ID = ca-app-pub-1392995944739082/9989839261
# 小型广告
ADMOB_SMALL_NATIVE_ID = ca-app-pub-1392995944739082/3065338262
# pangle 聚合APP ID
Pangle_APP_ID = 8712016
# pangle 插屏
Pangle_IV_ID = 982340388
# pangle 激励
Pangle_RV_ID = 982340379
#=========路由配置=================
# Debug IAP日志上报
TF_IAP_REPORT_TMP=https://fds.fnpserver.com/hkoc/report/iaptm
# IAP上报&支付二次认证
TF_IAP_REPORT=https://fds.fnpserver.com/hkoc/report/iap
# 用户绑定
TF_USER_BIND=https://fds.fnpserver.com/hkoc/user/bind
# 云存储详情
TF_USER_PROGRESS_DETAIL=https://fds.fnpserver.com/hkoc/thd/usprogress/detail
# 用户更新
TF_USER_UPDATE=https://fds.fnpserver.com/hkoc/user/update
# 敏感词审核
TF_USER_CENSOR_TEXT=https://fds.fnpserver.com/hkoc/user/censor-text
# 国内省份列表
TF_USER_CN_PROVINCE_LIST=https://fds.fnpserver.com/hkoc/cn/app/provinces
# 国家列表
TF_USER_COUNTRY_LIST=https://fds.fnpserver.com/hkoc/app/countries
# 排行榜用户
TF_USER_RANKING_USER=https://fds.fnpserver.com/hkoc/user/ranking-user
# Google翻译
TF_USER_GOOGLE_TRANSLATE=https://fds.fnpserver.com/hkoc/user/translate
# 归因数据中台
TRACK_EVENT_LOG=https://pu.fnpserver.com/log/event
# 云存储保存
TF_USER_PROGRESS_SAVE=https://fds.fnpserver.com/hkoc/thd/usprogress/save
# 用户详情
TF_USER_DETAIL=https://fds.fnpserver.com/hkoc/user/detail
# 积分上报
TF_USER_SCORE_REPORT=https://fds.fnpserver.com/hkoc/user/score-report
# 用户登录
TF_USER_LOGIN=https://fds.fnpserver.com/hkoc/user/login
# 用户删除
TF_USER_DEL=https://fds.fnpserver.com/hkoc/user/delete
# 排行榜区域
TF_USER_RANKING_AREA=https://fds.fnpserver.com/hkoc/user/ranking-area

View File

@ -0,0 +1 @@
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

View File

@ -0,0 +1,29 @@
{
"project_info": {
"project_number": "826703137242",
"project_id": "ageebe4c560e-1a6c4-gp",
"storage_bucket": "ageebe4c560e-1a6c4-gp.firebasestorage.app"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:826703137242:android:f8f0029b71b7915a05d8e3",
"android_client_info": {
"package_name": "com.satiszen.tidy.asmr.zxffg.free.launcher"
}
},
"oauth_client": [],
"api_key": [
{
"current_key": "AIzaSyCpi7dbmXK06gepr45uxfS793r03u8v0_s"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": []
}
}
}
],
"configuration_version": "1"
}

View File

@ -0,0 +1,241 @@
#=================基础配置=============================
#游戏名称
app_name=Satiszen Tidy ASMR Launcher
#包名
package_name=com.satiszen.tidy.asmr.zxffg.free.launcher
#闪屏图(&健康提示),值:图片名字,没有填"",详见需求文档(- 新增splash图 部分):https://pic6ktmsyi.feishu.cn/docs/doccnRdYblZyPN2HpIK6nsJmqSb#
splash_img=
#游戏横竖屏,根据游戏横竖屏取值 值: 0 竖屏, 1 横屏
game_screen_orientation=0
#发行主体
publish_account=GLC_004
#渠道
channel=GooglePlay
#子渠道
sub_channel=
#客户端协议上报u8 appid
tk_app_id=788dc6532930a7cc71ac2fb4966bc03c
#外部测试使用facebook id
fb_appid=
fb_client_token=
#adjust_id{}
adjust_id=sn8qbtk0tdz4
#巨量app id废弃
rangers_applog_id=
#发行人app id
publisher_appid=
publisher_url_scheme=
#调试模式(写死不动,仅供调试使用)
#debug_mode=false
#=================用户协议(弹窗)配置=============================
#游戏类型
TkA_Type=
#游戏题材
TkA_Theme=
#适龄,取值:8|12|16|18
TkA_Age=
#隐私政策url
TkA_Url_Privacy=https://manlemonzi.com/privacy.html
#用户协议url
TkA_Url_Agreement=
#数数上报地址
ss_url=https://slax.manlemonzi.com
#中台域名
zt_url=
#=================广告通用配置=============================
#广告平台,max|topon|xiaomi
ad_platform=max
#广告appid (包括max applovin.sdk.key)
ad_appid=h1gours48c2kom@7d3af77b0803cbc641888cb393e8652e
#广告appkey
ad_appkey=qQ7XVQbkl0J5pGUvq0ZdvhP9RtIwVA2m0SMT_HHzFkEwFdUCovsckr27CKGLamD04hzLWq0m5Iq50E39DkhumR
#admob id
admob_id=ca-app-pub-1392995944739082~2222357431
#GoogleAnalytics跟踪ID
TRACKING_ID=504463995
#
keystore=0
#游戏软著著作人
copyright_holder=
#游戏软著登记号
copyright_id=
#开屏广告位id
ad_splash_id=@disable
ad_native_splash_id=
#插屏广告位id
ad_interstital_id=@disable
#半屏插屏广告位id(小米广告区分全/半屏)
ad_interstital_half_id=
#激励视频广告位id
ad_reward_id=@disable
ad_reward_id_review=
#banner广告位id
ad_banner_id=@disable
ad_native_banner_id=
# 原生模板广告位id [增加]
ad_templete_natvie_id=
# 原生自渲染广告位id [增加]
ad_render_native_id=@disable
#=================TW配置=============================
#[TODO][meta-data]百度 APPID
BaiduMobAd_APP_ID=
#副包下载链接
FB_DOWNLOAD_URL=
FB_POP_CONFIG_DAT_URL=
#更多游戏链接
tka_url_moregame=
#TW广告位
#SDK插屏
ad_sk_interstital_id=
#SDK开屏
ad_sk_splash_id=
#SDK信息流
ad_sk_native_id=
#SDK信息流1
ad_sk_native1_id=
#[TODO][meta-data]游戏主 Activity:
#取值 Unity游戏: com.u8.sdk.U8UnityContext
#flash游戏: com.u8.sdk.ane.U8ANEActivity
#Cocos游戏: com.u8.sdk.U8CocosActivity
MAIN_ACTIVITY=com.u8.sdk.U8UnityContext
#极光 AppKey,默认空
JPUSH_APPKEY=
#客服邮箱
tkg_custom=Ngngocman2014@gmail.com
#ASN接口
asn_url=https://satiszen.manlemonzi.com/where/most/low
channel_appid=
channel_appkey=
channel_appsecret=
#=================Bugly=============================
Bugly_AppID=
Bugly_AppKey=
#=================YSDK实名认证=============================
#[TODO][ysdkconf.ini]腾讯AppID
OFFER_ID=
#=================Umeng配置=============================
#UM Appkey
UM_APP_KEY=
#json 参数 key
JSON_PARAM_KEY=
#[TODO][文件类型参数]默认 (在线) 参数配置
UMENG_DEFAULT_ONLINE_CONFIG=
#=================GA配置=============================
#GA AppKey
GA_KEY=
#GA AppSecret
GA_SECRETKEY=
#=================热云配置=============================
#AppKey
RN_APP_KEY=
#=================Tenjin配置=============================
#Tenjin ApiKey
TENJIN_API_KEY=PYOTVKJ4XZJHSMZW2V6GBQRCNXAFKWU2
# 数数appid
ss_app_id=0de04c9d796544bfa9a3ec9facce401a
# 是否有登录系统
has_user_system=
# 微信appKey&appSecret
wechat_app_id=
wechat_app_secret=
#==============亚马逊配置============
AmazonAppId=
AmazonMRECSlotID=
AmazonBannerSlotID=
AmazonLeaderSlotID=
AmazonInterSlotID=
AmazonVideoSlotID=
# Topon插屏
AD_Inter = n1gours4c244vg
# Topon激励视频
AD_Reward = n1gours4cj2nr3
# Admob聚合应用ID
Admob_APP_ID = ca-app-pub-1392995944739082~2222357431
# Admob聚合插屏广告单元ID
Admob_IV_ID = ca-app-pub-1392995944739082/9004260342
# Admob聚合激励广告单元ID
Admob_RV_ID = ca-app-pub-1392995944739082/2438851996
# Admob聚合传统Banner广告单元ID
Admob_Banner_ID2 = ca-app-pub-1392995944739082/5232536293
# Admob聚合信息流广告单元ID
Admob_NATIVE_ID = ca-app-pub-1392995944739082/2606372952
# 全屏Native
Admob_FULL_NATIVE_ID = ca-app-pub-1392995944739082/2550548540
# 小型广告
ADMOB_SMALL_NATIVE_ID = ca-app-pub-1392995944739082/7667127940
# pangle 聚合APP ID
Pangle_APP_ID = 8710327
# pangle 插屏
Pangle_IV_ID = 982328672
# pangle 激励
Pangle_RV_ID = 982328696
#=========路由配置=================
# Debug IAP日志上报
TF_IAP_REPORT_TMP=https://fds.fnpserver.com/hkoc/report/iaptm
# 用户删除
TF_USER_DEL=https://fds.fnpserver.com/hkoc/user/delete
# 用户绑定
TF_USER_BIND=https://fds.fnpserver.com/hkoc/user/bind
# 云存储保存
TF_USER_PROGRESS_SAVE=https://fds.fnpserver.com/hkoc/thd/usprogress/save
# 用户更新
TF_USER_UPDATE=https://fds.fnpserver.com/hkoc/user/update
# 积分上报
TF_USER_SCORE_REPORT=https://fds.fnpserver.com/hkoc/user/score-report
# 敏感词审核
TF_USER_CENSOR_TEXT=https://fds.fnpserver.com/hkoc/user/censor-text
# 用户登录
TF_USER_LOGIN=https://fds.fnpserver.com/hkoc/user/login
# 用户详情
TF_USER_DETAIL=https://fds.fnpserver.com/hkoc/user/detail
# 国内省份列表
TF_USER_CN_PROVINCE_LIST=https://fds.fnpserver.com/hkoc/cn/app/provinces
# 排行榜用户
TF_USER_RANKING_USER=https://fds.fnpserver.com/hkoc/user/ranking-user
# Google翻译
TF_USER_GOOGLE_TRANSLATE=https://fds.fnpserver.com/hkoc/user/translate
# 归因数据中台
TRACK_EVENT_LOG=https://pu.fnpserver.com/log/event
# IAP上报&支付二次认证
TF_IAP_REPORT=https://fds.fnpserver.com/hkoc/report/iap
# 云存储详情
TF_USER_PROGRESS_DETAIL=https://fds.fnpserver.com/hkoc/thd/usprogress/detail
# 国家列表
TF_USER_COUNTRY_LIST=https://fds.fnpserver.com/hkoc/app/countries
# 排行榜区域
TF_USER_RANKING_AREA=https://fds.fnpserver.com/hkoc/user/ranking-area

View File

@ -0,0 +1,124 @@
#=================基础配置=============================
#游戏名称
app_name=Satiszen Tidy ASMR Launcher
#包名
package_name=com.satiszen.tidy.asmr.zxffg.free.launcher
#发行主体
publish_account=GLC_004
#渠道
channel=GooglePlay
#隐私政策
TkA_Url_Privacy=https://manlemonzi.com/privacy.html
#数数上报地址
ss_url=https://slax.manlemonzi.com
#中台域名
zt_url=
#=========归因统计=================
#Adjust
adjust_id=sn8qbtk0tdz4
#GoogleAnalytics跟踪ID
TRACKING_ID=504463995
#=========广告配置=================
#广告平台,max|topon|xiaomi
ad_platform=max
#广告appid (包括max applovin.sdk.key)
ad_appid=h1gours48c2kom@7d3af77b0803cbc641888cb393e8652e
#广告appkey
ad_appkey=qQ7XVQbkl0J5pGUvq0ZdvhP9RtIwVA2m0SMT_HHzFkEwFdUCovsckr27CKGLamD04hzLWq0m5Iq50E39DkhumR
#admob id
admob_id=ca-app-pub-1392995944739082~2222357431
#开屏广告位id
ad_splash_id=@disable
#插屏广告位id
ad_interstital_id=@disable
#激励视频广告位id
ad_reward_id=@disable
ad_reward_id_review=
#banner广告位id
ad_banner_id=@disable
# 原生模板广告位id
ad_templete_natvie_id=
# 原生自渲染广告位id
ad_render_native_id=@disable
# 数数appid
ss_app_id=0de04c9d796544bfa9a3ec9facce401a
# 是否有登录系统
has_user_system=
# 微信appKey&appSecret
wechat_app_id=
wechat_app_secret=
#客服邮箱
tkg_custom=Ngngocman2014@gmail.com
#ASN接口
asn_url=https://satiszen.manlemonzi.com/where/most/low
# Topon插屏
AD_Inter = n1gours4c244vg
# Topon激励视频
AD_Reward = n1gours4cj2nr3
# Admob聚合应用ID
Admob_APP_ID = ca-app-pub-1392995944739082~2222357431
# Admob聚合插屏广告单元ID
Admob_IV_ID = ca-app-pub-1392995944739082/9004260342
# Admob聚合激励广告单元ID
Admob_RV_ID = ca-app-pub-1392995944739082/2438851996
# Admob聚合传统Banner广告单元ID
Admob_Banner_ID2 = ca-app-pub-1392995944739082/5232536293
# Admob聚合信息流广告单元ID
Admob_NATIVE_ID = ca-app-pub-1392995944739082/2606372952
# 全屏Native
Admob_FULL_NATIVE_ID = ca-app-pub-1392995944739082/2550548540
# 小型广告
ADMOB_SMALL_NATIVE_ID = ca-app-pub-1392995944739082/7667127940
# pangle 聚合APP ID
Pangle_APP_ID = 8710327
# pangle 插屏
Pangle_IV_ID = 982328672
# pangle 激励
Pangle_RV_ID = 982328696
#=========路由配置=================
# Debug IAP日志上报
TF_IAP_REPORT_TMP=https://fds.fnpserver.com/hkoc/report/iaptm
# 用户删除
TF_USER_DEL=https://fds.fnpserver.com/hkoc/user/delete
# 用户绑定
TF_USER_BIND=https://fds.fnpserver.com/hkoc/user/bind
# 云存储保存
TF_USER_PROGRESS_SAVE=https://fds.fnpserver.com/hkoc/thd/usprogress/save
# 用户更新
TF_USER_UPDATE=https://fds.fnpserver.com/hkoc/user/update
# 积分上报
TF_USER_SCORE_REPORT=https://fds.fnpserver.com/hkoc/user/score-report
# 敏感词审核
TF_USER_CENSOR_TEXT=https://fds.fnpserver.com/hkoc/user/censor-text
# 用户登录
TF_USER_LOGIN=https://fds.fnpserver.com/hkoc/user/login
# 用户详情
TF_USER_DETAIL=https://fds.fnpserver.com/hkoc/user/detail
# 国内省份列表
TF_USER_CN_PROVINCE_LIST=https://fds.fnpserver.com/hkoc/cn/app/provinces
# 排行榜用户
TF_USER_RANKING_USER=https://fds.fnpserver.com/hkoc/user/ranking-user
# Google翻译
TF_USER_GOOGLE_TRANSLATE=https://fds.fnpserver.com/hkoc/user/translate
# 归因数据中台
TRACK_EVENT_LOG=https://pu.fnpserver.com/log/event
# IAP上报&支付二次认证
TF_IAP_REPORT=https://fds.fnpserver.com/hkoc/report/iap
# 云存储详情
TF_USER_PROGRESS_DETAIL=https://fds.fnpserver.com/hkoc/thd/usprogress/detail
# 国家列表
TF_USER_COUNTRY_LIST=https://fds.fnpserver.com/hkoc/app/countries
# 排行榜区域
TF_USER_RANKING_AREA=https://fds.fnpserver.com/hkoc/user/ranking-area

View File

@ -1,13 +1,15 @@
from .context import Context
from .project_build import ProjectBuild
from .project_copy import ProjectCopy
from .project_end import ProjectEnd
from .project_init import ProjectInit
from .project_proguard import ProjectProguard
from .project_update import ProjectUpdate
from .project_upload import ProjectUpload
from utils.logger_utils import app_logger
from context import Context
from project_build import ProjectBuild
from project_copy import ProjectCopy
from project_end import ProjectEnd
from project_init import ProjectInit
from project_interface import ProjectInterface
from project_proguard import ProjectProguard
from project_res_md5 import ProjectResMd5
from project_res_string import ProjectResString
from project_update import ProjectUpdate
from project_upload import ProjectUpload
def run(context: Context):
@ -15,7 +17,10 @@ def run(context: Context):
tasks = [
ProjectInit(context),
ProjectCopy(context),
ProjectResMd5(context),
ProjectUpdate(context),
ProjectResString(context),
ProjectInterface(context),
ProjectProguard(context),
ProjectBuild(context),
ProjectUpload(context),

View File

@ -11,6 +11,10 @@ class Context:
game_type: str = ""
proguard_key = {}
app_name: str = ""
original_package: str = "com.drop.meme.merge.game.fsaew.puzzle"
project_original_path: str = "project/original"
temp_project_path: str = ""
@ -36,7 +40,9 @@ class Context:
out_release_apk: str = ""
out_release_aab: str = ""
proguard_dict: dict = None
proguard_dict = {}
string: dict = None
@classmethod
def from_json(cls, json_str: str):
@ -49,4 +55,6 @@ class Context:
return self.config.get(key, default_value).replace(" ", " ")
def get_app_name(self):
if self.app_name:
return self.app_name
return self.get_config("app_name")

View File

@ -1,5 +1,5 @@
from scripts.task import Task
from utils import FileUtils, TimeUtils
from utils import FileUtils
from utils.logger_utils import app_logger
@ -12,8 +12,6 @@ class ProjectCopy(Task):
pass
def init(self):
self.context.temp_project_path = self.context.project_original_path.replace(
"original", self.context.package_name.replace(".", "_") + TimeUtils.get_formatted_time(format_str="%H%M%S")
)
self.context.temp_project_path = self.context.project_original_path
pass

View File

@ -0,0 +1,127 @@
from scripts.task import Task
import re
import os
import hashlib
from utils import FileUtils
def string_to_md5(text):
# 将字符串编码为UTF-8字节
text_bytes = text.encode('utf-8')
# 创建MD5哈希对象并更新字节数据
md5_hash = hashlib.md5(text_bytes)
# 返回十六进制哈希字符串
return md5_hash.hexdigest()
class ProjectInterface(Task):
def __init__(self, context):
super().__init__(context)
self.target_code_package_name = ""
self.unity_proxy_api_file = ""
self.i_android_callback_unity_file = ""
self.target_unity_proxy_api_file = ""
self.target_i_android_callback_unity_file = ""
def generate_encryption_key(self, key: str, s_len: int = -1) -> str:
# if game_editor == "Cocos":
# return key
handle_key = self.context.package_name + key + self.context.package_name
processed_key = string_to_md5(handle_key)
while processed_key[0].isdigit():
processed_key = processed_key[1:] # 移除首字符
# 计算目标长度
if s_len > 0:
target_length = s_len
else:
target_length = len(key)
# 取前N位根据原始key长度不足则全部保留
# 如果处理后的key为空极小概率则返回空字符串
proguard_value = processed_key[:target_length] if processed_key else ""
self.context.proguard_key[key] = proguard_value
return proguard_value
def handle_common_proguard_game_mapping(self, path: str):
pattern = re.compile(r'const val (\w+) = "([^"]+)"')
lines = open(path, 'r', encoding='utf-8').readlines()
with (open(path, 'w', encoding='utf-8') as f_out):
for line in lines:
match = pattern.match(line.strip())
# print(line, match)
if match:
# 提取变量名和原始值
var_name, original_value = match.groups()
# 生成MD5并替换
encrypted_value = self.generate_encryption_key(original_value)
new_line = f'const val {var_name} = "{encrypted_value}"\n'
f_out.write(new_line)
else:
# 保留非匹配行
f_out.write(line)
def execute(self):
self.unity_proxy_api_file = os.path.join(self.context.temp_project_path,
"launcher-game/src/com/game/hachisdk/unity/UnityProxyApi.java".replace(
"/", os.sep))
self.i_android_callback_unity_file = os.path.join(self.context.temp_project_path,
"launcher-game/src/com/game/hachisdk/unity/IAndroidCallbackUnity.java".replace(
"/", os.sep))
self.target_code_package_name = self.context.package_name + "." + self.generate_encryption_key(
self.context.package_name, len(self.context.package_name.split('.')[-1]))
self.handle_common_proguard_game_mapping(
os.path.join(self.context.temp_project_path,
"launcher-game/src/com/game/hachisdk/game/ApiKeys.kt".replace("/", os.sep)))
self.handle_common_proguard_game_mapping(
os.path.join(self.context.temp_project_path,
"launcher-game/src/com/game/hachisdk/game/RespKeys.kt".replace("/", os.sep)))
self.handle_common_proguard_game_mapping(
os.path.join(self.context.temp_project_path,
"launcher-game/src/com/game/launcher/GLMaping.kt".replace("/", os.sep)))
target_unity_proxy_api_class = self.target_code_package_name + "." + self.generate_encryption_key(
"UnityProxyApi")
target_android_callback_unity_class = self.target_code_package_name + "." + self.generate_encryption_key(
"IAndroidCallbackUnity")
self.target_unity_proxy_api_file = os.path.join(self.context.temp_project_path, "launcher-game", "src",
target_unity_proxy_api_class.replace(".", os.sep) + ".java")
FileUtils.move(self.unity_proxy_api_file, self.target_unity_proxy_api_file)
self.target_i_android_callback_unity_file = os.path.join(self.context.temp_project_path, "launcher-game", "src",
target_android_callback_unity_class.replace(".",
os.sep) + ".java")
FileUtils.move(self.i_android_callback_unity_file, self.target_i_android_callback_unity_file)
text = open(self.target_unity_proxy_api_file, "r", encoding="utf-8").read()
text = text.replace("com.game.hachisdk.unity", self.target_code_package_name)
text = text.replace("UnityProxyApi", self.generate_encryption_key("UnityProxyApi"))
text = text.replace("proxyApi", self.generate_encryption_key("proxyApi"))
text = text.replace("initCallback", self.generate_encryption_key("initCallback"))
text = text.replace("IAndroidCallbackUnity", self.generate_encryption_key("IAndroidCallbackUnity"))
text = text.replace("callback", self.generate_encryption_key("callback"))
open(self.target_unity_proxy_api_file, "w", encoding="utf-8").write(text)
text = open(self.target_i_android_callback_unity_file, "r", encoding="utf-8").read()
text = text.replace("com.game.hachisdk.unity", self.target_code_package_name)
text = text.replace("IAndroidCallbackUnity", self.generate_encryption_key("IAndroidCallbackUnity"))
text = text.replace("callback", self.generate_encryption_key("callback"))
open(self.target_i_android_callback_unity_file, "w", encoding="utf-8").write(text)
proxy_api = self.generate_encryption_key("proxyApi")
init_callback = self.generate_encryption_key("initCallback")
callback = self.generate_encryption_key("callback")
print("target_unity_proxy_api_class", target_unity_proxy_api_class)
print("target_android_callback_unity_class", target_android_callback_unity_class)
print("proxy_api", proxy_api)
print("init_callback", init_callback)
print("callback", callback)
pass

View File

@ -1,11 +1,125 @@
import binascii
import hashlib
import json
import os
from pathlib import Path
import re
import xml.etree.ElementTree as ET
from pathlib import Path
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
from scripts.context import Context
from scripts.task import Task
from utils import FileUtils
from utils.logger_utils import app_logger
def encrypt_content(key: str, content: str) -> str:
"""
加密内容与Kotlin版本算法保持一致
使用AES/ECB/PKCS5Padding模式MD5生成密钥
"""
if not key:
raise ValueError("Key cannot be null or empty.")
if not content:
raise ValueError("Content cannot be null or empty.")
# 生成密钥的MD5哈希
key_bytes = generate_key_hash(key)
# 将内容转换为UTF-8字节
content_bytes = content.encode('utf-8')
# 初始化AES加密器使用ECB模式和PKCS5填充
cipher = AES.new(key_bytes, AES.MODE_ECB)
# 对内容进行填充并加密
padded_content = pad(content_bytes, AES.block_size)
encrypted_bytes = cipher.encrypt(padded_content)
# 将加密后的字节转换为小写十六进制字符串
return binascii.hexlify(encrypted_bytes).decode().lower()
def generate_key_hash(key: str) -> bytes:
"""生成密钥的MD5哈希返回16字节的密钥"""
md5 = hashlib.md5()
md5.update(key.encode('utf-8'))
return md5.digest()
def simple_encrypt(text, key):
return encrypt_content(key, text)
def encrypt_xml_resources(file_path, backup=True, key=""):
"""读取XML资源文件加密所有string内容然后写回"""
try:
# 创建备份文件
if backup and os.path.exists(file_path):
backup_path = f"{file_path}.bak"
with open(file_path, 'r', encoding='utf-8') as f_in, \
open(backup_path, 'w', encoding='utf-8') as f_out:
f_out.write(f_in.read())
print(f"已创建备份文件: {backup_path}")
# 解析XML文件
tree = ET.parse(file_path)
root = tree.getroot()
# 遍历所有string元素并加密内容
for string_elem in root.findall('string'):
original_text = string_elem.text.replace("\\'", "'")
if original_text is not None:
# 加密文本
encrypted_text = simple_encrypt(original_text, key)
# 更新元素内容
string_elem.text = encrypted_text
print(f"加密: {original_text} -> {encrypted_text}")
# 写回加密后的内容
tree.write(file_path, encoding='utf-8', xml_declaration=True)
print(f"加密完成,已更新文件: {file_path}")
except Exception as e:
print(f"处理文件时出错: {str(e)}")
def get_all_string_names(xml_file):
# 解析XML文件
tree = ET.parse(xml_file)
root = tree.getroot()
# 存储所有name属性值
string_names = []
# 遍历所有string标签
for string_elem in root.findall('string'):
# 获取name属性值
name = string_elem.get('name')
if name:
string_names.append(name)
return string_names
def get_all_style_names(xml_file):
# 解析XML文件
tree = ET.parse(xml_file)
root = tree.getroot()
# 存储所有name属性值
string_names = []
# 遍历所有string标签
for string_elem in root.findall('style'):
# 获取name属性值
name = string_elem.get('name')
if name:
string_names.append(name)
return string_names
def extract_launcher_ids(xml_content):
@ -17,12 +131,6 @@ def extract_launcher_ids(xml_content):
return matches
# def extract_launcher_ids(xml_content):
# """提取所有 android:id 值"""
# pattern = r'android:id\s*=\s*"@\+id/([^"]+)"'
# return re.findall(pattern, xml_content)
def string_to_md5(text):
# 将字符串编码为UTF-8字节
text_bytes = text.encode('utf-8')
@ -51,31 +159,20 @@ def generate_encryption_key(key: str, s_len: int = -1, target_package_name: str
return processed_key[:target_length] if processed_key else ""
layout_path = "LauncherCode/res/layout".replace("/", os.sep)
values_path = "LauncherCode/res/values".replace("/", os.sep)
drawable_xxhdpi_path = "LauncherCode/res/drawable-xxhdpi".replace("/", os.sep)
drawable_path = "LauncherCode/res/drawable".replace("/", os.sep)
code_path = "LauncherCode/src".replace("/", os.sep)
android_manifest_path = "lawnchair/AndroidManifest.xml".replace("/", os.sep)
xml_path = "lawnchair/res/xml".replace("/", os.sep)
launcher_code_path = "lawnchair/src".replace("/", os.sep)
src_code_path = "src".replace("/", os.sep)
launchercode = "launchercode"
lawn_layout = "res/layout".replace("/", os.sep)
qucikset_manifest = "quickstep/AndroidManifest-launcher.xml".replace("/", os.sep)
lawn_manifest = "AndroidManifest.xml".replace("/", os.sep)
pag_file = "lawnchair/assets/pag_wallpaper_slide.pag".replace("/", os.sep)
class ProjectProguard(Task):
def __init__(self, context: Context):
super().__init__(context)
self.context.proguard_dict = {
launchercode: generate_encryption_key(launchercode, target_package_name=self.context.package_name)}
self.root = self.context.temp_project_path
self.module_path = os.path.join(self.root, "launcher-game")
self.code_path = os.path.join(self.module_path, "src")
self.res_path = os.path.join(self.module_path, "res")
self.drawable_path = os.path.join(self.res_path, "drawable")
self.drawable_xxhdpi_path = os.path.join(self.res_path, "drawable-xxhdpi")
self.layout_path = os.path.join(self.res_path, "layout")
self.string_path = ""
self.launcher_xml = ""
self.launcher_java = ""
self.style_path = ""
def add_proguard_key(self, key: str) -> str:
value = self.context.proguard_dict.get(key)
@ -85,44 +182,6 @@ class ProjectProguard(Task):
self.context.proguard_dict[key] = value
return value
def rename_files_in_dir(self, dir_path: str):
for root, dirs, files in os.walk(dir_path):
for file in files:
file_path = os.path.join(root, file)
name = Path(file).stem
add_proguard_key = self.add_proguard_key(name)
FileUtils.move(file_path,
os.path.join(root, file.replace(name, add_proguard_key))
.replace(launchercode, self.context.proguard_dict.get(launchercode)),
overwrite=True)
def update(self, file_path: str):
text = open(file_path, "r", encoding="UTF-8").read()
for key, value in self.context.proguard_dict.items():
text = text.replace(key, value)
pass
open(file_path, "w", encoding="UTF-8").write(text)
def update_proguard(self, dir_path: str):
if os.path.isdir(dir_path):
for root, dirs, files in os.walk(dir_path):
for file in files:
if file.endswith(".xml") or file.endswith(".java") or file.endswith(".kt"):
file_path = os.path.join(root, file)
self.update(file_path)
else:
self.update(dir_path)
pass
def update_id(self, file_path: str):
for root, dirs, files in os.walk(file_path):
for file in files:
xml_file = os.path.join(root, file)
text = open(xml_file, "r", encoding="UTF-8").read()
ids = extract_launcher_ids(text)
for id in ids:
self.add_proguard_key(id)
def write_proguard(self):
file_path = os.path.join(self.context.temp_project_path, "proguard.pro")
lines = open(file_path, "r", encoding="UTF-8").readlines()
@ -136,27 +195,111 @@ class ProjectProguard(Task):
open(file_path, "w", encoding="UTF-8").writelines(lines)
pass
def proguard_code(self):
code_package_name_list = ["com.game.launcher.activity", "com.game.launcher.view", "com.game.launcher.service"]
for code_package in code_package_name_list:
code_dir = os.path.join(self.code_path, code_package.replace(".", os.sep))
files = os.listdir(code_dir)
self.context.proguard_dict[code_package] = self.context.package_name
for file in files:
file_path = Path(file)
file_name = file_path.stem
file_ext = file_path.suffix
target_class_name = self.add_proguard_key(file_name)
target_file_path = os.path.join(self.code_path, self.context.package_name.replace(".", os.sep),
target_class_name + file_ext)
o = os.path.join(code_dir, file)
self.context.proguard_dict[
code_package + "." + file_name] = self.context.package_name + "." + target_class_name
FileUtils.move(o, target_file_path)
pass
pass
def proguard_pag(self):
pag_file = os.path.join(self.module_path, "assets/pag_gl_slide.pag".replace("/", os.sep))
target_pag = self.add_proguard_key("pag_gl_slide")
FileUtils.move(pag_file, pag_file.replace("pag_gl_slide", target_pag))
pass
def proguard_file_name(self, dir_path: str):
for file in os.listdir(dir_path):
path = Path(file)
file_name = path.stem
target_file_name = self.add_proguard_key(file_name)
abspath = os.path.join(dir_path, file)
FileUtils.move(abspath, abspath.replace(file_name, target_file_name))
pass
def analysis_id_dir(self, dir_path: str):
for file in os.listdir(dir_path):
file = os.path.join(dir_path, file)
self.analysis_id_file(file)
pass
def analysis_id_file(self, path: str):
ids = extract_launcher_ids(open(path, "r", encoding="UTF-8").read())
for id in ids:
self.add_proguard_key(id)
pass
def analysis_string_name(self, file_path: str):
names = get_all_string_names(file_path)
for name in names:
self.add_proguard_key(name)
pass
def analysis_style_name(self, file_path: str):
names = get_all_style_names(file_path)
for name in names:
self.add_proguard_key(name)
pass
def update_proguard_file(self, file_path: str):
if not (file_path.endswith(".java") or file_path.endswith(".xml") or file_path.endswith(".kt")):
return
text = open(file_path, "r", encoding="UTF-8").read()
for key, value in self.context.proguard_dict.items():
text = text.replace(key, value)
open(file_path, "w", encoding="UTF-8").writelines(text)
def update_proguard_dir(self, dir_path: str):
for root, dirs, files in os.walk(dir_path):
for file in files:
file_path = os.path.join(root, file)
self.update_proguard_file(file_path)
pass
def execute(self):
self.root = self.context.temp_project_path
self.module_path = os.path.join(self.root, "launcher-game")
self.code_path = os.path.join(self.module_path, "src")
self.res_path = os.path.join(self.module_path, "res")
self.drawable_path = os.path.join(self.res_path, "drawable")
self.drawable_xxhdpi_path = os.path.join(self.res_path, "drawable-xxhdpi")
self.layout_path = os.path.join(self.res_path, "layout")
self.string_path = os.path.join(self.res_path, "values", "strings.xml")
self.style_path = os.path.join(self.res_path, "values", "styles.xml")
self.launcher_xml = os.path.join(self.root, "res/layout/launcher.xml".replace("/", os.sep))
self.launcher_java = os.path.join(self.root, "src/com/android/launcher3/Launcher.java".replace("/", os.sep))
self.write_proguard()
self.add_proguard_key("LauncherMyNoActionBar")
self.add_proguard_key("LauncherIntroTheme")
self.add_proguard_key("LauncherGameIntroTheme")
self.add_proguard_key("LauncherTransparentTheme")
self.proguard_code()
self.proguard_pag()
self.proguard_file_name(self.drawable_path)
self.proguard_file_name(self.drawable_xxhdpi_path)
self.proguard_file_name(self.layout_path)
self.add_proguard_key("launchergamead")
self.add_proguard_key("launcher_help_detail")
self.add_proguard_key("launcher_help")
self.add_proguard_key("launcher_uninstall")
self.add_proguard_key("launcher_onboard")
self.add_proguard_key("pag_wallpaper_slide")
self.analysis_id_file(self.launcher_xml)
self.analysis_id_dir(self.layout_path)
self.analysis_string_name(self.string_path)
self.analysis_style_name(self.style_path)
self.update_id(os.path.join(self.context.temp_project_path, lawn_layout))
self.update_id(os.path.join(self.context.temp_project_path, layout_path))
self.rename_files_in_dir(os.path.join(self.context.temp_project_path, layout_path))
self.rename_files_in_dir(os.path.join(self.context.temp_project_path, drawable_xxhdpi_path))
self.rename_files_in_dir(os.path.join(self.context.temp_project_path, drawable_path))
self.rename_files_in_dir(os.path.join(self.context.temp_project_path, code_path))
self.add_proguard_key("gltaskaffinity")
self.context.proguard_dict = {
k: v for k, v in sorted(
@ -165,32 +308,29 @@ class ProjectProguard(Task):
reverse=True
)
}
self.update_proguard(os.path.join(self.context.temp_project_path, layout_path))
self.update_proguard(os.path.join(self.context.temp_project_path, values_path))
self.update_proguard(os.path.join(self.context.temp_project_path, drawable_xxhdpi_path))
self.update_proguard(os.path.join(self.context.temp_project_path, drawable_path))
self.update_proguard(os.path.join(self.context.temp_project_path, code_path))
self.update_proguard(os.path.join(self.context.temp_project_path, android_manifest_path))
self.update_proguard(os.path.join(self.context.temp_project_path, xml_path))
self.update_proguard(os.path.join(self.context.temp_project_path, launcher_code_path))
self.update_proguard(os.path.join(self.context.temp_project_path, src_code_path))
self.update_proguard(os.path.join(self.context.temp_project_path, qucikset_manifest))
self.update_proguard(os.path.join(self.context.temp_project_path, lawn_manifest))
self.update_proguard(os.path.join(self.context.temp_project_path, lawn_layout))
self.update_proguard_file(os.path.join(self.context.temp_project_path,
"src/com/android/launcher3/views/OptionsPopupView.java".replace("/",
os.sep)))
self.update_proguard_file(self.launcher_xml)
self.update_proguard_file(self.launcher_java)
self.update_proguard_file(self.string_path)
target_pag_file = os.path.join(self.context.temp_project_path, pag_file)
FileUtils.move(target_pag_file,
target_pag_file.replace("pag_wallpaper_slide",
self.context.proguard_dict.get("pag_wallpaper_slide")))
pass
self.update_proguard_dir(self.layout_path)
self.update_proguard_dir(self.drawable_xxhdpi_path)
self.update_proguard_dir(self.drawable_path)
self.update_proguard_dir(self.module_path)
self.update_proguard_dir(os.path.join(self.context.temp_project_path, "lawnchair/res/xml"))
encrypt_xml_resources(self.string_path, False, string_to_md5(self.context.package_name).upper())
if __name__ == "__main__":
file = "../project/com_punch_prankster_puzzle_fwaes_free_launcher_fgsaw223908/LauncherCode/res/layout/a60034437eae19e7b00.xml".replace(
"/", os.sep)
text = open(file, "r", encoding="UTF-8").read()
print(text)
temp = extract_launcher_ids(text)
print(temp)
pass
app_logger().info(json.dumps(self.context.proguard_dict, indent=4))
# if __name__ == '__main__':
# encrypt_xml_resources(
# "/Users/luojian/Documents/project/zicp/Lawnchair_DollMasterLauncher/launcher-game/res/values/strings.xml")
# # key = string_to_md5("com.drop.meme.merge.game.fsaew.puzzle").upper()
# # print(key)
# # result = encrypt_content(key, "hello World")
# # print(result)
# pass

View File

@ -0,0 +1,80 @@
from scripts.task import Task
import os
import hashlib
from PIL import Image
import random
def get_md5(file_path):
"""计算文件的MD5值"""
hash_md5 = hashlib.md5()
with open(file_path, "rb") as f:
for chunk in iter(lambda: f.read(4096), b""):
hash_md5.update(chunk)
return hash_md5.hexdigest()
def modify_one_pixel(input_path, output_path):
"""随机修改图片中一个不显眼的像素,每次执行结果不同"""
try:
with Image.open(input_path) as img:
width, height = img.size
# 随机选择一个像素位置(避开边缘以防某些特殊图片格式问题)
x = random.randint(1, width - 2)
y = random.randint(1, height - 2)
# 获取该位置的像素值
pixel = img.getpixel((x, y))
# 随机决定是增加还是减少像素值
change = random.choice([-1, 1])
# 根据图像模式处理像素值
if img.mode in ['RGB', 'RGBA']:
new_pixel = list(pixel)
# 随机选择一个颜色通道进行修改
channel = random.randint(0, len(new_pixel) - 1)
new_pixel[channel] = (new_pixel[channel] + change) % 256
new_pixel = tuple(new_pixel)
elif img.mode == 'L': # 灰度图
new_pixel = (pixel + change) % 256
else:
# 其他模式处理
if isinstance(pixel, int):
new_pixel = (pixel + change) % 256
else:
# 对多通道非RGB模式随机选择一个通道修改
new_pixel = list(pixel)
channel = random.randint(0, len(new_pixel) - 1)
new_pixel[channel] = (new_pixel[channel] + change) % 256
new_pixel = tuple(new_pixel)
# 设置新的像素值
img.putpixel((x, y), new_pixel)
# 保存修改后的图片
img.save(output_path)
return True
except Exception as e:
print(f"处理图片时出错: {e}")
return False
class ProjectResMd5(Task):
def execute(self):
path = f"launcher-game/res/"
root_path = os.path.join(self.context.temp_project_path, path)
for i in os.listdir(root_path):
if i.startswith("drawable"):
path = os.path.join(root_path, i)
for file in os.listdir(path):
if file.endswith(".png") or file.endswith(".jpg"):
file_path = os.path.join(path, file)
md51 = get_md5(file_path)
modify_one_pixel(file_path, file_path)
md52 = get_md5(file_path)
print(file_path, md51, md52)
pass

View File

@ -0,0 +1,49 @@
import json
import os.path
import xml.etree.ElementTree as ET
from scripts.task import Task
from utils.logger_utils import app_logger
def batch_update_xml_resources(file_path, updates_dict):
# 解析XML文件
tree = ET.parse(file_path)
root = tree.getroot()
updated_count = 0 # 遍历字典中的每个key-value对
for key, new_value in updates_dict.items():
# 查找指定key的元素
for elem in root.findall(f".//string[@name='{key}']"):
# 修改元素内容
elem.text = new_value.replace("'", "\\'")
print(f"已更新 key: {key} 的值为: {elem.text}")
updated_count += 1
break
else:
print(f"未找到 key: {key}")
# 美化并保存修改
tree.write(file_path, encoding='utf-8', xml_declaration=True)
return updated_count
class ProjectResString(Task):
def update_res(self, string_path: str, res: dict[str, str]):
if os.path.exists(string_path):
batch_update_xml_resources(string_path, res)
return
app_logger().debug("路径不存,不操作了,后续可以给他创建出来:" + string_path + "\t" + json.dumps(res, indent=4))
def execute(self):
for key in self.context.string.keys():
launcher = key.replace('base', '')
if launcher:
launcher = "values-" + launcher
else:
launcher = "values"
path = f"launcher-game/res/{launcher}/strings.xml"
self.update_res(os.path.join(self.context.temp_project_path, path), self.context.string[key])
pass

View File

@ -1,10 +1,12 @@
import os.path
from pathlib import Path
import re
from xml.dom import minidom
import javaproperties
import requests
from lxml import etree
import xml.etree.ElementTree as ET
from scripts.context import Context
from scripts.task import Task
@ -12,33 +14,53 @@ from utils import FileUtils
from utils.logger_utils import app_logger
def update_dependency_version(content, dependency_name, new_version):
"""
更新 Gradle 依赖的版本号
def process_manifest(input_path, output_path):
# 解析XML文件
tree = ET.parse(input_path)
root = tree.getroot()
:param content: Gradle 文件内容
:param dependency_name: 依赖名称可以是完整字符串或部分匹配
:param new_version: 新版本号
:return: 更新后的内容
"""
# 匹配 implementation 声明,捕获组用于保留前缀和后缀
pattern = rf"(implementation\s*\(\s*['\"]{re.escape(dependency_name)}:)([^'\"]+)(['\"]\s*\))"
# 定义命名空间映射
android_namespace = 'http://schemas.android.com/apk/res/android'
ET.register_namespace('android', android_namespace)
namespaces = {'android': android_namespace}
# 替换版本号部分
updated_content = re.sub(pattern, rf"\g<1>{new_version}\g<3>", content)
# 处理application标签移除所有属性
application = root.find('application')
if application is not None:
# 保存所有子节点
children = list(application)
# 清除application标签
root.remove(application)
# 创建新的application标签无属性
new_application = ET.Element('application')
# 添加回所有子节点
for child in children:
new_application.append(child)
# 将新的application标签添加回root
root.append(new_application)
return updated_content
# 查找并删除指定的activity节点
activity_to_remove = new_application.find(
".//activity[@android:name='com.unity3d.player.UnityPlayerActivity']",
namespaces=namespaces
)
if activity_to_remove is not None:
new_application.remove(activity_to_remove)
# 保存处理后的XML保留android命名空间前缀
rough_string = ET.tostring(root, 'utf-8')
reparsed = minidom.parseString(rough_string)
pretty_xml = reparsed.toprettyxml(indent=" ", encoding='utf-8')
def get_latest_version(url):
try:
response = requests.get(url)
root = etree.fromstring(response.content)
latest = root.xpath("//latest/text()") or root.xpath("//version[last()]/text()")
return latest[0] if latest else None
except Exception as e:
app_logger().error(f"Error: {e}")
return None
# 去除空行
lines = pretty_xml.decode('utf-8').split('\n')
non_empty_lines = [line for line in lines if line.strip() != '']
pretty_xml = '\n'.join(non_empty_lines).encode('utf-8')
with open(output_path, 'wb') as f:
f.write(pretty_xml)
print(f"处理完成,结果已保存到 {output_path}")
def uncomment_line(content, line_pattern):
@ -82,6 +104,56 @@ def update_gradle_variable(content, variable_name, new_value):
return updated_content
def modify_text_with_regex(original_text, key, new_value):
"""
使用正则表达式修改文本中指定key的值支持带引号和数字类型
参数:
original_text -- 原始文本内容
key -- 要修改的键名
new_value -- 新的值
返回:
修改后的文本内容
"""
# 改进的正则模式:更精确地匹配带引号的值和数字值
# 匹配带引号的值(单引号或双引号)或数字值
pattern = re.compile(
r'(final def ' + re.escape(key) + r' = )' # 前缀部分
r'(?:' # 非捕获组,用于分组不同情况
r'([\'"])(.*?)\2' # 带引号的值(单引号或双引号)
r'|' # 或者
r'(\d+)' # 数字值(整数)
r')'
)
# 查找匹配
match = pattern.search(original_text)
if not match:
print(f"未找到键: {key}")
return original_text
# 检查是带引号的情况还是数字情况
quote_type = match.group(2) # 引号类型(单引号或双引号)
is_number = match.group(4) is not None # 是否是数字类型
# 构造替换字符串
if quote_type:
# 有引号的情况,保持原有引号类型
replacement = f'\g<1>{quote_type}{new_value}{quote_type}'
elif is_number:
# 数字类型,直接替换数字
replacement = f'\g<1>{new_value}'
else:
# 其他情况,保持原样替换
replacement = f'\g<1>{new_value}'
# 执行替换,只替换第一个匹配项
modified_text = pattern.sub(replacement, original_text, count=1)
return modified_text
def update_gradle_property(content, key, new_value):
# 匹配两种格式:
# 1. resValue "string", "key", "value"
@ -95,10 +167,10 @@ def update_gradle_property(content, key, new_value):
LAUNCHER_CODE_PATH = f"LauncherCode/src/com/launchercode".replace("/", os.sep)
GAME_ACTIVITY_PATH = f"LauncherCode/src/com/launchercode/GameActivity.kt".replace("/", os.sep)
GAME_ACTIVITY_PATH = f"launcher-game/src/com/game/launcher/activity/GLGameActivity.kt".replace("/", os.sep)
GAME_ACTIVITY_PATH_2 = f"LauncherCode/src/com/launchercode/activity/GameActivity.kt".replace("/", os.sep)
ANDROID_MANIFEST_PATH = f"lawnchair/AndroidManifest.xml".replace("/", os.sep)
STRING_PATH = f"LauncherCode/res/values/strings.xml".replace("/", os.sep)
ANDROID_MANIFEST_PATH = f"launcher-game/AndroidManifest.xml".replace("/", os.sep)
STRING_PATH = f"launcher-game/res/values/strings.xml".replace("/", os.sep)
LAUNCER_STRING_PATH = f"LauncherCode/src/com/launchercode/LauncherStringsValue.kt".replace("/", os.sep)
@ -114,21 +186,19 @@ class ProjectUpdate(Task):
:return:
"""
build_gradle_path = os.path.join(self.context.temp_project_path, "build.gradle")
build_gradle_path = os.path.join(self.context.temp_project_path, "ad.gradle")
text = open(build_gradle_path, "r", encoding="utf-8").read()
text = text.replace("com.fingerheart.launcher.game.free.sdjws", self.context.package_name)
text = text.replace(self.context.original_package, self.context.package_name)
open(build_gradle_path, "w", encoding="utf-8").write(text)
xml_path = os.path.join(self.context.temp_project_path, "lawnchair/res/xml")
# com.launchercode.SplashActivity
# TODO 这里还需要改启动项
for root, dirs, files in os.walk(xml_path):
for file in files:
temp_xml_path = os.path.join(root, file)
text = open(temp_xml_path, "r", encoding="utf-8").read()
text = text.replace("com.fingerheart.launcher.game.free.sdjws", self.context.package_name)
text = text.replace(self.context.original_package, self.context.package_name)
open(temp_xml_path, "w", encoding="utf-8").write(text)
pass
pass
@ -171,16 +241,20 @@ storePassword=123456
app_logger().debug(f"{target_path} -> {dst} , 解压结果: {result}")
mainly_path = os.path.join(dst, "mainly")
if not os.path.exists(mainly_path):
mainly_path = os.path.join(dst, "appConfig")
google_services_json_path = os.path.join(dst, "google-services.json")
if not os.path.exists(google_services_json_path):
google_services_json_path = os.path.join(dst, "appConfig", "google-services.json")
FileUtils.copy(google_services_json_path,
os.path.join(self.context.temp_project_path, "google-services.json"),
True)
dst_path = os.path.join(self.context.temp_project_path, f"lawnchair{os.sep}assets")
dst_path = os.path.join(self.context.temp_project_path, f"launcher-game{os.sep}assets")
for file in list(filter(lambda f: not (f == "google_fonts.json" or f == "pag_wallpaper_slide.pag"),
for file in list(filter(lambda f: not (f == "google_fonts.json" or f == "pag_gl_slide.pag"),
os.listdir(dst_path))):
FileUtils.delete(os.path.join(dst_path, file), True)
pass
@ -188,7 +262,7 @@ storePassword=123456
for file in list(filter(lambda f: f.find(".") <= 0, os.listdir(mainly_path))):
FileUtils.copy(os.path.join(mainly_path, file), os.path.join(dst_path, file))
with open(os.path.join(mainly_path, "tkg_config_mainly.properties"), 'rb') as f:
with open(os.path.join(dst, "tkg_config_mainly.properties"), 'rb') as f:
self.context.config = javaproperties.load(f)
# 不打admob
@ -212,7 +286,7 @@ storePassword=123456
temp_tart_path = os.path.join(root, file)
if temp_tart_path.find("__MACOSX") > 0:
continue
temp_dst = temp_tart_path.replace(tag, "res")
temp_dst = temp_tart_path.replace(tag, "launcher-game" + os.sep + "res")
app_logger().debug(f"copy icon = {temp_tart_path} -> {temp_dst}")
FileUtils.copy(temp_tart_path, temp_dst, True)
pass
@ -232,6 +306,10 @@ storePassword=123456
temp_dst = dst + "_res"
if os.path.exists(dst):
FileUtils.delete(dst, True)
if os.path.exists(temp_dst):
FileUtils.delete(temp_dst, True)
FileUtils.decompress(res_path, temp_dst)
build_path = os.path.join(temp_dst, "build")
@ -243,11 +321,16 @@ storePassword=123456
else:
FileUtils.copy(temp_dst, dst)
android_manifest_xml_path = os.path.join(dst, "src", "main", "AndroidManifest.xml")
process_manifest(android_manifest_xml_path, android_manifest_xml_path)
text = open(os.path.join(dst, "build.gradle"), "r", encoding="utf-8").read()
text = text.replace("implementation", "api")
text = text.replace("compileSdkVersion", """
namespace "com.unity3d.player"
compileSdkVersion""")
if not 'namespace "com.unity3d.player"' in text:
text = text.replace("compileSdkVersion", """
namespace "com.unity3d.player"
compileSdkVersion""")
text = text.replace("unityStreamingAssets.tokenize(', ')",
'[".unity3d", ".bundle", ".version", ".bytes", ".hash"]')
text = text.replace("apply plugin: 'com.android.library'", """
@ -257,15 +340,26 @@ plugins {
""")
open(os.path.join(dst, "build.gradle"), "w", encoding="utf-8").write(text)
lines = open(os.path.join(dst, "build.gradle"), "r", encoding="utf-8").readlines()
new_lines = []
for line in lines:
if line.find("com.game:hachisdk") > 0:
continue
new_lines.append(line)
open(os.path.join(dst, "build.gradle"), "w", encoding="utf-8").writelines(new_lines)
# 引用Unity项目
text = open(self.build_gradle_path, "r", encoding="utf-8").read()
text = open(os.path.join(self.context.temp_project_path, "ad.gradle"), "r", encoding="utf-8").read()
text = uncomment_line(text, "implementation projects.unityLibrary")
open(self.build_gradle_path, "w", encoding="utf-8").write(text)
open(os.path.join(self.context.temp_project_path, "ad.gradle"), "w", encoding="utf-8").write(text)
text = open(os.path.join(self.context.temp_project_path, "settings.gradle"), "r", encoding="utf-8").read()
text = uncomment_line(text, "include ':unityLibrary'")
open(os.path.join(self.context.temp_project_path, "settings.gradle"), "w", encoding="utf-8").write(text)
# launcher 引用 unityActivity
text = open(os.path.join(self.context.temp_project_path, GAME_ACTIVITY_PATH), "r", encoding="utf-8").read()
text = text.replace("WebActivity", "com.unity3d.player.UnityPlayerActivity")
text = text.replace("GLGameWebActivity", "com.unity3d.player.UnityPlayerActivity")
open(os.path.join(self.context.temp_project_path, GAME_ACTIVITY_PATH), "w", encoding="utf-8").write(text)
text = open(os.path.join(self.context.temp_project_path, ANDROID_MANIFEST_PATH), "r",
@ -295,7 +389,7 @@ plugins {
dst = os.path.join(dst, "drawable-xxhdpi")
target_root_path = os.path.join(self.context.temp_project_path,
f"LauncherCode{os.sep}res{os.sep}drawable-xxhdpi")
f"launcher-game{os.sep}res{os.sep}drawable-xxhdpi")
image_list = list(map(lambda f: Path(f).stem, os.listdir(target_root_path)))
@ -318,21 +412,17 @@ plugins {
:return:
"""
build_gradle_path = os.path.join(self.context.temp_project_path, "build.gradle")
build_gradle_path = os.path.join(self.context.temp_project_path, "ad.gradle")
text = open(build_gradle_path, "r", encoding="UTF-8").read()
text = update_gradle_property(text, "admob_app_id", self.context.admob_app_id)
text = update_gradle_property(text, "game_services_project_id", self.context.game_services_project_id)
text = update_gradle_property(text, "facebook_app_id", self.context.facebook_app_id)
text = update_gradle_property(text, "facebook_client_token", self.context.facebook_client_token)
text = update_gradle_property(text, "derived_app_name", self.context.get_app_name())
text = update_gradle_variable(text, "versionDisplayName", self.context.version_display_name)
text = update_gradle_variable(text, "version_code", self.context.version_code)
text = update_dependency_version(text, f"straw:hachisdk_unity_{self.context.package_name}",
self.context.sdk_prolink_version)
text = update_dependency_version(text, f"com.game:hachisdk_unity_{self.context.package_name}",
self.context.sdk_version)
text = modify_text_with_regex(text, "admob_app_id", self.context.admob_app_id)
text = modify_text_with_regex(text, "game_services_project_id", self.context.game_services_project_id)
text = modify_text_with_regex(text, "facebook_app_id", self.context.facebook_app_id)
text = modify_text_with_regex(text, "facebook_client_token", self.context.facebook_client_token)
text = modify_text_with_regex(text, "appName", self.context.get_app_name())
text = modify_text_with_regex(text, "appVersionName", self.context.version_display_name)
text = modify_text_with_regex(text, "appVersionCode", self.context.version_code)
open(build_gradle_path, "w", encoding="UTF-8").write(text)
pass
@ -346,28 +436,20 @@ plugins {
raise Exception("配置文件中没有配置 tkg_custom")
text = open(os.path.join(self.context.temp_project_path, STRING_PATH), "r", encoding="utf-8").read()
text = text.replace("https://harmonitun.com/privacy.html", privacy)
text = text.replace("https://harmonitun.com/TermsOfUse.html",
text = text.replace("https://doanvanquy.com/privacy.html", privacy)
text = text.replace("https://doanvanquy.com/TermsOfUse.html",
privacy.replace("privacy.html", "TermsOfUse.html"))
text = text.replace("harmounitun@outlook.com", tkg_custom)
open(os.path.join(self.context.temp_project_path, STRING_PATH), "w", encoding="utf-8").write(text)
text = open(os.path.join(self.context.temp_project_path, LAUNCER_STRING_PATH), "r", encoding="utf-8").read()
text = text.replace("https://harmonitun.com/privacy.html", privacy)
text = text.replace("https://harmonitun.com/TermsOfUse.html",
privacy.replace("privacy.html", "TermsOfUse.html"))
text = text.replace("harmounitun@outlook.com", tkg_custom)
open(os.path.join(self.context.temp_project_path, LAUNCER_STRING_PATH), "w", encoding="utf-8").write(text)
pass
def update_code_dir(self):
# code_path = os.path.join(self.context.temp_project_path, GAME_ACTIVITY_PATH)
# for i in os.listdir(code_path):
# os
# text = open(os.path.join(self.context.temp_project_path, LAUNCER_STRING_PATH), "r", encoding="utf-8").read()
# text = text.replace("https://harmonitun.com/privacy.html", privacy)
# text = text.replace("https://harmonitun.com/TermsOfUse.html",
# privacy.replace("privacy.html", "TermsOfUse.html"))
# text = text.replace("harmounitun@outlook.com", tkg_custom)
# open(os.path.join(self.context.temp_project_path, LAUNCER_STRING_PATH), "w", encoding="utf-8").write(text)
pass
def execute(self):
self.update_code_dir()
global GAME_ACTIVITY_PATH
path = os.path.join(self.context.temp_project_path, GAME_ACTIVITY_PATH)
if not os.path.exists(path):
@ -375,7 +457,6 @@ plugins {
# GAME_ACTIVITY_PATH = GAME_ACTIVITY_PATH_2
pass
self.build_gradle_path = os.path.join(self.context.temp_project_path, "build.gradle")
self.init_sdk_version()
self.update_package_name()
self.update_keystore()
self.update_config()
@ -385,33 +466,3 @@ plugins {
self.update_gradle_config()
self.update_string()
pass
def get_sdk_version(self) -> str:
for i in range(3):
try:
url = f"https://repo.dgtverse.cn/repository/tk_my/com/game/hachisdk_unity_{self.context.package_name}/maven-metadata.xml"
version = get_latest_version(url)
if version:
return version
pass
except Exception as e:
pass
raise Exception("sdk error.")
def get_prolink_version(self) -> str:
for i in range(3):
try:
url = f"https://repo.dgtverse.cn/repository/tk_my/straw/hachisdk_unity_{self.context.package_name}/maven-metadata.xml"
print(url)
version = get_latest_version(url)
if version:
return version
except Exception as e:
print(e)
pass
raise Exception("sdk prolink error.")
def init_sdk_version(self):
self.context.sdk_version = self.get_sdk_version()
self.context.sdk_prolink_version = self.get_prolink_version()
pass