Meituan-Dianping / Meituan-Dianping/Robust

与aspectj一起使用时,补丁失效,求助~

Open
#379 0 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,导致补丁包失效,没有崩溃现象,就是无法加载补丁代码,请问大佬们遇到过此等问题吗?该如何解决?盼回复~

异常类型:打补丁包时异常

Robust版本:如:0.4.91

Gradle版本:5.11
Gradle插件版本:3.4.1

Aspectjx版本:com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.5

系统:Linux

细节描述:

我在项目中的测试代码比较简单,只是在MainActivityupdateTabStatus方法中加了一句ToastUtil.showToast("hotfix method updateTabStatus222");
具体代码:

@Modify
    public void updateTabStatus(int position) {
        int color = mTabTextSelectColor;
        int showType = mShowTypeArray[position];
        mFragmentType = showType;
        resetTab();
        viewPager.setCurrentItem(position, false);
        if (SkinUtil.checkMainTab()) {
            loadingSkin();
            return;
        }
        switch (showType) {
            case FRAGMENT_TYPE_HOME:
                mIvTabRent.setImageResource(R.drawable.icon_tabbar_home_32_seleted);
                mTvTabRent.setTextColor(color);
                break;
            case FRAGMENT_TYPE_ZIRUYU:
                mIvTabYu.setImageResource(R.drawable.icon_tabbar_map_32_seleted);
                mTvTabYu.setTextColor(color);
                break;
            case FRAGMENT_TYPE_MINSU:
                mIvTabLvju.setImageResource(R.drawable.icon_tabbar_owner_32_seleted);
                mTvTabLvju.setTextColor(color);
                break;
            case FRAGMENT_TYPE_SERVICE:
                mIvTabService.setImageResource(R.drawable.icon_tabbar_discover_32_seleted);
                mTvTabService.setTextColor(color);
                break;
            case FRAGMENT_TYPE_MY:
                mIvTabMy.setImageResource(R.drawable.icon_tabbar_me_32_seleted);
                mTvTabMy.setTextColor(color);
                ToastUtil.showToast("hotfix method updateTabStatus222");
                break;
        }

        if (showType != FRAGMENT_TYPE_MINSU) {//通知暂停视频播放
            EventBus.getDefault().post(new VideoEvent(0));
            EventBus.getDefault().post(new OwnerHomePageEvent(0));
        }
    }

不用aspectj时补丁包可以生效,反编译后发现生效的补丁包比无效的补丁包多了一个com.meituan.robust.patch.HomePageFragmentInLinePatch.class
另外,MainActivityPatch文件内容也不同,
无效的补丁包中的MainActivityPatch文件如下:

package com.meituan.robust.patch;

import android.util.Log;
import com.meituan.robust.utils.EnhancedRobustUtils;
import com.ziroom.ziroombi.performance.apptrace.MethodAspect;
import com.ziroom.ziroomcustomer.MainActivity;
import org.aspectj.a.a.a;
import org.aspectj.a.a.b;
import org.aspectj.a.b.e;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.b;

public class MainActivityPatch {
  MainActivity originClass;
  
  public MainActivityPatch(Object paramObject) {
    this.originClass = (MainActivity)paramObject;
  }
  
  public Object[] getRealParameter(Object[] paramArrayOfObject) {
    if (paramArrayOfObject == null || paramArrayOfObject.length < 1)
      return paramArrayOfObject; 
    Object[] arrayOfObject = new Object[paramArrayOfObject.length];
    for (int i = 0; i < paramArrayOfObject.length; i++) {
      if (paramArrayOfObject[i] instanceof Object[]) {
        arrayOfObject[i] = getRealParameter((Object[])paramArrayOfObject[i]);
      } else if (paramArrayOfObject[i] == this) {
        arrayOfObject[i] = this.originClass;
      } else {
        arrayOfObject[i] = paramArrayOfObject[i];
      } 
    } 
    return arrayOfObject;
  }
  
