Android使用腾讯Bugly中的Tinker进行热更新详解

前言:本人之前没有使用过和集成过热更新tinker,决定自己看文档尝试一下,在项目中配置一下。在看了文档之后,文档中介绍了两种集成实现热更新的方式,其中一对我来说就是比较麻烦的一种,要修改自己项目中的已经写好的Application类,由于一些原因,我不想修改这个类,而且觉得这种方式写起来麻烦,就选择了写更少的代码去实现。这里我是完全按照文档来的,但是对文档进行了多次热更新尝试中间有时成功有时失败,最后总结的配置方法,这里我不在介绍怎么配置依赖,配置简单,参考https://bugly.qq.com/docs/user-guide/instruction-manual-android-hotfix/?v=20180709165613 

什么第一步添加插件依赖,第二部集成SDK,上面介绍的比较详细,完全按照上面的来弄就行,

,接着在app module的“build.gradle”文件中添加:

 依赖插件脚本   :    apply from: 'tinker-support.gradle'       这个写在和 apply plugin: 'com.android.application' 同级,就写在它下一行就行了。

然后新建一个名为tinker-support.gradle 的文件,和app的build.gradle 同级别即可,创建完,打开此文件,里面直接把文档连的全部复制下来,拷贝进去,我就是。

//这个不需要改动
apply plugin: 'com.tencent.bugly.tinker-support'
//这个不需要改动
def bakPath = file("${buildDir}/bakApk/")

/**
 * 此处填写每次构建生成的基准包目录
* 这个内容是在app->build->bakApk下的文件名字,看你想用哪个文件下面的内容,注意如果多次编译,会出现多个,但是在后面打补丁包只能选择一个,而且下面的baseApk 内容填写的就是你选择的那个文件下面的apk的名称
BaseApkDir 目录名称为上次打包发布时的bakApk 的文件夹名称(一定要记下来,且不能删除,也不能轻易clean,一旦clean,这些文件就全部没了,然后你就无法打补丁了)虽然每次运行都会生成一个新的,这个里面的文件夹会越来越多,但是你可以手动把其他的删除,发布版本生成apk那个对应的文件夹名称不要删除,要留着
 */
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 }
    // 这里也需要改 ,每次都改为自己的新发布的版本的apk名称
    baseApk = "${bakPath}/${baseApkDir}/app-release.apk"

    // 对应tinker插件applyMapping
    //这个看项目内容,有的有,有的没有,我的项目中没有生成这个文件,我就注释掉了,这是混淆文件会有这个
    baseApkProguardMapping = "${bakPath}/${baseApkDir}/app-release-mapping.txt"

    // 对应tinker插件applyResourceMapping    
    // 这个一般不用动,都是一样的
    baseApkResourceMapping = "${bakPath}/${baseApkDir}/app-release-R.txt"

       // 构建基准包和补丁包都要指定不同的tinkerId,并且必须保证唯一性
    //每次发布新版本时,都需要重新修改一下tinkerId 的值,确保即即将发布的版本中的tinkerId在目前所有版本中是唯一的
    //其他版本时没有的,这样为了在此版本有修改的bug时,再修改此tinkerId的,只会对应当前线上你想对应的版本
    tinkerId = "base-1.0.1"

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

    // 是否启用加固模式,默认为false.(tinker-spport 1.0.7起支持)
    // isProtectedApp = true

    // 是否开启反射Application模式  ,这个看需求,我改为true 了,
    enableProxyApplication = false

    // 是否支持新增非export的Activity(注意:设置为true才能修改AndroidManifest文件)
    supportHotplugComponent = true

}

/**
 * 一般来说,我们无需对下面的参数做任何的修改
 * 对于各参数的详细介绍请参考:
 * https://github.com/Tencent/tinker/wiki/Tinker-%E6%8E%A5%E5%85%A5%E6%8C%87%E5%8D%97
 */
tinkerPatch {
    //oldApk ="${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}/${appName}/app-release-mapping.txt" //  可选,设置mapping文件,建议保持旧apk的proguard混淆方式
        //applyResourceMapping = "${bakPath}/${appName}/app-release-R.txt" // 可选,设置R.txt文件,通过旧apk文件保持ResId的分配
    }
}

注意:这里在多说几句,

def baseApkDir = "app-0208-15-10-00"   这一行上面已经 详细的说明了,这里在啰嗦一句,假如我现在发布一个版本的apk,我要build apk,然后会生成一个release 的apk,此时,会在app -> build -> bakApk -> 下面生成一个文件夹,文件夹的名字就是当前的时间命名的,假如现在是11月17日19点30分54秒,那文件夹的名称就是app-1117-19-30-54 展开此文件夹,下面就会有对应的两个或三个文件,这个先不管,我们一定要记住这个发布时对应的这个文件一定留着。

还有上面在build apk时,看看上面的tinker-support.gradle 文件中 这个内容是否有值,: tinkerId = "base-1.0.1"

这里默认为base-1.0.1 ,你也可以用这个初始化命名,也可以稍作修改,我的改为了base-1.0.0 了,然后在进行build生成要发布的apk.

好了,现在我们把上面打包好的apk发布上去,用户下载。

突然有一个bug需要修改,我们此时要先把需要修改的bug改掉,接着在注意上面发布的apk,这时,我们先把上面build生成apk时那个bakApk下的那个文件夹名字记住了,然后把名字 写到  

def baseApkDir  

这个对应的值中。

然后,在修改  

tinkerId  的值,上面我发布的时候,值为  base-1.0.0  那么,这里我需要改一下和发布不一样的,这个修改有个规律,就是和我们apk的版本号一样,虽然为字符串,但是我们依然可以那么写,这里我们改为 base-1.0.1, 

然后在看一下 这个值:

baseApk    它后面的apk的名称和我们上面发布apk时bakApk下面对应的文件夹里面的apk名称是否一样,一样就不需要动了,不一样就要修改一下,其他的就不用动了。

接着我们就开始打补丁了,点击AndroidStudio右边的Gradle,然后在app下面Task-》tinker-support 下面的buildTInkerPatchRelease ,点击它就开始打补丁了。补丁打好之后,会在左边项目的app -> build -> outputs下面的patch文件夹下面生成三个文件,哪三个文件,这个我就不写了,截个图

我们需要的就是中间那个,patch_signed_7zip.apk ,我们拷贝这个文件,然后发布到bugly的热更新中,发布补丁,

选择文件,之后会自动匹配到对应的版本,然后备注一下,点击立即下发,过一会就能看到你修改的东西了。可能需要等待两三分钟。在下发列表中可以看到下发数量和激活数量。必须激活有激活的,才表示补丁成功。

 

这里在多说一句,每次发布的新版本,build  apk时,一样要先修改 tinkerId  ,一个tinkerId对应一个apk版本,若不修改,和之前老版本的tinkerId一样,那你这个补丁基本下发都是失败的,我尝试过多次,都是这个问题。一点主意。然后在打补丁,打补丁需要基于已发布的版本的tinkerId 对base-1.0.1进行增加,改动,不能和之前的一样。即可。多次遇坑就在这里。慢慢摸索的。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值