Click Event
- IPC
- Process.start
- ActivityThread
- bindApplication
- LifeCycle
- ViewRootImpl
后台
- 前台
LifeCycle
冷启动之前:
随后:
优化方向:
Application和Activity生命周期
adb shell am start -W packageName/packageName.SplashActivity
输出说明:
totalTime
: 所有Activity启动耗时;
ThisTime
: 最后一个Activity启动耗时;
WaitTime
: AMS启动Activity的总耗时。
特点:
启动时候打点,结束时候计算
在Application的attachBaseContext(Context cntext)
中记录初始计时
public class LaunchTimer {
private static long sStartTime;
/**
* 开始计算
* 在Application的attachBaseContext方法调用
*/
public static void startRecord(){
sStartTime = System.currentTimeMillis();
}
/**
* 结束计时
* 在界面显示成功的时候计算
* ViewTreeObserver viewTreeObserver = mView.getViewTreeObserver();
* viewTreeObserver.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
* @Override
* public boolean onPreDraw() {
* viewTreeObserver.removeOnPreDrawListener(this);
* finishRecord();
* return true;
* }
* });
*/
public static void finishRecord() {
long time = System.currentTimeMillis() - sStartTime;
Log.d("启动耗时", time + "");
}
}
Debug.startMethodTracing("");
Debug.stopMethodTracing();
生成本地文件路径:Androdi/data/packagename/files
python systrace.py -t 10 [other-options][categories]
代码插入System.currentTimeMills()
面向切面编程
classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.0'
apply plugin: 'android-aspectjx'
implementation 'org.aspectj:aspectjrt:1.8.13'
@Before("execution(*android.app.Activity.on**(..))")
public void onActivityCalled(JoinPoint joinPoint) throw Throwable {
}
@Aspect
@Around(call(* com.example.app.TestActivity.**(..)))
等public void getDuration(ProceedingJoinPoint point) {
Signature signature = point.getSignature();
String methodName = signature.toShorString();
long time = System.currentTmeMillis();
point.proceed();
Log.d("耗时", methodName + " " + (System.currentTmeMillis() - time));
}
Theme切换(感觉上会快)
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
android:opacity="opaque">
<item android:drawable="@android:color/white" />
<item>
<bitmap
android:gravity="bottom"
android:src="@drawable/first_ic_logo" />
item>
layer-list>
<style name="AppTheme.Launcher">
- "android:background"
>@drawable/first_layer
style>
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
setTheme(R.style.MyTheme);
super.onCreate(savedInstanceState);
}
子线程分担主线程任务,并行减少时间
int processors = Runtime.getRuntime().availableProcessors();
int count = Math.max(2, Math.min(processors - 1, 4));
ExecutorService executorService = Executors.newFixedThreadPool(count);
executorService.submit(new Runnable() {
@Override
public void run() {
//todo:需要在子线程执行的方法
countDownLatch.countDown();
}
});
//该int值表示要执行多少次countDown方法,只有执行完对应次数之后,才不会await,表示要等子线程的方法执行完
CountDownLatch countDownLatch = new CountDownLatch(int次数);`
countDownLatch.countDown();
countDownLatch.await();
表示,执行了int次的countDown方法之后,就不再await方法
注意:
缺点:
异步初始化的最优解
充分利用CPU多核,自动梳理任务顺序
流程:
代码见【3-10 异步初始化最优解-启动器-2】
对延迟任务进行分批初始化
可以提升用户体验
利用IdleHandler特性,在空闲的时候执行
【3-11 更优秀的延迟初始化方案】