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
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 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
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 execGameCommonInitializeScript(channelName, platformId, appVersion, resVersion, platformType): if (os.path.exists(file_operate.getGameCommonScriptPath())): gameCommonInitScriptBat = file_operate.getGameCommonScriptPath() + "/initialize.bat" if (os.path.exists(gameCommonInitScriptBat)): cmd = '"%s" "%s" "%s" "%s" "%s"' % (gameCommonInitScriptBat, platformId, channelName, appVersion, resVersion) ret = file_operate.execFormatCmd(cmd) if ret: print "execute initialize.bat error" return 1 gameCommonInitScriptExe = file_operate.getGameCommonScriptPath() + "/initialize.exe" if (os.path.exists(gameCommonInitScriptExe)): cmd = '"%s" "%s" "%s" "%s" "%s"' % (gameCommonInitScriptExe, platformId, channelName, appVersion, resVersion) ret = file_operate.execFormatCmd(cmd) if ret: print "execute initialize.exe error" return 1 gameCommonInitScriptPyc = file_operate.getGameCommonScriptPath() + "/initialize.pyc" if os.path.exists(gameCommonInitScriptPyc): sys.path.append(file_operate.getGameCommonScriptPath()) import initialize ret = initialize.initialize(platformId, channelName, platformType, appVersion, resVersion)
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 execGameCommonFinalizeScript(channelName, platformId, appVersion, resVersion, checkBox_isChecked, checkBox_4_isChecked, checkBox_5_isChecked): if (os.path.exists(file_operate.getGameCommonScriptPath())): gameCommonFinalizeScriptBat = file_operate.getGameCommonScriptPath() + "/finalize.bat" if (os.path.exists(gameCommonFinalizeScriptBat)): cmd = '"%s" "%s" "%s" "%s" "%s"' % (gameCommonFinalizeScriptBat, platformId, channelName, appVersion, resVersion) ret = file_operate.execFormatCmd(cmd) if ret: print "execute finalize.bat error" return 1 gameCommonFinalizeScriptExe = file_operate.getGameCommonScriptPath() + "/finalize.exe" if (os.path.exists(gameCommonFinalizeScriptExe)): cmd = '"%s" "%s" "%s" "%s" "%s"' % (gameCommonFinalizeScriptExe, platformId, channelName, appVersion, resVersion) ret = file_operate.execFormatCmd(cmd) if ret: print "execute finalize.exe error" return 1 gameCommonFinalizeScriptPyc = file_operate.getGameCommonScriptPath() + "/finalize.pyc" if os.path.exists(gameCommonFinalizeScriptPyc): print "gameCommonFinalize" + file_operate.getGameCommonScriptPath() + "/finalize.pyc" sys.path.append(file_operate.getGameCommonScriptPath()) import finalize ret = finalize.finalize(platformId, channelName, appVersion, resVersion, checkBox_isChecked, checkBox_4_isChecked, checkBox_5_isChecked)
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')
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 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
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
import sys import file_operate print 'install apk path----' + sys.argv[1] cmd = 'chmod 777 ../tool/mac/adb' file_operate.execFormatCmd(cmd) cmd = '../tool/mac/adb install -r ' + sys.argv[1] file_operate.execFormatCmd(cmd)
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."
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
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)