您的位置:首页 > 移动开发 > Android开发

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

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

首先,我们需要检查驱动程序的初始化时间是否合理,因此可以应用这个补丁。

"kernel/init/main.c"

-bool initcall_debug;

+bool initcall_debug = 1;

core_param(initcall_debug, initcall_debug, bool, 0644);

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

...

initcall <driver_init_function> returned 0 after <time in microsecond> usecs

...

在这一步之后,我们确认每个驱动程序的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个文档了解更多

信息。

<Linux Platform Performance Measurement Procedures>

<APPLICATION NOTE ANDROID BOOT TIME MEASUREMENT>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: