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.42k stars 807 forks source link

与 AspectJ 兼容问题导致不能正常生成补丁逻辑和补丁执行 crash #240

Open devLiuGit opened 6 years ago

devLiuGit commented 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) 
hedex commented 6 years ago

@devLiuGit 感谢反馈,已有解决方案,马上解决

dntil commented 6 years ago

在Kotlin中也有同样的问题,在Activity中的方法增加 Toast.makeText(this, "test", Toast.LENGTH_SHORT).show() this会编译成(Context)this,在补丁中类型转换出错无法修复。