Open devLiuGit opened 6 years ago
异常类型:与 AspectJ 兼容问题
现象 : 加载补丁后执行逻辑 crash , 自动生成补丁中没有业务相关修改逻辑
crash 原因 : AspectJ @Around 插入的强制转型逻辑导致类转换异常.
手机型号:红米 note 2
手机系统版本: Android 5.0.2
Robust版本:如:0.4.75
Gradle版本:如:2.14.1
系统 : Mac
patch code :
package com.meituan.robust.patch; import android.os.Bundle; import android.util.Log; import com.meituan.robust.utils.EnhancedRobustUtils; import com.ymt360.app.fetchers.api.EventHandler; import com.ymt360.app.mass.activity.SplashActivity; import com.ymt360.app.mass.activity.SplashActivity.AjcClosure1; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.JoinPoint.StaticPart; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.runtime.internal.AroundClosure; import org.aspectj.runtime.reflect.Factory; public class SplashActivityPatch { SplashActivity originClass; public SplashActivityPatch(Object obj) { this.originClass = (SplashActivity) obj; } public Object[] getRealParameter(Object[] objArr) { if (objArr == null || objArr.length < 1) { return objArr; } Object[] objArr2 = new Object[objArr.length]; for (int i = 0; i < objArr.length; i++) { if (objArr[i] == this) { objArr2[i] = this.originClass; } else { objArr2[i] = objArr[i]; } } return objArr2; } protected void onCreate(Bundle savedInstanceState) { StaticPart staticPart = (StaticPart) EnhancedRobustUtils.getStaticFieldValue("Y", SplashActivity.class); Log.d("robust", "get static value is ajc$tjp_0 No: 1"); JoinPoint joinPoint = (JoinPoint) EnhancedRobustUtils.invokeReflectStaticMethod("makeJP", Factory.class, getRealParameter(new Object[]{staticPart, this, this, savedInstanceState}), new Class[]{StaticPart.class, Object.class, Object.class, Object.class}); Object obj = (EventHandler) EnhancedRobustUtils.invokeReflectStaticMethod("aspectOf", EventHandler.class, getRealParameter(new Object[0]), null); Object[] objArr = new Object[]{this, savedInstanceState, joinPoint}; Log.d("robust", " inner Class new No: 2"); Object obj2 = (AjcClosure1) EnhancedRobustUtils.invokeReflectConstruct("com.ymt360.app.mass.activity.SplashActivity$AjcClosure1", getRealParameter(new Object[]{objArr}), new Class[]{Object[].class}); if (obj2 == this) { obj2 = ((SplashActivityPatch) obj2).originClass; } ProceedingJoinPoint proceedingJoinPoint = (ProceedingJoinPoint) EnhancedRobustUtils.invokeReflectMethod("linkClosureAndJoinPoint", obj2, getRealParameter(new Object[]{new Integer(69648)}), new Class[]{Integer.TYPE}, AroundClosure.class); Log.d("robust", "invoke method is No: 3 linkClosureAndJoinPoint"); if (obj == this) { obj = ((SplashActivityPatch) obj).originClass; } obj2 = EnhancedRobustUtils.invokeReflectMethod("onPageEvent", obj, getRealParameter(new Object[]{proceedingJoinPoint}), new Class[]{ProceedingJoinPoint.class}, EventHandler.class); Log.d("robust", "invoke method is No: 4 onPageEvent"); } }
堆栈/日志:
02-24 15:31:35.189 12633-12659/com.ymt360.app.mass W/robust: robustApkHash :9d4437c075c221c11217632857eacc9b 02-24 15:31:35.191 12633-12659/com.ymt360.app.mass D/robust: patchManipulate list size is 1 02-24 15:31:35.193 12633-12659/com.ymt360.app.mass D/robust: PatchsInfoImpl name:com.meituan.robust.patch.PatchesInfoImpl 02-24 15:31:35.195 12633-12659/com.ymt360.app.mass D/robust: PatchsInfoImpl ok 02-24 15:31:35.195 12633-12659/com.ymt360.app.mass D/robust: current path:com.ymt360.app.mass.activity.SplashActivity 02-24 15:31:35.205 12633-12659/com.ymt360.app.mass D/robust: oldClass :class com.ymt360.app.mass.activity.SplashActivity fields 56 02-24 15:31:35.214 12633-12659/com.ymt360.app.mass D/robust: current path:com.ymt360.app.mass.activity.SplashActivity find:ChangeQuickRedirect com.meituan.robust.patch.SplashActivityPatchControl 02-24 15:31:35.223 12633-12659/com.ymt360.app.mass D/robust: changeQuickRedirectField set sucess com.meituan.robust.patch.SplashActivityPatchControl 02-24 15:31:35.223 12633-12659/com.ymt360.app.mass D/robust: patch finished 02-24 15:31:35.223 12633-12659/com.ymt360.app.mass D/RobustCallBack: onPatchApplied result: true 02-24 15:31:35.223 12633-12659/com.ymt360.app.mass D/RobustCallBack: onPatchApplied patch: 123 02-24 15:31:35.223 12633-12659/com.ymt360.app.mass D/robust: patch LocalPath:/storage/emulated/0/robust/patch.jar,apply result true 02-24 15:31:35.912 12633-12633/com.ymt360.app.mass D/robust: arrivied in isSupport ::false:726 paramArrayOfObject [Ljava.lang.Object;@10a5496d 02-24 15:31:35.912 12633-12633/com.ymt360.app.mass D/robust: in isSupport assemble method number is 726 02-24 15:31:35.912 12633-12633/com.ymt360.app.mass D/robust: arrivied in isSupport ::false:726 paramArrayOfObject [Ljava.lang.Object;@10a5496d isSupport result is true 02-24 15:31:35.912 12633-12633/com.ymt360.app.mass D/robust: arrivied in AccessDispatch ::false:726 paramArrayOfObject [Ljava.lang.Object;@2a0da9a2 02-24 15:31:35.913 12633-12633/com.ymt360.app.mass D/robust: keyToValueRelation not contain 02-24 15:31:35.913 12633-12633/com.ymt360.app.mass D/robust: assemble method number is 726 02-24 15:31:35.914 12633-12633/com.ymt360.app.mass D/robust: invoke method is com.meituan.robust.patch.SplashActivityPatch.onCreate(android.os.Bundle) 02-24 15:31:35.914 12633-12633/com.ymt360.app.mass D/robust: get static value is ajc$tjp_0 No: 1 02-24 15:31:35.921 12633-12633/com.ymt360.app.mass D/robust: inner Class new No: 2 [ 02-24 15:31:35.921 12633:12704 I/preload plugin(/data/data/com.ymt360.app.mass/app_dynamicload/common_plugins/com.ymt360.app. 02-24 15:31:35.922 12633-12633/com.ymt360.app.mass D/robust: invoke method is No: 3 linkClosureAndJoinPoint 02-24 15:31:35.923 12633-12633/com.ymt360.app.mass W/System.err: java.lang.ClassCastException: com.meituan.robust.patch.SplashActivityPatch cannot be cast to com.ymt360.app.mass.activity.SplashActivity 02-24 15:31:35.923 12633-12633/com.ymt360.app.mass W/System.err: at com.meituan.robust.utils.EnhancedRobustUtils.invokeReflectMethod(EnhancedRobustUtils.java:34) 02-24 15:31:35.923 12633-12633/com.ymt360.app.mass W/System.err: at com.meituan.robust.patch.SplashActivityPatch.onCreate(SplashActivityPatch.java:121) 02-24 15:31:35.923 12633-12633/com.ymt360.app.mass W/System.err: at com.meituan.robust.patch.SplashActivityPatchControl.accessDispatch(PatchTemplate.java) 02-24 15:31:35.923 12633-12633/com.ymt360.app.mass W/System.err: at com.meituan.robust.PatchProxy.accessDispatch(PatchProxy.java:69) 02-24 15:31:35.924 12633-12633/com.ymt360.app.mass W/System.err: at com.meituan.robust.utils.EnhancedRobustUtils.invokeReflectMethod(EnhancedRobustUtils.java:34) 02-24 15:31:35.924 12633-12633/com.ymt360.app.mass W/System.err: at com.meituan.robust.patch.SplashActivityPatch.onCreate(SplashActivityPatch.java:121) 02-24 15:31:35.924 12633-12633/com.ymt360.app.mass W/System.err: at com.meituan.robust.patch.SplashActivityPatchControl.accessDispatch(PatchTemplate.java) 02-24 15:31:35.924 12633-12633/com.ymt360.app.mass W/System.err: at com.meituan.robust.PatchProxy.accessDispatch(PatchProxy.java:69) 02-24 15:31:35.924 12633-12633/com.ymt360.app.mass W/System.err: Caused by: java.lang.RuntimeException: java.lang.ClassCastException: com.meituan.robust.patch.SplashActivityPatch cannot be cast to com.ymt360.app.mass.activity.SplashActivity 02-24 15:31:35.925 12633-12633/com.ymt360.app.mass W/System.err: Caused by: java.lang.ClassCastException: com.meituan.robust.patch.SplashActivityPatch cannot be cast to com.ymt360.app.mass.activity.SplashActivity 02-24 15:31:35.925 12633-12633/com.ymt360.app.mass W/System.err: at com.meituan.robust.utils.EnhancedRobustUtils.invokeReflectMethod(EnhancedRobustUtils.java:39) 02-24 15:31:35.925 12633-12633/com.ymt360.app.mass W/System.err: at com.meituan.robust.patch.SplashActivityPatch.onCreate(SplashActivityPatch.java:121) 02-24 15:31:35.925 12633-12633/com.ymt360.app.mass W/System.err: at com.meituan.robust.patch.SplashActivityPatchControl.accessDispatch(PatchTemplate.java) 02-24 15:31:35.925 12633-12633/com.ymt360.app.mass W/System.err: at com.meituan.robust.PatchProxy.accessDispatch(PatchProxy.java:69) 02-24 15:31:36.645 12633-12633/com.ymt360.app.mass E/AndroidRuntime: FATAL EXCEPTION: main Process: com.ymt360.app.mass, PID: 12633 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ymt360.app.mass/com.ymt360.app.mass.activity.SplashActivity}: java.lang.RuntimeException: java.lang.RuntimeException: invokeReflectMethod error onPageEvent parameter [Ljava.lang.Object;@f83928f targetObject com.ymt360.app.fetchers.api.EventHandler@1b47291c args [Ljava.lang.Class;@337b3925 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2470) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2532) at android.app.ActivityThread.access$900(ActivityThread.java:169) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1421) at android.os.Handler.dispatchMessage(Handler.java:111) at android.os.Looper.loop(Looper.java:194) at android.app.ActivityThread.main(ActivityThread.java:5562) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:968) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:763) Caused by: java.lang.RuntimeException: java.lang.RuntimeException: invokeReflectMethod error onPageEvent parameter [Ljava.lang.Object;@f83928f targetObject com.ymt360.app.fetchers.api.EventHandler@1b47291c args [Ljava.lang.Class;@337b3925 at com.ymt360.app.dynamicload.core.runtime.PluginInstrumentation.callActivityOnCreate(PluginInstrumentation.java:470) at cn.jiguang.a.a.d.a.a.d.callActivityOnCreate(Unknown Source) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2423) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2532) at android.app.ActivityThread.access$900(ActivityThread.java:169) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1421) at android.os.Handler.dispatchMessage(Handler.java:111) at android.os.Looper.loop(Looper.java:194) at android.app.ActivityThread.main(ActivityThread.java:5562) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:968) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:763) Caused by: java.lang.RuntimeException: invokeReflectMethod error onPageEvent parameter [Ljava.lang.Object;@f83928f targetObject com.ymt360.app.fetchers.api.EventHandler@1b47291c args [Ljava.lang.Class;@337b3925 at com.meituan.robust.utils.EnhancedRobustUtils.invokeReflectMethod(EnhancedRobustUtils.java:39) at com.meituan.robust.patch.SplashActivityPatch.onCreate(SplashActivityPatch.java:121) at com.meituan.robust.patch.SplashActivityPatchControl.accessDispatch(PatchTemplate.java) at com.meituan.robust.PatchProxy.accessDispatch(PatchProxy.java:69) at com.ymt360.app.mass.activity.SplashActivity.onCreate(SplashActivity.java) at android.app.Activity.performCreate(Activity.java:6029) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1111) at com.ymt360.app.dynamicload.core.runtime.PluginInstrumentation.callActivityOnCreate(PluginInstrumentation.java:467) at cn.jiguang.a.a.d.a.a.d.callActivityOnCreate(Unknown Source) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2423) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2532) at android.app.ActivityThread.access$900(ActivityThread.java:169) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1421) at android.os.Handler.dispatchMessage(Handler.java:111) at android.os.Looper.loop(Looper.java:194) at android.app.ActivityThread.main(ActivityThread.java:5562) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:968) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:763)
@devLiuGit 感谢反馈,已有解决方案,马上解决
在Kotlin中也有同样的问题,在Activity中的方法增加 Toast.makeText(this, "test", Toast.LENGTH_SHORT).show() this会编译成(Context)this,在补丁中类型转换出错无法修复。
Toast.makeText(this, "test", Toast.LENGTH_SHORT).show()
异常类型:与 AspectJ 兼容问题
现象 : 加载补丁后执行逻辑 crash , 自动生成补丁中没有业务相关修改逻辑
crash 原因 : AspectJ @Around 插入的强制转型逻辑导致类转换异常.
手机型号:红米 note 2
手机系统版本: Android 5.0.2
Robust版本:如:0.4.75
Gradle版本:如:2.14.1
系统 : Mac
patch code :
堆栈/日志: