APM之Android应用的启动次数(2)

怎么防止sdk反复启动呢?---->一次启动对于应用来说算一次启动次数

  private static boolean started = false;

  public void start(Context context)  //sdk初始化执行的逻辑
  {
    if (started) {         //用一个变量防止重复初始化.
      log.debug("NewRelic is already running.");
      return;
    }
    try {
      AgentLogManager.setAgentLog(new NullAgentLog());
      log.setLevel(this.logLevel);

      if (isInstrumented()) {                               //如果使能成功才改变started的值.
        AndroidAgentImpl.init(context, agentConfiguration);
        started = true;
      } else {
        log.error("Failed to detect New Relic instrumentation.  Something likely went wrong during your build process and you should contact [email protected]");
        return;
      }
    } catch (Throwable e) {
      log.error("Error occurred while starting the New Relic agent!", e);
    }
  } 
  private boolean isInstrumented()  
  {
    return false;   //是不是感觉很奇怪?为什么直接返回false?那么sdk怎么改变started的值?
  }

虽然在sdk中 isInstrumented()返回的是false,但是编译成功以后这个值就变成true了(表明rewriter在用户apk中嵌码的流程已经生效了,而不仅仅是添加了agent的jar包版本, 这个过程俗称使能.)

为了防止sdk反复初始化.要求上面的初始化方法必须嵌入在Activity的onCreate()方法中. 如果嵌在异步线程中可能会出现多次初始化.

 

注意点:

1.初始化代码不要嵌在Appliation的onCreate()方法中. 有可能出现多进程多次初始化的问题.

2.Asm是通过对java的字节码进行操作嵌码的. 字节码中只有类的父类信息.没有其父类以上的继承信息. 所以如果ActivityA extends BaseActivity; BaseActivity extends Activity.

那么ActivityA因为其父类BaseActivity无法确认是否是Activity的子类,所以不会被嵌码. BaseActivity会正常嵌码. 

幸好JAVA是运行时. ActivityA生命周期的onStart() onStop()调用的时候.其父类BaseActivity的onStart(),onStop()也会正常执行.前面的ApplicationStateMonitor.activityStart()和activityStop()也会正常执行一次.

3.低端版本的Android可能存在按电源键锁屏 不会走Activity生命周期的onStop()方法.------->一个apk minsdkVersion=4的时候出现过.

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。