当前位置: 首页 > news >正文

Android启动优化

一. 核心优化思路

开机过程主要分为以下几个阶段,优化也围绕这些阶段展开:

  1. Bootloader:初始化硬件,加载内核。通常由芯片厂商定制,优化空间有限
  2. Kernel:初始化驱动、子系统。优化重点在于减少初始化时间和裁剪不必要的驱动
  3. Init 进程:解析 init.rc 脚本,启动核心系统服务(如 servicemanager, surfaceflinger)
  4. Zygote 进程:Android 运行时和系统服务的孵化器。预加载类和资源,其启动速度直接影响后续应用启动
  5. SystemServer:Android 框架的核心,启动所有系统服务(如 AMS, PMS, WMS 等)。这是优化潜力最大、最复杂的阶段
  6. Launcher:系统启动完成的标志,启动主屏幕应用

核心思想并行化、延迟加载、缓存、裁剪

二. 具体优化方法

阶段 一:内核与 Init 阶段优化
  1. 内核配置优化
    ○ 裁剪内核:移除设备不需要的驱动、文件系统、网络协议、调试功能等。使用 make menuconfig 进行精细配置
    ○ 优化内核启动参数:调整控制台输出、内存管理等参数
    ○ 初始化调用优化:将非关键的驱动初始化(module_init)标记为延迟初始化late_initcall),使其在系统启动后再初始化
  2. Init 阶段优化
    ○ 并行执行任务:修改 init.rc 文件,利用 class_start 将不相互依赖的服务标记为同一个 class,让 init 进程并行启动它们
    ○ 减少 Shell 命令:避免在 init.rc 中执行耗时的 Shell 命令(如 chmodchown 等),这些操作应在编译时由 fs_config 完成
    ○ 使用 Treble 和 A/B 分区:Treble 架构将系统和供应商解耦,简化了更新流程。A/B(无缝更新)分区可以让系统在后台更新,下次启动直接切换到新系统,减少感知到的启动时间
