android Jenkins打包
2021-04-07 本文已影响0人
DreamMeng
本文主要讲解jenkins自动化打包配置,关于Jenkins安装可以自行百度一下。
1、新建任务
![](https://img.haomeiwen.com/i17233974/a469f4f4c85f30a2.png)
2、
image.png
3、输入项目描述、设置丢弃策略,这里我们可以根据自身情况适当设置
![](https://img.haomeiwen.com/i17233974/3867b8f0f8643323.png)
4、选中“参数化构建过程”,进行打包参数设置
4.1 打包类型参数设置(公测包、渠道包、测试包)
这里我们添加一个“选项参数” ,PACK_TYPE
![](https://img.haomeiwen.com/i17233974/357108641b78809e.png)
![](https://img.haomeiwen.com/i17233974/358423662afb3222.png)
4.2 代码分支设置
这里同样我们添加一个“选项参数”,BRANCH_TYPE
![](https://img.haomeiwen.com/i17233974/a2b18c8203f3445f.png)
4.3 打包渠道设置
![](https://img.haomeiwen.com/i17233974/b37f3bb6cd75d225.png)
4.4 添加是否需要上传大数据的选项参数
![](https://img.haomeiwen.com/i17233974/5b1bb55641216722.png)
4.5 添加是否请用热修复选项参数
![](https://img.haomeiwen.com/i17233974/aeab65b46171af4d.png)
5 源码管理
5.1设置项目git地址,添加git用户名、密码
![](https://img.haomeiwen.com/i17233974/2a9b9cdaa6740935.png)
5.2 设置代码分支,这是我们设置成上面4.2中对应的“ BRANCH_TYPE”参数
![](https://img.haomeiwen.com/i17233974/483be326980fde0b.png)
5 构建
5.1 根据自身项目选择gradle版本,这里的版本对应于“全局工具配置”里面我们配置的gradle
![](https://img.haomeiwen.com/i17233974/f1b6bc09c6323a22.png)
5.2高级设置
![](https://img.haomeiwen.com/i17233974/a170e50204221e5c.png)
![](https://img.haomeiwen.com/i17233974/583e130af954a54d.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
![](https://img.haomeiwen.com/i17233974/9cfd6bc2f0370d53.png)
6.2 在项目中build.gradle中设置对应的buildConfigField
![](https://img.haomeiwen.com/i17233974/018f483b96487e94.png)
后续项目可以跟进这些buidConfig参数进行相应的业务处理,如多选环境,是否打印log等。
7 多渠道打包、项目加固处理
7.1在项目根目录添加两个变量,后面python代码会读取这两个参数
![](https://img.haomeiwen.com/i17233974/d37448047bac2bb9.png)
7.2复制“Jenkins”文件夹到项目根目录
![](https://img.haomeiwen.com/i17233974/20c3cd8913556306.png)
7.3修改apk输出路径
![](https://img.haomeiwen.com/i17233974/e36a80b6715b9f57.png)
7.4设置打包渠道
![](https://img.haomeiwen.com/i17233974/7a442de42dc72baf.png)
多渠道打包基于walle打包,所以需要在项目中引入walle
步骤如下:
1、在根目录build.gradle中添加
classpath 'com.meituan.android.walle:plugin:1.1.6'
![](https://img.haomeiwen.com/i17233974/39e4e8cb0cef061a.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<String> 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打包脚本
![](https://img.haomeiwen.com/i17233974/c0693ac93c306c93.png)
![](https://img.haomeiwen.com/i17233974/831a9d36b9d29ef9.png)
最后点击确定
10 如果配置后想进行编辑,点击“配置”即可进入编辑页
![](https://img.haomeiwen.com/i17233974/7118d0a6eae2bc32.png)
最后点击“[Build with Parameters]”进行打包
![](https://img.haomeiwen.com/i17233974/4d3e4799fc56f517.png)
其他:
如果已有打包任务,在新建任务时通过直接复制一个配置,然后进行相关配置修。
![](https://img.haomeiwen.com/i17233974/903c7c66725b2120.png)