Android篇

性能优化(四):Android启动速度优化

2021-04-04  本文已影响0人  w达不溜w
1.App启动流程
app启动流程.jpg
  1. 点击桌面App图标,Launcher进程采用Binder IPC向system_server进程发起startActivity请求。
  2. system_server进程接收到请求后,向Zygote进程发送创建进程的请求。
  3. Zygote进程fork出新的子进程,即App进程
  4. App进程通过Binder IPC向system_server进程发起attach Application请求
  5. system_server进程收到请求后,进行一系列准备工作后,再通过Binder IPC向App进程发送scheduleLaunchActivity请求。
  6. App进程的binder线程(ApplicationThread)在收到请求后,通过handler向主线程发送LAUNCHER_ACTIVITY消息。
  7. 主线程收到Message后,通过反射机制创建目标Activity,并回调Activity.onCreate()等方法。
  8. 到此,App便正式启动,开始进入Activity生命周期,执行完onCreate/onStart/onResume方法,UI渲染结束后便可以看到App的主界面。
2.启动状态

应用有三种启动状态,每种状态都会影响应用向用户显示所需要的时间:

3.冷启动耗时统计

性能测试中存在2-5-8原则:2s内很快,2~5s 还可以,5~8s 很慢还可以接受,8s糟糕透了。

Google 提出一项计划Android Vitals:冷启动5s内,温启动2s内,热启动1.5s内。

4.CPU Profile
我们可以通过CPU Profiler查看应用在某段时间里某个线程执行了哪些方法,并且还定量的展示了执行这些方法所耗费的时间及其方法的调用堆栈。 cpu profile.png

CPU Profile只支持Android 8.0以上,其它版本可以用Debug API生成trace

public class MyApplication extends Application {
    public MyApplication(){
        //开始跟踪
        Debug.startMethodTracing("trace");
    }
    //...
}

public class MainActivity extends AppCompatActivity{
    @Override
    public void onWindowFocusChanged(booleanhasFocus){
        super.onWindowFocusChanged(hasFocus);
        //停止跟踪
        Debug.stopMethodTracing();    
    }
    //...
}

运行app会生成.trace文件,用Android Studio打开即可。

5.StrictMode

严苛模式是一个开发工具,能够检测程序中的违例,从而修复。最常用于主线程中磁盘读写和网络访问。

public class MyApplication extends Application {
     public void onCreate() {
     if (BuildConfig.DEBUG) {
         //线程检查策略
         StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                 .detectDiskReads() //读磁盘
                 .detectDiskWrites()//写磁盘
                 .detectNetwork()   //检查网络
                 .penaltyLog()
                 .build());
         //VM检查策略
         StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                 .detectLeakedSqlLiteObjects()  //Sqlite对象,如cursors
                 .detectLeakedClosableObjects() //未关闭的Closeable对象
                 .penaltyLog()  //违规打印日志
                 .penaltyDeath() //违规崩溃
                 .build());
     }
     super.onCreate();
 }
    //...
}

检测项

检测到违规项之后的表现形式

6.启动优化相关

1.异步加载:耗时多的加载放到子线程中异步执行
2.延迟加载: 非必须的数据延迟加载

Looper.myQueue().addIdleHandler(new MessageQueue.IdleHandler() {
        @Override
        public boolean queueIdle() {
            XXX.init();
            return false;
        }
});

3.提前加载:利用ContentProvider提前进行初始化

上一篇下一篇

猜你喜欢

热点阅读