• 优化Bootloader
  • boot签名校验优化
  • systrace debug 开机问题
  • 总结

本篇博文作为Android 开机优化 的续篇,之前的博文在排查底层耗时比较粗糙。本篇作为补充,提供剖析底层耗时的方法。

优化Bootloader

  • 减少不必要的log,最近遇到的开机慢问题就发现UART log没有关闭,这里一般而言能优化1s左右的时间。UART关闭改动kernel config文件的如下:
CONFIG_SERIAL_MSM_HSL=n
CONFIG_SERIAL_MSM_HSL_CONSOLE=n

Android 开机优化 里也提到了可以移除部分无用的kernel config,为了方便check,编写了一个python脚本,可以方便查看哪些无用config依然包含在项目中。

#!/usr/bin/env python
'''
@author: azhengye
'''
import difflib
import sys_DEFAULT_CAN_REMOVE_CONFIG = ['CONFIG_SCHED_DEBUG\n','CONFIG_DEBUG_KMEMLEAK\n','CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE\n','CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF\n','CONFIG_DEBUG_SPINLOCK\n','CONFIG_DEBUG_MUTEXES\n','CONFIG_DEBUG_ATOMIC_SLEEP\n','CONFIG_DEBUG_STACK_USAGE\n','CONFIG_DEBUG_LIST\n','CONFIG_FAULT_INJECTION_DEBUG_FS\n','CONFIG_LOCKUP_DETECTOR\n''CONFIG_DEBUG_PAGEALLOC\n','CONFIG_PAGE_POISONING\n','CONFIG_RMNET_DATA_DEBUG_PKT\n','CONFIG_MMC_PERF_PROFILING\n','CONFIG_DEBUG_BUS_VOTER\n','CONFIG_SLUB_DEBUG\n','CONFIG_DEBUG_BUGVERBOSE\n','CONFIG_ALLOC_BUFFERS_IN_4K_CHUNK\n','CONFIG_SERIAL_CORE\n','CONFIG_SERIAL_CORE_CONSOLE\n','CONFIG_SERIAL_MSM_HSL\n','CONFIG_SERIAL_MSM_HSL_CONSOLE\n','CONFIG_MSM_TZ_LOG\n','CONFIG_DYNAMIC_DEBUG\n','CONFIG_ANDROID_LOGGER\n','CONFIG_IMX134\n','CONFIG_IMX132\n','CONFIG_OV9724\n','CONFIG_OV5648\n','CONFIG_USB_MON\n','CONFIG_USB_STORAGE_DATAFAB\n','CONFIG_USB_STORAGE_FREECOM\n','CONFIG_USB_STORAGE_ISD200\n','CONFIG_USB_STORAGE_USBAT\n','CONFIG_USB_STORAGE_SDDR09\n','CONFIG_USB_STORAGE_SDDR55\n','CONFIG_USB_STORAGE_JUMPSHOT\n','CONFIG_USB_STORAGE_ALAUDA\n','CONFIG_USB_STORAGE_KARMA\n','CONFIG_USB_STORAGE_CYPRESS_ATACB\n','CONFIG_SEEMP_CORE\n','CONFIG_MSM_SMEM_LOGGING\n','CONFIG_IOMMU_DEBUG\n','CONFIG_IOMMU_DEBUG_TRACKING\n','CONFIG_IOMMU_TESTS\n','CONFIG_MOBICORE_DRIVER\n','CONFIG_MSDOS_FS\n',
]def main(argv):if len(argv) != 2:print '%s: invalid arguments' % argv[0]return 2filename1 = argv[1]try:with open(filename1, "r") as f1:str1 = f1.readlines();list1 =[]for string in str1:if string.startswith('#') or len(string) <= 6:continuelist1.append(string.split('=')[0]+'\n')diffs = difflib.unified_diff(_DEFAULT_CAN_REMOVE_CONFIG, list1)except Exception as e:print "something wrong: %s" % ereturn 1status_code = 0for diff in diffs:if diff.startswith('+') or diff.startswith('-') or diff.startswith('@'):continuesys.stdout.write('follow config can be remove====>')sys.stdout.write(diff)status_code = 1return status_codeif __name__ == '__main__':sys.exit(main(sys.argv))

特别说明下脚本中_DEFAULT_CAN_REMOVE_CONFIG只是一个通用的可移除config列表,在移除之前一定要跟具体项目挂钩check。

脚本使用方法:
a: 先单独编译user版本的kernel,然后去out目录下找到生成的.config文件。
b: 保持上述脚本为check-config.py。 运行check-config.py .config
输出如下类似结果:

