Meituan-Dianping / Meituan-Dianping/Robust
与 AspectJ 兼容问题导致不能正常生成补丁逻辑和补丁执行 crash
Nobody has claimed this yet.
- Dominant language
- Java
- Stars
- 4.5k
- Forks
- 806
- PR merge metrics
- No merged PRs in 30d
Description
异常类型:与 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)
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the generated SplashActivityPatch and EnhancedRobustUtils.invokeReflectMethod, using the supplied AspectJ @Around example and stack trace to reproduce the ClassCastException. Trace how the patch object is passed through onCreate and onPageEvent; done means the patch logic is generated correctly and applying it no longer crashes on the reported Android setup.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- android, java
- Domain
- mobile-dev
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100