def signApk(apkFile, keyStore, storepassword, keyalias, aliaspassword):
    if not os.path.exists(keyStore):
        print keyStore
        return 0
    apkFile = file_operate.getFullPath(apkFile)
    keyStore = file_operate.getFullPath(keyStore)
    aapt = file_operate.getToolPath('aapt')
    listcmd = '%s list %s' % (aapt, apkFile)
    listcmd = listcmd.encode('gb2312')
    output = os.popen(listcmd).read()
    for filename in output.split('\n'):
        if filename.find('META-INF') == 0:
            rmcmd = '"%s" remove "%s" "%s"' % (aapt, apkFile, filename)
            bReturn = file_operate.execFormatCmd(rmcmd)

    jarsingnCmd = '"%sjarsigner" -keystore "%s" -storepass "%s" -keypass "%s" "%s" "%s" -sigalg SHA1withRSA -digestalg SHA1' % (
        file_operate.getJavaBinDir(), keyStore, storepassword, aliaspassword,
        apkFile, keyalias)

    print jarsingnCmd
    ret = file_operate.execFormatCmd(jarsingnCmd)
    if ret:
        error_operate.error(140)
        return 1
    return 0
Exemplo n.º 2
0
def processAdvertising(channel, checkBox_2_isChecked, comboBox_6_currentText):
    if not checkBox_2_isChecked:
        return
    
    advertisingPath = file_operate.getAdvertisingPath()
    thirdAdvertisingName = comboBox_6_currentText
    thirdAdvertisingPath = advertisingPath + '/' + str(thirdAdvertisingName)
    print "..........", thirdAdvertisingPath
    file_operate.copyFiles(thirdAdvertisingPath + "/jar", constant.tmpPath + '/' + channel + "/jar")
    if platform.system() == 'Windows':
        dxTool = file_operate.getToolPath('dx.bat')
    else:
        dxTool = file_operate.getToolPath('dx')
#     cmd = '"%s" --dex --output="%s" "%s"' % (dxTool, file_operate.getFullPath(constant.tmpPath+'/'+channel+"/classes.dex"), file_operate.getFullPath(constant.tmpPath+'/'+channel+"/jar")) #合并jar
    cmd = '"%s" --multi-dex --dex --output="%s" "%s"' % (dxTool, file_operate.getFullPath(constant.tmpPath + '/' + channel), file_operate.getFullPath(constant.tmpPath + '/' + channel + "/jar"))  # 合并jar
    print "cmd" + cmd
    ret = file_operate.execFormatCmd(cmd)
    if ret:
        error_operate.error(104)
        return
    
    if (os.path.exists(thirdAdvertisingPath + "/advertisingScript.pyc")):
        file_operate.copyFile(thirdAdvertisingPath + "/advertisingScript.pyc", file_operate.getFullPath(constant.tmpPath + '/' + channel) + "/advertisingScript.pyc")
    
    # 合并ForManifest.xml
    manifestFile = file_operate.getFullPath(constant.tmpPath + '/' + channel + "/ForManifest.xml")
    ET.register_namespace('android', constant.androidNS)
    targetTree = ET.parse(manifestFile)
    targetRoot = targetTree.getroot()
    
    haveChanged = modifyManifest.doModifyForManifest(manifestFile, thirdAdvertisingPath + "/ForManifest.xml", targetRoot)
    if haveChanged:
        targetTree.write(manifestFile, 'UTF-8')
def copyMetaDataToAndroidManifest(configFile, manifestFile):

    ET.register_namespace('android', androidNS)
    configTree = ET.parse(configFile)
    configRoot = configTree.getroot()
    metaConfig = configRoot.find("metaconfig")
    if metaConfig is None:
        return
    metaConfigList = metaConfig.findall("meta-data")

    targetTree = ET.parse(manifestFile)
    targetRoot = targetTree.getroot()
    key = '{' + androidNS + '}name'
    value = '{' + androidNS + '}value'
    applicationNode = targetRoot.find('application')
    if applicationNode is None:
        error_operate.error(110)
        return
    metaListNode = applicationNode.findall('meta-data')
    for metaNode in metaListNode:
        name = metaNode.attrib[key]
        for child in metaConfigList:
            if child.attrib[key] == name:
                metaListNode.remove(metaNode)

    for child in metaConfigList:
        metaNode = SubElement(applicationNode, "meta-data")
        metaNode.set(key, child.attrib[key])
        metaNode.set(value, child.attrib[value])

    targetTree.write(manifestFile, 'UTF-8')
    file_operate.printf(
        'write funcellconfig.xml meta-data into AndroidManifest.xml success')
def writeDeveloperIntoManifest(SDK, usrSDKConfig, decompileDir):
    """"""
    manifestFile = decompileDir + '/AndroidManifest.xml'
    ET.register_namespace('android', androidNS)
    targetTree = ET.parse(manifestFile)
    targetRoot = targetTree.getroot()
    key = '{' + androidNS + '}name'
    value = '{' + androidNS + '}value'
    applicationNode = targetRoot.find('application')
    if applicationNode is None:
        error_operate.error(110)
        return
    metaListNode = applicationNode.findall('meta-data')
    for metaNode in metaListNode:
        name = metaNode.attrib[key]
        for child in usrSDKConfig['param']:
            if child['name'] == name and child['bWriteIntoManifest'] == 1:
                metaListNode.remove(metaNode)

    for child in usrSDKConfig['param']:
        if child['bWriteIntoClient']:
            if child['bWriteIntoManifest'] is not None and child[
                    'bWriteIntoManifest'] == 1:
                metaNode = SubElement(applicationNode, 'meta-data')
                metaNode.set(key, child['name'])
                metaNode.set(value, child['value'])

    targetTree.write(manifestFile, 'UTF-8')
    file_operate.printf(
        'write Developer Infomation into AndroidManifest.xml success')
def alignAPK(tempApkFile, apkFile, outputDir):
    if not os.path.exists(outputDir):
        os.makedirs(outputDir)
    align = file_operate.getToolPath('zipalign')
    aligncmd = '"%s" -f 4 "%s" "%s"' % (align, tempApkFile, apkFile)
    ret = file_operate.execFormatCmd(aligncmd)
    if ret:
        error_operate.error(250)
        return 1
    return 0
Exemplo n.º 6
0
def decodeXmlFiles(workDir):
    devInfo = workDir + '/assets/developerInfo.xml'
    supPlug = workDir + '/assets/supportPlugin.xml'
    if not os.path.exists(devInfo):
        error_operate.error(112)
        return 1
    xmlDecode(devInfo)
    if os.path.exists(supPlug):
        xmlDecode(supPlug)
    return 0
Exemplo n.º 7
0
def processMedia(channel, checkBox_voice_isChecked, comboBox_voice_currentText):
    print"----------begin processMedia--------------"
    if not checkBox_voice_isChecked:
        return
    print"----------select path--------------"
    mediaPath = file_operate.getMediaPath()
    print "path= "+comboBox_voice_currentText
    thirdMediaName = unicode(comboBox_voice_currentText)
    thirdMediaPath = mediaPath + '/' + thirdMediaName
    print "thirdMediaPath= "+thirdMediaPath
    file_operate.copyFiles(thirdMediaPath + "/jar", constant.tmpPath + '/' + channel + "/jar")
    print"----------select windows--------------"
    if platform.system() == 'Windows':
        dxTool = file_operate.getToolPath('dx.bat')
    else:
        dxTool = file_operate.getToolPath('dx')
#     cmd = '"%s" --dex --output="%s" "%s"' % (dxTool, file_operate.getFullPath(constant.tmpPath+'/'+channel+"/classes.dex"), file_operate.getFullPath(constant.tmpPath+'/'+channel+"/jar")) #合并jar
    cmd = '"%s" --multi-dex --dex --output="%s" "%s"' % (dxTool, file_operate.getFullPath(constant.tmpPath + '/' + channel), file_operate.getFullPath(constant.tmpPath + '/' + channel + "/jar"))  # 合并jar
    ret = file_operate.execFormatCmd(cmd)
    if ret:
        error_operate.error(104)
        return
    print"-----------copy libs-------------"
    # copy libs
    targetDir = file_operate.getFullPath(constant.tmpPath + '/' + channel)
    oldApkDir = targetDir + "/oldApkDir"
    if os.path.exists(thirdMediaPath + "/ForLibs"):
        if os.path.exists(oldApkDir + "/lib/armeabi") and os.path.exists(thirdMediaPath + "/ForLibs/armeabi"):
            operate.copyResToApk(thirdMediaPath + "/ForLibs/armeabi", oldApkDir + "/lib/armeabi")
        if os.path.exists(oldApkDir + "/lib/armeabi-v7a") and os.path.exists(thirdMediaPath + "/ForLibs/armeabi-v7a"):
            operate.copyResToApk(thirdMediaPath + "/ForLibs/armeabi-v7a", oldApkDir + "/lib/armeabi-v7a")
        if os.path.exists(oldApkDir + "/lib/x86") and os.path.exists(thirdMediaPath + "/ForLibs/x86"):
            operate.copyResToApk(thirdMediaPath + "/ForLibs/x86", oldApkDir + "/lib/x86")
    print"-----------copy res-------------"
     # copy res
    if os.path.exists(thirdMediaPath + "/ForRes"):
        operate.copyResToApk(thirdMediaPath + "/ForRes", oldApkDir + "/res")
        
    print"-----------copy pushScript-------------"    
    # copy pushScript
    file_operate.copyFile(thirdMediaPath + "/pushScript.pyc", targetDir + "/pushScript.pyc")
    print"----------- ForManifest-------------" 
    # 合并ForManifest.xml
    manifestFile = file_operate.getFullPath(constant.tmpPath + '/' + channel + "/ForManifest.xml")
    ET.register_namespace('android', constant.androidNS)
    targetTree = ET.parse(manifestFile)
    targetRoot = targetTree.getroot()
    print"-----------write-------------" 
    haveChanged = modifyManifest.doModifyForManifest(manifestFile, thirdMediaPath + "/ForManifest.xml", targetRoot)
    if haveChanged:
        targetTree.write(manifestFile, 'UTF-8')
    print"-----------comeplete-------------"    
def smaliTrans2dex(smaliDir, targetFile):
    smaliDir = file_operate.getFullPath(smaliDir)
    targetFile = file_operate.getFullPath(targetFile)
    smaliFile = file_operate.getToolPath('smali.jar')
    cmd = '"%s" -jar -Xms512m -Xmx512m "%s" "%s" -o "%s"' % (
        file_operate.getJava(), smaliFile, smaliDir, targetFile)
    ret = file_operate.execFormatCmd(cmd)
    if ret:
        error_operate.error(50)
        return 1
    else:
        file_operate.delete_file_folder('file/smali')
        return 0
def addFileToApk(srcfile, apkFile):
    if os.path.exists(srcfile) and os.path.exists(apkFile):
        apkFile = file_operate.getFullPath(apkFile)
        aapt = file_operate.getToolPath('aapt')
        rmcmd = '"%s" remove "%s" "%s"' % (aapt, apkFile, 'classes.dex')
        bReturn = file_operate.execFormatCmd(rmcmd)
        if bReturn:
            error_operate.error(70)
            return 1
        f = zipfile.ZipFile(apkFile, 'a')
        f.write(srcfile, 'classes.dex')
        f.close()
        file_operate.printf('add file:' + srcfile)
        return 0
