Android 通过odex优化提高首次开机速度

背景

客户反馈说开机时间过长,需要优化。

原文:https://blog.csdn.net/croop520/article/details/73930184

介绍

现在很多Android都需要预装很多apk,这些apk主要在/system/app,/system/priv-app/,/system/vendor/app等目录下。

如果没有做odex优化,在首次开机时,systemService.java 会调用PackageManagerService.java对这几个目录下的apk多dexopt的优化,生成oat文件。apk越多,首次开机的时间也就越长。

首次开机时,通常在手机上开到正在优化第*个应用,总共 * 个应用。就是在对apk做dexopt的优化。

解决方式

编译时odex优化

如果我们要提高首次开机的速度,可以做如下设置:

1、在安卓源码树/device/xxx/项目/BoardConfig.mk 修改下面两个设置:

#Joe add 20181221 
# Enable dex pre-opt to speed up initial boot 
#ifneq ($(TARGET_USES_AOSP),true) 
# ifeq ($(HOST_OS),linux)
ifeq ($(WITH_DEXPREOPT),)
WITH_DEXPREOPT := true
WITH_DEXPREOPT_PIC := true
ifneq ($(TARGET_BUILD_VARIANT),user)
# Retain classes.dex in APK's for non-user builds
DEX_PREOPT_DEFAULT := nostripping
endif
endif

修改下面两个设置,在编译时,对jar,apk都做odex优化,生成对应的odex文件

DISABLE_DEXPREOPT := false
WITH_DEXPREOPT := true

如果不想在编译时做odex优化,可以注释掉这两行,或者把这两个值设置成:

注释:

#DISABLE_DEXPREOPT := false
#WITH_DEXPREOPT := true

 或:
 
DISABLE_DEXPREOPT := true
WITH_DEXPREOPT := false

jar包odex优化

2、如果设置了:

 DISABLE_DEXPREOPT := false
 WITH_DEXPREOPT := true

在编译的时候,/system/framework/目录下面的jar包,和/system/app/system/priv-app//system/vendor/app下面的apk文件,都会在编译时,做odex优化。

如果不想jar包做odex优化,可以在/buid/core/java_library.mk文件中设置:

LOCAL_DEX_PREOPT := false

这样在编译时,jar包就不会做odex优化。

单独的APK优化

3、在实际开发过程中,有些apk如果做了odex优化,可能会出问题,可以通过在apk的编译目录Android.mk文件中添加:

LOCAL_DEX_PREOPT := false

这样该apk就不会做odex优化。

如果jar包和apk都做odex优化,在我的项目中,原来的首次开机速度3分钟左右可以提高到1分05秒左右。

如果说我的文章对你有用,只不过是我站在巨人的肩膀上再继续努力罢了。
若在页首无特别声明,本篇文章由 Schips 经过整理后发布。
博客地址:https://www.cnblogs.com/schips/
原文地址:https://www.cnblogs.com/schips/p/accelerate_android_system_booting_time_by_odex.html