阶段 二:Zygote 优化
  1. 预加载优化
    ○ 分析预加载类:使用工具分析 Zygote 预加载的类和资源。移除系统级应用不再使用的类,减少预加载列表(如 preloaded-classes
    ○ 优化预加载逻辑:避免在预加载阶段执行复杂的逻辑或 I/O 操作
  2. Zygote 本身优化
    ○ 关注 AOSP 上游的改进。例如,Android 10 引入了 App Zygote 和 USAP(未知应用预孵化池),进一步优化了应用启动,但其本身的初始化也需要优化
阶段 三:SystemServer 优化 - 重中之重

这是最复杂也是收益最高的部分

  1. 服务启动分析
    ○ 使用 dumpsys package startup-info 或直接查看 SystemServer 的日志,了解各个服务的启动耗时
    ○ 重点关注 SystemServer 主线程的 init 和 start 阶段
  2. 并行化启动服务
    ○ 主线程优化:将不依赖其他服务的系统服务(如 TelephonyRegistry)的启动,从 SystemServer 的主线程移动到单独的线程中,使用 SystemServiceManager.startBootPhase() 来协调启动顺序
    ○ 使用 ConcurrentyFramework:在 SystemServer 中利用 ExecutorService 创建线程池,并发启动多个服务
  3. 延迟启动与非关键服务
    ○ 识别关键路径:明确启动 Launcher 所必须的系统服务(如 ActivityManagerServicePackageManagerService)。其他服务(如 BluetoothServiceWiFiService)可以延迟加载
    ○ 使用 StartControllers 和 BackgroundLaunch:将非关键服务标记为可以在后台启动,或者等到第一次被绑定时才初始化
  4. 缓存与预加载
    ○ PackageManager 优化PackageManagerService 的扫描和解析是耗时大户
    ◎ 使用编译时信息:启用 dex2oat 的 speed 模式,在系统编译时对系统应用进行预优化
    ◎ 优化扫描路径:确保只扫描必要的目录(/system/vendor/product),避免扫描 data 分区
    ◎ 使用 apex 和 module:新的模块化分发方式可以减少 PMS 的扫描负担
阶段 四:应用与 Launcher 优化
  1. Launcher 自身优化
    ○ 将 Launcher 视为一个普通应用,应用所有应用启动优化手段
    ○ 避免冷启动:确保 Launcher 进程在开机前已被 Zygote 预加载
  2. 系统应用预加载
    ○ 使用 cmd package compile -m speed -f <package-name> 命令在首次启动后或工厂烧录时,预编译关键系统应用为最优的机器码

三. 分析与测量工具

没有测量就无法优化。以下是关键工具:

  1. bootchart
    ○ 功能:生成整个启动过程的 CPU、I/O、进程树的时间线图。是启动优化的首选宏观分析工具
    ○ 使用:在 AOSP 源码中启用 ENABLE_BOOTCHART=true,编译后刷机。开机后会在 /data/bootchart 生成日志,用 pybootchart.py 解析生成图表
  2. systrace / perfetto
    ○ 功能:提供更细粒度的性能分析,可以跟踪系统调用、CPU 调度、锁竞争等。Perfetto 是 Systrace 的升级版
    ○ 使用:在代码中插入 Trace.beginSection("MyService.init") 和 Trace.endSection() 来标记关键代码块。然后使用 python systrace.py 或 Perfetto UI 抓取 trace 文件进行分析
  3. 内核日志
    ○ 功能:通过 dmesg 查看内核启动日志,里面包含了每个驱动初始化的精确时间戳(通过 printk 输出)
    ○ 使用adb shell dmesg > dmesg.log,然后分析时间戳间隔较大的部分
  4. Logcat
    ○ 功能:查看系统服务的启动日志。SystemServer 会打印类似 StartService ... 和 Service ... started 的日志
    ○ 使用adb logcat -b all -v time -d > logcat.txt,然后搜索 SystemServer 和 ActivityManager 的相关日志
  5. 自定义打点
    ○ 在 SystemServer.java 等关键位置添加 logcat 或 Slog.i 输出时间戳,可以非常精确地测量特定服务的启动耗时

四. 实战流程建议

  1. 建立基线:使用 bootchart 和 systrace 抓取一次未优化的启动过程,确定总启动时间和各阶段耗时
  2. 定位瓶颈:分析图表,找到耗时最长的阶段(是 Kernel?PMS?还是某个系统服务?)
  3. 制定策略
    ○ 如果是 I/O 密集型(如 PMS 扫描),考虑缓存、预加载、并行扫描
    ○ 如果是 CPU 密集型(如服务初始化逻辑),考虑延迟加载、异步初始化、算法优化
    ○ 如果是等待依赖,考虑调整启动顺序或并行化
  4. 实施修改:修改 AOSP 代码(如 SystemServer.javainit.rc),每次只做一个修改
  5. 验证效果:重新编译刷机,再次测量,对比优化前后的数据
  6. 迭代:重复步骤 2-5,直到达到目标

总结

层面关键优化手段
内核/Init驱动裁剪与延迟初始化,init.rc 任务并行化
Zygote精简预加载类和资源
SystemServer服务启动并行化,非关键服务延迟加载,PMS 扫描优化
应用/Launcher预编译,应用启动优化
工具bootchart(宏观),systrace/perfetto(微观),logcat/dmesg(日志)
http://www.dtcms.com/a/399782.html

相关文章:

  • 中学生旅游网站开发的论文怎么写口碑营销理论
  • 整站seo优化公司浙江seo
  • 上传网站步骤wordpress调用小工具
  • 学了网站建设的心得体会最好设计网站建设
  • 上海信息公司做网站软件开发需要学什么专业好
  • 网站页面设计效果图江苏网站seo平台
  • 网站做细分领域客户管理系统网站
  • 网站开发建设费用外国高端网站
  • 电商资讯网站有哪些茶文化网站制作
  • Vue前端用什么开发工具?Vue前端开发常用工具推荐、Vue开发工具对比与最佳实践分享
  • 网站网站制作网站营销最好的方法
  • linux安装hbase(完)
  • S7-200 SMART PLC 以太网通信详解:3 种方式从原理到实操
  • 岳阳做网站 公司电话做农产品的网站名称
  • 我们公司在做网站推广莱芜百度推广电话
  • leetcode(填充每个节点的下一个右侧节点指针 II)
  • 如何提高网站在搜索引擎中的排名wordpress主题有后台
  • 展厅讲解机器人如何选?AI大模型是关键
  • 做网站找沈阳横纵网络通辽网站制作公司
  • PyTorch深度学习实战【12】之基于RNN的自然语言处理入门
  • 【超详细图文教程】Windows 系统 Go 语言环境安装与配置详细教程​
  • 广州网站制作实力乐云seo网站开发知识视频教程
  • hive架构及搭建
  • JavaWeb之快递管理系统(完结)
  • 网站建设公司有哪几家微信广告朋友圈投放
  • 网站运行环境建设方案进一步强化网站建设
  • WIFI大师小程序4.1.9独立版源码
  • sparkml 多列共享labelEncoder pipeline方案
  • Python临时文件与目录完全指南:从基础到高级实战
  • 哪个网站收录排名好东台网络推广