Compare commits
2 Commits
fc46fb68d6
...
f987784ac7
Author | SHA1 | Date |
---|---|---|
|
f987784ac7 | |
|
804a89c170 |
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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",
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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
|
||||
}
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1 @@
|
|||
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
|
|
@ -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"
|
||||
}
|
|
@ -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
|
|
@ -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
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1 @@
|
|||
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
|
|
@ -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"
|
||||
}
|
|
@ -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
|
|
@ -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
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -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),
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
|
@ -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
|
||||
|
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue