1.前言
工作关系,需要做安卓环境的自动打包,领导要求公司产品、测试、开发等小伙伴每天来上班之前,可以在指定位置下载开发,测试,生产环境最新的安卓版本安装包,可以每日验证产品开发进度以及及时反馈开发功能的方向是否正确。
博文说明:
签名软件一般用于程序编译打包之后,手机在运行程序之前会先去验证程序的签名(可以看作类似于我们电脑上常说的md5)是否合法,只有通过了验证的文件才会被运行
2.编译环境安装
1、 因为android使用java语言开发,所以需要先安装java jdk
[root@jenkins ~]# java -version java version "1.8.0_65" Java(TM) SE Runtime Environment (build 1.8.0_65-b17) Java HotSpot(TM) 64-Bit Server VM (build 25.65-b01, mixed mode)
2、 安装android sdk,也就是android开发工具包。
安装sdk
[root@jenkins ~]# wget https://dl.google.com/android/android-sdk_r24.4.1-linux.tgz [root@jenkins ~]# tar xf android-sdk_r24.4.1-linux.tgz -C /usr/local/ [root@jenkins ~]# cd /usr/local/ [root@jenkins local]# ln -s android-sdk-linux/ android-sdk
设置环境变量
[root@jenkins ~]# cat /etc/profile.d/android.sh export ANDROID_HOME=/usr/local/android-sdk export PATH=$PATH:$ANDROID_HOME/tools [root@jenkins ~]# source /etc/profile.d/android.sh
Android sdk更新,时间比较长,确保磁盘有足够的空间,总大小5G左右
android update sdk --no-ui
3、 安装gradle,也就是android构建环境。
wget https://services.gradle.org/distributions/gradle-2.10-all.zip unzip gradle-2.2-all.zip -d /usr/local/ cd /usr/local/ ln -s gradle-2.2/ gradle
设置换变量
[root@jenkins ~]# cat /etc/profile.d/gradle.sh export GRADLE_HOME=/usr/local/gradle export PATH=$PATH:$GRADLE_HOME/bin [root@jenkins ~]# source /etc/profile.d/gradle.sh
4、 因为我们公司的安卓源码需要使用build tools 23.0.3版本打包,所以需要另外安装build-tools版本,方法如下:
使用 android list sdk –all查看所有可用的更新包,找到build-tools 23.0.3编码为7
使用如下命令安装build包
[root@bogon android-sdk]# android update sdk --no-ui --all -filter 7
安装完成如下所示
查看android-sdk,存在的build-tools版本,就可以看到build-tools 23.0.3版本已经存在了
[root@jenkins ~]# ll /usr/local/android-sdk/build-tools/ 总用量 12 drwxrwx---. 4 root root 4096 10月 18 09:52 23.0.3 drwxr-xr-x. 5 root root 4096 10月 17 16:12 24.0.2
如果不存在,则从http://mirrors.neusoft.edu.cn/android/repository/网站现在对应的版本,解压到build-tools目录即可
如果不知道源码需要使用的build-tools版本,可以直接查看源码中build.gradle文件中的如下两个参数即可
compileSdkVersion 23 buildToolsVersion "23.0.3"
3.开始编译
1、 获取源码:从公司gitlab服务获取对应的安卓项目到打包服务器。
2、 配置apk签名
具体签名信息需要联系开发人员提供,然后把密钥文件还有密码填写正确即可
3、编译安卓源码,生成apk安装包
进入源码目录,先使用gradle clean清理编译目录(清除之前的编译遗留文件),在使用gradle build进行构建
gradle clean gradle build
编译完成会出现如下提示,说明编译成功
注意:第一次打包会从https://jcenter.bintray.com下载一些依赖的jar包到本地,所以编译时间会比较长
打包完成之后apk安装文件,存放在源码目录build/outputs/apk/目录中,我们只需要从中获取apk文件安装即可
4.每日自动打包实现
上面我们已经实现了安卓的自动打包,可以获取apk安装文件,如果上面的打包没有问题,我们就可以通过脚本实现自动化打包,并且每天凌晨运行打包脚本,把打出来的安装包放到一个可以让公司小伙伴下载的环境。关于打包脚本,我需要补充两点:
1、由于开发每次都是通过IDE环境打包,IDE环境打包和服务器环境打包有以下不同,所以我是在获取源码之后,通过sed命令手动在gradle.build文件添加apk签名信息。
- IDE配置apk签名不需要通过gradle.build文件,在IDE有专门的位置填写签名信息
- 密钥文件和打包服务器的密钥文件存放位置不同
- gradle.build文件开发会修改,需要保证每次打包之前都是获取最新的gradle.build文件
2、我们每天需要打开发、测试、生产三个环境的安装包,所以在写脚本的时候,需要通过sed命令手动修改接口服务器的地址。
下面是我自己写的一个打包脚本,省略了配置文件替换,以及推送apk安装包到下载服务器的部分,你可以根据你们公司的情况进行更改。
#!/bin/bash # 设置时间变量 CTIME=$(date "+%Y-%m-%d-%H-%M") # 项目名称,和gitlab仓库名称一致 project= # 本地代码目录(gitlab拉取代码后存放目录) CODE_DIR=/data/gitlab/"$project" # 临时代码目录,用来修改配置文件和编译打包代码 TMP_DIR=/data/tmp/"$project" # 签名文件 jks_file= # 脚本使用帮助 usage(){ echo $"Usage: $0 [build tag ENV]" } # 拉取代码 git_pro() { if [ $# -lt 1 ];then echo "请传入tag或分支" exit 1 fi tag=$1 cd $CODE_DIR && git checkout master && git pull && git checkout $1 if [ $? != 0 ];then echo "拉取代码失败" exit 10 fi cd $CODE_DIR && git pull 2>/dev/null >/dev/null } # 推送代码到编译目录 sync_tmp() { rsync -avz --delete $CODE_DIR/ $TMP_DIR/ 2>/dev/null >/dev/null } # 设置代码配置文件 set_conf() { android=`grep -n "填写密钥信息位置 {" $TMP_DIR/build.gradle | grep -o --color [1-9]|[0-9][0-9]|[0-9][0-9][0-9]` sed -i "$android r $jks_file" $TMP_DIR/gevek/build.gradle release=`grep -n "填写签名信息位置 {" $TMP_DIR/build.gradle | egrep -o --color "[1-9][0-9][0-9]|[0-9][0-9][0-9]"` sed -i "$release a signingConfig signingConfigs.release" $TMP_DIR/gevek/build.gradle #替换环境为生产环境 sed -i "s@之前的接口地址@生产环境接口地址@g" 源码设置服务器接口配置文件 } # 编译代码 build(){ cd $TMP_DIR/gevek && gradle clean && gradle build } # 推送apk安装包到共享目录 scp_apk(){ # 把最新的apk文件推送到你们公司的下载位置 } # 代码执行选项设置 main() { case $1 in build) git_pro $2; sync_tmp; set_conf; build; scp_apk; ;; *) usage; esac } main $1 $2