follow config can be remove====> CONFIG_MMC_PERF_PROFILING
follow config can be remove====> CONFIG_MSM_TZ_LOG
  • 内核编译完成后会生成zImage内核镜像文件。然后bootloader加载zImage,这之后就需要解压zImage.默认的压缩算法是GZIP,使用LZ4压缩算法能缩短时间。可以参考该patch[https://patchwork.kernel.org/patch/6810841/] 来修改。这块节省的时间有限,不到1s,权衡利弊后,最终没有take到实际项目中,追求完美的你可以试试。风险自担-_-

boot签名校验优化

最近新项目上出现的这个坑,由于项目是高通平台,同时自定义了一套自己的签名规则,在自定义签名出问题时,又会重新走高通的签名。拉长了启动时间。之前怀疑过这块,但苦于找不到证据。最终还是在查看/proc下面的一堆节点时找到了线索,cat /proc/morelog找到了证据:

[730] boot_verifier: Signature decrypt failed! Signature invalid = -1
[790] Your device has loaded a different operating system.
Wait for 5 seconds before proceeding

拿到这个证据,找负责签名的同事更改这块,优化了不少时间。

同时还发现了一个好东西/proc/bootprof,之前没有关注过这个节点,cat一下看到了非常有用的信息,列出来感受下。

----------------------------------------
0       BOOT PROF (unit:msec)
----------------------------------------953        : preloader779        : first logo2671        : lk
----------------------------------------20.233999 : ON135.360846 :    1-swapper/0       : initcall: arm64_device_init    49.639539ms218.746846 :    1-swapper/0       : initcall: event_trace_init    33.785154ms236.874461 :    1-swapper/0       : probe: probe=platform_drv_probe drv=mt-pmic(ffffffc001076840)    15.639385ms236.918615 :    1-swapper/0       : initcall: pmic_mt_init    16.109692ms311.124539 :    1-swapper/0       : initcall: populate_rootfs    71.181924ms381.334693 :    1-swapper/0       : probe: probe=platform_drv_probe drv=musb-hdrc(ffffffc0010829f0)    17.795231ms381.360769 :    1-swapper/0       : probe: probe=platform_drv_probe drv=musb-mtu3d(ffffffc001082c30)    17.965769ms381.861308 :    1-swapper/0       : initcall: mtu3d_driver_init    18.712692ms1717.001003 :    1-swapper/0       : probe: probe=i2c_device_probe drv=bq25890(ffffffc00110cc58)  1248.854233ms1717.779465 :    1-swapper/0       : initcall: bq25890_init  1249.733311ms1828.548927 :    1-swapper/0       : probe: probe=platform_drv_probe drv=mtkfb(ffffffc001096780)    29.705308ms1829.394927 :    1-swapper/0       : initcall: mtkfb_init    30.689154ms//省略内容

还有/proc/bootmsg节点也非常有用。
这里正好弥补了Android 开机优化 中perftool的不足,能看到更底层的启动耗时。

systrace debug 开机问题

systrace的根基是linux 的ftrace,它不仅能分析上层的性能问题,底层问题同样也可以使用,不过需要对底层代码做些修改。具体如下:

  • 修改frameworks/native/cmds/atrace/atrace.rc
    打开默认关闭的trace开关。
-    write /sys/kernel/debug/tracing/tracing_on 0
+    #write /sys/kernel/debug/tracing/tracing_on 0
  • 适当的位置加入如下改动,之所以适当,因为不同平台编译文件有差异,这个需要结合项目代码去寻找位置。高通平台可以在device/qcom/common/common.mk文件中添加:
PRODUCT_PROPERTY_OVERRIDES += debug.atrace.tags.enableflags=802922
  • 同样适当的make文件中加入如下修改,比如BoardConfig.mk文件
BOARD_KERNEL_CMDLINE += trace_buf_size=64M trace_event=sched_wakeup,sched_switch,sched_blocked_reason,sched_cpu_hotplug,block,ext4
  • 项目的init.rc文件加入如下修改,目的是结束trace记录。
 on property:sys.boot_completed=1start qrngp
+   write /d/tracing/tracing_on 0
+   write /d/tracing/events/ext4/enable 0
+   write /d/tracing/events/block/enable 0

做完上述修改后编译烧录镜像文件,待开机结束后执行:

adb root && adb shell "cat /d/tracing/trace" > boot_trace

然后执行

external/chromium-trace/catapult/tracing/bin/trace2html boot_trace 

上述命令可以将trace log转成systrace文件,用chrome浏览器打开,方便分析。

总结

开机优化问题涉及的模块很多,通过这两篇博文,大致给出了从底层到上层的分析方法和部分解决方案。欢迎大家一起探讨分享。

Android 开机底层优化相关推荐

  1. 直播代码,Android开机速度优化

    直播代码,Android开机速度优化的相关方法和代码 cpu升频和task上大核: on init# boost sched tunewrite /dev/stune/schedtune.prefer ...

  2. 浅谈Android开机启动速度优化(含应用程序启动速度优化)

    众所周知Android开机启动速度较慢,于是如何加快启动速度便成为一个值得讨论的问题. 在查阅过许多资料后(特别是Google Group的android-platform),我整理总结出下面几点基本 ...

  3. Android开机启动速度优化 app启动速度优化

    众所周知Android开机启动速度较慢,于是如何加快启动速度便成为一个值得讨论的问题.在查阅过许多资料后(特别是Google Group的android-platform),我整理总结出下面几点基本看 ...

  4. android开机优化服务,Android开机速度优化简单回顾

    Android的开机速度,基本上没人说快的,通常移植完系统后,马上要看的事情就是优化开机时间,以下是简单回忆以下以前做优化的那些事. 开机时间都花在哪? 优化开机时间,通常做的首先是那有有没有BUG, ...

  5. Android开机启动性能优化

    Android 开机启动速度优化 一 在开机启动中,可以借助bootchart 工具分析android的启动过程.bootchart是一个用于linux启动过程性能分析的开源软件工具,在系统启动过程自 ...

  6. Rockchip Android平台内存优化及系统裁剪

    Rockchip Android平台内存优化及系统裁剪 文章目录 Rockchip Android平台内存优化及系统裁剪 编译32bit的Android系统 启用Android GO的配置 系统裁剪 ...

  7. android系统 修改优化,修改Android系统源代码,优化开机速度。

    通常情况下,Android系统开机保持在20s~25s应该算是合格比较好的状态. 最近几天在看关于Android系统开机启动过程的相关内容.做个笔记. 关于有话Android系统开机时间有话,采取三个 ...

  8. android 性能优化---(2) MTK 平台开机时间优化

    一.在工程模式开启MTKLogger, 开机后取日志bootprof  adb pull /storage/emulated/0/mtklog/mobilelog/APLog_2018_0309_10 ...

  9. android 进lanucher的广播,Android开机优化之调整Launcher的加载时间

    前言 如前面两篇文章所描述的, 我们对Android系统的开机时间优化有了一个比较全面的了解,以及一些常用的调试手段(bootchart等),在这篇文章中我们先来看看如下这个问题,首先看一张图: 如上 ...

  10. Android开机时长优化

    文章目录 一.背景说明 二.开机流程介绍 三.分析方法&工具 3.1 手动秒表计时 3.2 bootchart 3.2.1 生成log文件 3.2.2 生成bootchart.png 3.2. ...

最新文章

  1. nginx配置image_filter生成缩略图
  2. js中propertyIsEnumerable()方法使用介绍
  3. NGUI创建Camera参数为Simple 2D的UI UI对象的结构UI Root(2D)
  4. 华为手机怎么下载linux命令,在linux命令
  5. CentOS 7添加开机启动服务脚本
  6. mysql 聚合函数 怎么用在条件里_MySql 中聚合函数增加条件表达式的方法
  7. flume存储到mysql_flume_实现自定义MysqlSink,写入mysql表
  8. 使用mybatis的resultMap进行复杂查询
  9. python之函数用法capitalize()
  10. windows-API劫持(API-HOOK)
  11. 精挑41款,好用到爆的谷歌浏览器插件,每位程序员日常编程必备
  12. 习题8.16 (简单方法)输入一个字符串,内有数字和非数字字符
  13. 基于OpenCV DNN模块给黑白老照片上色(附Python/C++源码)
  14. git 同时连接云效平台和github
  15. flash中国官网显示可能损害计算机,重橙网络:Flash Player 中国官网最新版可解决使用异常的问题...
  16. Java相对路径与类路径详解
  17. Revit 2020发布
  18. 3.6 使用矩形网格工具绘制围棋棋盘 [Illustrator CC教程]
  19. Matlab/Simulink:动态系统模型的表示及仿真分析基础
  20. 【C/进阶】如何对文件进行读写(含二进制)操作?

热门文章

  1. MOSSE相关滤波目标跟踪论文
  2. npm和包、npm下载安装使用包、全局安装包和本地安装包、全局安装nodemon包、开发依赖和生产依赖
  3. 水经注万能地图下载器功能简介(最新版)
  4. Xmind模板文档分享——行业模板(1)
  5. idea背景颜色修改
  6. 淘宝网的架构演化分析
  7. HP laserjet 1022n打印机总出现前端盖打开或者缺少硒鼓对话框,无法打印?
  8. 51单片机2个按钮逻辑设计http://www.51hei.com/bbs/forum.php?mod=viewthreadtid=165521page=1#pid720113
  9. 最简单的c语言if程序,C语言简单实用的程序-if else 嵌套式的使用例子
  10. 一、Java快速入门