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的时候出现过.

时间: 2024-12-22 14:06:08

APM之Android应用的启动次数(2)的相关文章

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

转载请说明. 一款应用的启动次数,无疑是一项重要的APM的检测指标.但Android的启动次数要考虑到一个重要的因素.那就是从后台切换回前台的时候.这算一次新的启动吗? 友盟和NewRelic作为国内外2家这项数据检测的领头羊,采用的方法是类似的.但是实现手段完全不一样. 友盟和newRelic的实现方法: 友盟需要用户自己在代码中,用户手工写代码嵌入Activity生命周期的onPause()和onResume()方法中,执行newRelic的逻辑. newRelic的用户完全无需用户关心这个

Android 取得应用程序的启动次数和运行时间等信息

使用情景:最近有个需求是统计后台应用运行时间,如果一个应用在后台运行超过一定时间就Kill掉进程,达到省电的目的.此时就可以使用PkgUsageStats这个类来实现啦! 通过com.android.internal.os.PkgUsageStats这个类可以得到一个应用程序的启动次数,运行时间等信息,功能强大,但是google并没有将这个类作为API接口提供给开发者,如果在android源码下开发,可以通过以下代码来使用这个类: import com.android.internal.app.

Android应用第一次启动时的欢迎界面制作

原理是这样,我们在SharedPreferences中存储一个int型数据,用来代表第几次登录,每次启动时都读取出来判断是不是第一次启动,然后依次判断是否要显示欢迎界面, 具体实现如下: 设置一个欢迎界面的Activity,并设置为主Activity,在判断第几次启动后来决定要不要跳转到MainActivity package com.example.f; import androidx.appcompat.app.AppCompatActivity; import android.conten

关于Android Studio中启动模拟器时,报VT-x is disabled in BIOS错误的解决办法

有时候在Android Studio中启动一个模拟器去运行程序的时候,会出现下面的错误提示:"Intel HAXM is required to run this AVD,VT-x is disabled in BIOS". 接下来我来说说解决的办法: 1. 首先在SDK Manager中检查是否安装Download Intel x86 Emulator Accelerator (HAXM installer),如果没有安装,则在SDK Manager中下载安装Download Int

Cocos2d-x3.3RC0的Android编译Activity启动流程分析

本文将从引擎源代码Jni分析Cocos2d-x3.3RC0的Android Activity的启动流程,以下是具体分析. 1.引擎源代码Jni.部分Java层和C++层代码分析 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXV4aWt1b18x/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" > watermark/2/text/aHR0cDov

Android应用程序启动过程——Launcher源码分析

当我们在Launcher界面单击一个应用程序图标时就会启动一个程序,那这一个过程究竟发生了些哪样呢?让我们跟踪Launcher源码来分析一下吧. 先上流程图: step1.追踪Launcher  从源码中我们可以发现Launcher其实也是一个程序,它继承于Activity.找到该文件中的onCreate()方法,代码片段如下: protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceSta

Android Phone进程启动过程详解

之前解决一个开机搜网慢的问题时,发现由于Phone进程起来以后才会主动连接RILD,因而在一定程度上Phone进程启动的时间会影响网络状态注册的快慢.适当的将Phone进程提前,可以将网络注册时间提前一点,让状态栏中信号显示的时间提前.那么,Android中作为系统的核心进程之一,Phone进程是如何启动的了? RIL运行机制请参考: http://blog.csdn.net/jason_wzn/article/details/53232022 Telephony最开始创建的是PhoneFact

quick cocos2d x 手机(Android端)启动过程学习

简要学习下quick cocos2d x 在安卓端启动的过程. 首先需要了解一点:quick cocos2d x是依托于Android的activity和GLSurfaceView(继承自SurfaceView)的环境来显示quick层的游戏界面. (1)首先quick类的android游戏从AndroidManifest.xml文件指定的activity(假设AC)启动. (2)AC继承父类的Cocos2dxActivity. (3)调用静态初始化块,加载cocos2dx的动态库.也就是一些C

Android ADB Server启动失败

Android ADB Server启动失败 启动Android Stdio的时候报如下错误: 1 2 3 4 5 Unable to create Debug Bridge: Unable to start adb server: error: could not install *smartsocket* listener: cannot bind to 127.0.0.1:5037: 閫氬父姣忎釜濂楁帴瀛楀湴鍧?(鍗忚/缃戠粶鍦板潃/绔彛)鍙厑璁镐娇鐢ㄤ竴娆°?? (10048) c