def packResIntoApk(SDKWorkDir, SDK, decompileDir, packageName, usrSDKConfig):
    SDKDir = SDKWorkDir + SDK['SDKName']
    for child in SDK['operateLs']:
        if child['name'] == 'modifyManifest':
            modifyFrom = child['from']
            modifyTo = child['to']
            if modifyFrom == None and modifyTo == None:
                file_operate.printf(
                    'Operate error, Please check your config in funcellconfig.xml'
                )
                error_operate.error(100)
                return 1
            modifyFrom = None.path.join(SDKDir, modifyFrom)
            modifyTo = os.path.join(decompileDir, modifyTo)
            modifyFrom = file_operate.getFullPath(modifyFrom)
            modifyTo = file_operate.getFullPath(modifyTo)
            modifyManifest.modify(modifyTo, modifyFrom, SDK['SDKName'],
                                  usrSDKConfig)
            continue
        if child['name'] == 'copy':
            copyFrom = child['from']
            copyTo = child['to']
            if copyFrom == None and copyTo == None:
                file_operate.printf(
                    'Operate error, Please check your config in funcellconfig.xml'
                )
                error_operate.error(101)
                return 1
            copyFrom = None.path.join(SDKDir, copyFrom)
            copyFrom = file_operate.getFullPath(copyFrom)
            copyTo = os.path.join(decompileDir, copyTo)
            copyTo = file_operate.getFullPath(copyTo)
            copyResToApk(copyFrom, copyTo)
            if child['to'] == 'lib':
                armPath = os.path.join(copyFrom, 'armeabi')
                armv7To = os.path.join(copyTo, 'armeabi-v7a')
                if os.path.exists(armPath) and os.path.exists(armv7To):
                    copyResToApk(armPath, armv7To)

        if child['name'] == 'script':
            scriptPath = SDKDir + '/script.pyc'
            if os.path.exists(scriptPath):
                sys.path.append(SDKDir)
                import script
                script.script(SDK, decompileDir, packageName, usrSDKConfig)
                del sys.modules['script']
                sys.path.remove(SDKDir)

    return 0
Exemplo n.º 11
0
def processStatistics(channel, checkBox_isChecked, comboBox_4_currentText):
    if not checkBox_isChecked:
        return
    
    statisticsPath = file_operate.getStatisticsPath()
    thirdStatisticsName = comboBox_4_currentText
    thirdStatisticsPath = statisticsPath + '/' + str(thirdStatisticsName)
    print "..........", thirdStatisticsPath
    file_operate.copyFiles(thirdStatisticsPath + "/jar", constant.tmpPath + '/' + channel + "/jar")
    if platform.system() == 'Windows':
        dxTool = file_operate.getToolPath('dx.bat')
    else:
        dxTool = file_operate.getToolPath('dx')
#     cmd = '"%s" --dex --output="%s" "%s"' % (dxTool, file_operate.getFullPath(constant.tmpPath+'/'+channel+"/classes.dex"), file_operate.getFullPath(constant.tmpPath+'/'+channel+"/jar")) #合并jar
    cmd = '"%s" --multi-dex --dex --output="%s" "%s"' % (dxTool, file_operate.getFullPath(constant.tmpPath + '/' + channel), file_operate.getFullPath(constant.tmpPath + '/' + channel + "/jar"))  # 合并jar
    print "cmd" + cmd
    ret = file_operate.execFormatCmd(cmd)
    if ret:
        error_operate.error(104)
        return
    
    # copy libs
    targetDir = file_operate.getFullPath(constant.tmpPath + '/' + channel)
    oldApkDir = targetDir + "/oldApkDir"
    if os.path.exists(statisticsPath + "/ForLibs"):
        if os.path.exists(oldApkDir + "/lib/armeabi") and os.path.exists(statisticsPath + "/ForLibs/armeabi"):
            operate.copyResToApk(statisticsPath + "/ForLibs/armeabi", oldApkDir + "/lib/armeabi")
        if os.path.exists(oldApkDir + "/lib/armeabi-v7a") and os.path.exists(statisticsPath + "/ForLibs/armeabi-v7a"):
            operate.copyResToApk(statisticsPath + "/ForLibs/armeabi-v7a", oldApkDir + "/lib/armeabi-v7a")
        if os.path.exists(oldApkDir + "/lib/x86") and os.path.exists(statisticsPath + "/ForLibs/x86"):
            operate.copyResToApk(statisticsPath + "/ForLibs/x86", oldApkDir + "/lib/x86")
    
    # copy res
    if os.path.exists(statisticsPath + "/ForRes"):
        operate.copyResToApk(statisticsPath + "/ForRes", oldApkDir + "/res")
    
    if (os.path.exists(thirdStatisticsPath + "/statisticsScript.pyc")):
        file_operate.copyFile(thirdStatisticsPath + "/statisticsScript.pyc", file_operate.getFullPath(constant.tmpPath + '/' + channel) + "/statisticsScript.pyc")
    
    # 合并ForManifest.xml
    manifestFile = file_operate.getFullPath(constant.tmpPath + '/' + channel + "/ForManifest.xml")
    ET.register_namespace('android', constant.androidNS)
    targetTree = ET.parse(manifestFile)
    targetRoot = targetTree.getroot()
    
    haveChanged = modifyManifest.doModifyForManifest(manifestFile, thirdStatisticsPath + "/ForManifest.xml", targetRoot)
    if haveChanged:
        targetTree.write(manifestFile, 'UTF-8')
Exemplo n.º 12
0
 def run(self):
     """Overwrite run() method, put what you want the thread do here"""
     while not self.__stop:
         if self.__status == 0:
             time.sleep(1)
         elif self.__status == 1:
             try:
                 os.chdir(self.__curWorkDir)
                 if self.__platform == 0:
                     coreIcon.main(self.__task, self.__channelIconData)
                 elif self.__platform == 1:
                     pass
                 self.__status = 0
             except Exception as e:
                 self.__status = 0
                 error_operate.error(80)
def recompileApk(srcFolder, apkFile, apkTool='apktool2.jar'):
    """
        recompile Apk after decompile apk.
    """
    os.chdir(file_operate.curDir)
    apkFile = file_operate.getFullPath(apkFile)
    srcFolder = file_operate.getFullPath(srcFolder)
    apkTool = file_operate.getToolPath(apkTool)
    print "apkTool" + apkTool
    print "java" + file_operate.getJava()
    if os.path.exists(srcFolder):
        cmd = '"%s" -jar -Xms512m -Xmx512m "%s" -q b -f "%s" -o "%s"' % (
            file_operate.getJava(), apkTool, srcFolder, apkFile)
        ret = file_operate.execFormatCmd(cmd)
        if ret:
            error_operate.error(130)
            return 1
        else:
            return 0
    def run(self):
        """Overwrite run() method, put what you want the thread do here"""
        while not self.__stop:
            if self.__status == 0:
                time.sleep(1)
            elif self.__status == 1:
                try:
                    os.chdir(self.__curWorkDir)
                    if self.__platform == 0:
                        core.main(self.__task,self.__channelJsonData)
                        core.deleteWorkspace(self.__task)
                    elif self.__platform == 1:
                        pass
                        #coreios.main(self.__task)
                        #coreios.deleteWorkspace(self.__task)
                    self.__status = 0
                except Exception as e:
                    self.__status = 0
