Android系统的启动优化

1. 优化preload的classes和resource

  由于所有的Android应用程序都是从Zygote进程fork出来的,所以为了共享一些class和resourse资源,Zygote进程初始化过程中,会预先加载一些常用的java class和资源文件到进程的内存中,这样其他应用fork出来后就不用再次加载了,从而提高了应用的启动速度。

//资源和类并行加载

static void preload() {
  Thread preloadRsThread = new Thread(new Runnable(){
    @Override
    public void run() {
      //将该资源加载放在子线程中,加载资源文件要比加载classes文件要快,因此这里不提升子线程优先级。
      preloadResources();
      }
  }) ;
  preloadRsThread.start() ;
  preloadClasses();
  try {
    preloadRsThread.join() ;
  } catch (InterruptedException e) {
    e.printStackTrace();

  }
}

//  提升进程的优先级    ZygoteInit.java入口
    public static void main(String argv[]) {
        try { 
            //获取当前进程优先级
            int currentPriority = Process.getThreadPriority(Process.myPid()) ;
            //提升当前进程优先级。
            Process.setThreadPriority(Process.THREAD_PRIORITY_AUDIO) ;
            // Start profiling the zygote initialization.
            SamplingProfilerIntegration.start(); 
            registerZygoteSocket();
            EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_START,
                SystemClock.uptimeMillis());
            //5.加载资源
            preload();
            EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_END,
                SystemClock.uptimeMillis());
            SamplingProfilerIntegration.writeZygoteSnapshot();
            Process.setThreadPriority(currentPriority) ;
}

2.  精简native service和java service

  Android OS的启动本质上就是启动一系列的本地服务和Java服务,Android系统的所有功能都是通过这些服务间接提供的。这些服务有很多并不是必须启动的,根据业务需求可以去掉一些,涉及到的文件:

  system/core/rootdir/init.rc

  frameworks/base/services/java/com/android/server/SystemServer.java

3.  精简预装的apk文件

  系统启动过程中,会扫描系统指定目录下的所有apk文件,这个过程也是非常耗时的,预装的apk文件越少,系统启动速度也就越快,因此,精简预装apk也是优化系统启动速度最重要的手段之一。要想减少预装的apk文件,则需要分析系统的build文件,将不需要的apk编译选项删除掉,涉及到的文件:

   build/target/product/xxxx.mk

   device/<company>/<product>/xxxx.mk

   vendor/..../xxxx.mk

4.  减少内核的log打印级别

  过多的log打印消息会显著地增加系统启动的时间,log打印级别有多处可以调整,推荐修改init.rc文件中的loglevel来改变log打印级别。

  涉及到的文件:system/core/rootdir/init.rc

on property:sys.init_log_level=*
    loglevel ${sys.init_log_level}

5.  其他优化手段

  上面介绍的都是最常用的优化手段,其实还有很多其他的方法,简单列举如下:

(1) 优化启动动画,降低帧率和图片尺寸

(2) 精简系统,减小boot.img文件大小,可以显著减少启动过程中加载和解压boot.img的时间

(3) 预先创建一些目录和文件,而不是在init过程中创建

posted on 2020-08-17 14:15  feibin筱飞  阅读(1655)  评论(1编辑  收藏  举报