Android 自动化构建(Jenkins+Gradle+360
前言
续上一篇:iOS自动化构建(Jenkins+Fastlane)发布到蒲公英
Android构建所依赖的服务器,跟iOS构建一样,也在Mac节点机上进行。这里有人可能会有疑问,为什么不在主节点Linux服务器上进行呢?其实在Linux服务器上构建,安装编译环境相对于本机来说,会繁琐一点。构建期间出现的问题,排查起来也相对麻烦,可能自己能力不够吧。而且我并没有申请主节点Linux服务器的管理权限,这一切的一切综合下来,让我选择了在Mac节点机上构建。打包工具采用的是Gradle,并没有采用fastlane,因为查阅相关资料发现,fastlane有点重iOS轻Android。
1、准备工作
1.1、安装Gradle
Gradle的安装推荐两种方式:
1.1.1、通过Jenkins 系统管理-全局工具配置 中,选择自动安装相关版本的Gradle,参考如下:
![](https://img.haomeiwen.com/i3360017/7a7baf597a88dd96.png)
注意:Gradle安装版本最好与Android工程中配置的版本一致,避免因版本不兼容导致编译失败。
1.1.1.1、配置Gradle环境变量
打开终端,输入以下信息:
$ open -e .bash_profile
![](https://img.haomeiwen.com/i3360017/fb0b0d6e82b1ed6b.png)
编辑.bash_profile文件,在.bash_profile文件中配置好GRADLE_HOME信息,配置完成后,更新.bash_profile文件,在终端输入以下信息:
$ source ~/.bash_profile
在终端上执行gradle -version,查看是否配置成功
$ gradle -version
![](https://img.haomeiwen.com/i3360017/cce99da2aab73928.png)
至此Gradle环境变量配置完成
1.1.2、用Homebrew安装Gradle
$ brew install gradle
安装完成后,查看下版本信息
gradle -version
![](https://img.haomeiwen.com/i3360017/cc19788c11893326.png)
此处我采用Homebrew来安装,版本为4.1,与工程中配置的版本一致。
Mac 下的Gradle 安装提供不同系统的安装方式,具体请参考:
https://gradle.org/install/
Gradle安装完成后,参考上面1.1.1.1,配置好Gradle环境变量
1.2、安装Jenkins Android Lint插件
![](https://img.haomeiwen.com/i3360017/e1648b88c2dc9cd1.png)
1.3、Jenkins -> 系统管理 -> 全局工具配置 中配置 Gradle信息
![](https://img.haomeiwen.com/i3360017/b7f7c0067b626ce5.png)
1.4、JDK、Git、PATH等配置
以上信息,iOS自动化构建时已配置好,这里不再赘述。
1.5、配置Android SDK 路径
如果是在主节点上构建,需要在系统管理 -> 系统设置 中添加全局变量 ANDROID_HOME 位置可以在Android studio - preference 中找到
![](https://img.haomeiwen.com/i3360017/7a8bd0bbf64226c3.png)
我选择在Mac节点上构建,所以不需要在系统管理-系统设置 中配置ANDROID_HOME,只需要在 配置从节点(Mac) 信息中配置即可。如下:
![](https://img.haomeiwen.com/i3360017/88e1a95a1cddaf2d.png)
1.6、Jenkins 系统管理 -> 全局工具配置 中配置Gradle
![](https://img.haomeiwen.com/i3360017/91e1f01e58e763fd.png)
注意:此处虽然有警告⚠️,是因为GRADLE_HOME的配置不在master节点上,但是不会影响使用。此处如果不配置Gradle,配置从节点信息 中,无法配置Gradle信息,所以必须配置。
1.7、Jenkins -> 配置从节点 信息中配置Gradle
![](https://img.haomeiwen.com/i3360017/7936b9bf788dc75f.png)
![](https://img.haomeiwen.com/i3360017/2d0ac6ef903a2438.png)
自此,准备工作已完成。
2、新建任务
2.1、新建自由风格的项目
![](https://img.haomeiwen.com/i3360017/1b5afa3df3802fff.png)
2.2、 General
配置与iOS配置一致,需指定在Mac节点上构建。
![](https://img.haomeiwen.com/i3360017/20b990fbf032fd11.png)
2.3、源码配置
与iOS源码配置一致,从Git服务器拉取代码。参考构建iOS项目源码配置,这里不再过多赘述。
![](https://img.haomeiwen.com/i3360017/19550c78a05ea596.png)
2.4、构建
系统管理->配置全局工具 中配置了Gradle之后,构建时可以选择Gradle来构建,如下图:
![](https://img.haomeiwen.com/i3360017/8ff109bed86a45b3.png)
![](https://img.haomeiwen.com/i3360017/ea933cf6db9b0c90.png)
Root Build script:项目路径,${WORKSPACE}是项目的相对路径。
注意:assembleRelease:表示导出一个已签名的 release apk 文件。assembleRelease要执行成功,需要在工程的build.gradle中配置signingConfigs的release代码。如下:
signingConfigs {
debug {
keyAlias 'xxx'
keyPassword 'xxxxx'
storeFile file("../xxx.jks")
storePassword 'xxxxxxx'
}
//导出release包的签名信息,必不可少
release {
keyAlias 'xxxx'
keyPassword 'xxxx'
storeFile file("../xxx.jks")
storePassword 'xxxx'
}
}
buildTypes的release中,必须要加上signingConfig signingConfigs.release这句代码,如下:
buildTypes {
release {
signingConfig signingConfigs.release
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
signingConfig signingConfigs.debug
}
}
![](https://img.haomeiwen.com/i3360017/0bd6f9800df1ee30.png)
红色框框里的代码必不可少。
2.4、apk上传蒲公英
两种方式:通过curl命上传,或者通过Jenkins集成的蒲公英上传插件上传
2.4.1、通过curl命令 上传到蒲公英
蒲公英的userkey、apikey请至蒲公英官网申请,这里不再赘述。
![](https://img.haomeiwen.com/i3360017/16f99d6551a52cc3.png)
# Java路径 jdk中的环境变量
JAVA_HOME="/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/bin/java"
# 加固保根目录
JIAGU_HOME="/Users/xxx/Documents/jenkins/Library/Android/360jiagubao_mac/jiagu"
# 加固多渠道模板
CHANNEL_PATH="/Users/xxx/Documents/jenkins/Library/Android/360jiagubao_mac/jiagu/channel.txt"
# JDK中jarsigner 路径,加固后重签名用
JARSIGNER_PATH="/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/bin/jarsigner"
# 360:账户名、密码
USER="xxx"
PSSSWORD="xxx"
# 签名相关信息
alias="xxx"
alias_password="xxx"
keystore_password="xxx"
keystore_path="签名文件路径"
# 蒲公英userkey
pgyerUserKey="xxxxxxxxxxxxxxxxxxxxx"
# 蒲公英apiKey
pgyerApiKey="xxxxxxxxxxxxxxxxxxxxx"
# 更新版本信息
updateDescription="测试版本"
# apk路径 加固前
un_reinforce_path="${WORKSPACE}/app/build/outputs/apk/release/xxx.apk"
# apk路径 加固后
reinforce_path="${WORKSPACE}/app/build/outputs/apk/release"
# 解锁keychain
security -v unlock-keychain -p "xxxx"
# 登录360
$JAVA_HOME -jar $JIAGU_HOME/jiagu.jar -login $USER $PSSSWORD
# 导入签名的 keystore信息
$JAVA_HOME -jar $JIAGU_HOME/jiagu.jar -importsign $keystore_path $keystore_password $alias $alias_password
# 查看当前签名 keystore 信息
$JAVA_HOME -jar $JIAGU_HOME/jiagu.jar -showsign
# 导入渠道信息
#$JAVA_HOME -jar $JIAGU_HOME/jiagu.jar -importmulpkg $CHANNEL_PATH
# 查看当前渠道信息
#$JAVA_HOME -jar $JIAGU_HOME/jiagu.jar -showmulpkg
# 查看当前加固服务配置
$JAVA_HOME -jar $JIAGU_HOME/jiagu.jar -showconfig
# 配置增强服务,可选项
$JAVA_HOME -jar $JIAGU_HOME/jiagu.jar -config -x86 -crashlog
# 加固并签名,-automulpkg:多渠道加固。测试一般用不到,只需要一个加固包
$JAVA_HOME -jar $JIAGU_HOME/jiagu.jar -jiagu $un_reinforce_path $reinforce_path -autosign
# 删除未加固的apk(未选多渠道,此处只有一个包,如果选了多渠道,不推荐这种删除方式), 加固完成后执行。加固前执行,会导致加固失败,因为源文件已被删除
rm -r $un_reinforce_path
# 加固后重命名apk
mv $reinforce_path/*.apk $reinforce_path/xxx.apk
# 加固、重签名apk后的路径
apk_path="${reinforce_path}/xxx.apk"
# 上传蒲公英
curl -F "file=@${apk_path}" -F "uKey=${pgyerUserKey}" -F "_api_key=${pgyerApiKey}" -F "updateDescription=${updateDescription}" https://www.pgyer.com/apiv1/app/upload
加固常见问题记录:
1、登录360
执行:$JAVA_HOME -jar $JIAGU_HOME/jiagu.jar -login $USER $PSSSWORD,报错:
/Users/xxx/Documents/jenkins/Library/Android/360jiagubao_mac/jiagu/java/bin/java -jar /Users/xxx/Documents/jenkins/Library/Android/360jiagubao_mac/jiagu/jiagu.jar -login 15267875876 jiagu_123qwe
/var/folders/db/35y0nr8j4h7gjch994glqz080000gn/T/jenkins7387792665115197163.sh: line 37: /Users/xxx/Documents/jenkins/Library/Android/360jiagubao_mac/jiagu/java/bin/java: Permission denied
解决的办法:
/Users/xxx/Documents/jenkins/Library/Android/360jiagubao_mac/jiagu/java/bin/ 加权限
执行命令:
sudo chmod -R 777 /Users/xxx/Documents/jenkins/Library/Android/360jiagubao_mac/jiagu/java/bin/
-R 是指级联应用到目录里的所有子目录和文件
777 是所有用户都拥有最高权限
2、相关Java文件找不到,java 路径的报错
解决方法:
Java路径为:jdk中Java环境变量,而不是360加固架包中的Java路径。
这里坑了很久
注意:上传蒲公英的API有两个,分别是API 1.0、API 2.0。此处选择用API 1.0上传。两种API的具体参数,请参考蒲公英官网:
API 1.0:https://www.pgyer.com/doc/api#paramInfo
API 2.0:https://www.pgyer.com/doc/view/api#paramInfo
2.4.2、通过Jenkins集成的蒲公英插件 上传到蒲公英
构建后的步骤,选择蒲公英上传插件,如图:
![](https://img.haomeiwen.com/i3360017/609621a354fe32b2.png)
![](https://img.haomeiwen.com/i3360017/b81f505880c39103.png)
注意:上传蒲公英的API有两个,上面2.4.1有描述,这里不再赘述。
加固过程效果图:
![](https://img.haomeiwen.com/i3360017/02f5fef1f6f47f00.png)
重签名效果图:
![](https://img.haomeiwen.com/i3360017/789c698fcf084edc.png)
上传蒲公英:
![](https://img.haomeiwen.com/i3360017/c1998ba1bdc7fbbd.png)
![](https://img.haomeiwen.com/i3360017/70d5a18b2b78f36c.png)
自此,安卓自动化构建结束。
总结
因为之前一直做iOS的缘故,对安卓认识不够,自动化构建前期走了不少弯路,尤其是加固部分。加固流程:上传已签名的apk、加固、下载加固后的apk、重签名,感觉很麻烦。曾经考虑在工程中新建一个gradle文件,写一个task执行加固、重签名的操作,Jenkins通过gradle调用task来执行加固、重签名,因为对安卓了解不够多,这种方式调试起来很麻烦,尝试之后没有成功,最后放弃了。最终选择shell脚本构建的方式,脚本看起来也更直观,调试起来也更方便。
搭建自动化构建平台,一开始有种摸着石头过河的感觉,前期可能会踩不少坑,折腾了几天,终于把iOS、Android自动化构建、发布弄好了,团队打包效率上有了一定提升。现在开发小伙伴也不愿意去手动打包了,一个开发的同事说这种没技术含量、且重复性的工作,就应该工具去做。看来大家对效率有共同的认识,希望有更多好的工具能用到团队开发中来,进一步去提升团队的工作效率。