Meituan-Dianping / Meituan-Dianping/Robust

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

Open
#240 2 comments 0 reactions 0 assignees View on GitHub

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

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.