Android源码自动编译打包apk

 

1. 背景和目的

1)背景:Android开发人员,完成开发工作后,需要将源码提交至SVN,然后再由其他同事进行交叉编译

2)目的:确保开发人员代码提交的完整性;节省人工交叉编译的时间;自动化实现Android源码编译打包;编译结果邮件通知相关人员

2. 实现

2.1 环境搭建

1)搭建Java环境,MySql,Tomcat

2)搭建Android环境(Android SDK和NDK),安装编译插件(Gradle

2.2 思路

1)搭建一个Web服务器

· 编译计划管理模块

· 定时从SVN下载Android源码:通过SSH方式实现源码的下载

· 定时执行编译打包工作:通过SSH方式,执行Shell脚本来实现源码编译打包的工作

· 编译结果记录到数据库

2)Shell脚本

· 对指定源码通过编译命令执行编译打包工作

2.3 设计流程

 

2.4 代码实现

2.1 web服务器

1)编译计划管理模块:省略

2)SSH方式从SVN下载源码

Java代码:通过SSH方式执行下载SVN源码的Shell脚本(download.sh)

String downloadShellPath = "/home/...shell/download.sh"; //Shell脚本路径
String svnSrcPath = "https://test.com/svn/.../src/appProject"; //SVN源码路径
String svnSrcRevision = "0"; //SVN版本号
String cachePath = ""; //缓存路径
//SSH命令
String cmd_download = "sh " + downloadShellPath + " " + svnSrcPath + " " + svnSrcRevision + " " + cachePath;
Process process = Runtime.getRuntime().exec(new String[]{"sh", "-c", cmd_download});
//int result = process.waitFor(); // 方法阻塞, 等待命令执行完成(成功会返回0)

// 获取命令执行结果, 有两个结果: 正常的输出 和 错误的输出(PS: 子进程的输出就是主进程的输入)
BufferedReader successReader = null;
BufferedReader errorReader = null;
successReader = new BufferedReader(new InputStreamReader(process.getInputStream(), "UTF-8"));
errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream(), "UTF-8"));
String successLog = "";
String errorLog = "";
StringBuilder successSB = new StringBuilder();
StringBuilder errorSB = new StringBuilder();

// 读取输出
String successLine = null;
String errorLine = null;
while ((successLine = successReader.readLine()) != null) {
    successSB.append(successLine).append('\n');
}
successLog = successSB.toString();

while ((errorLine = errorReader.readLine()) != null) {
    errorSB.append(errorLine).append('\n');
}
errorLog = errorSB.toString();

if(StringUtil.isNotNull(successLog)){
    logger.info("downloadAndroidSrc===》下载完成");
}else(StringUtil.isNotNull(errorLog)){
    logger.info("downloadAndroidSrc===》下载失败");
}

Shell脚本(download.sh)

#! /bin/sh

echo "shell_log===>Download start---------"
echo "AndroidSvnPath=$1"
echo "AndroidSvnRevision=$2"
echo "AndroidCachePath=$3"

svnAccount=test
svnPassword=test
echo "SVN Account:${svnAccount}"
echo "SVN Password:${svnPassword}"

if [ $2 != "" -a $2 != "0" ];then
echo "download the specified version!"
svn co -r $2 --force $1 $3 --username $svnAccount --password $svnPassword
else 
echo "download the latest version!"
svn co --force $1 $3 --username $svnAccount --password $svnPassword
fi

cd $3
echo "current dir:"${pwd}

chmod +x "update_modules.sh"

sleep 3s
./update_modules.sh

echo "shell_log===>Download end------------"

3)SSH方式进行源码编译打包

Java代码

String gradlewShellPath = "/home/.../shell/gradlew.sh"; //Shell脚本路径
String srcPath = "/home/.../src/appProject"; //源码根目录路径
String cmd_gradlew = "sh " + gradlewShellPath + " " + srcPath;

Process process = null;
process = Runtime.getRuntime().exec(new String[]{"sh","-c", cmd_gradlew});
StringBuilder result = new StringBuilder();
BufferedReader bufrIn = null;
BufferedReader bufrError = null;
// process.waitFor(); // 方法阻塞, 等待命令执行完成(成功会返回0)
// 获取命令执行结果, 有两个结果: 正常的输出 和 错误的输出(PS: 子进程的输出就是主进程的输入)
bufrIn = new BufferedReader(new InputStreamReader(process.getInputStream(), "UTF-8"));
bufrError = new BufferedReader(new InputStreamReader(process.getErrorStream(), "UTF-8"));
// 读取输出
String line = null;
while ((line = bufrIn.readLine()) != null) {
    result.append(line).append('\n');
}
while ((line = bufrError.readLine()) != null) {
    result.append(line).append('\n');
}
compileLog = result.toString();

if(compileLog.contains("SUCCESS")){
    logger.info("compileApk===》编译成功");
}else if(compileLog.contains("FAILED")){
    logger.info("compileApk===》编译失败");
}else{
    logger.info("compileApk===》编译结束");
}

Shell脚本(gradlew.sh)

#! /bin/sh

echo "shell_log===>Compile start---------"
echo "shell_log===>AndroidSrc path=$1"

export ANDROID_SDK_HOME=/android/android_sdk/android-sdk-linux

echo "android_sdk_home:${ANDROID_SDK_HOME}"

cd "$1"

chmod +x gradlew

./gradlew assembleRelease

echo "shell_log===>Compile end------------"

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值