  public void updateTabStatus(int paramInt) {
    JoinPoint.StaticPart staticPart = (JoinPoint.StaticPart)EnhancedRobustUtils.getStaticFieldValue("Y", MainActivity.class);
    Log.d("robust", "get static  value is ajc$tjp_17     No:  5");
    JoinPoint joinPoint = (JoinPoint)EnhancedRobustUtils.invokeReflectStaticMethod("makeJP", e.class, getRealParameter(new Object[] { staticPart, this, this, EnhancedRobustUtils.invokeReflectStaticMethod("intObject", b.class, getRealParameter(new Object[] { new Integer(paramInt) }, ), new Class[] { int.class }) }), new Class[] { JoinPoint.StaticPart.class, Object.class, Object.class, Object.class });
    MethodAspect methodAspect = (MethodAspect)EnhancedRobustUtils.invokeReflectStaticMethod("aspectOf", MethodAspect.class, getRealParameter(new Object[0]), null);
    Object object2 = EnhancedRobustUtils.invokeReflectStaticMethod("intObject", b.class, getRealParameter(new Object[] { new Integer(paramInt) }, ), new Class[] { int.class });
    Log.d("robust", "  inner Class new      No:  6");
    object2 = EnhancedRobustUtils.invokeReflectConstruct("com.ziroom.ziroomcustomer.ao", getRealParameter(new Object[] { { this, object2, joinPoint },  }, ), new Class[] { Object[].class });
    Object object1 = object2;
    if (object2 == this)
      object1 = ((MainActivityPatch)object2).originClass; 
    object2 = EnhancedRobustUtils.invokeReflectMethod("linkClosureAndJoinPoint", object1, getRealParameter(new Object[] { new Integer(69648) }, ), new Class[] { int.class }, a.class);
    Log.d("robust", "invoke  method is       No:  7 linkClosureAndJoinPoint");
    object1 = methodAspect;
    if (methodAspect == this)
      object1 = ((MainActivityPatch)methodAspect).originClass; 
    object1 = EnhancedRobustUtils.invokeReflectMethod("around", object1, getRealParameter(new Object[] { object2 }, ), new Class[] { b.class }, MethodAspect.class);
    Log.d("robust", "invoke  method is       No:  8 around");
  }
}

生效补丁的MainActivityPatch文件如下:

package com.meituan.robust.patch;

import android.util.Log;
import android.widget.ImageView;
import android.widget.TextView;
import com.meituan.robust.utils.EnhancedRobustUtils;
import com.ziroom.commonlib.utils.v;
import com.ziroom.sojourn.ziroomstation.stationhome.module.l;
import com.ziroom.ziroomcustomer.MainActivity;
import com.ziroom.ziroomcustomer.util.b.g;
import com.ziroom.ziroomcustomer.widget.ScrollControlerViewPager;
import com.ziroom.zrlandlord.home.b.f;
import org.greenrobot.eventbus.c;

public class MainActivityPatch {
  MainActivity originClass;
  
  public MainActivityPatch(Object paramObject) {
    this.originClass = (MainActivity)paramObject;
  }
  
  public Object[] getRealParameter(Object[] paramArrayOfObject) {
    if (paramArrayOfObject == null || paramArrayOfObject.length < 1)
      return paramArrayOfObject; 
    Object[] arrayOfObject = new Object[paramArrayOfObject.length];
    for (int i = 0; i < paramArrayOfObject.length; i++) {
      if (paramArrayOfObject[i] instanceof Object[]) {
        arrayOfObject[i] = getRealParameter((Object[])paramArrayOfObject[i]);
      } else if (paramArrayOfObject[i] == this) {
        arrayOfObject[i] = this.originClass;
      } else {
        arrayOfObject[i] = paramArrayOfObject[i];
      } 
    } 
    return arrayOfObject;
  }
  
