本文主要讲解jenkins自动化打包配置,关于Jenkins安装可以自行百度一下。
1、新建任务

image.png
2、
image.png

image.png
3、输入项目描述、设置丢弃策略,这里我们可以根据自身情况适当设置

image.png
4、选中“参数化构建过程”,进行打包参数设置
4.1 打包类型参数设置(公测包、渠道包、测试包)
这里我们添加一个“选项参数” ,PACK_TYPE

image.png

image.png
4.2 代码分支设置
这里同样我们添加一个“选项参数”,BRANCH_TYPE

image.png
4.3 打包渠道设置

image.png
4.4 添加是否需要上传大数据的选项参数

image.png
4.5 添加是否请用热修复选项参数

image.png
5 源码管理
5.1设置项目git地址,添加git用户名、密码

image.png
5.2 设置代码分支,这是我们设置成上面4.2中对应的“ BRANCH_TYPE”参数

image.png
5 构建
5.1 根据自身项目选择gradle版本,这里的版本对应于“全局工具配置”里面我们配置的gradle

image.png
5.2高级设置

image.png

image.png
勾选“Pass all job parameters as Project properties”选项,这样我们在项目中就可以接收Jenkins中的相关参数。
6 app项目接收上面设置的参数
6.1 在项目根目录”gradle.properties”中输入5.2中我们需要注入到app的三个参数
PACK_TYPE = channel
EnableBigdataLog = YES
HotFixEnable = YES

image.png
6.2 在项目中build.gradle中设置对应的buildConfigField

image.png
后续项目可以跟进这些buidConfig参数进行相应的业务处理,如多选环境,是否打印log等。
7 多渠道打包、项目加固处理
7.1在项目根目录添加两个变量,后面python代码会读取这两个参数

image.png
7.2复制“Jenkins”文件夹到项目根目录

image.png
7.3修改apk输出路径

image.png
7.4设置打包渠道

image.png
多渠道打包基于walle打包,所以需要在项目中引入walle
步骤如下:
1、在根目录build.gradle中添加
classpath 'com.meituan.android.walle:plugin:1.1.6'

image.png
2、在工程app的build.gradle中添加:
apply plugin: 'walle'
implementation 'com.meituan.android.walle:library:1.1.6'
我们可以通过以下代码来获取渠道
WalleChannelReader.getChannel(context);
8、打包输出名称、混淆文件等相关配置
在工程app中的build.gradle中android节点下添加
def bakPath = file(“${buildDir}/bakApk”)
List flavors = new ArrayList()
project.android.productFlavors.each { flavor ->
flavors.add(flavor.name)
}
boolean hasFlavors = flavors.size() > 0
def date = new Date().format("MMdd-HH-mm-ss")
//设置打包生成的apk文件的名称
android.applicationVariants.all { variant ->
variant.outputs.all { output ->
def date1 = new Date().format("MMdd_HHmm", TimeZone.getTimeZone("GMT+08"))
outputFileName = "apk名称_v${variant.versionName}_${variant.buildType.name}_${date1}.apk"
}
}
/**
* bak apk and mapping
*/
android.applicationVariants.all { variant ->
/**
* task type, you want to bak
*/
def taskName = variant.name
tasks.all {
if ("assemble${taskName.capitalize()}".equalsIgnoreCase(it.name)) {
it.doLast {
copy {
def fileNamePrefix = "${project.name}-${variant.baseName}".toLowerCase()
def newFileNamePrefix = hasFlavors ? "${fileNamePrefix}" : "${fileNamePrefix}-${date}"
def destPath = hasFlavors ? file("${bakPath}/${project.name}-${date}/${newFileNamePrefix}") : bakPath
if (variant.metaClass.hasProperty(variant, 'packageApplicationProvider')) {
def packageAndroidArtifact = variant.packageApplicationProvider.get()
if (packageAndroidArtifact != null) {
try {
from new File(packageAndroidArtifact.outputDirectory.getAsFile().get(), variant.outputs.first().apkData.outputFileName)
} catch (Exception e) {
try {
from new File(packageAndroidArtifact.outputDirectory, variant.outputs.first().apkData.outputFileName)
} catch (Exception e1) {
try {
from variant.outputs.first().mainOutputFile.outputFile
} catch (Exception e2) {
from variant.outputs.first().outputFile
}
}
}
} else {
from variant.outputs.first().mainOutputFile.outputFile
}
} else {
from variant.outputs.first().outputFile
}
into destPath
/*rename { String fileName ->
fileName.replace("${fileNamePrefix}", "${newFileNamePrefix}.apk")
}*/
from "${buildDir}/outputs/mapping/${variant.dirName}/mapping.txt"
into destPath
rename { String fileName ->
fileName.replace("mapping.txt", "${newFileNamePrefix}-mapping.txt")
}
from "${buildDir}/intermediates/symbols/${variant.dirName}/R.txt"
from "${buildDir}/intermediates/symbol_list/${variant.dirName}/R.txt"
into destPath
rename { String fileName ->
fileName.replace("R.txt", "${newFileNamePrefix}-R.txt")
}
}
}
}
}
9、配置Jenkins打包脚本

image.png

image.png
最后点击确定
10 如果配置后想进行编辑,点击“配置”即可进入编辑页

image.png
最后点击“[Build with Parameters]”进行打包

image.png
其他:
如果已有打包任务,在新建任务时通过直接复制一个配置,然后进行相关配置修。

image.png