Launcher启动性能优化

422 阅读3分钟

一、启动流程分析

Launcher启动涉及 系统服务初始化应用自身启动 两个阶段:

`
  A[SystemServer启动] --> B[AMS.systemReady()]
  B --> C[AMS.startHomeActivityLocked()]
  C --> D[Zygote进程fork Launcher进程]
  D --> E[Launcher Application初始化]
  E --> F[Main Activity启动及UI绘制]`
  

二、关键源码路径与优化点

1. 系统服务优化(SystemServer & AMS)
  • 源码路径:

    • frameworks/base/services/java/com/android/server/SystemServer.java
    • frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
  • 优化点:

    • 延迟非关键服务初始化:在SystemServerstartOtherServices()中,将非核心服务(如蓝牙、Wi-Fi,NFC)延迟到Launcher启动后初始化。
    • 并行化服务启动:通过SystemServiceManager调整服务启动顺序,允许部分服务并行启动。利用Android 14新增的@ConcurrentService注解实现服务并行初始化

    @ConcurrentService(phase = SystemService.PHASE_BOOT_COMPLETED) class PowerManagerService extends SystemService {...}

    • 提前触发Zygote预加载:在ZygoteInit中预加载Launcher常用类(如ResourcesTheme),减少进程fork时间。

2. ​​AMS启动决策优化​​

​​源码路径​​

frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

​​优化策略​​

  • ​​Zygote预加载增强​​:在startProcessLocked()前触发Launcher相关资源预加载
`  // 扩展预加载资源类型(新增Launcher专属图标/布局)
ZygotePreload.addLauncherSpecificResources(); `
  • Binder事务合并​​:将bindApplication与scheduleLaunchActivity合并为原子操作

    mAtmService.atomicBindAndLaunch(processName, intent);

​二、Zygote进程优化​​

1. ​​预加载机制增强​​

​​源码路径​​

frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

​​优化策略​​

​​类预加载分级​​:在preload()方法中实现三级预加载策略

`preloadCommonClasses();    // 基础系统类
preloadLauncherClasses();  // Launcher专属类(如BaseDraggingActivity)
preloadSharedLibs();       // 共享库(如libhwui.so)`

​​资源预加载优化​​:扩展preloadResources()加载Launcher高频资源

`TypedArray launcherRes = mResources.obtainTypedArray(R.array.launcher_preload_drawables);`
2. ​​进程创建加速​​

​​源码路径​​

frameworks/base/core/java/android/os/ZygoteProcess.java

​​优化策略​​

​​Socket通信协议优化​​:采用二进制协议替代文本协议降低IPC耗时

​​USAP池预初始化​​:在SystemServer启动时预创建USAP进程池

​三、Launcher应用层优化​​

1. ​​Application初始化重构​​

​​源码路径​​

packages/apps/Launcher3/src/com/android/launcher3/LauncherAppState.java

​​优化策略​​

三级任务调度​​:通过AppStartup库实现初始化任务分级

`AppInitializer.getInstance(this)
    .initializeComponent(StartupType.CRITICAL)  // 关键路径(主线程同步)
    .initializeComponent(StartupType.ASYNC)   // 异步任务(图标缓存加载)
    .initializeComponent(StartupType.DEFERRED);// 延迟任务(插件预加载)`
    
2. ​数据加载优化
  • 源码路径
    packages/apps/Launcher3/src/com/android/launcher3/model/LoaderTask.java

  • 优化策略

    • 工作区数据预取​:在loadWorkspace()阶段使用内存映射文件加速加载
mIconCache.preloadIconsInMappedFile();
  • 数据库索引优化​:改造LauncherProvider的SQLiteOpenHelper实现WAL模式
3. ​UI渲染加速
  • 源码路径
    frameworks/base/libs/hwui/RenderNode.cpp

  • 优化策略

    • 硬件层缓存​:在Activity启动时预生成RenderNode硬件层

getWindow().getDecorView().buildLayer();

  • 异步布局加载​:改造LauncherActivity使用ConstraintLayout+ViewStub2.0
<androidx.constraintlayout.widget.ConstraintLayout>
<ViewStub2 android:id="@+id/hotseat_stub" 
             android:layout="@layout/hotseat_deferred"/>
</androidx.constraintlayout.widget.ConstraintLayout>

#### **四、系统级绘制优化**​
1. ​SurfaceFlinger策略调整
  • 源码路径
    frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp

  • 优化策略

    • 首帧优先级​:在queueBuffer()阶段标记LAUNCHER_BUFFER为高优先级

    bufferQueue->setBufferPriority(HIGH_PRIORITY);

    2. ​HWUI渲染管线优化
  • 源码路径
    frameworks/base/libs/hwui/threading/RenderThread.cpp

  • 优化策略

    • 预编译着色器​:在应用安装时生成SPIR-V格式的预编译Shader

RenderThread.getPipeline().precompileShaders();

五、监控体系构建

1. ​全链路Trace监控
`// 系统层埋点
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "AMS_launchHome");
// 应用层埋点
class LauncherActivity {
    void onCreate() {
        Trace.beginSection("LauncherUI_Inflate");
        //...
        Trace.endSection();
    }
}`

##### 2. ​**线上指标监控**​
  • 关键指标

    • 冷启动耗时:ActivityTaskManagerService#reportLaunchTime

    • 首帧渲染时间:Choreographer.FrameCallback