#                     file_operate.reportError(traceback.format_exc(), int(threading.currentThread().getName()))
                    error_operate.error(80)
def decompileApk(apkFile, targetDir, apkTool='apktool2.jar'):
    """
        Decompile apk
    """
    apkFile = file_operate.getFullPath(apkFile)
    targetDir = file_operate.getFullPath(targetDir)
    apkTool = file_operate.getToolPath(apkTool)
    if os.path.exists(targetDir):
        file_operate.delete_file_folder(targetDir)
    if not os.path.exists(targetDir):
        os.makedirs(targetDir)

    cmd = '"%s" -jar -Xms512m -Xmx512m "%s" -q d -b -f "%s" -o "%s"' % (
        file_operate.getJava(), apkTool, apkFile, targetDir)
    ret = file_operate.execFormatCmd(cmd)
    if ret:
        error_operate.error(80)
        return 1
    else:
        return 0
Exemplo n.º 16
0
 def run(self):
     """Overwrite run() method, put what you want the thread do here"""
     print '<---packThread run()--->'
     while not self.__stop:
         if self.__status == 0:
             time.sleep(1)
         elif self.__status == 1:
             try:
                 os.chdir(self.__curWorkDir)
                 if self.__platform == 0:
                     core.main(self.__task)
                     core.deleteWorkspace(self.__task)
                 # elif self.__platform == 1:
                 #     coreios.main(self.__task)
                 #     coreios.deleteWorkspace(self.__task)
                 self.__status = 0
             except Exception as e:
                 print '<---packThread Exception--->%s' % (e)
                 self.__status = 0
                 file_operate.reportError(
                     traceback.format_exc() + '\r\n%s' % (e),
                     int(threading.currentThread().getName()))
                 error_operate.error(80)
Exemplo n.º 17
0
    def addMetaDataIntoManifestApplication(self, metaKey , metaValue):

        manifestFile = self.__decompileDir + '/AndroidManifest.xml'
        ET.register_namespace('android', androidNS)
        targetTree = ET.parse(manifestFile)
        targetRoot = targetTree.getroot()
        key = '{' + androidNS + '}name'
        value = '{' + androidNS + '}value'
        applicationNode = targetRoot.find('application')
        if applicationNode is None:
            error_operate.error(110)
            return

        metaListNode = applicationNode.findall('meta-data')
        for metaNode in metaListNode:
            name = metaNode.attrib[key]
            if name == metaKey:
                applicationNode.remove(metaNode)

        metaNode = SubElement(applicationNode, 'meta-data')
        metaNode.set(key, metaKey)
        metaNode.set(value, metaValue)
        targetTree.write(manifestFile, 'UTF-8')
Exemplo n.º 18
0
def modifyFileContent(source, fileType, oldContent, newContent):
    if os.path.isdir(source):
        for file in os.listdir(source):
            sourceFile = os.path.join(source, file)
            modifyFileContent(sourceFile, fileType, oldContent, newContent)

    elif os.path.isfile(source) and os.path.splitext(source)[1] == fileType:
        f = open(source, 'r+')
        data = str(f.read())
        f.close()
        bRet = False
        idx = data.find(oldContent)
        while idx != -1:
            data = data[:idx] + newContent + data[idx + len(oldContent):]
            idx = data.find(oldContent, idx + len(oldContent))
            bRet = True

        if bRet:
            fhandle = open(source, 'w')
            fhandle.write(data)
            fhandle.close()
            printf('modify file:%s' % source)
        else:
            error_operate.error(108)
def dexTrans2Smali(dexFile, targetDir, step, baksmali='baksmali.jar'):
    if not os.path.exists(targetDir):
        os.mkdir(targetDir)
    if os.path.exists(dexFile):
        dexFile = file_operate.getFullPath(dexFile)
        smaliFile = file_operate.getToolPath(baksmali)
        targetDir = file_operate.getFullPath(targetDir)
        cmd = '"%s" -jar -Xms512m -Xmx512m "%s" -o "%s" "%s"' % (
            file_operate.getJava(), smaliFile, targetDir, dexFile)
        ret = file_operate.execFormatCmd(cmd)
        if ret:
            if step == 3:
                error_operate.error(30)
                return 1
            elif step == 4:
                error_operate.error(40)
                return 1
            else:
                error_operate.error(105)
                return 1
        else:
            return 0
