一、启动耗时检测
1、查看Logcat
在Android Studio Logcat中过滤关键字“Displayed”,可以看到对应的Activity启动耗时日志。
2、adb shell
使用adb shell获取应用的启动时间
adb shell am start -W [packageName]/[AppstartActivity全路径]
执行后会得到三个时间:ThisTime、TotalTime和WaitTime,详情如下:
ThisTime 最后一个Activity启动耗时。
TotalTime 所有Activity启动耗时。
WaitTime AMS启动Activity的总耗时。
一般查看得到的TotalTime,即应用的启动时间,包括创建进程 + Application初始化 + Activity初始化到界面显示的过程。
特点:
- 线下使用方便,不能带到线上。
- 非严谨、精确时间。
3、AOP(Aspect Oriented Programming)打点
面向切面编程,通过预编译和运行期动态代理实现程序功能统一维护的一种技术。
作用
利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合性降低,提高程序的可重用性,同时大大提高了开发效率。
AOP核心概念
1)、横切关注点
对哪些方法进行拦截,拦截后怎么处理。
2)、切面(Aspect)
类是对物体特征的抽象,切面就是对横切关注点的抽象。
3)、连接点(JoinPoint)
被拦截到的点(方法、字段、构造器)。
4)、切入点(PointCut)
对JoinPoint进行拦截的定义。
5)、通知(Advice)
拦截到JoinPoint后要执行的代码,分为前置、后置、环绕三种类型。
准备 首先,为了在Android使用AOP埋点需要引入AspectJ,在项目根目录的build.gradle下加入:
classpath 'com.hujiang.aspectjx:gradle-android-plugin- aspectjx:2.0.0'
然后,在app目录下的build.gradle下加入:
apply plugin: 'android-aspectjx'
implement 'org.aspectj:aspectjrt:1.8.+'
AOP埋点实战 JoinPoint一般定位在如下位置:
- 函数调用
- 获取、设置变量
- 类初始化 使用PointCut对我们指定的连接点进行拦截,通过Advice,就可以拦截到JoinPoint后要执行的代码。 Advice通常有以下几种类型:
- Before:PointCut之前执行
- After:PointCut之后执行
- Around:PointCut之前、之后分别执行
首先,我们举一个小栗子:
@Before("execution(* android.app.Activity.on**(..))")
public void onActivityLifeCalled(JoinPoint joinPoint) throws Throwable {
...
}