安卓apk在CentOS上自动化编译打包发布

安卓apk在CentOS上自动化编译打包发布

如果你还在 手动 clean ->build ->上传apk到OSS ->执行app更新操作...

*本文 不含三方加固 等操作!!!

已经厌倦了每次手动发布版本, 请接着往下看!

安卓apk在CentOS上自动化编译打包发布_第1张图片

步骤

  1. 在服务器上使用 Git 拉取最新代码
  2. 使用 Gradle 编译打包安卓项目
  3. 将打包好的 Apk 上传至OSS服务器
  4. 连接服务器执行 Sql 更新app (app版本号等信息存库, 不是读取xml文件)
  5. 编写 Shell 脚本

准备工作

  • CentOS服务器 (已安装 mysql 并正常运行)
  • OSS (已获取到 ACCESS_KEY_IDACCESS_KEY_SECRET)
  • Git 上已有安卓项目

1. 在服务器上使用Git拉取最新代码

  • 安装Git
yum install git			

安卓apk在CentOS上自动化编译打包发布_第2张图片

  • 查看是否已安装成功
git --version			
  • 新建文件夹存放新项目(比如我的项目叫 oa-app ) 然后cd进入 oa-app 文件夹
mkdir oa-app
  • git 账号密码全局保存一下, 防止每次都需要输入 (懒得配置的直接看步骤2)
//全局保存
git config --global credential.helper store

//清除重置
git config --system --unset credential.helper
  • 克隆 git 项目到服务器
git clone https://gitee.com/xxxxx.git     //填写自己的git项目地址

安卓apk在CentOS上自动化编译打包发布_第3张图片

  • 当然这里也可以更换使用ssh地址
git remote rm origin
git remote add origin [email protected]:xxxxx.git
git remote -v

安卓apk在CentOS上自动化编译打包发布_第4张图片

  • 将服务器和远程关联起来
//如果本地新建了一个分支 branch_name,但是在远程没有
git branch --set-upstream-to=origin/master master

//如果远程新建了一个分支,本地没有该分支
git checkout --track origin/branch_name


  • 执行 git pull 等命令可能会提示无权限, 需要在 git项目管理页面 生成 sshkey
ssh-keygen -t rsa -C "xxxxxx.com" 

安卓apk在CentOS上自动化编译打包发布_第5张图片

  • 打开 /root/.ssh/id_rsa.pub 文件内容拷贝到 git ssh公钥处 保存

2. 使用gradle编译打包安卓项目

安装编译所需的SDK

  • 下载并安装 linux版的sdkmanager 管理工具 https://developer.android.google.cn/studio 最下面有个 Command line tools only 点此下载后上传到服务器 或者
    安卓apk在CentOS上自动化编译打包发布_第6张图片

  • 或者 回到 oa-app 项目文件夹下:

 wget https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip

安卓apk在CentOS上自动化编译打包发布_第7张图片

  • 下载成功, 然后解压 ,没有 unzip 命令 先下载 yum install -y unzip zip
 unzip sdk-tools-linux-4333796.zip 		//解压后是tools文件夹

tools 目录结构:

安卓apk在CentOS上自动化编译打包发布_第8张图片

  • 需要通过 bin/sdkmanager 来下载 sdk , 所以我们先配置一下环境变量
vim /etc/profile

在最后添加

#android
export ANDROID_HOME=/root/oa-app
export PATH=$ANDROID_HOME/tools:$ANDROID_HOME/tools/bin:$ANDROID_HOME/platform-tools:$PATH

wq 保存退出并刷新生效一下

source /etc/profile

附图环境变量配置: (注意路径)
安卓apk在CentOS上自动化编译打包发布_第9张图片

  • 根据项目 build-tools 版本和 sdk 版本下载对应的版本, 比如我这里使用的是 api 25
//查看打印出版本号确认是否配置成功
sdkmanager --version

//下载build-tools
sdkmanager "build-tools;27.0.3"

//下载platform
sdkmanager "platform-tools" "platforms;android-25"

中间会提示Accept? (y/N): y 回车

  • 下载完成会保存在刚才的 oa-app 文件夹下, 查看已安装的和可用的 sdk 列表
sdkmanager --list

安卓apk在CentOS上自动化编译打包发布_第10张图片

安装Gradle

  • 下载 Gradleoa-app 项目文件夹下, 根据自己项目 gradle-wapper 下的distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip 下载相应的gradle 版本
//下载 我这里是 4.10.1
wget https://downloads.gradle.org/distributions/gradle-4.10.1-all.zip

//解压
unzip gradle-4.10.1-all.zip
  • 配置 gradle 环境变量
vim /etc/profile

//文件最后继续添加
#gradle
export GRADLE_HOME=/root/oa-app/gradle-4.10.1
export PATH=${GRADLE_HOME}/bin:$PATH

//保存退出并刷新
source /etc/profile

//查看配置是否成功
gradle -v

安卓apk在CentOS上自动化编译打包发布_第11张图片

  • 修改 app 项目中 local.properties 配置刚才服务器上的 sdk 路径

安卓apk在CentOS上自动化编译打包发布_第12张图片