Exemplo n.º 20
0
 def custom_package_r_file(self, packageName, androidManiFest = 'AndroidManifest.xml'):
     '''
     create custom packageName R file
     :param packageName:
     :param androidManiFest:
     :return:
     '''
     # bMerge = mergeValueXml(decompileFullDir)
     # if bMerge:
     #     error_operate.error(102)
     #     return 1
     fullPath = self.__decompileDir
     tempPath = os.path.dirname(self.__decompileDir)
     tempPath = tempPath + '/tempRFile'
     if os.path.exists(tempPath):
         file_operate.delete_file_folder(tempPath)
     if not os.path.exists(tempPath):
         os.makedirs(tempPath)
     resPath = os.path.join(self.__decompileDir, 'res')
     targetResPath = os.path.join(tempPath, 'res')
     file_operate.copyFiles(resPath, targetResPath)
     genPath = os.path.join(tempPath, 'gen')
     if not os.path.exists(genPath):
         os.mkdir(genPath)
     androidPath = file_operate.getToolPath('android.jar')
     srcManifest = os.path.join(fullPath, androidManiFest)
     aaptPath = file_operate.getToolPath('aapt')
     cmd = '"%s" p -f -m -J "%s" --custom-package "%s" -S "%s" -I "%s" -M "%s"' % (aaptPath,
      genPath,
      packageName,
      targetResPath,
      androidPath,
      srcManifest)
     ret = file_operate.execFormatCmd(cmd)
     if ret:
         error_operate.error(102)
         return 1
     RPath = packageName.replace('.', '/')
     RPath = os.path.join(genPath, RPath)
     RFile = os.path.join(RPath, 'R.java')
     cmd = '"%sjavac" -source 1.7 -target 1.7 -encoding UTF-8 "%s"' % (file_operate.getJavaBinDir(), RFile)
     ret = file_operate.execFormatCmd(cmd)
     if ret:
         error_operate.error(103)
         return 1
     dexPath = os.path.join(tempPath, 'class.dex')
     if platform.system() == 'Windows':
         dxTool = file_operate.getToolPath('dx.bat')
         cmd = '"%s" --dex --output="%s" "%s"' % (dxTool, dexPath, genPath)
     else:
         dxTool = file_operate.getToolPath('/lib/dx.jar')
         cmd = 'java -jar -Xms512m -Xmx512m "%s" --dex --output="%s" "%s"' % (dxTool, dexPath, genPath)
     ret = file_operate.execFormatCmd(cmd)
     if ret:
         error_operate.error(104)
         return 1
     smaliPath = os.path.join(fullPath, 'smali')
     ret = apk_operate.dexTrans2Smali(dexPath, smaliPath, 10, 'baksmali.jar')
     if ret:
         return 1
     else:
         return 0
     pass
                return 1
    except Exception, e:
        print e
        print "Error: cannot parse file: funcellconfig.xml."

    ################################

    dexPath = os.path.join(tempPath, 'class.dex')
    if platform.system() == 'Windows':
        dxTool = file_operate.getToolPath('dx.bat')
    else:
        dxTool = file_operate.getToolPath('dx')
    cmd = '"%s" --dex --output="%s" "%s"' % (dxTool, dexPath, genPath)
    ret = file_operate.execFormatCmd(cmd)
    if ret:
        error_operate.error(104)
        return 1
    smaliPath = os.path.join(fullPath, 'smali')
    ret = dexTrans2Smali(dexPath, smaliPath, 10)
    if ret:
        return 1
    else:
        return 0


def configDeveloperInfo(channel, SDK, usrSDKConfig, decompileDir, privateKey):
    ret = generateDeveloperInfo(channel, SDK, usrSDKConfig, decompileDir,
                                privateKey)
    if ret:
        return 1
    ret = generatePluginInfo(SDK, usrSDKConfig, decompileDir)
Exemplo n.º 22
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)
def generatePluginInfo(SDK, usrSDKConfig, decompileDir):
    """the infomation about Plugin would configure here"""
    assetsDir = decompileDir + '/assets'
    if not os.path.exists(assetsDir):
        os.makedirs(assetsDir)
    PluginFile = assetsDir + '/supportPlugin.xml'
    targetTree = None
    targetRoot = None
    pluginLsNode = None
    if not os.path.exists(PluginFile):
        targetTree = ElementTree()
        targetRoot = Element('support')
        targetTree._setroot(targetRoot)
    else:
        targetTree = ET.parse(PluginFile)
        targetRoot = targetTree.getroot()
    for plugin in SDK['pluginLs']:
        type = plugin['typePlugin']
        typeTag = '<plugin>'
        if type == 0:
            typeTag = 'user_plugin'
            if not usrSDKConfig['type'] & 32:
                continue
        elif type == 1:
            typeTag = 'ads_plugin'
            if not usrSDKConfig['type'] & 16:
                continue
        elif type == 2:
            typeTag = 'iap_plugin'
            if not usrSDKConfig['type'] & 8:
                continue
        elif type == 3:
            typeTag = 'social_plugin'
            if not usrSDKConfig['type'] & 4:
                continue
        elif type == 4:
            typeTag = 'share_plugin'
            if not usrSDKConfig['type'] & 2:
                continue
        elif type == 5:
            typeTag = 'analytics_plugin'
            if not usrSDKConfig['type'] & 1:
                continue
        elif type == 6:
            typeTag = 'push_plugin'
            if not usrSDKConfig['type'] & 64:
                continue
        pluginName = plugin['name']
        if pluginName is None:
            file_operate.printf('pluginName error')
            error_operate.error(109)
            return 1
        pluginLsNode = targetRoot.find(typeTag)
        if pluginLsNode is not None:
            for plugin in pluginLsNode.getchildren():
                if plugin.text == pluginName:
                    pluginLsNode.remove(plugin)

        if pluginLsNode is None:
            pluginLsNode = SubElement(targetRoot, typeTag)
        paramNode = SubElement(pluginLsNode, 'param')
        paramNode.text = pluginName
        paramNode.set('name', SDK['SDKName'])

    targetTree.write(PluginFile, 'UTF-8')
    file_operate.printf('generate supportPlugin.xml success')
    return 0
def pushIconIntoApk(iconPath, decompileDir):

    manifestFile = decompileDir + '/AndroidManifest.xml'
    ET.register_namespace('android', androidNS)
    targetTree = ET.parse(manifestFile)
    targetRoot = targetTree.getroot()
    namekey = '{' + androidNS + '}name'
    key = '{' + androidNS + '}icon'
    icon = None
    applicationNode = targetRoot.find('application')
    if applicationNode is None:
        error_operate.error(121)
        return 1
    activityLsNode = applicationNode.findall('activity')
    if activityLsNode is not None:
        for activityNode in activityLsNode:
            intentLsNode = activityNode.findall('intent-filter')
            if intentLsNode is None:
                continue
            for intentNode in intentLsNode:
                bFindAction = False
                bFindCategory = False
                actionLsNode = intentNode.findall('action')
                for actionNode in actionLsNode:
                    if actionNode.attrib[
                            namekey] == 'android.intent.action.MAIN':
                        bFindAction = True
                        break

                if not bFindAction:
                    continue
                categoryLsNode = intentNode.findall('category')
                for categoryNode in categoryLsNode:
                    if categoryNode.attrib[
                            namekey] == 'android.intent.category.LAUNCHER':
                        bFindCategory = True
                        break

                if bFindAction and bFindCategory:
                    icon = activityNode.attrib.get(key)
                    break

    if icon is None:
        icon = applicationNode.attrib.get(key)
    if icon is None:
        icon = '@drawable/ic_launcher'
        applicationNode.attrib[key] = icon
        targetTree.write(manifestFile, 'UTF-8')
    iconName = 'ic_launcher'
    idxDrawable = icon.find('@drawable')
    if idxDrawable != -1:
        iconName = icon[idxDrawable + 10:]


