def initDatabase(self): """get the data from database.""" cf = ConfigParser.ConfigParser() cf.read(file_operate.get_server_dir()+"/config/db_config.ini") self.db_host = cf.get("mysqlconf", "host") self.db_port = cf.getint("mysqlconf", "port") self.db_user = cf.get("mysqlconf", "user") self.db_pwd = cf.get("mysqlconf", "password") self.db_sdk_name = cf.get("mysqlconf", "sdkdbname") cx = MySQLdb.connect(host=self.db_host, port=self.db_port, user=self.db_user, passwd=self.db_pwd) cx.select_db(self.db_sdk_name) self.readSDKLs(cx) cx.close()
def readUserDatabase(self): """get the config about user's sdk from database""" cf = ConfigParser.ConfigParser() cf.read(file_operate.get_server_dir()+"/config/db_config.ini") self.db_host = cf.get("mysqlconf", "host") self.db_port = cf.getint("mysqlconf", "port") self.db_user = cf.get("mysqlconf", "user") self.db_pwd = cf.get("mysqlconf", "password") cx = MySQLdb.connect(host=self.db_host, port=self.db_port, user=self.db_user, passwd=self.db_pwd) cx.select_db(self._db_name) #self.readSDKVersionLs(cx) # self.readChannelCustomLs(cx) 7.12 self.readChannel(cx) self.readChannelSdk(cx) self.readUserSDKConfig(cx) self.readUserSDKParam(cx) self.readGameLs(cx) # self.readUserSource(cx) # self.readProjFolder(cx) # self.readProjSDKPath(cx) self.readOutputDir(cx) self.readPackage(cx) self.read_res_for_replace(cx) self.read_sub_channel_database(cx) # self.readTargetName(cx) #从user.xml里读取targetName cx.close() game = self.getCurrentGame() if game is None: print 'game == None' return self._keystore['file'] = game['keystoreFile'] self._keystore['storepassword'] = game['keystorePwd'] self._keystore['keyalias'] = game['keystoreAlias'] self._keystore['aliaspassword'] = game['keystoreAliasPwd']
def split_apk(db_name, game_id, id_channel, parent_apk_path, sub_apk_path, sub_channel_id): reload(sys) sys.setdefaultencoding('utf8') log_dir = '%s/%s/%s' % (db_name, game_id, id_channel) ConfigParse.shareInstance().set_log_dir(log_dir) if not os.path.exists(parent_apk_path): logError('parent apk not exist', log_dir) print '{"ret":"fail","msg":"parent apk not exist"}' return middle_dir = '%s/%s' % (db_name, sub_channel_id) split_work_dir = file_operate.get_server_dir( ) + '/split_workspace/%s' % middle_dir print 'split_work_dir:' + split_work_dir if os.path.exists(split_work_dir): file_operate.delete_file_folder(split_work_dir) os.makedirs(split_work_dir) split_decompile_dir = split_work_dir + '/decompile' os.mkdir(split_decompile_dir) channel_temp_apk_dir = split_work_dir + '/temp' os.mkdir(channel_temp_apk_dir) channel_temp_apk = channel_temp_apk_dir + '/temp.apk' file_operate.copyFile(parent_apk_path, channel_temp_apk) ret = apk_operate.decompileApk(channel_temp_apk, split_decompile_dir, None) if ret: logError('decompileApk parent apk fail', log_dir) print '{"ret":"fail","msg":"decompileApk parent apk fail"}' return ConfigParse.shareInstance().readUserConfig(0) sub_channel_config = ConfigParse.shareInstance().get_sub_channel_config() sub_channel_icon_url = None display_name = None sub_app_id = '' sub_num = '' if len(sub_channel_config) > 0: for r in sub_channel_config: if int(id_channel) != int(r['p_channel_id']): logError('param channel id is not right', log_dir) print '{"ret":"fail","msg":"param channel id is not right"}' return if int(game_id) != int(r['game_id']): logError('param game id is not right', log_dir) print '{"ret":"fail","msg":"param game id is not right"}' return if r['r_channel_game_icon'] is None: sub_channel_icon_url = '' else: sub_channel_icon_url = r['r_channel_game_icon'] if r['display_name'] is None: display_name = '' else: display_name = r['display_name'].encode('utf-8') sub_app_id = str(r['sub_app_id']) print 'sub_app_id: %s' % sub_app_id sub_num = str(r['sub_num']) else: logError('sub channel config is empty', log_dir) print '{"ret":"fail","msg":"sub channel config is empty"}' return if sub_app_id == 0 or sub_num == 0: log_info = 'ret:fail,msg:sub_app_id and sub_num == 0' logError(log_info, log_dir) return if display_name != '' and display_name is not None: apk_operate.doModifyAppName(split_decompile_dir, display_name) if sub_channel_icon_url != '' and sub_channel_icon_url is not None: channel_icon_dir = split_work_dir + '/icon/' os.mkdir(channel_icon_dir) urllib.urlretrieve(sub_channel_icon_url, channel_icon_dir + 'icon.png') ret = apk_operate.pushIconIntoApk(channel_icon_dir, split_decompile_dir) if ret: logError('pushIconIntoApk error', log_dir) return ret = encode_operate.decodeXmlFiles(split_decompile_dir) if ret: logError('decodeXmlFiles error', log_dir) return channel = ConfigParse.shareInstance().findChannel(int(id_channel)) sdk_dir = split_work_dir + '/sdk/' for channel_sdk in channel['sdkLs']: id_sdk = channel_sdk['idSDK'] SDK = ConfigParse.shareInstance().findSDK(id_sdk) if SDK is None: continue split_script_src_dir = file_operate.get_server_dir( ) + '/config/sdk/' + SDK['SDKName'] + '/specialsplit_script.pyc' split_script_src_dir = file_operate.getFullPath(split_script_src_dir) if not os.path.exists(split_script_src_dir): continue split_script_dest_dir = sdk_dir + SDK[ 'SDKName'] + '/specialsplit_script.pyc' file_operate.copyFiles(split_script_src_dir, split_script_dest_dir) SDKDir = sdk_dir + SDK['SDKName'] sys.path.append(SDKDir) import specialsplit_script print 'sub_app_id:' + sub_app_id ret = specialsplit_script.script(split_decompile_dir, sub_app_id, sub_num) del sys.modules['specialsplit_script'] sys.path.remove(SDKDir) if ret: logError("error do Special Operate", log_dir) print "error do Special Operate" return ret = change_develop_id(split_decompile_dir, sub_app_id, sub_num) print 'change_develop_id ret:%s' % ret if ret: logError('change develop id error', log_dir) return encode_operate.encodeXmlFiles(split_decompile_dir) channel_unsign_apk = channel_temp_apk_dir + '/channel_temp_apk.apk' ret = apk_operate.recompileApk(split_decompile_dir, channel_unsign_apk) if ret: logError("recompileApk fail", log_dir) print "recompileApk fail" return game = ConfigParse.shareInstance().getCurrentGame() if game is None: print 'game is none' logError('game is none', log_dir) return ret = apk_operate.signApkAuto(channel_unsign_apk, game, channel, middle_dir) if ret: print 'signApkAuto fail' logError('signApkAuto fail', log_dir) return out_put_dir = os.path.dirname(sub_apk_path) ret = apk_operate.alignAPK(channel_unsign_apk, sub_apk_path, out_put_dir) if ret: print 'alignAPK fail' logError('alignAPK fail', log_dir) return print '{"ret":"success","msg":"run pack success"}' file_operate.delete_file_folder(split_work_dir)
def deleteWorkspace(channel): idChannel = channel['idChannel'] workDir = file_operate.get_server_dir() + '/workspace/%s/%s' % ( ConfigParse.shareInstance().getDBName(), idChannel) workDir = file_operate.getFullPath(workDir) file_operate.delete_file_folder(workDir)
def main(channel): # 调用函数 8.4 inspectJDK() source = ConfigParse.shareInstance().getSource() if os.path.isdir(source): error_operate.error(3000) return # buildGradle(channel) else: idChannel = channel.get('idChannel') channelName = channel.get('name') channelNum = channel.get('channelNum') ConfigParse.shareInstance().set_channel_num(channelNum) extChannel = channel.get('extChannel') threading.currentThread().setName(idChannel) taskManager.shareInstance().notify(idChannel, 5) # source = ConfigParse.shareInstance().getSource() basename = os.path.basename(source) exttuple = os.path.splitext(basename) taskLock = taskManager.shareInstance().getLock() basename = exttuple[0] extname = exttuple[1] game = ConfigParse.shareInstance().getCurrentGame() if game is None: error_operate.error(3) return versionName = ConfigParse.shareInstance().getVersionName() print '<---Parent apk versionName-->%s' % (versionName) keystore = ConfigParse.shareInstance().getKeyStore() print '<---Game keystore info-->%s' % (keystore) if channelName is None: error_operate.error(5) return taskManager.shareInstance().notify(idChannel, 10) # file_operate.execFormatCmd('chmod -R 777 %s' % (file_operate.get_server_dir()+'/workspace/')) workDir = file_operate.get_server_dir() + '/workspace/%s/%s' % ( ConfigParse.shareInstance().getDBName(), idChannel) workDir = file_operate.getFullPath(workDir) file_operate.delete_file_folder(workDir) if not os.path.exists(source): error_operate.error(60) return tmpApkSource = workDir + '/temp.apk' file_operate.copyFile(source, tmpApkSource) print 'tmpApkSource-->' + tmpApkSource decompileDir = workDir + '/decompile' ret = apk_operate.decompileApk(tmpApkSource, decompileDir, taskLock) print 'step--decompileAPK--RET-->%d' % (ret) if ret: return unknownFile = decompileDir + '/AddForRoot' if os.path.exists(decompileDir + '/unknown'): os.rename(decompileDir + '/unknown', unknownFile) # oldPackageName = apk_operate.getPackageName(decompileDir) # isCocosPlay = apk_operate.checkForCocosPlay(decompileDir, channel, oldPackageName) # if isCocosPlay: # ret = apk_operate.renameApkForCocosPlay(decompileDir, oldPackageName, channel['packNameSuffix'], game, # channel, taskLock) # if ret: # return # ConfigParse.shareInstance().setCocosPlayMode(isCocosPlay) apk_operate.replace_custom_res(decompileDir) taskManager.shareInstance().notify(idChannel, 20) SmaliDir = decompileDir + '/smali' SDKWorkDir = workDir + '/sdk/' for Channel_SDK in channel['sdkLs']: idSDK = Channel_SDK['idSDK'] SDK = ConfigParse.shareInstance().findSDK(idSDK) if SDK == None: continue SDKSrcDir = file_operate.get_server_dir( ) + '/config/sdk/' + SDK['SDKName'] SDKSrcDir = file_operate.getFullPath(SDKSrcDir) SDKDestDir = SDKWorkDir + SDK['SDKName'] file_operate.copyFiles(SDKSrcDir, SDKDestDir) if os.path.exists(SDKDestDir + '/ForRes/drawable-xxxhdpi'): if file_operate.getTargetSdkVersion(tmpApkSource) < 18: file_operate.delete_file_folder(SDKDestDir + '/ForRes/drawable-xxxhdpi') taskManager.shareInstance().notify(idChannel, 30) for Channel_SDK in channel['sdkLs']: idSDK = Channel_SDK['idSDK'] SDK = ConfigParse.shareInstance().findSDK(idSDK) if SDK == None: continue SDKDir = SDKWorkDir + SDK['SDKName'] SDKDex = os.path.join(SDKDir, 'classes.dex') SDKDex = file_operate.getFullPath(SDKDex) ret = apk_operate.dexTrans2Smali(SDKDex, SmaliDir, 4, 'baksmali.jar') if ret: return taskManager.shareInstance().notify(idChannel, 35) decompileSmaliDir = decompileDir + '/smali' maniFestFile = decompileDir + '/AndroidManifest.xml' newPackagename = apk_operate.renameApkPackage( decompileSmaliDir, maniFestFile, channel['packNameSuffix'], channel['r_bundle_id']) #reset apk version if channel['r_gameversion_build'] != '' and channel[ 'r_gameversion'] != '': apk_operate.resetApkVersion(maniFestFile, channel['r_gameversion_build'], channel['r_gameversion']) file_operate.printf("Reset ApkVersion success") taskManager.shareInstance().notify(idChannel, 45) print '<---- decompileDir:%s ---->' % (decompileDir) print '<---- channel:%s ---->' % (channel) print '<---- game:%s ---->' % (game) apk_operate.writeChannelInfoIntoDevelopInfo(decompileDir, channel, game) apk_operate.writeSupportInfo(decompileDir) taskManager.shareInstance().notify(idChannel, 50) bExecuteSpecialScipt = False for Channel_SDK in channel['sdkLs']: idSDK = Channel_SDK['idSDK'] UsrSDKConfig = ConfigParse.shareInstance().findUserSDKConfigBySDK( idSDK, channel['idChannel']) SDK = ConfigParse.shareInstance().findSDK(idSDK) if SDK == None: continue ret = apk_operate.packResIntoApk(SDKWorkDir, SDK, decompileDir, newPackagename, UsrSDKConfig) if ret: return SDKVersionInfo = ConfigParse.shareInstance().findSDKVersion( SDK['SDKName']) if SDKVersionInfo is not None: SDK['showVersion'] = SDKVersionInfo['showVersion'] print '<---- SDK:%s ---->' % (SDK) print '<---- UsrSDKConfig:%s ---->' % (UsrSDKConfig) ret = apk_operate.configDeveloperInfo(channel, SDK, UsrSDKConfig, decompileDir) if ret: return # apk_operate.downloadUserConfigFile(channel,game,UsrSDKConfig) for child in SDK['operateLs']: if child['name'] == 'script' or child['name'] == 'Script': bExecuteSpecialScipt = True break taskManager.shareInstance().notify(idChannel, 65) # bMergeR = False ret, bMergeR = apk_operate.addSplashScreen(channel, decompileDir) if ret: return ret = encode_operate.encodeXmlFiles(workDir + '/decompile') if ret: return taskManager.shareInstance().notify(idChannel, 60) if bExecuteSpecialScipt: ret = special_script.doSpecialOperate(channel, decompileDir, newPackagename, SDKWorkDir) if ret: return taskManager.shareInstance().notify(idChannel, 70) if extChannel.find("androidsupportv4") != -1: print 'handle androidsupportv4 resource' androidsupportv4dex = decompileDir + '/../../../../config/channel/android-support-v4.dex' if os.path.exists(androidsupportv4dex): samilDir = decompileDir + '/smali' ret = apk_operate.dexTrans2Smali(androidsupportv4dex, samilDir, 10) if ret: print('copy androidsupportv4 dex to smali fail') return else: print('androidsupportv4.dex is not exists') return if (ConfigParse.shareInstance().getChannelIcon(idChannel) != ''): iconDir = file_operate.get_server_dir( ) + '/workspace/' + ConfigParse.shareInstance().getOutputDir( ) + '/icon/' if not os.path.exists(iconDir): os.makedirs(iconDir) urllib.urlretrieve( ConfigParse.shareInstance().getChannelIcon(idChannel), iconDir + 'icon.png') ret = apk_operate.pushIconIntoApk(iconDir, decompileDir) if ret: return # newAppName = ConfigParse.shareInstance().getAppName() #modify app display name by game setting # apk_operate.modifyAppName(game, decompileDir, newAppName) # modify app display name by channel setting #if channel display_name is not null,the app displayname will be set by channel apk_operate.modifyAppNameByChannel(channel, decompileDir) apk_operate.writeDataIntoAndroidManifest(decompileDir, channel) taskManager.shareInstance().notify(idChannel, 75) ret = apk_operate.produceNewRFile(newPackagename, decompileDir) if ret: return ret = apk_operate.splitDex(workDir, channel) if ret: return taskManager.shareInstance().notify(idChannel, 80) tempApkDir = workDir + '/tempApk' tempApkDir = file_operate.getFullPath(tempApkDir) tempApkName = '%s/game_%s_%s%s' % (tempApkDir, channel['idChannel'], versionName, extname) apk_operate.encryptApkByDeveloper(decompileDir) ret = apk_operate.recompileApk(decompileDir, tempApkName) if ret: return print '<---recompileApk success--->' taskManager.shareInstance().notify(idChannel, 90) for Channel_SDK in channel['sdkLs']: idSDK = Channel_SDK['idSDK'] SDK = ConfigParse.shareInstance().findSDK(idSDK) if SDK == None: continue SDKSrcDir = file_operate.get_server_dir( ) + '/config/sdk/' + SDK['SDKName'] SDKSrcDir = file_operate.getFullPath(SDKSrcDir) ForRootDir = SDKSrcDir + '/ForRootDir' if os.path.exists(ForRootDir): apk_operate.addForRootDir(tempApkName, ForRootDir) if os.path.exists(unknownFile): apk_operate.addForRootDir(tempApkName, unknownFile) ret = apk_operate.signApkAuto(tempApkName, game, channel) if ret: return #outputDir = ConfigParse.shareInstance().getOutputDir() #print '<---outputDir--->'+outputDir #if outputDir == '': # outputDir = '../' #get date for apk file name import time # dateStr = time.strftime("%Y%m%d%H%M%S") #get final apk name finalAppName = '' print '<---start rename apk--->' # if game.get('isModifyAppName') is not None and game['isModifyAppName'] != False: # finalAppName = game.get('gameName').encode('utf-8') # display_name = channel['display_name'].encode('utf-8') # if display_name is not None and display_name != '': # finalAppName = display_name # # if finalAppName == '': # finalAppName = game.get('gameName') # channel_name = channel['name'].encode('utf-8') #outputDir += '/' + game['gameName'] + '/' + versionName + '/' + channel_name #outputDir = file_operate.getFullPath(outputDir) #apkName = ('%s/%s_%s_%s_%s%s' % (outputDir, # finalAppName, # channel_name, # versionName, # dateStr, # extname)).encode('utf-8') apkName = ConfigParse.shareInstance().getOutPutApkName() print '<---Apk PATH--->' + apkName #if platform.system() == 'Windows': # apkName = '%s/game_%s%s' % (outputDir, versionName, extname) # print '<---apk path:'+apkName+'--->' strlist = apkName.split('/') outputDir = apkName.replace('/' + strlist[len(strlist) - 1], '') print '<---outputDir--->' + outputDir ret = apk_operate.alignAPK(tempApkName, apkName, outputDir) if ret: print '{"ret":"fail","msg":"run pack fail"}' return print '{"ret":"success","msg":"run pack success"}' taskManager.shareInstance().notify(idChannel, 100)
def findSDK(self, idSDK): """check SDK whether has OperateLs""" SDK = self.__SDKLs.get(idSDK) if SDK is None: return SDK while True: if SDK['operateLs'] is not None and len(SDK['operateLs']) > 0: break configPath = file_operate.get_server_dir()+'/config/sdk/' + SDK['SDKName'] + '/config.xml' configPath = file_operate.getFullPath(configPath) if not os.path.exists(configPath): break targetTree = ET.parse(configPath) targetRoot = targetTree.getroot() if targetRoot is None: break operateLsNode = targetRoot.find('operateLs') if operateLsNode is None: break for operateNode in operateLsNode: dictTemp = {} dictTemp['name'] = operateNode.get('name') if operateNode.get('step') is not None: dictTemp['step'] = int(operateNode.get('step')) dictTemp['from'] = operateNode.get('from') dictTemp['to'] = operateNode.get('to') dictTemp['desc'] = operateNode.get('desc') dictTemp['idSDK'] = int(SDK.get('idSDK')) SDK['operateLs'].append(dictTemp) if SDK['pluginLs'] is not None and len(SDK['pluginLs']) > 0: break pluginLsNode = targetRoot.find('pluginLs') if pluginLsNode is None: break for pluginNode in pluginLsNode: dictTemp = {} dictTemp['name'] = pluginNode.get('name') if pluginNode.get('typePlugin') is not None: dictTemp['typePlugin'] = int(pluginNode.get('typePlugin')) dictTemp['desc'] = pluginNode.get('desc') dictTemp['idSDK'] = int(SDK.get('idSDK')) SDK['pluginLs'].append(dictTemp) if not SDK['bHasChildSDK']: break if SDK['SDKLs'] is not None and len(SDK['SDKLs']) > 0: break SDKLsNode = targetRoot.find('SDKLs') if SDKLsNode is None: break for SDKNode in SDKLsNode: dictTemp = {} dictTemp['SDKName'] = SDKNode.get('SDKName') dictTemp['SDKType'] = SDKNode.get('SDKType') dictTemp['SDKShowName'] = SDKNode.get('SDKShowName') ParamLsNode = SDKNode.find('param') if ParamLsNode is None: continue for param in ParamLsNode: dictParam = {} dictParam['name'] = param.get('name') dictParam['required'] = param.get('required') dictParam['desc'] = param.get('desc') dictParam['showName'] = param.get('showName') dictParam['bWriteIntoManifest'] = param.get('bWriteIntoManifest') dictParam['bWriteIntoClient'] = param.get('bWriteIntoClient') dictTemp['param'] = dictParam SDK['SDKLs'].append(dictTemp) break return self.__SDKLs[idSDK]