你也可以使用sampleInstallTinker
,即全部使用默认参数。
各个类具体的功能与使用方法如下:
定义了Tinker在加载补丁时的一些回调,我们为你提供了默认实现DefaultLoadReporter.java.
一般来说, 你可以继承DefaultLoadReporter实现你自己感兴趣的事件回调,例如.
我们在sample中也写了一个默认的回调上报例子,可参考SampleTinkerReport.
需要注意的有以下两点:
- 回调发生的时机是我们调用
installTinker
之后,某些进程可能并不需要installTinker。现对各个回调作简要的说明:
所有的错误码都定义在,onLoadPackageCheckFail
的相关错误码解析如下:
错误码 | 数值 | 描述 |
---|---|---|
ERROR_PACKAGE_CHECK_SIGNATURE_FAIL | -1 | 签名校验失败 |
ERROR_PACKAGE_CHECK_PACKAGE_META_NOT_FOUND | -2 | 找不到"assets/package_meta.txt"文件 |
ERROR_PACKAGE_CHECK_DEX_META_CORRUPTED | -3 | "assets/dex_meta.txt"信息损坏 |
ERROR_PACKAGE_CHECK_LIB_META_CORRUPTED | -4 | "assets/so_meta.txt"信息损坏 |
ERROR_PACKAGE_CHECK_APK_TINKER_ID_NOT_FOUND | -5 | 找不到基准apk AndroidManifest中的TINKER_ID |
ERROR_PACKAGE_CHECK_PATCH_TINKER_ID_NOT_FOUND | -6 | 找不到补丁中"assets/package_meta.txt"中的TINKER_ID |
ERROR_PACKAGE_CHECK_TINKER_ID_NOT_EQUAL | -7 | 基准版本与补丁定义的TINKER_ID不相等 |
ERROR_PACKAGE_CHECK_RESOURCE_META_CORRUPTED | -8 | "assets/res_meta.txt"信息损坏 |
ERROR_PACKAGE_CHECK_TINKERFLAG_NOT_SUPPORT | -9 | tinkerFlag不支持补丁中的某些类型的更改,例如补丁中存在资源更新,但是使用者指定不支持资源类型更新。 |
onLoadException
的错误码具体如下:
回调中定义的fileType定义如下:
文件类型 | 数值 | 描述 |
---|---|---|
TYPE_PATCH_FILE | 1 | 补丁文件 |
TYPE_PATCH_INFO | 2 | "patch.info"补丁版本配置文件 |
TYPE_DEX | 3 | 在Dalvik合成全量的Dex文件 |
TYPE_DEX_OPT | 4 | odex文件 |
TYPE_LIBRARY | 5 | library文件 |
TYPE_RESOURCE | 6 | 资源文件 |
对于onLoadPatchVersionChanged与onLoadFileNotFound的复写要较为谨慎,因为版本升级杀掉其他进程与文件丢失发起恢复任务,都是我认为比较重要的操作。
自定义PatchReporter类
定义了Tinker在修复或者升级补丁时的一些回调,我们为你提供了默认实现DefaultPatchReporter.java.
一般来说, 你可以继承DefaultPatchReporter实现你自己感兴趣的事件回调,例如.
需要注意的是:
PatchReporter中onPatchPackageCheckFail的错误码与LoadReporter的一致。
PatchListener类是用来过滤Tinker收到的补丁包的修复、升级请求,也就是决定我们是不是真的要唤起:patch进程去尝试补丁合成。我们为你提供了默认实现。
一般来说, 你可以继承DefaultPatchListener并且加上自己的检查逻辑,例如SamplePatchListener.java。
若检查成功,我们会调用TinkerPatchService.runPatchService
唤起:patch进程,去尝试完成补丁合成操作。反之,会回调检验失败的接口。事实上,你只需要复写patchCheck
函数即可。若检查失败,会在LoadReporter的onLoadPatchListenerReceiveFail中回调。
以DefaultPatchListener为例,说明默认我们检查的条件,你可以定义自己的错误码,也可以沿用这里的错误码。
错误码 | 数值 | 描述 |
---|---|---|
ERROR_PATCH_DISABLE | -1 | 当前tinkerFlag为不可用状态。 |
ERROR_PATCH_NOTEXIST | -2 | 输入的临时补丁包文件不存在。 |
ERROR_PATCH_RUNNING | -3 | 当前:patch补丁合成进程正在运行。 |
ERROR_PATCH_INSERVICE | -4 | 不能在:patch补丁合成进程,发起补丁的合成请求。 |
ERROR_PATCH_JIT | -5 | 补丁不支持 N 之前的 JIT 模式。 |
ERROR_PATCH_ALREADY_APPLY | -6 | 补丁已经应用。 |
ERROR_PATCH_RETRY_COUNT_LIMIT | -7 | 补丁超过重试次数。 |
其他 | 在SamplePatchListener里面,我们还检查了当前Rom剩余空间,最大内存,是否是GooglePlay渠道等条件。 |
自定义AbstractResultService类
一般来说, 你可以继承DefaultTinkerResultService实现自己的回调,例如SampleResultService.java。当然,你也需要在AndroidManifest上添加你的Service。
默认我们在DefaultTinkerResultService会杀掉:patch进程,假设当前是补丁升级并且成功了,我们会杀掉当前进程,让补丁包更快的生效。若是修复类型的补丁包并且失败了,我们会卸载补丁包。下面对的定义做详细说明:
在SampleResultService.java中,我们没有立刻杀掉当前进程去应用补丁,而选择在当前应用在退入后台或手机锁屏时这两个时机。你也可以在自杀前,通过发送service或者broadcast inent来尽快重启进程。
是用来加载补丁的核心类,你可以实现自己的加载逻辑。但是一般不建议那么做
,如果你一定要你需要保证以下两条规则:
- 将你的实现的类以及它用到的所有类都加入到dex.loader中;
- 保证上述的类都在main dex中。只要简单的将loaderClass参数中的"com.tencent.tinker.loader.TinkerLoader",换成你的实现类的名称即可,这里只能传递字符串。
Tinker Notification id设置
为了提高的进程优先级,我们将它设置为Foreground
。对于sdk>18的版本,使用innerService方式使通知栏不会显示。
Warning, 这里占用了id为-1119860829.若你的app存在与它相同的id, 可以使用以下API重新设置
UpgradePatch类是用来升级当前补丁包的处理类,一般来说你也不需要复写它。
你可以根据需要自定义以上的一些类,然后我们继续学习。