-
Notifications
You must be signed in to change notification settings - Fork 809
Robust定制化
本文重点介绍一下Robust在实际项目的具体使用:
补丁的加载我们推荐越靠前越好,这样对bug的可修复范围就大大的增加,建议在Application onCreate方法或更早的时机加载补丁。
对于使用multidex的项目,需要确保所有的dex都已经加载,再加载补丁,避免被补丁的类由于没有加载而导致补丁应用失败,所以需要在补丁加载之前保证所有dex都已经加载。
继承并实现PatchManipulate
,这个类里面有三个方法,在我们的样例代码中有比较详细的注释,在PatchManipulate
这个类里面需要联网拉取补丁列表(List<Patch> fetchPatchList(Context context)
)、下载补丁(boolean ensurePatchExist(Patch patch)
)以及校验补丁(boolean verifyPatch(Context context, Patch patch)
),拉取补丁列表之后需要把补丁相关的信息初始化,并把补丁列表的数据加密保留在某处,初始化补丁相关信息的时候,请留意类Patch
的一些属性,比较重要的有四个,
/**
* 补丁名称,可以作为补丁的唯一标识符
*/
private String name;
/**
* 原始补丁本地保存路径,这个补丁建议是加密之后的补丁,建议放到app的私有目录
*/
private String localPath;
/**
* 补丁本地保存路径,这个是解密之后补丁的位置,这个位置建议加载之后立即删除,避免被篡改
* 建议放到app私有目录
*/
private String tempPath;
/**
* 补丁md5值,用来校验localPath补丁的完整性
*/
private String md5;
把下载的补丁文件保留在localPath中,每次加载补丁之前先对localpath的补丁进行md5校验,然后解密补丁,并放到tempPath,补丁加载之后就删除tempPath下的文件。
关于补丁的校验这块,建议采用非对称加密,各个App根据自己业务方定制,自由发挥吧。
上面说了补丁加密和解密的策略,这部分重点介绍补丁如何加载才能保证尽可能修复所有问题,并且在后台做到补丁可控,可控的意思就是可以随时不使用补丁,补丁的加载与否完全由后台来决定。
首先来说为了提高补丁的加载率,有必要在应用启动的时候加载缓存的补丁,也就是上一次App启动加载过得补丁,但是这会导致一个问题,那就是我如何在后台控制不使用这个补丁,这个问题可以在本地保留一个和服务器同步的补丁列表,当发现补丁被在补丁后台不存在的时候,就删除本地缓存的补丁。
在执行new PatchExecutor(getApplicationContext(), new PatchManipulateImp(), new Callback()).start()
的需要传递实现RobustCallBack
接口的类,在这里进行数据的统计和上报。
class Callback implements RobustCallBack {
@Override
public void onPatchListFetched(boolean result, boolean isNet) {
System.out.println(" robust arrived in onPatchListFetched");
}
@Override
public void onPatchFetched(boolean result, boolean isNet, Patch patch) {
System.out.println(" robust arrived in onPatchFetched");
}
@Override
public void onPatchApplied(boolean result, Patch patch) {
System.out.println(" robust arrived in onPatchApplied ");
}
@Override
public void logNotify(String log, String where) {
System.out.println(" robust arrived in logNotify "+where);
}
@Override
public void exceptionNotify(Throwable throwable, String where) {
throwable.printStackTrace();
System.out.println(" robust arrived in exceptionNotify "+where);
}
}