tinker 的git地址https://github.com/Tencent/tinker
tinkerpatch官方网址http://tinkerpatch.com/Docs/dev
tinkerpatch是在tinker的基础上进行封装并提供了相应后台服务以及可视化的补丁管理平台详细操作与基础可以参考tinkerpatch官方文档
关于SDK的集成官方和百度都有甚多教程文档,这里我不做过多的赘述了,今天我这里把我在使用过程中解决的问题以及对tinker及tinkerpatch的分析理解跟大家分享一下
1.首先SDK集成中(官方文档的第三步)
这里官方的文档提供的参数配置仅供大家了解参数功能,详细配置说的很清楚可以参考git地址中的 tinkerpatch.gradle (个人认为直接复制此文件使用即可)
当然关于tinkerpatch.gradle的配置中关于打包补丁的相关文件路径可能要根据你的项目需求相应更改配置,如:
/**
- TODO: 请按自己的需求修改为适应自己工程的参数
*/
def bakPath = file("${buildDir}/bakApk/")
def baseInfo = “app-1.0.0-1112-12-49-34”
def variantName = “debug”
像baseInfo是你要填写你打补丁包的配置文件路径
像variantName是要打的补丁包的模式是debug和release
2.SDK集成中(官方文档的第四步)
这里是对在Application中SDK的初始化,这里tinkerpatch的操作和tinker一样都是提供了2种,一种是使用reflectApplication 模式(如果项目的Application操作比较多个人建议使用此中模式对项目改动比较小);另一种是不使用reflectApplication 模式,这个就要像上一个问题中的操作参考git源码SampleApplicationLike 类.
3.补丁加载后自动重启的问题
大家了解过这些更新的应该都知道,tinker是需要冷启动的(也就是需要重启后补丁文件再能生效)
但由于业务需求我需要让补丁合成后自动重启来使补丁能够及时的生效,所以我就要监听补丁合成的结果。
这时我们就要更改SDK的初始化了,这需要我们对他SDK的实现逻辑有一些了解,但tinkerpatch的SDK进行过混淆不太方便阅读,本人参考了tinker的发现基本实现源码一致,大家也可以看看这边文章《微信热补丁tinker–补丁流程》个人感觉分析的比较透彻
tinkerApplicationLike = TinkerPatchApplicationLike.getTinkerPatchApplicationLike();
TinkerPatch.Builder builder = new TinkerPatch.Builder(tinkerApplicationLike);
//修改tinker的构造函数,自定义类
builder.listener(new DefaultPatchListener(mContext))
.loadReporter(new DefaultLoadReporter(mContext))
.patchReporter(new DefaultPatchReporter(mContext))
// .resultServiceClass(TinkerServerResultService.class)
.resultServiceClass(MyDefaultTinkerResultService.class)//自己定义的servise
.upgradePatch(new UpgradePatch())
.patchRequestCallback(new TinkerPatchRequestCallback());
// 初始化TinkerPatch SDK
TinkerPatch.init(builder.build())//tinkerApplicationLike,builder.build()
.reflectPatchLibrary()
.setPatchRollbackOnScreenOff(true)
.setPatchRestartOnSrceenOff(true)
.setFetchPatchIntervalByHours(1)
.fetchDynamicConfig(new ConfigRequestCallback() {
@Override
public void onSuccess(HashMap<String, String> hashMap) {
Log.d(TAG, “onSuccess-----”+hashMap.toString());
}
@Override
public void onFail(Exception e) {
Log.d(TAG, “onFail-----”+e.getStackTrace());
}
}, false)
.setPatchResultCallback(new ResultCallBack() {
@Override
public void onPatchResult(PatchResult patchResult) {
Log.d(TAG, “setPatchResultCallback-----”);
}
}).setPatchRollBackCallback(new RollbackCallBack() {
@Override
public void onPatchRollback() {
Log.d(TAG, “setPatchRollBackCallback”);
}
});
由于我们要获取补丁合成结果,所以我们需要自己写一个TinkerResultService也就是我自己写的MyDefaultTinkerResultService:
public class MyDefaultTinkerResultService extends DefaultTinkerResultService {
private static final String TAG = “king_mdtrs”;
@Override
public void onPatchResult(PatchResult result) {
if (result == null) {
TinkerLog.e(TAG, “DefaultTinkerResultService received null result!!!”);
return;
}
TinkerLog.i(TAG, "DefaultTinkerResultService received a result:%s ", result.toString());
TinkerLog.i(TAG,“关闭接收进程------”);
TinkerServiceInternals.killTinkerPatchServiceProcess(getApplicationContext());
if (result.isSuccess) {
deleteRawPatchFile(new File(result.rawPatchFilePath));
if (checkIfNeedKill(result)) {
try{
TinkerLog.i(TAG,“发现新补丁,自动重启------”);
jumpToNext(getApplicationContext());
}catch (Exception e){
e.getStackTrace();
}
} else {
TinkerLog.i(TAG, “I have already install the newly patch version!”);
TinkerLog.i(TAG,“不中结进程------”);
}
}
}
/**
* 二次启动
*/
private void jumpToNext(Context getApplicationContext) {
TinkerLog.i(TAG,"跳转二次启动------");
restartApplication();
TinkerLog.i(TAG,"关闭进程------");
android.os.Process.killProcess(android.os.Process.myPid());
}
private void restartApplication() {
final Intent intent = getPackageManager().
getLaunchIntentForPackage(getPackageName());
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
自测可行,不好勿喷,欢迎大家一起交流学习