随手写的自动批量编译部署NativeAndroid程序Python脚本

  • 背景

  有一堆工程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()

       

posted @ 2014-12-03 15:50  Zephyroal  阅读(928)  评论(0编辑  收藏  举报