TinkerInstaller相关接口

TinkerInstaller封装了一些比较重要的函数,现作简单的说明:

Tinker实例的构建

Tinker类是整个框架的核心,我们需要构建它的单例。其中intentResult存放是我们加载补丁时的数据,它在install之后才将数据赋值给Tinker与TinkerLoadResult类。

全部使用默认定义类的构造方法:

  1. public static void install(ApplicationLike applicationLike) {
  2. Tinker.with(tinkerApplication).install(applicationLike.getTinkerResultIntent());
  3. }

若使用了自定义类,可选择多参数的install方法,具体用法可参考SampleApplicationLike

你一定要先install Tinker之后,才能使用Tinker相关的API。不然你只能使用TinkerApplicationHelper.java中的API。

发起补丁修复请求

正如之前所说的,所有的补丁升级请求都将会分发到PatchListener去处理。

发起升级补丁请求,即收到一个新的补丁包,多次补丁也是调用下面这个接口:

  1. public static void onReceiveUpgradePatch(Context context, String patchLocation) {
  2. Tinker.with(context).getPatchListener().onPatchReceived(patchLocation);
  3. }

Library库的加载

不使用Hack的方式

更新的Library库文件我们帮你保存在tinker下面的子目录下,但是我们并没有为你区分abi(部分手机判断不准确)。所以若想加载最新的库,你有两种方法,第一个是直接尝试去Tinker更新的库文件中加载,第二个参数是库文件相对安装包的路径。

  1. TinkerLoadLibrary.loadLibraryFromTinker(getApplicationContext(), "assets/x86", "libstlport_shared");

但是我们更推荐的是,使用TinkerInstaller.loadLibrary接管你所有的库加载,它会自动先尝试去Tinker中的库文件中加载,但是需要注意的是当前这种方法只支持lib/armeabi目录下的库文件

  1. //load lib/armeabi library
  2. TinkerLoadLibrary.loadArmLibrary(getApplicationContext(), "libstlport_shared");
  3. //load lib/armeabi-v7a library
  4. TinkerLoadLibrary.loadArmV7Library(getApplicationContext(), "libstlport_shared");

若存在Tinker还没install之前调用加载补丁中的Library库,可使用TinkerApplicationHelper.java的接口

  1. //load lib/armeabi library
  2. TinkerApplicationHelper.loadArmLibrary(tinkerApplicationLike, "libstlport_shared");
  3. //load lib/armeabi-v7a library
  4. TinkerApplicationHelper.loadArmV7Library(tinkerApplicationLike, "libstlport_shared");

若想对第三方代码的库文件更新,可先使用TinkerLoadLibrary.load*Library对第三方库做提前的加载!更多使用方法可参考MainActivity.java

使用Hack的方式

以上使用方式似乎并不能做到开发者透明,这是因为我们想尽量少的去hook系统框架减少兼容性的问题。Tinker也提供了一键反射Library Path的方式供大家选择:

  1. // 将tinker library中的armeabi注册到系统的library path中。
  2. TinkerLoadLibrary.installNavitveLibraryABI(context, "armeabi");

当然,当前手机系统的abi 需要大家自行判断传入即可,这样我们就无需再对library的加载做任何的介入。

设置LogIml实现

你可以设置自己的Log输出实现:

  1. public static void setLogIml(TinkerLog.LogImp imp) {
  2. TinkerLog.setLogImp(imp);
  3. }