#     resDir = decompileDir + '/res'
#     iconCopytoDrawable(os.path.join(resDir, 'drawable'), os.path.join(iconPath, 'icon48x48.png'), iconName)
#     iconCopytoDrawable(os.path.join(resDir, 'drawable-ldpi'), os.path.join(iconPath, 'icon36x36.png'), iconName)
#     iconCopytoDrawable(os.path.join(resDir, 'drawable-mdpi'), os.path.join(iconPath, 'icon48x48.png'), iconName)
#     iconCopytoDrawable(os.path.join(resDir, 'drawable-hdpi'), os.path.join(iconPath, 'icon72x72.png'), iconName)
#     iconCopytoDrawable(os.path.join(resDir, 'drawable-xhdpi'), os.path.join(iconPath, 'icon96x96.png'), iconName)
#     iconCopytoDrawable(os.path.join(resDir, 'drawable-xxhdpi'), os.path.join(iconPath, 'icon144x144.png'), iconName)
#     if os.path.exists(os.path.join(resDir, 'drawable-xxxhdpi')):
#         iconCopytoDrawable(os.path.join(resDir, 'drawable-xxxhdpi'), os.path.join(iconPath, 'icon192x192.png'), iconName)

    appendChannelIconMark(iconName, decompileDir)
def produceNewRFile(packName,
                    decompileFullDir,
                    androidManiFest='AndroidManifest.xml'):
    """
        According to the merger of resources to create new R file
    """
    fullPath = decompileFullDir
    tempPath = os.path.dirname(decompileFullDir)
    tempPath = tempPath + '/tempRFile'
    if os.path.exists(tempPath):
        file_operate.delete_file_folder(tempPath)
    if not os.path.exists(tempPath):
        os.makedirs(tempPath)
    resPath = os.path.join(decompileFullDir, 'res')
    targetResPath = os.path.join(tempPath, 'res')
    file_operate.copyFiles(resPath, targetResPath)
    genPath = os.path.join(tempPath, 'gen')
    if not os.path.exists(genPath):
        os.mkdir(genPath)
    androidPath = file_operate.getToolPath('android.jar')
    srcManifest = os.path.join(fullPath, androidManiFest)
    aaptPath = file_operate.getToolPath('aapt')
    cmd = '"%s" p -f -m -J "%s" -S "%s" -I "%s" -M "%s"' % (
        aaptPath, genPath, targetResPath, androidPath, srcManifest)
    ret = file_operate.execFormatCmd(cmd)
    if ret:
        error_operate.error(102)
        return 1
    RPath = packName.replace('.', '/')
    RPath = os.path.join(genPath, RPath)
    RFile = os.path.join(RPath, 'R.java')
    cmd = '"%sjavac" -source 1.7 -target 1.7 -encoding UTF-8 "%s"' % (
        file_operate.getJavaBinDir(), RFile)
    ret = file_operate.execFormatCmd(cmd)
    if ret:
        error_operate.error(103)
        return 1

    #针对某系渠道通过R。xx来获取资源,在指定包名下添加R文件
    try:
        config = ET.parse(file_operate.getConfigXmlPath())
        root = config.getroot()
        Manifest = root.find("Manifest")
        num = int(Manifest.get('num'))
        for i in range(0, num):
            srcManifest_i = os.path.join(
                file_operate.getFullPath(constant.tmpPath),
                'Manifest/' + str(i) + '/AndroidManifest.xml')
            cmd = '"%s" p -f -m -J "%s" -S "%s" -I "%s" -M "%s"' % (
                aaptPath, genPath, targetResPath, androidPath, srcManifest_i)
            ret = file_operate.execFormatCmd(cmd)
            if ret:
                error_operate.error(102)
                return 1
            packageNameArray = Manifest.get('packageNameArray')
            packageNameNode = packageNameArray.split(',')[i]
            RPath = packageNameNode.replace('.', '/')
            RPath = os.path.join(genPath, RPath)
            RFile = os.path.join(RPath, 'R.java')
            cmd = '"%sjavac" -source 1.7 -target 1.7 -encoding UTF-8 "%s"' % (
                file_operate.getJavaBinDir(), RFile)
            ret = file_operate.execFormatCmd(cmd)
            if ret:
                error_operate.error(103)
                return 1
    except Exception, e:
        print e
        print "Error: cannot parse file: funcellconfig.xml."
Exemplo n.º 26
0
def main(channel):
    idChannel = channel.get('idChannel')
    channelName = channel.get('name')
    channelNum = channel.get('channelNum')
    threading.currentThread().setName(idChannel)
    taskManager.shareInstance().notify(idChannel, 20)
    source = ConfigParse.shareInstance().getSource()
    basename = os.path.basename(source)
    exttuple = os.path.splitext(basename)
    basename = exttuple[0]
    extname = exttuple[1]
    originDir = ConfigParse.shareInstance().getProjFolder()
    useSDK = ConfigParse.shareInstance().getProjSDKVersion()
    systemSDKPath = ConfigParse.shareInstance().getProjSDKPath()
    ipaPackage = ConfigParse.shareInstance().getProjIpaPackage()
    game = ConfigParse.shareInstance().getCurrentGame()
    if channelName is None:
        error_operate.error(5)
        return
    versionName = ConfigParse.shareInstance().getVersionName()
    outputDir = ConfigParse.shareInstance().getOutputDir()
    if outputDir == '':
        outputDir = '../'
    #cocos2dx need cocos2dx framework,so we must put release pdroject to cocos2dx dictionary
    #outputDir += '/' + game['gameName'] + '/' + versionName + '/' + channel['name']
    outputDir += '/' + channel['name'] + '_' + versionName

    outputDir = file_operate.getFullPath(outputDir)
    outputDir = os.path.realpath(outputDir)
    file_operate.delete_file_folder(outputDir)
    #workDir = outputDir + '/Project_iOS'
    workDir = outputDir
    workDir = file_operate.getFullPath(workDir)
    workDir = os.path.realpath(workDir)
    file_operate.delete_file_folder(workDir)
    iconDir = '../workspace/icon/' + channelNum
    iconDir = file_operate.getFullPath(iconDir)
    iconDir = os.path.realpath(iconDir)
    if not os.path.exists(outputDir):
        os.makedirs(outputDir)
    if not os.path.exists(workDir):
        os.makedirs(workDir)
    file_operate.copyFiles(originDir, workDir)
    pbxFile = workDir + '/' + ConfigParse.shareInstance().getProjXcode(
    ) + '/project.pbxproj'
    target_name = None
    project = XcodeProject.Load(pbxFile)
    #从congfig.py里的getTargetName取到要编译打包的target,没有的话用默认的最后一个target
    if ConfigParse.shareInstance().getTargetName():
        target_name = project_name = ConfigParse.shareInstance().getTargetName(
        )
        print '----config ---- target name ----' + target_name
