You need to enable JavaScript to run this app.
导航

编译失败:阿里Sophix打热修复包失败

最近更新时间2024.01.08 16:31:19

首次发布时间2022.08.09 16:02:59

问题描述
APMInsight SDK 为了采集应用启动数据,会在编译时对 Application 类的 attachBaseContext() 及 onCreate() 方法嵌码。而阿里 Hotfix 补丁工具要求Application 不能调用非 Android 官方 API,导致生成补丁失败。
图片

解决方案
分析:

  1. 为何会往阿里的类里面插桩?
    1. 阿里热修:阿里热修通过自己的SophixStubApplication代理了业务的Application类,启动监控会往真实的Application里面插桩,所以会修改SophixStubApplication类的代码。
  2. 如何不往阿里的类插装?又可以实现启动监控?
    1. 配置阿里SophixStubApplication类黑名单,配置自己的Application黑名单。
    2. 手动往自己的application里面添加启动监控的代码

插件配置:
如果使用了阿里的sophix热修复,需要做如下配置。

ApmPlugin{
    blackList = [
        "com.apm.app.SophixStubApplication",//阿里热修的Application
        "com.apm.app.MyApp"//自己的Application
    ]
}

启动Application配置:
在自己的Application里面配置启动监控的代码。

public class App extends Application {

    public App(){
        super();
        //监控App构造函数
        AppAgent.onTrace(AppAgent.CONSTRUCT,true);
        AppAgent.onTrace(AppAgent.CONSTRUCT,false);
    }

    @Override
    protected void attachBaseContext(Context base) {
        //监控启动attachBaseContext()方法
        AppAgent.onTrace(AppAgent.ATTACH_BASE_CONTEXT,true);
        super.attachBaseContext(base);
        AppAgent.onTrace(AppAgent.ATTACH_BASE_CONTEXT,false);
    }

    @Override
    public void onCreate() {
        //监控启动onCreate()方法
        AppAgent.onTrace(AppAgent.ON_CREATE,true);
        super.onCreate();
        
        //这里可以初始化业务其他代码
        
        AppAgent.onTrace(AppAgent.ON_CREATE,false);
    }
}

如果找不到常量AppAgent. CONSTRUCT 可以配置

public static final String CONSTRUCT = "<init>";
public static final String ATTACH_BASE_CONTEXT = "attachBaseContext";
public static final String ON_CREATE = "onCreate";

验证:
添加黑名单,添加了启动监控的代码。
初始化设置debug模式,过滤ApmInsight可以看到Receive:StartData即获取启动数据成功。