  public void updateTabStatus(int paramInt) {
    MainActivityPatch mainActivityPatch12;
    MainActivityPatch mainActivityPatch11;
    MainActivity mainActivity11;
    MainActivityPatch mainActivityPatch10;
    ImageView imageView5;
    MainActivity mainActivity10;
    MainActivityPatch mainActivityPatch9;
    TextView textView5;
    MainActivity mainActivity9;
    MainActivityPatch mainActivityPatch8;
    ImageView imageView4;
    MainActivity mainActivity8;
    MainActivityPatch mainActivityPatch7;
    TextView textView4;
    MainActivity mainActivity7;
    MainActivityPatch mainActivityPatch6;
    ImageView imageView3;
    MainActivity mainActivity6;
    MainActivityPatch mainActivityPatch5;
    TextView textView3;
    MainActivity mainActivity5;
    MainActivityPatch mainActivityPatch4;
    ImageView imageView2;
    MainActivity mainActivity4;
    MainActivityPatch mainActivityPatch3;
    TextView textView2;
    MainActivity mainActivity3;
    MainActivityPatch mainActivityPatch2;
    MainActivity mainActivity2;
    MainActivityPatch mainActivityPatch1;
    MainActivity mainActivity1;
    ImageView imageView10;
    TextView textView10;
    ImageView imageView9;
    TextView textView9;
    ImageView imageView8;
    TextView textView8;
    ImageView imageView7;
    TextView textView7;
    if (this instanceof MainActivityPatch) {
      mainActivity11 = this.originClass;
    } else {
      mainActivityPatch12 = this;
    } 
    int i = ((Integer)EnhancedRobustUtils.getFieldValue("C", mainActivityPatch12, MainActivity.class)).intValue();
    Log.d("robust", "get value is mTabTextSelectColor     No:  1");
    if (this instanceof MainActivityPatch) {
      mainActivity11 = this.originClass;
    } else {
      mainActivityPatch12 = this;
    } 
    int[] arrayOfInt = (int[])EnhancedRobustUtils.getFieldValue("g", mainActivityPatch12, MainActivity.class);
    Log.d("robust", "get value is mShowTypeArray     No:  2");
    int j = arrayOfInt[paramInt];
    if (this instanceof MainActivityPatch) {
      mainActivity11 = this.originClass;
    } else {
      mainActivityPatch11 = this;
    } 
    EnhancedRobustUtils.setFieldValue("b", mainActivityPatch11, j, MainActivity.class);
    Log.d("robust", "set value is mFragmentType     No:  3");
    EnhancedRobustUtils.invokeReflectMethod("l", this.originClass, new Object[0], null, MainActivity.class);
    Log.d("robust", "invoke  method is       No:  4 resetTab");
    if (this instanceof MainActivityPatch) {
      mainActivity11 = this.originClass;
    } else {
      mainActivityPatch11 = this;
    } 
    ScrollControlerViewPager scrollControlerViewPager2 = (ScrollControlerViewPager)EnhancedRobustUtils.getFieldValue("c", mainActivityPatch11, MainActivity.class);
    Log.d("robust", "get value is viewPager     No:  5");
    ScrollControlerViewPager scrollControlerViewPager1 = scrollControlerViewPager2;
    if (scrollControlerViewPager2 == this)
      mainActivity11 = ((MainActivityPatch)scrollControlerViewPager2).originClass; 
    EnhancedRobustUtils.invokeReflectMethod("setCurrentItem", mainActivity11, getRealParameter(new Object[] { new Integer(paramInt), new Boolean(false) }, ), new Class[] { int.class, boolean.class }, ScrollControlerViewPager.class);
    Log.d("robust", "invoke  method is       No:  6 setCurrentItem");
    if (((Boolean)EnhancedRobustUtils.invokeReflectStaticMethod("checkMainTab", g.class, getRealParameter(new Object[0]), null)).booleanValue()) {
      EnhancedRobustUtils.invokeReflectMethod("h", this.originClass, new Object[0], null, MainActivity.class);
      Log.d("robust", "invoke  method is       No:  7 loadingSkin");
      return;
    } 
    switch (j) {
      default:
        if (j != 2) {
          MainActivity mainActivity;
          c c3 = (c)EnhancedRobustUtils.invokeReflectStaticMethod("getDefault", c.class, getRealParameter(new Object[0]), null);
          Object[] arrayOfObject2 = getRealParameter(new Object[] { new Integer(0) });
          Log.d("robust", " parameters[] from method      No:  28 " + arrayOfObject2);
          l l = (l)EnhancedRobustUtils.invokeReflectConstruct("com.ziroom.sojourn.ziroomstation.stationhome.module.l", arrayOfObject2, new Class[] { int.class });
          c c2 = c3;
          if (c3 == this)
            mainActivity = ((MainActivityPatch)c3).originClass; 
          EnhancedRobustUtils.invokeReflectMethod("post", mainActivity, getRealParameter(new Object[] { l }, ), new Class[] { Object.class }, c.class);
          Log.d("robust", "invoke  method is       No:  29 post");
          c3 = (c)EnhancedRobustUtils.invokeReflectStaticMethod("getDefault", c.class, getRealParameter(new Object[0]), null);
          Object[] arrayOfObject1 = getRealParameter(new Object[] { new Integer(0) });
          Log.d("robust", " parameters[] from method      No:  30 " + arrayOfObject1);
          f f = (f)EnhancedRobustUtils.invokeReflectConstruct("com.ziroom.zrlandlord.home.b.f", arrayOfObject1, new Class[] { int.class });
          c c1 = c3;
          if (c3 == this)
            mainActivity10 = ((MainActivityPatch)c3).originClass; 
          EnhancedRobustUtils.invokeReflectMethod("post", mainActivity10, getRealParameter(new Object[] { f }, ), new Class[] { Object.class }, c.class);
          Log.d("robust", "invoke  method is       No:  31 post");
          return;
        } 
        return;
      case 0:
        if (this instanceof MainActivityPatch) {
          mainActivity11 = this.originClass;
        } else {
          mainActivityPatch10 = this;
        } 
        imageView10 = (ImageView)EnhancedRobustUtils.getFieldValue("s", mainActivityPatch10, MainActivity.class);
        Log.d("robust", "get value is mIvTabRent     No:  8");
        imageView5 = imageView10;
        if (imageView10 == this)
          mainActivity10 = ((MainActivityPatch)imageView10).originClass; 
        EnhancedRobustUtils.invokeReflectMethod("setImageResource", mainActivity10, getRealParameter(new Object[] { new Integer(2131233124) }, ), new Class[] { int.class }, ImageView.class);
        Log.d("robust", "invoke  method is       No:  9 setImageResource");
        if (this instanceof MainActivityPatch) {
          mainActivity10 = this.originClass;
        } else {
          mainActivityPatch9 = this;
        } 
        textView10 = (TextView)EnhancedRobustUtils.getFieldValue("i", mainActivityPatch9, MainActivity.class);
        Log.d("robust", "get value is mTvTabRent     No:  10");
        textView5 = textView10;
        if (textView10 == this)
          mainActivity9 = ((MainActivityPatch)textView10).originClass; 
        EnhancedRobustUtils.invokeReflectMethod("setTextColor", mainActivity9, getRealParameter(new Object[] { new Integer(i) }, ), new Class[] { int.class }, TextView.class);
        Log.d("robust", "invoke  method is       No:  11 setTextColor");
      case 1:
        if (this instanceof MainActivityPatch) {
          mainActivity9 = this.originClass;
        } else {
          mainActivityPatch8 = this;
        } 
        imageView9 = (ImageView)EnhancedRobustUtils.getFieldValue("t", mainActivityPatch8, MainActivity.class);
        Log.d("robust", "get value is mIvTabYu     No:  12");
        imageView4 = imageView9;
        if (imageView9 == this)
          mainActivity8 = ((MainActivityPatch)imageView9).originClass; 
        EnhancedRobustUtils.invokeReflectMethod("setImageResource", mainActivity8, getRealParameter(new Object[] { new Integer(2131233128) }, ), new Class[] { int.class }, ImageView.class);
        Log.d("robust", "invoke  method is       No:  13 setImageResource");
        if (this instanceof MainActivityPatch) {
          mainActivity8 = this.originClass;
        } else {
          mainActivityPatch7 = this;
        } 
        textView9 = (TextView)EnhancedRobustUtils.getFieldValue("j", mainActivityPatch7, MainActivity.class);
        Log.d("robust", "get value is mTvTabYu     No:  14");
        textView4 = textView9;
        if (textView9 == this)
          mainActivity7 = ((MainActivityPatch)textView9).originClass; 
        EnhancedRobustUtils.invokeReflectMethod("setTextColor", mainActivity7, getRealParameter(new Object[] { new Integer(i) }, ), new Class[] { int.class }, TextView.class);
        Log.d("robust", "invoke  method is       No:  15 setTextColor");
      case 2:
        if (this instanceof MainActivityPatch) {
          mainActivity7 = this.originClass;
        } else {
          mainActivityPatch6 = this;
        } 
        imageView8 = (ImageView)EnhancedRobustUtils.getFieldValue("u", mainActivityPatch6, MainActivity.class);
        Log.d("robust", "get value is mIvTabLvju     No:  16");
        imageView3 = imageView8;
        if (imageView8 == this)
          mainActivity6 = ((MainActivityPatch)imageView8).originClass; 
        EnhancedRobustUtils.invokeReflectMethod("setImageResource", mainActivity6, getRealParameter(new Object[] { new Integer(2131233132) }, ), new Class[] { int.class }, ImageView.class);
        Log.d("robust", "invoke  method is       No:  17 setImageResource");
        if (this instanceof MainActivityPatch) {
          mainActivity6 = this.originClass;
        } else {
          mainActivityPatch5 = this;
        } 
        textView8 = (TextView)EnhancedRobustUtils.getFieldValue("k", mainActivityPatch5, MainActivity.class);
        Log.d("robust", "get value is mTvTabLvju     No:  18");
        textView3 = textView8;
        if (textView8 == this)
          mainActivity5 = ((MainActivityPatch)textView8).originClass; 
        EnhancedRobustUtils.invokeReflectMethod("setTextColor", mainActivity5, getRealParameter(new Object[] { new Integer(i) }, ), new Class[] { int.class }, TextView.class);
        Log.d("robust", "invoke  method is       No:  19 setTextColor");
      case 4:
        if (this instanceof MainActivityPatch) {
          mainActivity5 = this.originClass;
        } else {
          mainActivityPatch4 = this;
        } 
        imageView7 = (ImageView)EnhancedRobustUtils.getFieldValue("v", mainActivityPatch4, MainActivity.class);
        Log.d("robust", "get value is mIvTabService     No:  20");
        imageView2 = imageView7;
        if (imageView7 == this)
          mainActivity4 = ((MainActivityPatch)imageView7).originClass; 
        EnhancedRobustUtils.invokeReflectMethod("setImageResource", mainActivity4, getRealParameter(new Object[] { new Integer(2131233121) }, ), new Class[] { int.class }, ImageView.class);
        Log.d("robust", "invoke  method is       No:  21 setImageResource");
        if (this instanceof MainActivityPatch) {
          mainActivity4 = this.originClass;
        } else {
          mainActivityPatch3 = this;
        } 
        textView7 = (TextView)EnhancedRobustUtils.getFieldValue("l", mainActivityPatch3, MainActivity.class);
        Log.d("robust", "get value is mTvTabService     No:  22");
        textView2 = textView7;
        if (textView7 == this)
          mainActivity3 = ((MainActivityPatch)textView7).originClass; 
        EnhancedRobustUtils.invokeReflectMethod("setTextColor", mainActivity3, getRealParameter(new Object[] { new Integer(i) }, ), new Class[] { int.class }, TextView.class);
        Log.d("robust", "invoke  method is       No:  23 setTextColor");
      case 7:
        break;
    } 
    if (this instanceof MainActivityPatch) {
      mainActivity3 = this.originClass;
    } else {
      mainActivityPatch2 = this;
    } 
    ImageView imageView6 = (ImageView)EnhancedRobustUtils.getFieldValue("w", mainActivityPatch2, MainActivity.class);
    Log.d("robust", "get value is mIvTabMy     No:  24");
    ImageView imageView1 = imageView6;
    if (imageView6 == this)
      mainActivity2 = ((MainActivityPatch)imageView6).originClass; 
    EnhancedRobustUtils.invokeReflectMethod("setImageResource", mainActivity2, getRealParameter(new Object[] { new Integer(2131233130) }, ), new Class[] { int.class }, ImageView.class);
    Log.d("robust", "invoke  method is       No:  25 setImageResource");
    if (this instanceof MainActivityPatch) {
      mainActivity2 = this.originClass;
    } else {
      mainActivityPatch1 = this;
    } 
    TextView textView6 = (TextView)EnhancedRobustUtils.getFieldValue("m", mainActivityPatch1, MainActivity.class);
    Log.d("robust", "get value is mTvTabMy     No:  26");
    TextView textView1 = textView6;
    if (textView6 == this)
      mainActivity1 = ((MainActivityPatch)textView6).originClass; 
    EnhancedRobustUtils.invokeReflectMethod("setTextColor", mainActivity1, getRealParameter(new Object[] { new Integer(i) }, ), new Class[] { int.class }, TextView.class);
    Log.d("robust", "invoke  method is       No:  27 setTextColor");
    EnhancedRobustUtils.invokeReflectStaticMethod("showToast", v.class, getRealParameter(new Object[] { "hotfix method updateTabStatus222" }, ), new Class[] { String.class });
  }
}

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 by reproducing the Robust patch build with and without Aspectjx using the versions listed in the issue. Compare the generated MainActivityPatch and com.meituan.robust.patch.HomePageFragmentInLinePatch outputs, then verify that the patched updateTabStatus method loads and shows the added Toast message.

Written by the indexing model from the issue text.

Assessment

Tech stack
android, java
Domain
build-system, mobile-dev
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.