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一起使用时,补丁失效,求助~ #379

Open qujc opened 4 years ago

qujc commented 4 years ago

您好,我项目中用到了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 });
  }
}