2017年11月13日 星期一

Android如何优化启动时间(boot time)

尽可能地减少LA的启动时间在USER的构建。 并假设我们有一个非常稳定的USER构建软件,没有任何错误,甚至警告消息存在于启动阶段。



首先,我们需要检查驱动程序的初始化时间是否合理,因此可以应用这个补丁。
"kernel/init/main.c"
-bool initcall_debug;
+bool initcall_debug = 1;
core_param(initcall_debug, initcall_debug, bool, 0644);

然后下面的消息会在内核启动时输出,我们可以逐一检查它们,看看是否有些驱动程序的initcall需要太多的时间。



...
initcall returned 0 after

在这一步之后,我们确认每个驱动程序的init过程是合理的。
最后,不要忘记还原上面的测试补丁。



2.禁用串行控制台和早期的printk
串口控制台和早期的printk会相当慢的内核启动,所以我们可以考虑到
在发布版本中禁用它们。


2.1您可以确认在文件“AndroidBoard.mk”中使用了哪个内核defconfig。 看起来像 ”

msmxxxx-perf_defconfig"
ifeq ($(TARGET_BUILD_VARIANT),user)
KERNEL_DEFCONFIG := msmxxxx-perf_defconfig
else
KERNEL_DEFCONFIG := msmxxxx_defconfig
endif



然后删除以下两个配置在此defconfig禁用串行控制台。
-CONFIG_SERIAL_MSM_HSL_CONSOLE = y



2.2禁用earlyprintk
编辑文件“BoardConfig.mk”,并删除“earlyprintk = msm_hsl_uart,0xf991e000”从“
BOARD_KERNEL_CMDLINE“。




3.进一步收缩内核defconfig。
基于“msmxxxx-perf_defconfig”,尝试删除以下配置。

-CONFIG_CGROUP_DEBUG=y
-CONFIG_SERIAL_MSM_HSL_CONSOLE=y
-CONFIG_MSM_ADSPRPC=y
-CONFIG_REGULATOR_TPS65132=y
-CONFIG_PFT=y
-CONFIG_CORESIGHT=y
-CONFIG_CORESIGHT_EVENT=y
-CONFIG_CORESIGHT_FUSE=y
-CONFIG_CORESIGHT_CTI=y
-CONFIG_CORESIGHT_TMC=y
-CONFIG_CORESIGHT_TPIU=y
-CONFIG_CORESIGHT_FUNNEL=y
-CONFIG_CORESIGHT_REPLICATOR=y
-CONFIG_CORESIGHT_STM=y
-CONFIG_CORESIGHT_HWEVENT=y
-CONFIG_CORESIGHT_ETMV4=y
-CONFIG_CORESIGHT_MODEM_ETM=y
-CONFIG_CORESIGHT_WCN_ETM=y
-CONFIG_CORESIGHT_RPM_ETM=y

-CONFIG_CP_ACCESS64=y
-CONFIG_MSM_SMD_DEBUG=y
-CONFIG_MSM_DEBUG_LAR_UNLOCK=y
-CONFIG_MSM_FORCE_WDOG_BITE_ON_PANIC=y
-CONFIG_MSM_OCMEM_DEBUG=y
-CONFIG_MSM_OCMEM_NONSECURE=y
-CONFIG_LOCKUP_DETECTOR=y
-CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC=y
-CONFIG_DEBUG_KMEMLEAK=y
-CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF=y
-CONFIG_DEBUG_SPINLOCK=y
-CONFIG_DEBUG_MUTEXES=y
-CONFIG_DEBUG_ATOMIC_SLEEP=y
-CONFIG_DEBUG_STACK_USAGE=y
-CONFIG_DEBUG_MEMORY_INIT=y
-CONFIG_DEBUG_LIST=y
-CONFIG_FAULT_INJECTION=y
-CONFIG_FAIL_PAGE_ALLOC=y
-CONFIG_FAULT_INJECTION_DEBUG_FS=y
-CONFIG_FAULT_INJECTION_STACKTRACE_FILTER=y

-CONFIG_MSM_RTB=y
-CONFIG_MSM_RTB_SEPARATE_CPUS=y
-CONFIG_DYNAMIC_DEBUG=y
-CONFIG_PANIC_ON_DATA_CORRUPTION=y
-CONFIG_STRICT_MEMORY_RWX=y

然后,重新编译代码,并检查文件$ANDROID_TOP/out/target/product/$TARGET/obj/KERNEL_OBJ/.

查看更改是否生效。



4.在早期引导时将多个内核设置为在线
如果您应用此步骤,请特别注意,因为它可能会导致热问题。


4.1首先应用以下3个补丁。 由于芯片组之间的差异,你需要做一些轻微的改变
这些补丁。

https://www.codeaurora.org/cgit/quic/la//device/qcom/common/commit/?id=
6df8a1ba549e6bf64fae2a73e2f6e3249bd72701


https://www.codeaurora.org/cgit/quic/la//kernel/msm-3.10/commit/?id=
d77f3f9feded36585a41fa094b17493ee7bb6092


https://www.codeaurora.org/cgit/quic/la//platform/system/core/commit/?id=
7f29bccd05b584dfb2028ba8579e04eaf7628f46



4.2 编辑"bootargs" 在 "msmxxxx.dtsi"
+bootargs = "boot_cpus=0 androidboot.earlyboot_cpus=2,4,6 sched_enable_hmp=1";



注意:
这种变化将导致温度迅速上升,并且如果超过一些阈值,thermal thread将会
限制这些核心降低频率,甚至关闭它们。 所以如果你遇到热问题,请还原
代码更改。


5.对于Android和其他引导性能,您可以参考以下2个文档了解更多
信息。


沒有留言: