Android最简单的热更新方式 - Robust 使用填坑

看了Tinker和Robust,普通的修复的话,Robust真的是最简单,最好的。

但是看着别人写的,经过了无数次的失败,终于成功了。

java.lang.ClassNotFoundException: 
Didn't find class "xxx.xxx.xxx.PatchesInfoImpl" on path: 
DexPathList[[],nativeLibraryDirectories=[/vendor/lib, /system/lib]]

这个问题整了我几天,坑就是从这里开始填的:

1.包名

Robust这块有bug,包名不是com开头的新增类打不进去。

2.PatchManipulateImp 

public class PatchManipulateImp extends PatchManipulate {

    @Override
    protected List<Patch> fetchPatchList(Context context) {
        Patch patch = new Patch();
        patch.setName("patch test");
        patch.setLocalPath(FileDirectoryUtil.getPatchFile());
        patch.setPatchesInfoImplClassFullName("com.xxx.xxx.PatchesInfoImpl");
        List<Patch> patches = new ArrayList<>();
        patches.add(patch);
        return patches;
    }
    
    ......

}

① 这里的setLocalPath只需要写到文件名,后缀里面在get的时候已经自动加在了后面(虽然即使你加了其实也没影响,不过名称就多了一个.jar,对于我这种强迫症的人看着很不舒服)。

② setPatchesInfoImplClassFullName里面写的包名com.xxx.xxx是可以随意写的(由于上面的问题,所以还是以com开头为好),不需要和项目的包名一致,但是必须得和robust.xml里的patchPackname一致,还有,后面一定是 PatchesInfoImpl 结尾!!! 

③ 在执行过程中,是先执行 ensurePatchExist方法,这里先验证文件是否存在,如下:

    @Override
    protected boolean ensurePatchExist(Patch patch) {
        boolean exist = new File(patch.getLocalPath()).exists();
        return exist;
    }

 然后再执行verifyPatch

@Override
protected boolean verifyPatch(Context context, Patch patch) {
    //放到app的私有目录
    patch.setTempPath(FileDirectoryUtil.getPatchFile());
    //in the sample we just copy the file
    try {
        copy(patch.getLocalPath(), patch.getTempPath());
    }catch (Exception e){
        e.printStackTrace();
        throw new RuntimeException("copy source patch to local patch error, no patch         
            execute in path "+patch.getTempPath());
    }
    return true;
}

这里是在干嘛?在复制patch.jarpatch_temp.jar。因为最后使用patch_temp.jar执行的!!!不是用patch.jar !!!

android热修复之Robust使用(真正的入门)

这篇文章直接把两个方法直接写死为true,把LocalPath和TempPath都设置了。然后最后给手机推的是patch_temp.jar(那你设置的LocalPath有什么意义?)

我得到的是patch.jar,由于我是直接复制到手机里,所以理由当然的就把patch.jar直接复制过去了..... 

所以结果当然是,屡试不成功。

3.权限

 虽然我没有踩这个坑,但是还是提醒一下,因为有人遇到过,一定要动态的申请权限后再执行。

 

基于这个错误基本上就是这些。

下面再提醒一些:

1.  一定要加

multiDexEnabled true


implementation 'com.android.support:multidex:1.0.3'

  2. 一定要打正式包

    signingConfigs {
        release  {
            storeFile file(jks地址)
            storePassword "xxx"
            keyAlias "xxx"
            keyPassword "xxx"
        }
    }

    dexOptions {
        // 支持大工程模式
        jumboMode = true
    }

    buildTypes {
        debug {
            debuggable true
            minifyEnabled false
            signingConfig signingConfigs.release
        }
        release {
            signingConfig signingConfigs.release
            minifyEnabled true
            // 移除无用的resource文件
            shrinkResources true
            // Zipalign优化
            zipAlignEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
3.打APK和打补丁一定要注意开关这两个
// 生成补丁的时候开启,必须在其它之前
apply plugin: 'auto-patch-plugin'
// 生成APK的时候开启
apply plugin: 'robust'

4.每一个打完包后mapping.txt和methodsMap.robust一定要保存好,建议保存到以版本号命名的文件夹。

5.执行时一定要start()

protected void runRobust(){
    new PatchExecutor(getApplicationContext(),new PatchManipulateImp(),new                 
        RobustCallbackSample()).start();
}

 

可能上面的问题很多人都没遇到过,特别是最后一个,因为复制粘贴哪里有这种问题。代码最好是自己敲一遍,虽然敲的过程中会遇到很多很多坑,但是只有经历了这些坑,才会知其所以然。

有官方Demo的一样要用官方的Demo测试。虽然官方其实很多地方说的很模糊,然而恰恰正是那些模糊的地方,然使用者踩了很多坑。

比如,上面的 patch_temp.jar.....

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值