由于blog各种垃圾评论太多,而且本人审核评论周期较长,所以懒得管理评论了,就把评论功能关闭,有问题可以直接qq骚扰我

安卓自动化打包(基于gradle)

自动化 西门飞冰 8813℃
[隐藏]

1.前言

工作关系,需要做安卓环境的自动打包,领导要求公司产品、测试、开发等小伙伴每天来上班之前,可以在指定位置下载开发,测试,生产环境最新的安卓版本安装包,可以每日验证产品开发进度以及及时反馈开发功能的方向是否正确。

博文说明:

  1. 由于我们公司的产品是通过gradle实现的编译打包,所以本文介绍的是gradle的环境。具体你们公司安卓是通过什么工具编译打包的,需要和你们开发进行沟通。
  2. 安卓打包需要配置apk签名,签名的密码还有密钥需要联系开发获取,不然打出来的包是无法运行的。

签名软件一般用于程序编译打包之后,手机在运行程序之前会先去验证程序的签名(可以看作类似于我们电脑上常说的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
image001

使用如下命令安装build包

[root@bogon android-sdk]# android update sdk --no-ui --all -filter 7

安装完成如下所示
image002
查看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签名

具体签名信息需要联系开发人员提供,然后把密钥文件还有密码填写正确即可

image003

3、编译安卓源码,生成apk安装包
进入源码目录,先使用gradle clean清理编译目录(清除之前的编译遗留文件),在使用gradle build进行构建

gradle clean
gradle build

编译完成会出现如下提示,说明编译成功
image004
注意:第一次打包会从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

 

转载请注明:西门飞冰的博客-专注于Linux运维 » 安卓自动化打包(基于gradle)

喜欢 (2)or分享 (0)