系统裁剪及系统启动速度优化
系统裁剪优化也一直是各个厂商定制产品的关键步骤,包括浅层次的去除不必要的apk和深层次的裁剪整个编译系统和框架层。也只有多层次的裁剪定制自己的系统,才能充分体现各自产品的特性,也是优化各自产品的关键步骤。
系统裁剪及优化是需要长期考查的,不能一蹴而就,此篇帖子主要关注从多个层次来进行系统裁剪和优化,也需要大家畅所欲言,集思广益。
目前以MiniPC-S700作为研究对象,通过一系列的裁剪,为系统瘦身,缩短系统的启动时间及提升系统流畅度。
以下表格统计了系统裁剪后开机启动的时间以及系统裁剪后的系统分区大小。
系统启动时间 | 默认固件 | 系统裁剪1 | 系统裁剪2 | 系统裁剪3 | 系统裁剪44 | 系统裁剪4 |
1 | 29.09s | 25.47s | 26.40s | 22.25s | 20.09 | 19.17 |
2 | 28.89s | 26.67s | 26.25s | 21.88s | 19.98 | 19.75 |
3 | 29.35s | 25.98s | 26.34s | 21.55s | 20.74 | 19.98 |
平均 | 29.11s(168.08s) | 26.04s(140.24s) | 26.33s(140.23s) | 21.89s(135.01s) | 20.27(53.77) | 19.63(65.70) |
system分区大小 | 600.5M | 507M | 507MB | 467MB | 260MB | 323MB |
表格一:Boot时间统计
备注:
1.“平均”一栏,括号内的时间是烧录后系统第一次开机的时间。
2.默认固件:s700_android_s700_miniPC_180627-raw-debug_uart5.fw
3.系统裁剪新版本包含旧版本的改动,比如系统裁剪2包含系统裁剪1的修改
系统裁剪1:去除不必要的apk
系统中有许多基本用不上的APK,大概占用system分区超过100MB的空间,去除之后可以有效地缩短开机时间。
APK裁剪如下:
android/device/actions/common/prebuilt/apk/google/products/gms_base.mk
- Velvet (谷歌搜索,46MB)
- LatinImeGoogle (谷歌拉丁输入法,23MB)
- CloudPrint (谷歌云打印)
- FaceLock (谷歌人脸解锁)
- TagGoogle (谷歌NFC标记)
android/device/actions/s700_miniPC/device.mk
- ActionsCamera (炬芯摄像头测试应用)
- MiracastSink (无线投影)
系统裁剪2:去除不必要的驱动
kernel/arch/arm64/configs/s700_miniPC_defconfig
-CONFIG_BCMDHD_AP6335=m
-CONFIG_RTL8723BS=m
-CONFIG_RTL8723BU=m
-CONFIG_TOUCHSCREEN_GSL_X680_CES=m
-CONFIG_TOUCHSCREEN_FT5X06=m
-CONFIG_TOUCHSCREEN_GT9XX=m
-CONFIG_GSENSOR_BMA222=m
-CONFIG_OWL_CAMERA_ISP=m
-CONFIG_OWL_CAMERA_IMX=m
-CONFIG_OWL_CAMERA_SI=m
-CONFIG_GC5004=m
-CONFIG_GC2755=m
-CONFIG_GC2155=m
-CONFIG_GC0312=m
-CONFIG_GC2035=m
-CONFIG_GS5604=m
-CONFIG_IMX0219=m
-CONFIG_OV2685=m
-CONFIG_OV5645=m
-CONFIG_FLASHLIGHT=m
-CONFIG_VIDEO_OWL_CVBSC=y
-CONFIG_VIDEO_OWL_GCP=y
系统裁剪3:framework层优化zygote的初始化流程,其他修改详见下文。
在Android中,zygote是整个系统创建新进程的核心装置。android系统中几乎所有的应用进程都是由Zygote进程孵化出来的,Java环境也是由Zygote创建起来的,它建立了我们app运行所需要的环境,是app的受精卵,这里主要是优化Zygote的初始化流程。
1.android/frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
①.增大gc调用阀值。
②.在资源加载函数preload() 中,将preloadClasses()和preloadResources()并行加载。
③.修改读取配置信息过程中的gc频率。
④.提升该进程的优先级。
2.android/build/target/product/languages_full.mk
删除部分语言
3.android/build/target/product/locales_full.mk
删除部分语言
4.android/device/actions/s700_miniPC/device.mk
删除无用文件
- $(LOCAL_PATH)/init.storage.nand.rc:root/init.storage.nand.rc \
- $(LOCAL_PATH)/ft5x06-touch.idc:system/usr/idc/ft5x06-touch.idc \
- $(LOCAL_PATH)/GT813.idc:system/usr/idc/GT813.idc \
5.android/device/actions/s700_miniPC/init.modules.rc
不加载无用驱动
+ #insmod /misc/modules/gyrosensor_inv_mpu6500_iio.ko
+ #wait /sys/bus/iio/devices/iio:device0/name
系统裁剪4 (极端情况,测试用):尽量删除界面上所有app,查看大量移除app,系统启动时间能有多大提升空间。
在Android中,处于最上层的是app应用层,厂家出厂时一般会打包一些他们认为常用的app,不过难免会有冗余,系统第一次开机时所有app都需要初始化一次,所以第一次系统启动时间经常达到2至4分钟。本次裁剪尽量删除界面上所有app,查看大量移除app,系统启动时间能有多大提升空间,仅内部测试时使用。
测试结果在本文第二个贴的“Boot时间统计”表格中。
系统裁剪如下:
所有谷歌app
ActSensorCalib
MiracastSink
OTA
AgingTest
AgingTest_pad
ApkManager
ApkManager_pad
FileExplorer
PcbaTest
PcbaTest_pad
actionsdisplaysettings
actionsproducttest
mediacentertv
Bluetooth
Browser
Calculator
Calendar
Camera2
Contacts
DeskClock
Dialer
VoiceDialer
UnifiedEmail
Gallery
Gallery2
Mms
Music
MusicFX
Nfc
QuickSearchBox
Settings
SoundRecorder
SpeechRecorder
superuser_prebuilt
iWnnIME
diff_display
display_control
AdobeFlashPlayer
OWLPlayer
经测试,“系统裁剪44”的system分区只剩下260MB,系统裁剪明显;再看启动时间,非第一次启动时间平均为20.27s,比"系统裁剪3"快了1.62秒,优化有限;而第一次开机时间为53.77s,比“系统裁剪3”快了81.24s,效果十分明显。
只针对非第一次开机,提升空间十分有限,建议下次正式裁剪app时,优化到20s左右后,就不要从app层次入手了,需要从其他层面入手,比如framework层,删除不必要的库和文件等。
系统裁剪5:裁剪无用app和服务等
1.裁剪app
所有谷歌应用、ActSensorCalib、MiracastSink、OTA、AgingTest、AgingTest_pad、ApkManager、ApkManager_pad、PcbaTest、PcbaTest_pad、actionsdisplaysettings、actionsproducttest、mediacentertv、Calendar、Contacts、DeskClock、Dialer、Email、Mms、Music、MusicFX、Nfc、QuickSearchBox、UnifiedEmail、VoiceDialer、diff_display、display_control
2.裁剪一些通话功能短信功能
mms-common、telephony-common、ims-common、VoiceDialer
3.删除无用脚本和service
init.extra_modules.sh、4G服务、actionslogcat服务
3.删除无用打印信息等
删除上层和驱动层部分打印、不输出bootloader和uboot打印,kernel打印等级降为1
测试结果在本文第二个贴的“Boot时间统计”表格中