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

2023年 7月 16日 115.9k 0

1.前言

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

博文说明:

  • 由于我们公司的产品是通过gradle实现的编译打包,所以本文介绍的是gradle的环境。具体你们公司安卓是通过什么工具编译打包的,需要和你们开发进行沟通。
  • 安卓打包需要配置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

     

    相关文章

    对接alertmanager创建钉钉卡片(1)
    手把手教你搭建OpenFalcon监控系统
    无需任何魔法即可使用 Ansible 的神奇变量“hostvars”
    openobseve HA本地单集群模式
    基于k8s上loggie/vector/openobserve日志收集
    openobseve单节点和查询语法

    发布评论