This commit is contained in:
Gitea 2021-07-26 16:19:13 +08:00
parent 163d4138b8
commit 2e4ec5ebe9
2 changed files with 242 additions and 244 deletions

View File

@ -1 +1 @@
{"leguChannel": {"value": "gmswz_tt_cq", "suffix": "1"}, "num": {"value": "1", "start": "12"}, "keystore": {"filename": "/data/bale_apk/ApkTool/keystore/legu729.keystore", "storepass": "123456", "alianame": "legu", "keypass": "123456"}, "master_package": {"value": "/data/bale_apk/ApkTool/gmswz_ceshi.apk"}} {"owner": {"value": "gmhdtt", "suffix": "0"}, "leguChannel": {"value": "gmswzhd_tt_gy", "suffix": "1"}, "num": {"value": "20", "start": "61"}, "keystore": {"filename": "/data/bale_apk/ApkTool/keystore/legu729.keystore", "storepass": "123456", "alianame": "legu", "keypass": "123456"}, "master_package": {"value": "/data/bale_apk/ApkTool/gmcgb_mubao_0617.apk"}}

View File

@ -1,243 +1,241 @@
# coding:utf-8 # coding:utf-8
import json import json
import os import os
import shutil import shutil
from core.config import settings from core.config import settings
class MakeTool: class MakeTool:
MakeDir = os.path.join(settings.ROOT_DIR, 'ApkTool') MakeDir = os.path.join(settings.ROOT_DIR, 'ApkTool')
def __init__(self, channel_path): def __init__(self, channel_path):
self.channel_path = channel_path self.channel_path = channel_path
self.apkName = '' self.apkName = ''
self.apkNameSuffix = '0' self.apkNameSuffix = '0'
self.easyName = '' self.easyName = ''
self.easyNameSuffix = '0' self.easyNameSuffix = '0'
self.packageId = '' self.packageId = ''
self.packageIdSuffix = '0' self.packageIdSuffix = '0'
self.keystore = '' self.keystore = ''
self.storepass = '' self.storepass = ''
self.alianame = '' self.alianame = ''
self.keypass = '' self.keypass = ''
self.owner = '' self.owner = ''
self.packNum = 0 self.packNum = 0
self.start = 0 self.start = 0
self.appid = '' self.appid = ''
self.gism_id = '' self.gism_id = ''
self.gism_name = '' self.gism_name = ''
self.gism_channel = '' self.gism_channel = ''
self.lg_ad_id = '' self.lg_ad_id = ''
self.lg_ad_name = '' self.lg_ad_name = ''
self.gactionId = '' self.gactionId = ''
self.gappSecretKey = '' self.gappSecretKey = ''
self.baiduId = '' self.baiduId = ''
self.baiduSecretKey = '' self.baiduSecretKey = ''
self.lg_reyun_game_appkey = '' self.lg_reyun_game_appkey = ''
self.lg_reyun_game_channelId = '' self.lg_reyun_game_channelId = ''
self.lg_reyun_io_appkey = '' self.lg_reyun_io_appkey = ''
self.lg_reyun_io_channelId = '' self.lg_reyun_io_channelId = ''
self.eventType = '' self.eventType = ''
self.master_package = '' self.master_package = ''
def _init_props(self): def _init_props(self):
# 提取参数 # 提取参数
props = dict() props = dict()
with open(self.channel_path, 'r') as f: with open(self.channel_path, 'r') as f:
props = json.load(f) props = json.load(f)
# 母包路径 # 母包路径
self.apkName = props.get('apkname', {}).get('value') or self.apkName self.apkName = props.get('apkname', {}).get('value') or self.apkName
self.apkNameSuffix = props.get('apkname', {}).get('suffix') or self.apkNameSuffix self.apkNameSuffix = props.get('apkname', {}).get('suffix') or self.apkNameSuffix
self.easyName = props.get('leguChannel', {}).get('value') or self.easyName self.easyName = props.get('leguChannel', {}).get('value') or self.easyName
self.easyNameSuffix = props.get('leguChannel', {}).get('suffix') or self.easyNameSuffix self.easyNameSuffix = props.get('leguChannel', {}).get('suffix') or self.easyNameSuffix
self.packageId = props.get('packageId', {}).get('value') or self.packageId self.packageId = props.get('packageId', {}).get('value') or self.packageId
self.packageIdSuffix = props.get('packageId', {}).get('suffix') or self.packageIdSuffix self.packageIdSuffix = props.get('packageId', {}).get('suffix') or self.packageIdSuffix
self.keystore = props.get('keystore', {}).get('filename') or self.keystore self.keystore = props.get('keystore', {}).get('filename') or self.keystore
self.storepass = props.get('keystore', {}).get('storepass') or self.storepass self.storepass = props.get('keystore', {}).get('storepass') or self.storepass
self.alianame = props.get('keystore', {}).get('alianame') or self.alianame self.alianame = props.get('keystore', {}).get('alianame') or self.alianame
self.keypass = props.get('keystore', {}).get('keypass') or self.keypass self.keypass = props.get('keystore', {}).get('keypass') or self.keypass
self.owner = props.get('owner', {}).get('value') or self.owner self.owner = props.get('owner', {}).get('value') or self.owner
self.packNum = props.get('num', {}).get('value') or self.packNum self.packNum = props.get('num', {}).get('value') or self.packNum
self.start = props.get('num', {}).get('start') or self.start self.start = props.get('num', {}).get('start') or self.start
self.start = int(self.start) self.start = int(self.start)
self.packNum = int(self.packNum) + self.start self.packNum = int(self.packNum) + self.start
self.appid = props.get('appid', {}).get('value') or self.appid self.appid = props.get('appid', {}).get('value') or self.appid
self.gism_id = props.get('gism_id', {}).get('value') or self.gism_id self.gism_id = props.get('gism_id', {}).get('value') or self.gism_id
self.gism_name = props.get('gism_name', {}).get('value') or self.gism_name self.gism_name = props.get('gism_name', {}).get('value') or self.gism_name
self.gism_channel = props.get('gism_channel', {}).get('value') or self.gism_channel self.gism_channel = props.get('gism_channel', {}).get('value') or self.gism_channel
self.lg_ad_id = props.get('lg_ad_id', {}).get('value') or self.lg_ad_id self.lg_ad_id = props.get('lg_ad_id', {}).get('value') or self.lg_ad_id
self.lg_ad_name = props.get('lg_ad_name', {}).get('value') or self.lg_ad_name self.lg_ad_name = props.get('lg_ad_name', {}).get('value') or self.lg_ad_name
self.gactionId = props.get('gactionId', {}).get('value') or self.gactionId self.gactionId = props.get('gactionId', {}).get('value') or self.gactionId
self.gappSecretKey = props.get('gappSecretKey', {}).get('value') or self.gappSecretKey self.gappSecretKey = props.get('gappSecretKey', {}).get('value') or self.gappSecretKey
self.baiduId = props.get('baiduId', {}).get('value') or self.baiduId self.baiduId = props.get('baiduId', {}).get('value') or self.baiduId
self.baiduSecretKey = props.get('baiduSecretKey', {}).get('value') or self.baiduSecretKey self.baiduSecretKey = props.get('baiduSecretKey', {}).get('value') or self.baiduSecretKey
self.lg_reyun_game_appkey = props.get('lg_reyun_game_appkey', {}).get('value') or self.lg_reyun_game_appkey self.lg_reyun_game_appkey = props.get('lg_reyun_game_appkey', {}).get('value') or self.lg_reyun_game_appkey
self.lg_reyun_game_channelId = props.get('lg_reyun_game_channelId', {}).get( self.lg_reyun_game_channelId = props.get('lg_reyun_game_channelId', {}).get(
'value') or self.lg_reyun_game_channelId 'value') or self.lg_reyun_game_channelId
self.lg_reyun_io_appkey = props.get('lg_reyun_io_appkey', {}).get('value') or self.lg_reyun_io_appkey self.lg_reyun_io_appkey = props.get('lg_reyun_io_appkey', {}).get('value') or self.lg_reyun_io_appkey
self.lg_reyun_io_channelId = props.get('lg_reyun_io_channelId', {}).get('value') or self.lg_reyun_io_channelId self.lg_reyun_io_channelId = props.get('lg_reyun_io_channelId', {}).get('value') or self.lg_reyun_io_channelId
self.eventType = props.get('eventType', {}).get('value') or self.eventType self.eventType = props.get('eventType', {}).get('value') or self.eventType
self.master_package = props.get('master_package', {}).get('value') or self.master_package self.master_package = props.get('master_package', {}).get('value') or self.master_package
def _init_path(self): def _init_path(self):
bin_dir = os.path.join(self.MakeDir, 'bin') bin_dir = os.path.join(self.MakeDir, 'bin')
if os.path.exists(bin_dir): if os.path.exists(bin_dir):
shutil.rmtree(bin_dir) shutil.rmtree(bin_dir)
os.makedirs(bin_dir) os.makedirs(bin_dir)
def check_props(self): def check_props(self):
if self.packNum < 1: if self.packNum < 1:
return False, '打包数不能小于1' return False, '打包数不能小于1'
if not os.path.exists(self.master_package): if not os.path.exists(self.master_package):
return False, '缺少母包路径' return False, '缺少母包路径'
if not os.path.exists(self.keystore): if not os.path.exists(self.keystore):
return False, '缺少keystore路径' return False, '缺少keystore路径'
if self.easyName: if self.easyName:
self.apkName = self.easyName self.apkName = self.easyName
return True, 'ok' return True, 'ok'
def modify_channel(self, value): def modify_channel(self, value):
tempXML = '' tempXML = ''
with open(os.path.join(self.MakeDir, 'AndroidManifest.xml')) as f: with open(os.path.join(self.MakeDir, 'AndroidManifest.xml')) as f:
for line in f: for line in f:
if line.find('leguChannel') > 0 and self.easyName != '': if line.find('leguChannel') > 0 and self.easyName != '':
if self.easyNameSuffix == "1": if self.easyNameSuffix == "1":
if value < 10:
line = '<meta-data android:name="leguChannel" android:value="%s_0%d"/>' % ( line = '<meta-data android:name="leguChannel" android:value="%s_%d"/>' % (
self.easyName, value) self.easyName, value)
else: else:
line = '<meta-data android:name="leguChannel" android:value="%s_%d"/>' % ( line = '<meta-data android:name="leguChannel" android:value="%s"/>' % (self.easyName)
self.easyName, value) elif line.find('owner') > 0 and self.owner != '':
else: print('owner====%s' % line)
line = '<meta-data android:name="leguChannel" android:value="%s"/>' % (self.easyName) line = '<meta-data android:name="owner" android:value="%s"/>' % (self.owner)
elif line.find('owner') > 0 and self.owner != '': elif line.find('package') > 0 and self.packageId != '':
print('owner====%s' % line) print('package====%s' % line)
line = '<meta-data android:name="owner" android:value="%s"/>' % (self.owner) line = '<?xml version="1.0" encoding="utf-8" standalone="no"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" android:compileSdkVersion="30" android:compileSdkVersionCodename="11" android:installLocation="auto" package="%s" platformBuildVersionCode="30" platformBuildVersionName="11">' % (
elif line.find('package') > 0 and self.packageId != '': self.packageId)
print('package====%s' % line) elif line.find('appid') > 0 and self.appid != '':
line = '<?xml version="1.0" encoding="utf-8" standalone="no"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" android:compileSdkVersion="30" android:compileSdkVersionCodename="11" android:installLocation="auto" package="%s" platformBuildVersionCode="30" platformBuildVersionName="11">' % ( print('appid====%s' % line)
self.packageId) line = '<meta-data android:name="appid" android:value="%s"/>' % (self.appid)
elif line.find('appid') > 0 and self.appid != '': elif line.find('gism_id') > 0 and self.gism_id != '':
print('appid====%s' % line) print('gism_id====%s' % line)
line = '<meta-data android:name="appid" android:value="%s"/>' % (self.appid) line = '<meta-data android:name="gism_id" android:value="%s"/>' % (self.gism_id)
elif line.find('gism_id') > 0 and self.gism_id != '': elif line.find('gism_name') > 0 and self.gism_name != '':
print('gism_id====%s' % line) print('gism_name====%s' % line)
line = '<meta-data android:name="gism_id" android:value="%s"/>' % (self.gism_id) line = '<meta-data android:name="gism_name" android:value="%s"/>' % (self.gism_name)
elif line.find('gism_name') > 0 and self.gism_name != '': elif line.find('gism_channel') > 0 and self.gism_channel != '':
print('gism_name====%s' % line) print('gism_channel====%s' % line)
line = '<meta-data android:name="gism_name" android:value="%s"/>' % (self.gism_name) line = '<meta-data android:name="gism_channel" android:value="%s"/>' % (self.gism_channel)
elif line.find('gism_channel') > 0 and self.gism_channel != '': elif line.find('lg_ad_id') > 0 and self.lg_ad_id != '':
print('gism_channel====%s' % line) print('lg_ad_id====%s' % line)
line = '<meta-data android:name="gism_channel" android:value="%s"/>' % (self.gism_channel) line = '<meta-data android:name="lg_ad_id" android:value="%s"/>' % (self.lg_ad_id)
elif line.find('lg_ad_id') > 0 and self.lg_ad_id != '': elif line.find('lg_ad_name') > 0 and self.lg_ad_name != '':
print('lg_ad_id====%s' % line) print('lg_ad_name====%s' % line)
line = '<meta-data android:name="lg_ad_id" android:value="%s"/>' % (self.lg_ad_id) line = '<meta-data android:name="lg_ad_name" android:value="%s"/>' % (self.lg_ad_name)
elif line.find('lg_ad_name') > 0 and self.lg_ad_name != '': elif line.find('gactionId') > 0 and self.gactionId != '':
print('lg_ad_name====%s' % line) print('gactionId====%s' % line)
line = '<meta-data android:name="lg_ad_name" android:value="%s"/>' % (self.lg_ad_name) line = '<meta-data android:name="gactionId" android:value="%s"/>' % (self.gactionId)
elif line.find('gactionId') > 0 and self.gactionId != '': elif line.find('gappSecretKey') > 0 and self.gappSecretKey != '':
print('gactionId====%s' % line) print('gappSecretKey====%s' % line)
line = '<meta-data android:name="gactionId" android:value="%s"/>' % (self.gactionId) line = '<meta-data android:name="gappSecretKey" android:value="%s"/>' % (self.gappSecretKey)
elif line.find('gappSecretKey') > 0 and self.gappSecretKey != '': elif line.find('baiduId') > 0 and self.baiduId != '':
print('gappSecretKey====%s' % line) print('baiduId====%s' % line)
line = '<meta-data android:name="gappSecretKey" android:value="%s"/>' % (self.gappSecretKey) line = '<meta-data android:name="baiduId" android:value="%s"/>' % (self.baiduId)
elif line.find('baiduId') > 0 and self.baiduId != '': elif line.find('baiduSecretKey') > 0 and self.baiduSecretKey != '':
print('baiduId====%s' % line) print('baiduSecretKey====%s' % line)
line = '<meta-data android:name="baiduId" android:value="%s"/>' % (self.baiduId) line = '<meta-data android:name="baiduSecretKey" android:value="%s"/>' % (self.baiduSecretKey)
elif line.find('baiduSecretKey') > 0 and self.baiduSecretKey != '': elif line.find('lg_reyun_game_appkey') > 0 and self.lg_reyun_game_appkey != '':
print('baiduSecretKey====%s' % line) print('lg_reyun_game_appkey====%s' % line)
line = '<meta-data android:name="baiduSecretKey" android:value="%s"/>' % (self.baiduSecretKey) line = '<meta-data android:name="lg_reyun_game_appkey" android:value="%s"/>' % (
elif line.find('lg_reyun_game_appkey') > 0 and self.lg_reyun_game_appkey != '': self.lg_reyun_game_appkey)
print('lg_reyun_game_appkey====%s' % line) elif line.find('lg_reyun_game_channelId') > 0 and self.lg_reyun_game_channelId != '':
line = '<meta-data android:name="lg_reyun_game_appkey" android:value="%s"/>' % ( print('lg_reyun_game_channelId====%s' % line)
self.lg_reyun_game_appkey) line = '<meta-data android:name="lg_reyun_game_channelId" android:value="%s"/>' % (
elif line.find('lg_reyun_game_channelId') > 0 and self.lg_reyun_game_channelId != '': self.lg_reyun_game_channelId)
print('lg_reyun_game_channelId====%s' % line) elif line.find('lg_reyun_io_appkey') > 0 and self.lg_reyun_io_appkey != '':
line = '<meta-data android:name="lg_reyun_game_channelId" android:value="%s"/>' % ( print('lg_reyun_io_appkey====%s' % line)
self.lg_reyun_game_channelId) line = '<meta-data android:name="lg_reyun_io_appkey" android:value="%s"/>' % (
elif line.find('lg_reyun_io_appkey') > 0 and self.lg_reyun_io_appkey != '': self.lg_reyun_io_appkey)
print('lg_reyun_io_appkey====%s' % line) elif line.find('lg_reyun_io_channelId') > 0 and self.lg_reyun_io_channelId != 0:
line = '<meta-data android:name="lg_reyun_io_appkey" android:value="%s"/>' % ( print('lg_reyun_io_channelId====%s' % line)
self.lg_reyun_io_appkey) line = '<meta-data android:name="lg_reyun_io_channelId" android:value="%s"/>' % (
elif line.find('lg_reyun_io_channelId') > 0 and self.lg_reyun_io_channelId != 0: self.lg_reyun_io_channelId)
print('lg_reyun_io_channelId====%s' % line) elif line.find('eventType') > 0 and self.eventType != '':
line = '<meta-data android:name="lg_reyun_io_channelId" android:value="%s"/>' % ( print('eventType====%s' % line)
self.lg_reyun_io_channelId) line = '<meta-data android:name="eventType" android:value="%s"/>' % (self.eventType)
elif line.find('eventType') > 0 and self.eventType != '': tempXML += line
print('eventType====%s' % line)
line = '<meta-data android:name="eventType" android:value="%s"/>' % (self.eventType) with open(os.path.join(self.MakeDir, 'temp/AndroidManifest.xml'), 'w') as f:
tempXML += line f.write(tempXML)
with open(os.path.join(self.MakeDir, 'temp/AndroidManifest.xml'), 'w') as f:
f.write(tempXML) unsignApk = os.path.join(self.MakeDir, f'bin/{self.apkName}_{value}_unsigned.apk')
unsignApk = os.path.join(self.MakeDir, f'bin/{self.apkName}_{value}_unsigned.apk') cmdPack = f'cd {self.MakeDir} && java -jar apktool.jar b temp -o {unsignApk}'
os.system(cmdPack)
cmdPack = f'cd {self.MakeDir} && java -jar apktool.jar b temp -o {unsignApk}'
os.system(cmdPack) signedjar = os.path.join(self.MakeDir, f'bin/{self.apkName}_{value}.apk')
unsignedjar = os.path.join(self.MakeDir, f'bin/{self.apkName}_{value}_unsigned.apk')
signedjar = os.path.join(self.MakeDir, f'bin/{self.apkName}_{value}.apk')
unsignedjar = os.path.join(self.MakeDir, f'bin/{self.apkName}_{value}_unsigned.apk') cmd_sign = f'cd {self.MakeDir} && jarsigner -verbose -digestalg SHA1 -sigalg MD5withRSA -keystore {self.keystore} -storepass {self.storepass} -keypass {self.keypass} -signedjar {signedjar} {unsignedjar} {self.alianame}'
os.system(cmd_sign)
cmd_sign = f'cd {self.MakeDir} && jarsigner -verbose -digestalg SHA1 -sigalg MD5withRSA -keystore {self.keystore} -storepass {self.storepass} -keypass {self.keypass} -signedjar {signedjar} {unsignedjar} {self.alianame}' os.remove(unsignedjar)
os.system(cmd_sign)
os.remove(unsignedjar) def _unpack(self, pack_name):
"""
def _unpack(self, pack_name): 解包
""" :param pack_name:
解包 :return:
:param pack_name: """
:return: cmd = f'cd {self.MakeDir} && java -jar apktool.jar d -f -s {self.master_package} -o temp'
""" os.system(cmd)
cmd = f'cd {self.MakeDir} && java -jar apktool.jar d -f -s {self.master_package} -o temp' androidmanifest_path = os.path.join(self.MakeDir, 'AndroidManifest.xml')
os.system(cmd) if os.path.exists(androidmanifest_path):
androidmanifest_path = os.path.join(self.MakeDir, 'AndroidManifest.xml') os.remove(androidmanifest_path)
if os.path.exists(androidmanifest_path): new_androidmanifest_path = os.path.join(self.MakeDir, 'temp/AndroidManifest.xml')
os.remove(androidmanifest_path) shutil.copyfile(new_androidmanifest_path, androidmanifest_path)
new_androidmanifest_path = os.path.join(self.MakeDir, 'temp/AndroidManifest.xml')
shutil.copyfile(new_androidmanifest_path, androidmanifest_path) def _clear(self):
path = os.path.join(self.MakeDir, 'temp')
def _clear(self): if os.path.exists(path):
path = os.path.join(self.MakeDir, 'temp') shutil.rmtree(path)
if os.path.exists(path): path = os.path.join(self.MakeDir, 'AndroidManifest.xml')
shutil.rmtree(path) if os.path.exists(path):
path = os.path.join(self.MakeDir, 'AndroidManifest.xml') os.remove(path)
if os.path.exists(path):
os.remove(path) def _make(self):
"""
def _make(self): 重新编译包
""" :return:
重新编译包 """
:return: for i in range(self.start, self.packNum):
""" self.modify_channel(i)
for i in range(self.start, self.packNum):
self.modify_channel(i) def run(self):
try:
def run(self): self._init_props()
try: self._init_path()
self._init_props() is_ok, msg = self.check_props()
self._init_path() if not is_ok:
is_ok, msg = self.check_props() return False, msg
if not is_ok: self._unpack(self.master_package)
return False, msg self._make()
self._unpack(self.master_package) self._clear()
self._make() except Exception as e:
self._clear() return False, str(e)
except Exception as e: else:
return False, str(e) return True, 'ok'
else:
return True, 'ok'