Android 自动化打包实践 gradle打包并推送到git远程库
2017-03-22 00:00
465 查看
我们希望在打包的时候能够做到:
使用 Android studio ,使用 gradle 进行构建;
在实际开发中,需要配置我们的 gradle 脚本以支持参数化的方式;
想获得一个可配置打包脚本的方法,允许配置人员根据需要修改服务器地址,versionCode, versionName等;
隔离的源代码的配置,使用者在shell脚本里进行配置。
在阅读本文之前,一些关于gradle的配置项,可以通过这篇文章复习了解
Android使用gradle打包的各种配置
一.自动打包和推送git的shell脚本
XXX_autoReleaseToGit.sh
这个脚本会顺序执行打包脚本XXX_assemble.sh和git操作脚本XXX_PUSH_APK.sh,结果是可以根据使用者的选择打包出发布版本、测试版本(极光正式key)和测试版本(极光测试key)。当然,你也可以通过修改脚本,一次性打包出以上版本。
[b]执行shell脚本进行自动打包[/b]
XXX_assembleRelease.sh
这个脚本包含了代码分支更新、代码更新、选择打包环境和第三方服务(极光推送)的操作。
参数都是自定义的,这里写入了多个参数,有指定的各个服务器地址,apk输入文件路径,和环境标识后缀名、极光标识。
配置debug节点各个服务器地址的值
同配置defaultConfig节点一样
配置release节点
读取上面XXX_assemble.sh文件传入的参数的值作为各个服务器地址的值。
在读取参数的时候,我们先检查参数是否存在,使用代码:
所有通过命令行传入的参数都或作为 project 内建对象的属性,我们这里判断了指定的参数名是否存在。如何使用参数呢?直接使用即可。
和普通的变量使用方法是一样的。我们还会遇到在字符串中使用的时候,可以使用表达式 来引用,比如:
示例;
详细如下:
将以上工作做完之后,我们就可以通过执行脚本来打包了,我们可以打出一系列debug和release的不同服务器环境的版本,对应不同的第三方服务的版本(如极光推送生产环境和发布环境的版本)。当然,你可以修改脚本,写入定时执行功能,将脚本完全写成自动化定时执行的脚本。
使用 Android studio ,使用 gradle 进行构建;
在实际开发中,需要配置我们的 gradle 脚本以支持参数化的方式;
想获得一个可配置打包脚本的方法,允许配置人员根据需要修改服务器地址,versionCode, versionName等;
隔离的源代码的配置,使用者在shell脚本里进行配置。
在阅读本文之前,一些关于gradle的配置项,可以通过这篇文章复习了解
Android使用gradle打包的各种配置
一.自动打包和推送git的shell脚本
XXX_autoReleaseToGit.sh
这个脚本会顺序执行打包脚本XXX_assemble.sh和git操作脚本XXX_PUSH_APK.sh,结果是可以根据使用者的选择打包出发布版本、测试版本(极光正式key)和测试版本(极光测试key)。当然,你也可以通过修改脚本,一次性打包出以上版本。
# 自动打包和推送git的shell脚本 # 打开自动打包工具目录 # 执行打包脚本 cd 你的自动打包工具目录 echo "进入自动化打包脚本目录..." pwd #使用gradle命令进行打包 echo "使用gradle命令开始打包..." `dirname ${0}`/XXX_assemble.sh #推送到git远程库 echo "git操作开始..." `dirname ${0}`/XXX_PUSH_APK.sh
[b]执行shell脚本进行自动打包[/b]
XXX_assembleRelease.sh
这个脚本包含了代码分支更新、代码更新、选择打包环境和第三方服务(极光推送)的操作。
参数都是自定义的,这里写入了多个参数,有指定的各个服务器地址,apk输入文件路径,和环境标识后缀名、极光标识。
project_path="你的工程根目录" gradlew_path="${project_path}/gradlew" # 切换到项目目录 cd ${project_path} echo "切换到项目目录..." pwd # 进行代码分支选择 echo "正在更新代码分支信息..." # 更新分支信息 git fetch -p # 获取所有远程分支信息 remote_branchs=`git branch -r` # 分割成数组后让使用者选择打包分支 echo "请选择待打包分支: " echo "请选择待打包分支: " arr=(${remote_branchs// /}) index=1 for i in ${arr[@]}; do #statements echo ${index}". "${i:7} ((index++)) done # 读取使用者数据 read branch_index echo "你选择要打包的分支是: ${branch_index} " if [[ -z ${branch_index} ]]; then echo "Error: 选择的分支序号不合法" echo "Error: 选择的分支序号不合法" fi ((branch_index--)) # 切换branch并拉取最新代码 echo "切换到该分支并拉取最新代码..." if [[ ${arr[${branch_index}]} =~ "HEAD" ]]; then echo "Error: 不能切换到该分支(${arr[${branch_index}]})" echo "Error: 不能切换到该分支(${arr[${branch_index}]})" exit 1 fi # git reset --hard HEAD #result_code=$? git checkout ${arr[${branch_index}]:7} result_code=$? git pull result_code=$? if [[ ${result_code} != 0 ]]; then echo "Error: 拉取代码失败" echo "Error: 拉取代码失败" exit 1 fi # gradlew文件增加可执行权限 chmod u+x ${gradlew_path} echo "请选择版本的环境地址" echo "1:正式环境" echo "2:测试环境" read environment # 执行gradlew.bat 进行打包 # -P表示后面的是自定义参数 如-POUT_PUT_DIR_PARA 表示自定义了一个OUT_PUT_DIR_PARA参数 后面是赋值 # OUT_PUT_DIR_PARA APK输出目录 # BASE_URL_PARA 服务器基本请求地址 # ENVIRONMENT_PARA 服务器环境表示 1.real 正式环境 2.test 测试环境 # JPUSH_APPKEY_PARA 只要有自定义这个参数 就代表要输出极光推送的APK if [[ ${environment} = 1 ]]; then #statements echo "你选择要打包的地址是:正式环境" ${gradlew_path} assembleRelease -POUT_PUT_DIR_PARA=你的APK输出目录 -PBASE_URL_PARA=你的正式环境服务器地址 -PENVIRONMENT_PARA=real --info --stacktrace else #statements echo "你选择要打包的地址是:测试环境" echo "----" echo "请选择版本的极光Key" echo "1:正式Key" echo "2:测试Key" read jpushAppKey if [[ ${jpushAppKey} = 1 ]]; then #statements echo "你选择要打包的极光Key是:正式Key" ${gradlew_path} assembleRelease -POUT_PUT_DIR_PARA=你的APK输出目录 -PBASE_URL_PARA=你的测试环境服务器地址 -PENVIRONMENT_PARA=test --info --stacktrace else #statements echo "你选择要打包的极光Key是:测试Key" ${gradlew_path} assembleRelease -POUT_PUT_DIR_PARA=你的APK输出目录 -PBASE_URL_PARA=你的测试环境服务器地址 -PENVIRONMENT_PARA=test_int -PJPUSH_APPKEY_PARA=1 --info --stacktrace fi fi
二.配置gradle文件
配置 defaultConfig 节点defaultConfig { if (project.hasProperty('JPUSH_APPKEY_PARA')) { //如果有指定极光key的自定义参数,那么就设置极光推送测试key对应的appId applicationId project.APPLICATIONID_JPUSH } else { //工程本来的appId applicationId project.APPLICATIONID_RELEASE } //最低安装版本Android 4.0 minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionCode rootProject.ext.versionCode versionName rootProject.ext.versionName // dex突破65535的限制 multiDexEnabled true manifestPlaceholders = [ // 默认是umeng测试的渠道 UMENG_CHANNEL_VALUE: "TEST", // 默认是正式的极光key JPUSH_APPKEY: project.JPUSH_APPKEY_VALUE_RELEASE ] //配置 defaultConfig 下的 buildConfigField字段 ,这是为了 代码编译的方便,使得在各个环境下都有 BASE_URL 这个字段。 //正式服务器 buildConfigField("String", "BASE_URL", "\"" + project.BASE_URL_REAL + "\"") }
配置debug节点各个服务器地址的值
同配置defaultConfig节点一样
debug { //测试服务器请求 buildConfigField("String", "BASE_URL", "\"" + project.BASE_URL_TEST + "\"") }
配置release节点
读取上面XXX_assemble.sh文件传入的参数的值作为各个服务器地址的值。
在读取参数的时候,我们先检查参数是否存在,使用代码:
project.hasProperty('参数名')
所有通过命令行传入的参数都或作为 project 内建对象的属性,我们这里判断了指定的参数名是否存在。如何使用参数呢?直接使用即可。
versionCode Integer.parseInt(VERSION_CODE_PARA) //注意这里,进行了转型,从字符串转型为 int 类型 versionName VERSION_NAME_PARA
和普通的变量使用方法是一样的。我们还会遇到在字符串中使用的时候,可以使用表达式 来引用,比如:
${参数名}
示例;
fileName = fileName.replace(".apk", "-${android.defaultConfig.versionName}.apk")
详细如下:
// 定义一个打包时间 def releaseTime() { return new Date().format("yyyyMMdd", TimeZone.getTimeZone("UTC")) } android { ... buildTypes { debug { ... } ... release { ... if (project.hasProperty('JPUSH_APPKEY_PARA')) { //接收自定义参数的值,指定测试的极光key manifestPlaceholders = [ JPUSH_APPKEY: project.JPUSH_APPKEY_VALUE_DEBUG ] } applicationVariants.all { variant -> variant.outputs.each { output -> def outputFile = output.outputFile if (outputFile != null && outputFile.name.endsWith('.apk')) { // 输出apk名称为XXX20160328_v1.0.0_vc10_XXXX_test.apk if (project.hasProperty('ENVIRONMENT_PARA') def fileName=" XXX${releaseTime()}_v${defaultConfig.versionName}_vc${defaultConfig.versionCode}_${variant.productFlavors[0].name}_${ENVIRONMENT_PARA}.apk" //控制输出的APK的存放路径 if (project.hasProperty('OUT_PUT_DIR_PARA')) { File output_dir1 = file("${OUT_PUT_DIR_PARA}"); output.outputFile = new File(output_dir1, fileName) println "输出文件位置: " + output.outputFile } else { output.outputFile = new File(outputFile.parent, fileName) println "输出文件位置: " + output.outputFile } } } } } productFlavors.all { flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name] } } }
三.打包完成之后,将APK提交并推送到git远程库
XXX_PUSH_APK.shcd 你的APK输出目录 pwd #同步远程库 git pull; #add新增加的APK文件 git add *; #提交APK git commit -m '提交APK'; #推送到远程库 git push;
将以上工作做完之后,我们就可以通过执行脚本来打包了,我们可以打出一系列debug和release的不同服务器环境的版本,对应不同的第三方服务的版本(如极光推送生产环境和发布环境的版本)。当然,你可以修改脚本,写入定时执行功能,将脚本完全写成自动化定时执行的脚本。
相关文章推荐
- Android Studio Gradle实践之多渠道自动化打包(Android快速多渠道打包)
- Linux中Jenkins+Git+Gradle自动化打包Android
- jenkins自动化编译之android gradle编译git仓库源码
- Jenkins+Gradle+Git+Pyger+二维码搭建Android自动打包平台
- Android Gradle多渠道和自动化打包(深入篇)
- jenkins+gradle+git android自动化构建
- 使用Jenkins+Git+Gradle自动化构建Android APK包
- Android Jenkins+Git+Gradle持续集成打包
- 实践Jenkins+Gradle实现Android自动化构建,并上传至fir.im
- Jenkins+Gradle+Python进行Android自动化打包
- 自动化打包 Jenkins 持续集成 Git Gradle
- hudson +gradle+git+maven(非必选)持续集成一 打包自动化
- Jenkins+Gradle+Git+Pyger+二维码搭建Android自动打包平台
- Jenkins+Gradle实现自动化Android打包、输出APK到指定路径
- Android自动化构建之Ant多渠道打包实践(下)
- GitHub入门与实践(2)掌握Git 4、推送至远程仓库
- Jenkins+Gradle+Git+Centos 实现android持续集成、打包(超详细)
- 一.jenkins+github+gradle 实现android自动化打包全攻略(MAC版)
- Jenkins+Gradle实现自动化Android打包、输出APK到指定路径