Android集成Bugly热更新(基于Tinker)

1,678 阅读1分钟

集成指南

直接按官网文档步骤来就行,参考以下资料:

问题记录

1.打多渠道补丁包时遇到的问题

发现问题

由于项目配置了打包命名规则:

android.applicationVariants.all { variant ->
    //自定义打包命名规则
    def outputApkName = "tfysy_v${variant.versionName}_${variant.versionCode}.apk"
    variant.outputs.all {
        outputFileName = outputApkName
    }
}

导致多渠道打包assembleReleasetinker自动备份的文件是这样的:

自定义打包命名规则
接下来将tinker脚本配置为buildAllFlavorsDir = "${bakPath}/${baseApkDir}",这个就是表明要对每个渠道打多渠道补丁,然后执行buildAllFlavorsTinkerPatchRelease打多渠道补丁,这样就会提示如下错误:

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:tinkerPatchBaiduRelease'.
> old apk D:\Project\Android\yishengyue_tianfu\app\build\bakApk/app-0927-10-39-35/baidu/app-baidu-release.apk is not exist, you must set the correct old apk value!

提示找不到基准包,再看基准包的名字是app-baidu-release.apk,这和前面备份的包名字不一样,所以就会找不到基准包。

解决问题

既然是因为命名的问题,这里就要通过命名规则来入手。

  • 方案一:不使用自定义命名规则,直接删除掉命名规则,使用默认命名。
  • 方案二:设置备份文件的命名规则以满足tinker的读取的基准包命名规则:

tinker-support.gradle文件中添加如下配置:

def date = new Date().format("MMdd-HH-mm-ss")

/**
 * bak apk and mapping
 */
android.applicationVariants.all { variant ->
    //自定义打包命名规则
    def outputApkName = "tfysy_v${variant.versionName}_${variant.versionCode}.apk"
    variant.outputs.all {
        outputFileName = outputApkName
    }
    /**
     * task type, you want to bak
     */
    def taskName = variant.name
    tasks.all {
        if ("assemble${taskName.capitalize()}".equalsIgnoreCase(it.name)) {

            it.doLast {
                copy {
                    //备份文件前缀
                    def bakFilePrefix = "${project.name}-${variant.baseName}"
                    def destPath = "${bakPath}/${project.name}-${date}/${variant.flavorName}"

                    from variant.outputs.first().outputFile
                    into destPath
                    rename { String fileName ->
                        fileName.replace(outputApkName, "${bakFilePrefix}.apk")
                    }

                    from "${buildDir}/outputs/mapping/${variant.dirName}/mapping.txt"
                    into destPath
                    rename { String fileName ->
                        fileName.replace("mapping.txt", "${bakFilePrefix}-mapping.txt")
                    }

                    from "${buildDir}/intermediates/symbols/${variant.dirName}/R.txt"
                    into destPath
                    rename { String fileName ->
                        fileName.replace("R.txt", "${bakFilePrefix}-R.txt")
                    }
                }
            }
        }
    }
}

现在打多渠道包assembleReleasetinker自动备份的文件是这样的:

设置备份文件命名规则
可以看到有按以上规则命名的文件,现在再执行buildAllFlavorsTinkerPatchRelease打多渠道补丁,就不会报错了。