Android 第一次开机速度优化

本文探讨了如何通过调整Android项目的编译配置来优化预装APK的dex预编译过程,减少首次开机时间,改善用户体验。具体介绍了如何设置WITH_DEXPREOPT标志并正确配置32位与64位APK的LOCAL_MULTILIB属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现在很多Android项目都需要预装很多apk。

主要在/system/app,/system/priv-app/,/system/vendor/app等目录下。

预置很多应用的结果就是,第一次开机的时候 systemService.java 会调用PackageManagerService.java对这几个目录下的apk多dexopt的优化,生成oat文件。apk越多,首次开机的时间也就越长,导致第一次开机需要5-6分钟,不利于用户体验。

对于这些应用,我们可以对其进行odex优化:

一、在devices所建立的子项目下的BoardConfig.mk文件中添加

        DISABLE_DEXPREOPT := false
        WITH_DEXPREOPT := true

可以再编译时对apk,jar都做odex的提取优化,如果不想jar包做odex优化,可以在/buid/core/java_library.mk文件中设置:

LOCAL_DEX_PREOPT := false

在实际开发过程中,有些apk如果做了odex优化,可能会出问题,可以在apk的Android.mk文件中添加该属性

二、打开宏WITH_DEXPREOPT:=true后,首次开机无效果仍然慢;

        说明开机之后又去提取预置apk的odex文件(原本应该是在预编译阶段就生成的);

        主要原因是预置apk的Android.mk对32bit和64bit的配置不准确导致。

搜索main log关键字:dex2oat : /system/bin/dex2oat 

 ▪这条log打印出就代表这个apk有在做dex2oat且是32还是64的指令集

 I dex2oat : /system/bin/dex2oat --zip-fd=11 --zip-location=/system/app/***.apk --oat-fd=12 --oat-location=/data/dalvik-cache/arm or arm64/system@app@**@**.apk@classes.dex --instruction-set=arm or arm64 --instruction-set-features=default --runtime-arg -Xms64m --runtime-arg -Xmx512m --swap-fd=13

▪oat-location表示odex文件存储位置

 ▪Instruction-set表示此apk的primaryCpuAbi对应的指令集(arm对应32bit / arm64对应64bit)

 请严格遵守

       1、对于64bit的芯片,若apk只32bit的lib或者只能作为32bit运行,请在预置apk时在android.mk中添加下边的TAG标记此apk为32bit:
             LOCAL_MULTILIB :=32 

           (比如出现上述做dex2oat arm的log,则需这样设定)

       2、而对于有源码无lib库的apk,

             请注释掉LOCAL_MULTILIB :=32 

            (比如出现上述做dex2oat arm64的log,则需这样注释掉)

       3、开机之后既提取arm又提取arm64的apk,

             请设定LOCAL_MULTILIB :=both

            (比如出现上述做dex2oat arm以及arm64的log,则需这样设定)

总之,对32bit 和 64bit 的apk做不同处理。

例:对于第三方QQ或者微信等预置apk做提取odex处理需要添加WITH_DEXPREOPT := true外

还需要在android.mk文件中添加LOCAL_MULTILIB :=both才可以。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旧时旅人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值