腾讯Bugly热更新集成踩坑总结

236 阅读3分钟

「这是我参与2022首次更文挑战的第6天,活动详情查看:2022首次更文挑战」。

热更新:多么高大上的名字,Android 开发者应该都知道这么个东西,原理呢!请自行百度,这里只是集成总结,谢谢!!! 对于第三方SDK的使用,大家都知道用“步步高点读机,哪里不会点哪里”—— 所以第一步肯定是看官方集成文档:地址:bugly.qq.com/docs/user-g… 首先,刚开始看的时候跟大部分SDK一样肯定是各种配置的,这里根据官方文档的步骤来解释说明哪里需要注意的,以及我是怎么处理成功的。

第一步:添加插件依赖 工程根目录下“build.gradle”文件中添加:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        // tinkersupport插件, 其中lastest.release指拉取最新版本,也可以指定明确版本号,例如1.0.4
        classpath “com.tencent.bugly:tinker-support:latest.release”
    }
}

坑 1:这里是添加依赖没错,但我遇到问题就是后面生成patch包时在Gradle任务中找不到文档里面说的tinker文件夹和tinker-support文件夹(后面的步骤会说到),于是乎翻山越岭找资料,发现一个这个: classpath (‘com.tencent.tinker:tinker-patch-gradle-plugin:1.7.5’) 需要这个依赖插件

第二步:集成SDK:这里没有什么大坑,照着复制就可以了,注意:tinker-support.gradle文件中的配置

apply plugin: ‘com.tencent.bugly.tinker-support’

def bakPath = file(“${buildDir}/bakApk/”)

此处填写每次构建生成的基准包目录,如果是你打基准包这个可以暂时不用管,打patch包的话就要改成你的基准包生成的目录,必须相同

def baseApkDir = “app-0208-15-10-00

对于插件各参数的详细解析请参考

tinkerSupport {
    // 开启tinker-support插件,默认值true
    enable = true

    // 指定归档目录,默认值当前module的子目录tinker
    autoBackupApkDir = "${bakPath}"

    // 是否启用覆盖tinkerPatch配置功能,默认值false
    // 开启后tinkerPatch配置不生效,即无需添加tinkerPatch
    overrideTinkerPatchConfiguration = true

    // 编译补丁包时,必需指定基线版本的apk,默认值为空
    // 如果为空,则表示不是进行补丁包的编译
    // @{link tinkerPatch.oldApk } **patch包改成基准包的apk文件名**
    baseApk = "${bakPath}/${baseApkDir}/app-release.apk"

    // 对应tinker插件applyMapping **patch包改成基准包的mapping文件名**
    baseApkProguardMapping = "${bakPath}/${baseApkDir}/app-release-mapping.txt"

    // 对应tinker插件applyResourceMapping **patch包改成基准包的R文件名**
    baseApkResourceMapping = "${bakPath}/${baseApkDir}/app-release-R.txt"

    // 构建基准包和补丁包都要指定不同的tinkerId,并且必须保证唯一性,**基准包这里最好是改成base-versionname,patch包就改成patch-versionname,每个版本的都不一样**
    tinkerId = "base-1.0.1"//示例

    // 构建多渠道补丁时使用
    // buildAllFlavorsDir = "${bakPath}/${baseApkDir}"

    // 是否开启反射Application模式
    enableProxyApplication = false
}

**一般来说,我们无需对下面的参数做任何的修改,对于各参数的详细介绍请参考:

tinkerPatch {
    //oldApk =”bakPath/bakPath/{appName}/app-release.apk”
    ignoreWarning = false
    useSign = true
    dex {
        dexMode = “jar”
        pattern = [“classes*.dex”]
        loader = []
    }
    lib {
        pattern = [“lib//.so”]
    }

    res {
        pattern = ["res/*", "r/*", "assets/*", "resources.arsc", "AndroidManifest.xml"]
        ignoreChange = []
        largeModSize = 100
    }

    packageConfig {
    }
    sevenZip {
        zipArtifact = "com.tencent.mm:SevenZip:1.1.10"
        // path = “/usr/local/bin/7za”
    }
    buildConfig {
    keepDexApply = false
    //tinkerId = “1.0.1-base”
    //applyMapping = “bakPath/bakPath/{appName}/app-release-mapping.txt” // 可选,设置mapping文件,建议保持旧apk的proguard混淆方式
    //applyResourceMapping = “bakPath/bakPath/{appName}/app-release-R.txt” // 可选,设置R.txt文件,通过旧apk文件保持ResId的分配
    }
}

后面的步骤就按照集成文档来就OK了,最后说明一下:build文件夹下会产生很多app-xxxx-xx-xx的文件夹, 你生成的基准包就是在这里面,主要使用最新的,不想要的话直接build project或者clean也可以。

image.png

终极大坑:  在打patch包的时候,遇到点击Gradle任务中的tinker-support生成apk的时候有时会出错,经过我的不断rebuild和clean之后就好了(也有可能是你配置文件中的问题,这里需要注意)。

image.png