执行编译项目

  • 进入 项目 所在目录
//先clean
gradle clean

//再build
gradle assembleRelease

第一次会下载依赖什么的, 比较慢耐心等待…

最后提示 BUILD SUCCESSFUL 打包成功, 默认 apk/app/build/outputs/

  • 附上一张 /root/oa-app/ 下的目录结构: ( OA 为as项目 ,刚才下载的一些工具已经删掉了)

安卓apk在CentOS上自动化编译打包发布_第13张图片

3. 将打包好的apk上传至OSS

  • 下载阿里OSS提供的 ossutil 工具
wget http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/attach/50452/cn_zh/1524643963683/ossutil64
  • ossutil64 赋予可执行权限
chmod +x ossutil64
  • 查看下载成功
./ossutil64 help ls -L ch
  • 配置 ACCESS_KEY_IDACCESS_KEY_SECRET
./ossutil64 config -e oss.aliyuncs.com -i ak -k sk
  • 查看OSS上 bucket 列表
./ossutil64 ls

安卓apk在CentOS上自动化编译打包发布_第14张图片

  • 找到自己需要上传apk到OSS的存放位置
//根据自己路径创建, 我保存在office-auto/app/apk/文件夹下
oss://office-auto/app/apk   
  • 可以修改 aksk endPoint 等参数
vim /root/.ossutilconfig

查看OSS可用地域endPoint

安卓apk在CentOS上自动化编译打包发布_第15张图片

  • 上传文件命令, 查找刚才打好的 apk 是否可以上传成功, 上传后也可以到OSS后台管理查看
find /root/oa-app/OA/app/build/outputs -name '*.apk' -exec  ./ossutil64 cp -f '{}' oss://office-auto/app/apk/ \;

apk上传到oss成功

  • 修改自定义 apk 文件名
variant.outputs.all { output ->
	outputFileName = "${variant.name.replace("Release", "")}${defaultConfig.versionName}.apk"
}

由于我是多渠道打包并在 build.gradle 中修改了输出的 目录名字apk文件名 这里就不再修改了, 直接执行上传

4. 连接服务器执行sql更新app (app版本号等信息存库, 不是读取xml文件)

  • 通过 shell 脚本解析 output.json 文件获取 versionCodeversionName ,当然还有 apk 大小
//方法1: 获取指定文件大小  人性化格式
du -sh /root/oa-app/OA/app/build/outputs/apk/app-release.apk | awk '{print $1}'
>> 13M

//方法2: 查询获取文件大小 字节
find oa-app/OA/app/build/outputs -name '*.apk' -exec stat -c '%s' '{}' \;
>> 12816027

//通过awk命令截取versionCode
cat /root/oa-app/OA/app/build/outputs/apk/output.json | awk -F "[:]" '/:/{print $7}' | awk -F "[,]" '/,/{print $1}'
>> 192

//通过awk命令截取versionName
cat /root/oa-app/OA/app/build/outputs/apk/ggxq/release/output.json | awk -F "[:]" '/:/{print $8}' | awk -F "[,]" '/,/{print $1}' | awk -F "[\"]" '/\"/{print $2}'
>> 1.9.2
  • 连接数据库和拼接 insert_sql 语句

根据自己的 app更新表 来写 sql语句

参数 update_content 更新内容可以使用 read 命令输入

# 数据库
hostname="xx.xx.xx.xx"
port="xx"
username="xx"
password="xxxx"
dbname="xx"
tablename="t_xxxx"

# id 我这里是时间戳拼接的32位字符串
current_id=`date +%Y%m%d%H%M%SAAAAAAAAAAAAAAAAAA`
# create_time
create_time=`date +"%Y-%m-%d %H:%M:%S"`
 
# 拼接sql (根据自己的表结构写)
insert_sql="insert into ${tablename} values('${current_id}',${version_code},'${version_name}','${apk_size}','${update_content}',1,0,'${create_time}','',NULL,NULL,NULL)"

# ECS上的mysql
mysql -h${hostname}  -P${port}  -u${username} -p${password} ${dbname} -e  "${insert_sql}"

# ECS服务器连接RDS数据库: mysql -h RDS的内网地址 -u RDS用户名 -p密码 要进入的数据库 -e "要执行的sql语句"
#mysql -h${hostname} -u${username} -p${password} ${dbname} -e  "${insert_sql}"

安卓apk在CentOS上自动化编译打包发布_第16张图片

RDS配置注意:

  1. 查看 RDS 内网地址
  2. ECS 实例查看 ECSvpc路由器,确保两者用的是同一个路由器
  3. RDS 添加白名单分组,把你的 ECS 服务器的 ip 加入到白名单中

5. 编写 Shell 脚本

/root 目录下新建 updateApp.sh 文件并编写 shell 脚本

//新建文件
touch updateApp.sh

//编辑
vim updateApp.sh (下面有下载地址)

//赋予可执行权限
chmod +x updateApp.sh
  • 最后, 执行Shell脚本即可
./updateApp.sh

附件:

完整Shell脚本下载

你可能感兴趣的:(安卓,数据库,Shell)