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

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

Tinker、Bugly 简介

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

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

Tinker 热修复组件 GitHub 连接地址bash

使用说明和简介详见项目 wiki 连接地址微信

接入指南详见 GitHub 连接地址app

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

Bugly、Tinker 接入

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

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

  2. 若是你之前接入过 bugly 须要在 gradle 中注释掉原有的 bugly 依赖。ui

  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 功能了。

相关文章
相关标签/搜索