JavaAndroidAndroid

android Jenkins打包

2021-04-07  本文已影响0人  DreamMeng

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

1、新建任务

image.png

2、 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<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打包脚本

image.png image.png

最后点击确定

10 如果配置后想进行编辑,点击“配置”即可进入编辑页

image.png

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


image.png

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


image.png
上一篇 下一篇

猜你喜欢

热点阅读