Example #1
0
    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()
Example #2
0
    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']
Example #3
0
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)
Example #4
0
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)
Example #5
0
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)
Example #6
0
    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]