微信 Tinker + 腾讯 Bugly 热修复就搞定啦

1,264 阅读4分钟

本篇文章使用 tinker 作为热修复工具,使用 bugly 做为后台进行下补丁。

Tinker、Bugly 简介

「 Tinker 」 是微信官方的 Android 热补丁解决方案,支持动态下发代码、So库以及资源,用来紧急修复 bug,解决你的燃眉之急。

「 Bugly 」 是腾讯针对移动端 bug 管理、运营统计、热修复的一个平台。

Tinker 热修复组件 GitHub 链接地址

使用说明和简介详见项目 wiki 链接地址

接入指南详见 GitHub 链接地址

Bugly Android 热更新使用指南 链接地址

Bugly、Tinker 接入

参考上面的「 Bugly Android 热更新使用指南 」,按照步骤一步一步来。 其中要注意一下以几个点:

  1. 配置依赖时,最好指定版本号。因为最新版本要是改东西了,你也不知道,可能就会发生一些问题,比如:方法的名字变了,当升级后就找不到了。

  2. 如果你以前接入过 bugly 需要在 gradle 中注释掉原有的 bugly 依赖。

  3. 别忘记在 app modul e的 “build.gradle” 文件中添加插件依赖。

    apply from: 'tinker-support.gradle'

  4. 使用推荐的 Tinker 接入方式,虽然接入麻烦写,但兼容性会更好。

这里详细说下推荐的 Tinker 接入方式,许多人在这里比较晕乎。

  1. 将 BaseApplication 中继承的 Application 改为继承 DefaultApplicationLike,并导入构造方法。
  2. 在 BaseApplication 中添加 onBaseContextAttached() 方法和 registerActivityLifecycleCallback() 方法。
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
    @Override
    public void onBaseContextAttached(Context base) {
        super.onBaseContextAttached(base);
        // you must install multiDex whatever tinker is installed!
        MultiDex.install(base);

        // 安装tinker
        Beta.installTinker(this);
    }

    @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
    public void registerActivityLifecycleCallback(Application.ActivityLifecycleCallbacks callbacks) {
        getApplication().registerActivityLifecycleCallbacks(callbacks);
    }
  1. 在 onCreate 方法中初始化 Bugly 。
    @Override
    public void onCreate() {
        super.onCreate();
        // 这里实现SDK初始化,appId替换成你的在Bugly平台申请的appId
        // 调试时,将第三个参数改为true
        Bugly.init(getApplication(), "900029763", false);
    }

至此,我们的原 BaseApplication 就已经改造完成了。Application 的获取可以通过 getApplication() 进行获取。

  1. 自定义 Application 继承 TinkerApplication。
public class SampleApplication extends TinkerApplication {
    public SampleApplication() {
        super(ShareConstants.TINKER_ENABLE_ALL, "xxx.xxx.SampleApplicationLike",
                "com.tencent.tinker.loader.TinkerLoader", false);
    }
}

其中第二个参数 "xxx.xxx.SampleApplicationLike",就是我们刚刚改好的 BaseApplication,xxx.xxx 是你的项目包名。

  1. 将 AndroidManifest.xml 中的 application name 改为自定义的 Application。

至于 tinker-support.gradle 文件,我们直接粘贴过来即可。 配置参数可参考 TinkerSupport 插件使用指南,参考链接

发布正式版本:

  1. 在项目的主 moudle 下,打开 tinker-support.gradle 文件,也可使用全局搜索。此文件是 tinker 的配置文件,热修复相关功能和参数能都在此文件中配置。

  2. 打开 tinker 热修复组件。在 tinkerSupport 的方法中,将 enable 改为 true。

    enable = true ( true 开启,false 关闭 )。

  3. 启用覆盖 tinkerPatch 配置功能。在 tinkerSupport 的方法中,将 overrideTinkerPatchConfiguration 改为 true。

    overrideTinkerPatchConfiguration = true ( true 开启,false 关闭 )。

  4. 按照规则配置 tinkerId,tinkerId必须保证唯一性

  • 正式包 base-版本名 例:base-2.6.1
  • 补丁包 patch-版本名.1 例:patch-2.6.1.1 patch-2.6.1.2 。。。
  1. 关闭 tinkerPatch 的功能。在 tinkerPatch 中,注释 tinkerPatch 中 tinkerEnable = false。

    //tinkerEnable = false

  2. 修改好这些配置后,就可以正式打包了,打包有两种方式,以下两种方式均可。

  • Android Studio 正常打包流程,Build -> Generate Signed APK。

    正常打包流程

  • 打开 gradle 文件,运行 项目 gradle -> Tasks -> build -> assembleRelease。

    使用 gradle 打包

等待 gradle 运行结束后,会生成 bakApk 的文件夹,此文件夹下的 app-MMdd-hh-mm-ss 是我们的基准包目录,后期打补丁包的时候需要用到,一定要保存好。

文件位置:项目主 moudle -> build -> bakApk -> app-MMdd-hh-mm-ss(按照时间生成)。

文件位置

app-release.apk 就是我们打好的包,在使用 360 加固助手加固后就可以上线了。

发布补丁包:

当修改好 bug 以后,

  1. 修改基准包目录。在 tinker-support.gradle 中,将 def baseApkDir 改为你需要修复版本的基准包目录(也就是上面提到的基准包目录)。

    def baseApkDir = "app-MMdd-hh-mm-ss"

    MMdd-hh-mm-ss 修改为你需要修复版本的基准包目录

后续的 5 个步骤和发正式包的前 5 个步骤相同,切记一定要修改 tinkerId,否则无发辨别版本。

  1. 使用 buildTinkerPatchRelease 打补丁包。

打开 gradle 运行 项目 gradle -> Tasks -> tinker-support -> buildTinkerPatchRelease。

buildTinkerPatchRelease位置

如果没有此选项,首先确认你的 tinkerEnable 是否是 true,然后重新构建下项目即可。

  1. 使用 Bugly 平台下发补丁包。

等待 gradle 运行结束后,会生成新的基准包,修复好的 apk 在此文件中。同时,还会生成 patch 文件夹,下发的补丁 patch_signed_7zip.apk 就在此文件夹中。

补丁文件位置:项目主 moudle -> build -> outputs -> patch -> release。

补丁图片

打开 Bugly 平台,选择移动端平台 -> 应用升级 -> 热更新。

点击发布补丁,选择补丁文件,目标版本会在补丁上传后会自动匹配。 可选择下发范围,选好后下发即可。

上传补丁

使用 instantrun 的配置

由于 Android Studio 的 instantrun 和 tinker 有冲突,所以,想要使用 instanttun 需要关闭 tinker,关闭方法如下:

1.关闭 tinker 热修复组件。在 tinkerSupport 的方法中,将 enable 改为 false。

enable = false( true 开启,false 关闭 )。

2.关闭覆盖 tinkerPatch 配置功能。在 tinkerSupport 的方法中,将 overrideTinkerPatchConfiguration 改为 false。

overrideTinkerPatchConfiguration = false( true 开启,false 关闭 )。

3.打开 tinkerPatch 的功能。在 tinkerPatch 中,去掉 tinkerPatch 中 tinkerEnable = false 的注释。

tinkerEnable = false

然后就可以正常的使用 instantrun 功能了。


版权声明:本文为博主原创文章,可转载,转载注明出处:https://juejin.im/editor/drafts/5aca25d2518825555e5e1f44。