随手写的自动批量编译部署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()
-
随手写的自动批量编译部署NativeAndroid程序Python脚本的更多相关文章
- Saltstack批量编译部署nginx(多模块)
最近一直在研究saltstack的同步文件和批量执行命令,随着架构的变大,批量部署的需求也变得明显起来了,我需要用一条命令就部署好nginx和tomcat,并且符合我所有的环境需求,可以直接投入生产环 ...
- 随手写的一个检测php连接mysql的小脚本
最近偶然接触到一点点的php开发,要用到mysql数据库,由于mysql和php版本的关系,php5里面连接函数有mysql_connect(),mysqli_connect()两种,php7中又使用 ...
- ansible批量分发免密钥登陆python脚本
最近看了看强大的号称自动化运维的三大利器之一的--ansible,ok,亲测之后,确实感觉,对于我们这种DBA工作者来说,确实很受益. 值得注意的是ansible要求被管理服务器python版本不低于 ...
- [python] 1、python鼠标点击、移动事件应用——写一个自动下载百度音乐的程序
1.问题描述: 最近百度总爱做一些破坏用户信任度的事——文库金币变券.网盘限速,吓得我赶紧想办法把存在百度云音乐中的歌曲下载到本地. http://yinyueyun.baidu.com/ 可问题是云 ...
- python 3 - 写一个自动生成密码文件的程序
1.你输入几,文件里面就给你产生多少条密码 2.密码必须包括,大写字母.小写字母.数字.特殊字符 3.密码不能重复 4.密码都是随机产生的 5.密码长度6-11 import string,rando ...
- windows中实现python,redis服务自动重启(任务计划程序+bat脚本)
需求:银行电脑无法自动开机,只能 通过 应用相关服务每天自动重启的方式实现 服务更新并且防止服务假死,内存过大 等情况 相关工具:win10系统中,使用windows自带的任务计划程序 和 bat脚本 ...
- 项目上使用的每月1日自动导出Zabbix性能数据的python脚本
基于zabbix-manager python2.7 #!/usr/bin/env python # -*- coding: utf-8 -*- # __author__ = "life&q ...
- 分享一个批量修改文件编码的python脚本
分享一个自己编写的递归查找子目录,将所有cpp文件编码修改为utf-8编码格式的小脚本 #i!/usr/bin/env python3 # -*- coding:utf-8 -*- import os ...
- 用Ant实现Java项目的自动构建和部署
原文地址:http://tech.it168.com/j/2007-11-09/200711091344781.shtml 本文请勿转载! Ant是一个Apache基金会下的跨平台的构 ...
随机推荐
- [自制简单操作系统] 1、从0-1到汇编再到c语言的奥秘
目录: 1.用0-1编写最简单的操作系统 2.用汇编改写上面0-1程序 2.1 只用DB的汇编改写版 2.2 加入RESB汇编的改写版 2.3 进一步使用汇编替换0-1文件 2.4 核心程序也用 ...
- [ACM_数学] LA 3708 Graveyard [墓地雕塑 圈上新加点 找规律]
Description Programming contests became so popular in the year 2397 that the governor of New Earck ...
- 易出错的C语言题目之二:指针
一.写出输出结果 #include<stdio.h> int main(){ ]; a[] = ; a[] = ; a[] = ; int *p,*q; p = a; q = &a ...
- 让delphi解析chrome扩展的native应用
chrome浏览器自从去年以来逐步去掉了对浏览器插件的支持,npapi的方案马上不可用. 当务之急要选择一个替代方案,最常用的就是扩展了.扩展程序提供了一套和本地程序交互的方案——“原生消息通信” 写 ...
- 重学JAVA基础(七):线程的wait、notify、notifyAll、sleep
/** * 测试thread的wait notify notifyAll sleep Interrupted * @author tomsnail * @date 2015年4月20日 下午3:20: ...
- NGUI ScrollView 循环 Item 实现性能优化
今天来说说一直都让我在项目中头疼的其中一个问题,NGUI 的scrollView 列表性能问题,实现循环使用item减少性能上的开销. 希望能够给其他同学们使用和提供一个我个人的思路,这个写的不是太完 ...
- java集合类的学习总结一
概况总结 首先,区分最顶层接口的区别:Collection和Map的区别:前者是单个元素:后者存储的是一对元素.Collection有List和Set两个子接口,两个子接口下分别有Vector和Arr ...
- Android WebView Memory Leak WebView内存泄漏
在这次开发过程中,需要用到webview展示一些界面,但是加载的页面如果有很多图片就会发现内存占用暴涨,并且在退出该界面后,即使在包含该webview的Activity的destroy()方法中,使用 ...
- C#通过SQL 添加,删除,或者修改表名。
这是我在 https://forums.asp.net/t/2106051.aspx?Create+Dynamic+table+in+SQL+using+C+ 的回复,如果其他人需要,可以参考 如果你 ...
- 《STL系列》之map原理及实现
上一篇文章<STL系列>之vector原理及实现,介绍了vector的原理及实现,这篇文章介绍map的原理及实现.STL实现源码下载.STL中map的实现是基于RBTree的,我在实现的时 ...