Skip to content

Robust定制化

何定旭 edited this page Nov 24, 2017 · 3 revisions

本文重点介绍一下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);
        }
    }

持续更新中。