本篇文章使用 tinker 作为热修复工具,使用 bugly 做为后台进行下补丁。
Tinker、Bugly 简介
「 Tinker 」 是微信官方的 Android 热补丁解决方案,支持动态下发代码、So库以及资源,用来紧急修复 bug,解决你的燃眉之急。
「 Bugly 」 是腾讯针对移动端 bug 管理、运营统计、热修复的一个平台。
Tinker 热修复组件 GitHub 。
使用说明和简介详见项目 wiki 。
接入指南详见 GitHub 。
Bugly Android 热更新使用指南 。
Bugly、Tinker 接入
参考上面的「 Bugly Android 热更新使用指南 」,按照步骤一步一步来。 其中要注意一下以几个点:
-
配置依赖时,最好指定版本号。因为最新版本要是改东西了,你也不知道,可能就会发生一些问题,比如:方法的名字变了,当升级后就找不到了。
-
如果你以前接入过 bugly 需要在 gradle 中注释掉原有的 bugly 依赖。
-
别忘记在 app modul e的 “build.gradle” 文件中添加插件依赖。
apply from: 'tinker-support.gradle'
-
使用推荐的 Tinker 接入方式,虽然接入麻烦写,但兼容性会更好。
这里详细说下推荐的 Tinker 接入方式,许多人在这里比较晕乎。
- 将 BaseApplication 中继承的 Application 改为继承 DefaultApplicationLike,并导入构造方法。
- 在 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); }复制代码
- 在 onCreate 方法中初始化 Bugly 。
@Override public void onCreate() { super.onCreate(); // 这里实现SDK初始化,appId替换成你的在Bugly平台申请的appId // 调试时,将第三个参数改为true Bugly.init(getApplication(), "900029763", false); }复制代码
至此,我们的原 BaseApplication 就已经改造完成了。Application 的获取可以通过 getApplication() 进行获取。
- 自定义 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 是你的项目包名。
- 将 AndroidManifest.xml 中的 application name 改为自定义的 Application。
至于 tinker-support.gradle 文件,我们直接粘贴过来即可。 配置参数可参考 TinkerSupport 插件使用指南,。
发布正式版本:
-
在项目的主 moudle 下,打开 tinker-support.gradle 文件,也可使用全局搜索。此文件是 tinker 的配置文件,热修复相关功能和参数能都在此文件中配置。
-
打开 tinker 热修复组件。在 tinkerSupport 的方法中,将 enable 改为 true。
enable = true
( true 开启,false 关闭 )。 -
启用覆盖 tinkerPatch 配置功能。在 tinkerSupport 的方法中,将 overrideTinkerPatchConfiguration 改为 true。
overrideTinkerPatchConfiguration = true
( true 开启,false 关闭 )。 -
按照规则配置 tinkerId,tinkerId必须保证唯一性。
- 正式包 base-版本名 例:base-2.6.1
- 补丁包 patch-版本名.1 例:patch-2.6.1.1 patch-2.6.1.2 。。。
-
关闭 tinkerPatch 的功能。在 tinkerPatch 中,注释 tinkerPatch 中 tinkerEnable = false。
//tinkerEnable = false
-
修改好这些配置后,就可以正式打包了,打包有两种方式,以下两种方式均可。
-
Android Studio 正常打包流程,Build -> Generate Signed APK。
-
打开 gradle 文件,运行 项目 gradle -> Tasks -> build -> assembleRelease。
等待 gradle 运行结束后,会生成 bakApk 的文件夹,此文件夹下的 app-MMdd-hh-mm-ss 是我们的基准包目录,后期打补丁包的时候需要用到,一定要保存好。
文件位置:项目主 moudle -> build -> bakApk -> app-MMdd-hh-mm-ss(按照时间生成)。
app-release.apk 就是我们打好的包,在使用 360 加固助手加固后就可以上线了。
发布补丁包:
当修改好 bug 以后,
-
修改基准包目录。在 tinker-support.gradle 中,将 def baseApkDir 改为你需要修复版本的基准包目录(也就是上面提到的基准包目录)。
def baseApkDir = "app-MMdd-hh-mm-ss"
MMdd-hh-mm-ss 修改为你需要修复版本的基准包目录
后续的 5 个步骤和发正式包的前 5 个步骤相同,切记一定要修改 tinkerId,否则无发辨别版本。
- 使用 buildTinkerPatchRelease 打补丁包。
打开 gradle 运行 项目 gradle -> Tasks -> tinker-support -> buildTinkerPatchRelease。
如果没有此选项,首先确认你的 tinkerEnable 是否是 true,然后重新构建下项目即可。
- 使用 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。