Meituan-Dianping / Robust

Robust is an Android HotFix solution with high compatibility and high stability. Robust can fix bugs immediately without a reboot.
Apache License 2.0
4.4k stars 806 forks source link

java.lang.ClassCastException: com.meta.xyx.robust.PatchManipulateImp cannot be cast to com.meituan.robust.PatchesInfo #343

Closed zhaopingfu closed 4 years ago

zhaopingfu commented 4 years ago

异常类型:app运行时异常

手机型号:OPPO A57t

手机系统版本:Android 6.0.1

Robust版本:0.4.90

Gradle版本:

com.android.tools.build:gradle:3.1.3

distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip

系统:Win10

堆栈/日志:

08-06 11:54:07.179 16175-17063/com.example.test D/robust:  patchManipulate list size is 1
08-06 11:54:07.193 16175-17063/com.example.test W/art: oat_file_name =         /data/user/0/com.example.test/app_patch_cache123null/patch_temp.dex, b = 0
08-06 11:54:07.415 16175-17063/com.example.test D/robust: patch     patch_info_name:com.example.test.robust.PatchManipulateImp
08-06 11:54:07.417 16175-17063/com.example.test E/robust: patch failed 188 
    java.lang.ClassCastException: com.example.test.robust.PatchManipulateImp cannot be cast to     com.meituan.robust.PatchesInfo
        at com.meituan.robust.PatchExecutor.patch(PatchExecutor.java:111)
        at com.meituan.robust.PatchExecutor.applyPatchList(PatchExecutor.java:64)
        at com.meituan.robust.PatchExecutor.run(PatchExecutor.java:34)
08-06 11:54:07.418 16175-17063/com.example.test D/RobustCallBackSample: logNotify log:     patchesInfo is null, patch info:id = 123,md5 = null
08-06 11:54:07.418 16175-17063/com.example.test D/RobustCallBackSample: logNotify where:     class:PatchExecutor method:patch line:114
08-06 11:54:07.418 16175-17063/com.example.test D/RobustCallBackSample: onPatchApplied     result: false
08-06 11:54:07.418 16175-17063/com.example.test D/RobustCallBackSample: onPatchApplied     patch: 123
08-06 11:54:07.418 16175-17063/com.example.test D/robust: patch     LocalPath:/storage/emulated/0/robust/patch.jar,apply result false

PatchManipulateImp.java

package com.example.test.robust;
public class PatchManipulateImp extends PatchManipulate {
private static final String TAG = "PatchManipulateImp";
/***
 * connect to the network ,get the latest patches
 * l联网获取最新的补丁
 * @param context
 *
 * @return
 */
@Override
protected List<Patch> fetchPatchList(Context context) {
    // 将app自己的robustApkHash上报给服务端,服务端根据robustApkHash来区分每一次apk build来给app下发补丁
    // apkhash is the unique identifier for  apk,so you cannnot patch wrong apk.
    String robustApkHash = RobustApkHashUtils.readRobustApkHash(context);
    LogUtil.w(TAG, "robust" + " robustApkHash :" + robustApkHash);
    // connect to network to get patch list on servers
    // 在这里去联网获取补丁列表
    Patch patch = new Patch();
    patch.setName("123");
    // we recommend LocalPath store the origin patch.jar which may be encrypted,while TempPath is the true runnable jar
    // LocalPath是存储原始的补丁文件,这个文件应该是加密过的,TempPath是加密之后的,TempPath下的补丁加载完毕就删除,保证安全性
    // 这里面需要设置一些补丁的信息,主要是联网的获取的补丁信息。重要的如MD5,进行原始补丁文件的简单校验,以及补丁存储的位置,这边推荐把补丁的储存位置放置到应用的私有目录下,保证安全性
    String localPath = Environment.getExternalStorageDirectory().getPath() + File.separator + "robust" + File.separator + "patch";
    LogUtil.d(TAG, "---> robust local path: " + localPath);
    patch.setLocalPath(localPath);
    // setPatchesInfoImplClassFullName 设置项各个App可以独立定制,需要确保的是setPatchesInfoImplClassFullName设置的包名是和xml配置项patchPackname保持一致,而且类名必须是:PatchManipulateImp
    // 请注意这里的设置
    patch.setPatchesInfoImplClassFullName("com.example.test.robust.PatchManipulateImp");
    List<Patch> patches = new ArrayList<>();
    patches.add(patch);
    return patches;
}

robust.xml

<!--需要热补的包名或者类名,这些包名下的所有类都被会插入代码-->
<!--这个配置项是各个APP需要自行配置,就是你们App里面你们自己代码的包名, 这些包名下的类会被Robust插入代码,没有被Robust插入代码的类Robust是无法修复的-->
<packname name="hotfixPackage">
    <name>com.example.test</name>
</packname>
<!--不需要Robust插入代码的包名,Robust库不需要插入代码,如下的配置项请保留,还可以根据各个APP的情况执行添加-->
<exceptPackname name="exceptPackage">
    <name>com.meituan.robust</name>
    <name>com.meituan.sample.extension</name>
</exceptPackname>
<!--补丁的包名,请保持和类PatchManipulateImp中fetchPatchList方法中设置的补丁类名保持一致( setPatchesInfoImplClassFullName("com.meituan.robust.patch.PatchManipulateImp")),
各个App可以独立定制,需要确保的是setPatchesInfoImplClassFullName设置的包名是如下的配置项,类名必须是:PatchManipulateImp-->
<patchPackname name="patchPackname">
    <name>com.example.test.robust</name>
</patchPackname>
<!--自动化补丁中,不需要反射处理的类,这个配置项慎重选择-->
<noNeedReflectClass name="classes no need to reflect">
</noNeedReflectClass>
zhaopingfu commented 4 years ago

找到问题了,是我配置写错了,setPatchesInfoImplClassFullName(com.example.test.robust.PatchesInfoImpl)