微信 Tinker 在 Android 中集成以及使用

来源:互联网 发布:java静态变量 定义 编辑:程序博客网 时间:2024/06/07 00:48

作者 | 秦川小将

地址 | http://www.jianshu.com/p/d50817b6d622

声明 | 本文是 秦川小将 原创,已获授权发布,未经原作者允许请勿转载



Tinker 简介

Tinker 是微信官方的 Android 热补丁解决方案,它支持动态下发代码。.so 库以及资源库,让应用能够在不需要重复安装的情况下实现更新,当然也可以使用 Tinker 来更新你的插件。


Tinker 地址:https://github.com/Tencent/tinker



在接入 Tinker 之前我们先对 Tinker 的结构了解一下


Tinker主要包括一下几个部分:


1.gradle 编译插件:tinker-patch-gradle-plugin。

2.核心 SDK库:tinker-android-lib。

3.非 gradle 编译用户的命令行版本:tinker-patch-cil.jar。


Tinker 的已知问题:


1.Tinker 不支持修改 AndroidMainfest.xml,Tinker 不支持新增四大组件。

2.由于 Google Pay 的开发者条款限制,不建议在 GP 渠道动态更新代码。

3.在 Android N上,补丁对应用启动时有轻微的影响。

4.不支持部分三星 android-21 机型,加载补丁时会主动抛出“TinkerRuntimeException:checkDexInstall failed”异常。

5.由于各个厂商加固实现并不一致,在1.7.6以后的版本,Tinker 不在支持加固的动态更新。

6.对于资源替换,不支持修改 remoteView,例如 transition 动画,notification icon 以及桌面图标。


Tinker 的修复方案跟 Hotfix 的修复方案大同小异,都是在两个 apk 包上作比较然后生成 patch。下面对 Tinker 进行接入。


接入流程

在工程目录下的 build.gradle 中添加依赖库


buildscript {
       repositories {
           jcenter()
       }
       dependencies {
           classpath 'com.android.tools.build:gradle:2.2.3'
           // 编译插件tinker-patch-gradle-plugin
           classpath 'com.tencent.tinker:tinker-patch-gradle-plugin:1.7.7'
       }
   }
   allprojects {
       repositories {
           jcenter()
       }
   }
   task clean(type: Delete) {
       delete rootProject.buildDir
   }


在工程 app 目录下的 build.gradle 中添加依赖库


   dependencies {
       compile fileTree(dir: 'libs', include: ['*.jar'])
       ......
       //可选,用于生成application类
       provided('com.tencent.tinker:tinker-android-anno:1.7.7')
       //tinker的核心库
       compile('com.tencent.tinker:tinker-android-lib:1.7.7')
   }


API引入


一般我们都是在 Application中onCreate() 中做初始化和加载 patch,不过 Tinker 推荐如下写法。因为程序启动时会加载默认的Application 类,这导致我们补丁包是无法对它做修改了。为了规避这个问题 Tinker 通过代码框架的方式来避免,这也是为了尽量少的去反射,提升框架的兼容性。


@DefaultLifeCycle(
           application = ".AppContext", flags = ShareConstants.TINKER_ENABLE_ALL
   )
   public class AppContextLike extends ApplicationLike {
       public AppContextLike(Application application, int tinkerFlags, boolean tinkerLoadVerifyFlag, long applicationStartElapsedTime, long applicationStartMillisTime, Intent tinkerResultIntent) {
           super(application, tinkerFlags, tinkerLoadVerifyFlag, applicationStartElapsedTime, applicationStartMillisTime, tinkerResultIntent);
       }
       @Override
       public void onCreate() {
           super.onCreate();
           TinkerInstaller.install(this);
       }
   }


代码中 AppContextLike 继承了 ApplicationLike,而ApplicationLike 并非集成 Application,而是类似于 Application 的一个类。Tinker 建议编写一个 ApplicationLike 的子类,可以当做Application 使用,注意顶部的注解:


<application
  android:name=".AppContext"
  ......
</application>



写完后会报红,此时只需要 Build 下即可解决报红。Application 配置就到此结束。接下来生成 patch 文件。因为 patch 文件是写入到SDCrad 的,所以我们需要在 AndroidManifest 中添加如下权限(注: 6.0及已上系统请动态设置权限或者手动在设置中为项目设置):


 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>



Tinker 需要在 AndroidManifest.xml 中指定 TINKER_ID

<meta-data
 android:name="TINKER_ID"
 android:value="tinker_id_100" />


Patch生成


patch生成官方提供了两种接入方式:


1.基于命令行的方式。

2.gradle编译的方式。


  1. gradle 编译生成 patch

微信 Tinker 的 gradle 配置也很简单,先来浏览一下 Tinker 接入指南,点击进入查看,对使用 gradle 配置的参数了解一下,接下来附上一个相对比较完整的 gradle 配置。


gradle 配置就到此结束了,要注意的地方有以下几点:


1.ext 相关配置,示例中有完整描述。

2.Tinker 插件 apply plugin: 'com.tencent.tinker.patch'

3.全局信息相关配置 tinkerPatch


配置完这些东西以后就可以调用 tinkerPatch 命令生成 patch 补丁文件。tinkerPatch 有 Debug 和 Release 两种模式,因为是案例,所以就使用 tinkerPatchDebug 命令。




注意:调用 tinkerPatchDebug 命令之前需要修改 ext 相关配置,ext 相关配置已基准 apk 包为准。







结束

到此微信 Tinker 热修复 gradle 配置结束。
案例地址:https://github.com/mengjingbo/TinkerApp


送书活动

1 11 月份我发起了一个编程话题,约你来讨论(有福利)

2 值得借鉴:耗时两个月的求职经历



原创粉丝点击