-
背景
有一堆工程NativeAndroid程序,要一一编译部署编译测试,手头只有AndroidManifest和Makefile,需要一个个Update,Ndk-build,和发包安装测试,很是头疼,也没搜到和我类似需求的,用batch各种问题,只好换路,Python花了一上午临时抱佛脚的,如有建议欢迎指教。
-
使用环境
-- Python3.x
-- AndroidNDK
-- AndroidSDK
-- Ant
并确保配置好在Path中
-
说明
看注释
- Code
-
#!/usr/bin/python # -*- coding: utf-8 -*- #用于批量编译NativeAndroid程序 #AutoBuild all sub native android projects #Zephyr 20141203 import os import sys #指定编译目录名 targetBuildDir = 'jni' #'Android' #指定目标Android版本 targetVersion = 'android-18' #Build Configuration调试模式 debug/release Configuration= 'debug' #是否输出详细编译信息 VerbosBuildInfo = 1 #黑名单,如果遇到以下目录,就不再予以遍历 blackList = ['obj','res','libs','bin','iOS','src'] #全局变量 curRootDir = os.getcwd() dirVec=[] def GetProcessorCount(): try: platform = sys.platform if platform == 'win32': if 'NUMBER_OF_PROCESSORS' in os.environ: return int(os.environ['NUMBER_OF_PROCESSORS']) else: return 8 else: from numpy.distutils import cpuinfo return cpuinfo.cpu._getNCPUs() except Exception: print('Cannot know cpuinfo, use default 4 cpu') return 8 def WalkDir(rootDir, level=1): if level==1: print rootDir for lists in os.listdir(rootDir): path = os.path.join(rootDir, lists) if os.path.isdir(path): print '│ '*(level-1)+'│--'+lists if not lists in blackList: if lists == targetBuildDir: #print('-----path: '+path) #取得父级目录 parentDir = os.path.dirname(path) #print('-----parentDir: '+parentDir) dirVec.append(parentDir) print('-----添加编译目录:'+parentDir) else: WalkDir(path, level+1) def DoBuild(): print('---------开始DoBuild---------') numProcessor = GetProcessorCount() UpdateCMD = 'android update project -p . -s -t %s' % (targetVersion) print('UpdateCMD: '+UpdateCMD) isDebug = ( Configuration == 'debug' ) NDKBuildCMD = 'ndk-build V=%d -j%d NDK_DEBUG=%d' % (VerbosBuildInfo, numProcessor, isDebug) print('NDKBuildCMD: '+NDKBuildCMD) AntCMD = 'ant %s install' % (Configuration) print('AntCMD: '+AntCMD) projectCount = 0 if 1: for dir in dirVec: androidDir = dir print('---------开始Update---------') print('所在目录:'+androidDir) projectCount += 1 if 1: os.chdir(androidDir) os.system(UpdateCMD) #依据mk文件相对路径决定是否要进入jni目录 os.chdir('jni') print('==========开始编译') os.system(NDKBuildCMD) os.chdir('../') print('==========装包APK') os.system(AntCMD) print('==========当前处理完成:'+androidDir) #os.chdir(curRootDir) #print('---------切回主目录---------') projectCount += 1 print('---------恭喜,完成%d个工程编译,已安装到设备---------' %(projectCount)) #MAIN WalkDir(curRootDir) DoBuild()
-
Code EN
-
#!/usr/bin/python # -*- coding: utf-8 -*- #Batch compileNativeAndroid #AutoBuild all sub native android projects #Zephyr 20141203 import os import sys #Target compile directory targetBuildDir = 'jni' #Target Android version targetVersion = 'android-19' #Build Configuration: debug/release Configuration= 'debug' #Will output detail compile info VerbosBuildInfo = 0 #Blacklist for skip-directory blackList = ['obj','res','libs','bin','iOS','src'] #Global curRootDir = os.getcwd() dirVec=[] def GetProcessorCount(): try: platform = sys.platform if platform == 'win32': if 'NUMBER_OF_PROCESSORS' in os.environ: return int(os.environ['NUMBER_OF_PROCESSORS']) else: return 8 else: from numpy.distutils import cpuinfo return cpuinfo.cpu._getNCPUs() except Exception: print('Cannot know cpuinfo, use default 4 cpu') return 8 def WalkDir(rootDir, level=1): if level==1: print rootDir for lists in os.listdir(rootDir): path = os.path.join(rootDir, lists) if os.path.isdir(path): print '│ '*(level-1)+'│--'+lists if not lists in blackList: if lists == targetBuildDir: #Get parent directory parentDir = os.path.dirname(path) dirVec.append(parentDir) print('-----add compile directory:'+parentDir) else: WalkDir(path, level+1) def DoBuild(): print('---------Begin DoBuild---------') numProcessor = GetProcessorCount() UpdateCMD = 'android update project -p . -s -t %s' % (targetVersion) print('UpdateCMD: '+UpdateCMD) isDebug = ( Configuration == 'debug' ) NDKBuildCMD = 'ndk-build V=%d -j%d NDK_DEBUG=%d' % (VerbosBuildInfo, numProcessor, isDebug) print('NDKBuildCMD: '+NDKBuildCMD) AntCMD = 'ant %s install' % (Configuration) print('AntCMD: '+AntCMD) projectCount = 0 if 1: for dir in dirVec: androidDir = dir print('---------Begin Update---------') print('Current directory:'+androidDir) projectCount += 1 if 1: os.chdir(androidDir) os.system(UpdateCMD) #Rely on make file to decide whether cd into jni directory #os.chdir('jni') print('==========Begin compile') os.system(NDKBuildCMD) #os.chdir('../') print('==========building APK') os.system(AntCMD) print('==========work done on:'+androidDir) #os.chdir(curRootDir) #print('---------go back directory---------') projectCount += 1 print('---------Congratulation,%d projects compiled,and deployed on device---------' %(projectCount)) #MAIN WalkDir(curRootDir) DoBuild()
-