Android 开机底层优化

本篇博文作为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 2
  filename1 = argv[1]
  try:
    with open(filename1, "r") as f1:
      str1 = f1.readlines();
      list1 =[]
      for string in str1:
          if string.startswith('#') or len(string) <= 6:
              continue
          list1.append(string.split('=')[0]+'\n')
    diffs = difflib.unified_diff(
        _DEFAULT_CAN_REMOVE_CONFIG, list1)
  except Exception as e:
    print "something wrong: %s" % e
    return 1
  status_code = 0
  for diff in diffs:
    if diff.startswith('+') or diff.startswith('-') or diff.startswith('@'):
        continue
    sys.stdout.write('follow config can be remove====>')
    sys.stdout.write(diff)
    status_code = 1
  return status_code

if __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        : preloader
       779        : first logo
      2671        : lk
----------------------------------------
        20.233999 : ON
       135.360846 :    1-swapper/0       : initcall: arm64_device_init    49.639539ms
       218.746846 :    1-swapper/0       : initcall: event_trace_init    33.785154ms
       236.874461 :    1-swapper/0       : probe: probe=platform_drv_probe drv=mt-pmic(ffffffc001076840)    15.639385ms
       236.918615 :    1-swapper/0       : initcall: pmic_mt_init    16.109692ms
       311.124539 :    1-swapper/0       : initcall: populate_rootfs    71.181924ms
       381.334693 :    1-swapper/0       : probe: probe=platform_drv_probe drv=musb-hdrc(ffffffc0010829f0)    17.795231ms
       381.360769 :    1-swapper/0       : probe: probe=platform_drv_probe drv=musb-mtu3d(ffffffc001082c30)    17.965769ms
       381.861308 :    1-swapper/0       : initcall: mtu3d_driver_init    18.712692ms
      1717.001003 :    1-swapper/0       : probe: probe=i2c_device_probe drv=bq25890(ffffffc00110cc58)  1248.854233ms
      1717.779465 :    1-swapper/0       : initcall: bq25890_init  1249.733311ms
      1828.548927 :    1-swapper/0       : probe: probe=platform_drv_probe drv=mtkfb(ffffffc001096780)    29.705308ms
      1829.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=1
    start 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浏览器打开,方便分析。
这里写图片描述

总结

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

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: android 系统开机优化是为了提高手机开机速度和用户体验而进行的一系列优化措施。以下是一些常见的 android 系统开机优化方法: 1. 延迟应用启动:android 系统在开机时会延迟一些应用的启动,只加载系统核心应用和服务,而将其他应用推迟启动。这样可以加快开机速度,用户可以更快地使用手机。 2. 启动器优化android 系统的启动器负责显示桌面、应用图标等信息。优化启动器可以减少启动器的加载时间,提高用户切换桌面的响应速度。 3. 禁用不必要的预装应用:很多手机厂商在出厂时会预装一些应用,这些应用可能对用户来说是多余的。禁用不必要的预装应用可以减少开机时加载的应用数量,提高开机速度。 4. 清理缓存:android 系统在使用过程中会生成大量的缓存数据,这些数据占用了手机的存储空间,并且可能导致系统开机慢。定期清理缓存可以释放存储空间,并提高开机速度。 5. 系统更新:android 系统的更新通常包含一些性能优化和 bug 修复,及时更新系统可以提高开机速度和系统稳定性。 综上所述,android 系统开机优化是通过延迟应用启动、启动器优化、禁用不必要的预装应用、清理缓存和系统更新等方法来提高手机开机速度和用户体验。 ### 回答2: Android系统开机优化是指针对手机的开机过程进行优化,以提高系统启动速度和用户体验。主要涉及以下方面的优化措施: 1. 减少开机自启动应用:开机时系统会自动加载一些应用程序,但这些应用可能会消耗系统资源和影响开机速度。通过减少不必要的自启动应用,可以加快系统启动时间。 2. 禁用系统预装应用:大多数手机在出厂时都预装了一些应用,但这些应用不一定被用户所需要。通过禁用一些不常用或不必要的预装应用,可以加快系统启动速度。 3. 清理系统缓存:开机时,系统会加载许多缓存文件,清理这些无用的缓存文件可以提高系统的启动速度。 4. 更新系统和应用程序:及时更新系统和应用程序可以修复漏洞和优化性能,从而提高系统的启动速度。 5. 使用轻量级应用:一些应用程序可能比较庞大或占用较多内存,启动时需要更多时间。选择轻量级应用可以加快系统的启动速度。 6. 关闭动画效果:在开机过程中,系统会显示一些动画效果,这些效果虽然提升了用户体验,但也会增加系统的启动时间。关闭这些动画效果可以加快开机速度。 7. 清理垃圾文件:开机时,系统会扫描和加载许多垃圾文件,清理这些无用的文件可以提高系统的启动速度。 通过对以上方面的优化,可以加快Android系统的启动速度,提升用户的使用体验。 ### 回答3: Android系统开机优化是为了提高开机速度和用户体验,以下是一些常见的优化方法: 1. 系统预加载:Android系统会在开机过程中预加载一些常用的应用和组件,以加快后续启动的速度。 2. 减少开机自启动应用:应用在安装时可以选择是否开机自启动,用户可以根据需求调整自启动应用的数量,减少开机时的负担。 3. 应用冷启动优化:冷启动是指应用被启动时,启动过程中需要加载资源和初始化的时间。开发者可以通过优化应用启动流程、延迟加载资源等方式来减少冷启动时间。 4. 优化系统服务启动顺序:Android系统启动时需要依次启动各个系统服务,优化服务启动顺序可以减少等待时间,提高开机速度。 5. 禁用无用的系统应用:Android系统预装了很多应用,但用户并不一定都需要使用。可以通过禁用一些无用的系统应用来减少开机负担。 6. 压缩系统文件大小:压缩系统文件可以减少开机时系统读取的文件数量和大小,从而提高读取速度。 7. 使用更快的存储设备:更换为高速的存储设备(如固态硬盘)可以显著提高系统开机速度。 总之,Android系统开机优化可以通过预加载、减少自启动应用、冷启动优化优化服务启动顺序、禁用无用系统应用、压缩系统文件大小和使用更快的存储设备等方式来提高开机速度和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值