#        print 'ERROR_>'+target_name+'<_ERROR'
#        print 'WARNING_>'+target_name+'<_WARNING'
    else:
        target_name = project_name = project.get_target_name()

    project_config = project.get_configurations()
    #use release archieve ipa
    project_config = 'Release'
    project.add_other_ldflags('-ObjC')
    project.showSearchPathInfo()
    """add other flag param"""
    #project.add_other_ldflags('-lz')

    if project.modified:
        project.save()
    taskManager.shareInstance().notify(idChannel, 40)
    parentDir = ''
    for parent, dirnames, filenames in os.walk(workDir):
        for filename in filenames:
            if filename == 'Contents.json':
                if parent.find('Images.xcassets/AppIcon.appiconset') != -1:
                    parentDir = parent

    if parentDir != '':
        for parent, dirnames, filenames in os.walk(parentDir):
            for filename in filenames:
                if filename != 'Contents.json':
                    os.remove(parentDir + '/' + filename)

        jsonFile = open(parentDir + '/Contents.json')
        jsonContent = json.load(jsonFile)
        for child in jsonContent['images']:
            imgSize = int(child['size'][0:child['size'].find('x')]) * int(
                child['scale'][0:child['scale'].find('x')])
            imgName = 'Icon-' + str(imgSize) + '.png'
            if os.path.exists(iconDir + '/' +
                              imgName) and not os.path.exists(parentDir + '/' +
                                                              imgName):
                file_operate.copyFile(iconDir + '/' + imgName,
                                      parentDir + '/' + imgName)
            child['filename'] = imgName

        jsonContent = json.dumps(jsonContent)
        jsonFile.close()
        jsonFile = open(parentDir + '/Contents.json', 'w')
        try:
            jsonFile.write(jsonContent)
        finally:
            jsonFile.close()

    project_infoplist = workDir + '/' + ConfigParse.shareInstance(
    ).getProjXcode() + '/../' + project.get_infoplistfile()
    newAppName = ''
    if game.get(
            'isModifyiOSName') is not None and game['isModifyiOSName'] == True:
        newAppName = ConfigParse.shareInstance().getIosName()
        if newAppName is None or newAppName == '':
            newAppName = game.get('gameName')
    #set display name by channel
    if channel['display_name'] != '':
        newAppName = channel['display_name']

    customBundleId = channel['r_bundle_id']
    if os.path.exists(project_infoplist) and (
            newAppName != '' or channel['packNameSuffix'] != ''
            or channel['r_gameversion'] != ''
            or channel['r_gameversion_build'] != '' or customBundleId != ''):
        plistModify = False
        try:
            plist = readPlist(project_infoplist)
            for key in plist:
                if key == 'CFBundleName' and newAppName != '':
                    plist['CFBundleName'] = newAppName
                    plistModify = True
                elif key == 'CFBundleIdentifier':
                    if customBundleId == '':
                        plist['CFBundleIdentifier'] = plist[
                            'CFBundleIdentifier'] + channel['packNameSuffix']
                    else:
                        plist['CFBundleIdentifier'] = customBundleId
                    plistModify = True
                elif key == 'CFBundleShortVersionString' and channel[
                        'r_gameversion'] != '':
                    plist['CFBundleShortVersionString'] = channel[
                        'r_gameversion']
                    plistModify = True
                elif key == 'CFBundleVersion' and channel[
                        'r_gameversion_build'] != '':
                    plist['CFBundleVersion'] = channel['r_gameversion_build']
                    plistModify = True

            if plistModify == True:
                try:
                    writePlist(plist, project_infoplist)
                    project.modify_bundle_identifier(
                        plist['CFBundleIdentifier'])
                    project.save()
                except Exception as e:
                    print 'modify bundle Id/bundle Name Error:' + e

        except:
            print 'No Plist found'

    writeChannelInfoIntoDevelopInfo(workDir, channel, game)
    writeSupportInfo(workDir)
    SDKWorkDir = workDir + '/sdk/'
    list = [0, 2, 1, 3, 4, 5, 6]
    for count in range(len(list)):
        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
            for plugin in SDK['pluginLs']:
                type = plugin['typePlugin']
                if type == list[count]:
                    SDKSrcDir = '../config/sdk/' + SDK['SDKName']
                    SDKSrcDir = file_operate.getFullPath(SDKSrcDir)
                    SDKDestDir = SDKWorkDir + SDK['SDKName']
                    SDKDestDir = os.path.realpath(SDKDestDir)
                    if os.path.exists(SDKDestDir):
                        continue
                    file_operate.copyFiles(SDKSrcDir, SDKDestDir)
                    lib_path = 'sdk/' + SDK['SDKName'] + '/'
                    project = XcodeProject.Load(pbxFile)
                    scriptPath = SDKDestDir + '/script.pyc'
                    if os.path.exists(scriptPath):
                        sys.path.append(SDKDestDir)
                        import script
                        script.script(SDK, workDir, target_name, usrSDKConfig,
                                      SDKDestDir, project)
                        del sys.modules['script']
                        sys.path.remove(SDKDestDir)
                    if os.path.exists(SDKDestDir + '/Frameworks'):
                        addFrameworkGroupPath(SDKDestDir + '/Frameworks',
                                              target_name, project)

                    if os.path.exists(SDKDestDir + '/Resources'):
                        for res in os.listdir(SDKDestDir + '/Resources'):
                            project.add_file(SDKDestDir + '/Resources/' + res,
                                             None, 'SOURCE_ROOT', True, False,
                                             False, target_name)

                    if os.path.exists(SDKDestDir + '/Codes'):
                        for codes in os.listdir(SDKDestDir + '/Codes'):
                            project.add_file(SDKDestDir + '/Codes/' + codes,
                                             None, 'SOURCE_ROOT', True, False,
                                             False, target_name)

                    if project.modified:
                        project.save()
                    xmlFile = SDKDestDir + '/config.xml'
                    doc = minidom.parse(xmlFile)
                    rootNode = doc.documentElement
                    sysFrameworksList = rootNode.getElementsByTagName(
                        'sysFrameworks')
                    for sysFrameworksNode in sysFrameworksList:
                        path = ''
                        required = False
                        if sysFrameworksNode.getAttribute('required') == '0':
                            required = True
                        if sysFrameworksNode.getAttribute(
                                'path') == 'xcodeFrameworks':
                            path = systemSDKPath + '/System/Library/Frameworks/' + sysFrameworksNode.getAttribute(
                                'name')
                        elif sysFrameworksNode.getAttribute(
                                'path') == 'xcodeUsrlib':
                            path = systemSDKPath + '/usr/lib/'
                            frameworkName = sysFrameworksNode.getAttribute(
                                'name')
                            #if ios 9 and above,replace .dylib to .tbd
                            if isIOS9(systemSDKPath):
                                print 'use ios 9 sdk for' + sysFrameworksNode.getAttribute(
                                    'name')
                                path = path + frameworkName.replace(
                                    '.dylib', '.tbd')
                            else:
                                path = path + frameworkName
                                print 'donot use ios 9 sdk'
                        else:
                            path = sysFrameworksNode.getAttribute(
                                'path') + sysFrameworksNode.getAttribute(
                                    'name')
                        ret = project.add_file_if_doesnt_exist(
                            path, None, 'SOURCE_ROOT', True, required, False,
                            target_name)

                        if project.modified:
                            project.save()

                    for child in SDK['operateLs']:
                        if child['name'] == 'RemoveValidArchs_arm64':
                            project.modify_validarchs()
                            if project.modified:
                                project.save()

                    generateDeveloperInfo(channel, SDK, usrSDKConfig, workDir,
                                          game)
                    generatePluginInfo(SDK, usrSDKConfig, workDir)

    if os.path.exists(workDir + '/supportPlugin.xml'):
        encode_operate.xmlEncode(workDir + '/supportPlugin.xml')
        project.add_file(workDir + '/supportPlugin.xml', None, 'SOURCE_ROOT',
                         True, False, False, target_name)
        if project.modified:
            project.save()
    if os.path.exists(workDir + '/developerInfo.xml'):
        encode_operate.xmlEncode(workDir + '/developerInfo.xml')
        project.add_file(workDir + '/developerInfo.xml', None, 'SOURCE_ROOT',
                         True, False, False, target_name)
        if project.modified:
            project.save()
        taskManager.shareInstance().notify(idChannel, 70)
    if ipaPackage != 'True':
        taskManager.shareInstance().notify(idChannel, 100)
        return
    xcodeDir = workDir + '/' + ConfigParse.shareInstance().getProjXcode(
    ) + '/../'
    xcodeDir = os.path.realpath(xcodeDir)
    print 'XcodeDir ' + xcodeDir
    #change dictionary first,then run build command
    os.chdir(xcodeDir)
    mode = 0
    if useSDK.find('simulator') == -1:
        mode = 1
    cmd = None
    projectFileName = ConfigParse.shareInstance().getProjXcode().replace(
        '/', '')
    if mode == 0:
        cmd = 'xcodebuild ' + useSDK + ' -target ' + target_name + ' -arch i386 >xcodebuild.txt'
    else:
        #clean project and target
        cmd = 'xcodebuild clean ' + useSDK + ' -project ' + projectFileName + ' -target ' + target_name
        ret = file_operate.execFormatCmd(cmd)
        #don't build. use archieve
        cmd = 'xcodebuild ' + useSDK + ' -target ' + target_name + '>xcodebuild.txt'
        #cmd = 'xcodebuild archive -scheme ' + target_name + '  -target ' + target_name + ' -archivePath ' + target_name + '.xcarchive >xcodearchive.txt'

    ret = file_operate.execFormatCmd(cmd)
    buildFile = workDir + '/xcodebuild.txt'
    if not os.path.exists(buildFile):
        print 'file not exists'
    else:
        file_object = open(buildFile)
        try:
            buildText = file_object.read()
            print buildText.find('BUILD SUCCEEDED')
            if buildText.find('BUILD SUCCEEDED') < 0:
                print 'BUILD FAILED!'
                error_operate.error(200)
                return
        finally:
            file_object.close()

    # ret = file_operate.execFormatCmd(cmd)
    # buildFile = workDir + '/xcodearchive.txt'
    # if not os.path.exists(buildFile):
    #     print 'file not exists'
    # else:
    #     file_object = open(buildFile)
    #     try:
    #         buildText = file_object.read()
    #         print buildText.find('** ARCHIVE SUCCEEDED **')
    #         if buildText.find('** ARCHIVE SUCCEEDED **') < 0:
    #             print 'ARCHIVE FAILED!'
    #             error_operate.error(200)
    #             return
    #     finally:
    #         file_object.close()

    appDir = None
    if mode == 0:
        appDir = project_config + '-iphonesimulator/'
    else:
        appDir = project_config + '-iphoneos/'
    ipaName = target_name + '_' + channelName + '_' + versionName + '.ipa'
    #use xcodebuild exportArchieve export ipa.this code don't contain Symbols.
    cmd = 'xcrun -sdk iphoneos PackageApplication -v ' + '"' + xcodeDir + '/build/' + appDir + project_name + '.app" -o "' + outputDir + '/' + ipaName + '"'
    #cmd = 'xcodebuild -exportArchive -archivePath ' + target_name + '.xcarchive -exportPath "' + xcodeDir + '" -exportFormat ipa >exportarchieve.txt'
    ret = file_operate.execFormatCmd(cmd)
    taskManager.shareInstance().notify(idChannel, 100)