Android开机启动耗时较多的部分有3个,分别是preloadclasses和scan packages。//preload-resources

本文探讨了Android系统启动过程中耗时的主要原因,包括preloadclasses和scanpackages操作,并提供了相应的优化建议。

Android开机启动耗时较多的部分有2个,分别是preloadclasses和scan packages。

 

这里又数preloadclasses最为耗时,在我的机子上一般需要13秒左右。关于preloadclasses的优化,可以参见http://www.eoeandroid.com/thread-29953-1-1.html。这篇帖子并没有给出如何优化preloaded-classes list的具体取舍。实际上,在看过google group众多关于preload class的主题后,基本可以确定以下事实:

 

preloaded-classes list中预加载的类位于dalvik zygote进程的heap中。在zygote衍生一个新的dalvik进程后,新进程只需加载heap中没有预加载的类(这些后加载进来的类成为该进程所private独有的),这样便加快了应用程序的启动速度。实际上这是一种以空间换时间的办法,因为几乎没有一个应用程序能够使用到所有的预加载类,必定有很多类对于该应用程序来说是冗余的。但是也正如Google所说,智能手机开机远没有启动应用程序频繁——用户开机一次,但直到下次再开机之前可能要运行多个应用程序。因此牺牲一点启动时间来换取应用程序加载时的较快速度是合算的。

preloaded-classes list已经是Google Android工程师使用众多测试工具分析,加以手动微调后形成的最优化预加载列表,涵盖了智能机上最长见的应用类型所需要的各种类。很难想象我们自己能够有什么手段能够获得比这样更优的一个预加载列表。所以,除非你的Android系统是被移植到非智能手机设备上使用(例如MID、EBOOK,可以不需要Telephony相关的类),不建议去“优化”preloaded-classes list。

在zygote中单起一个线程来做preload,是否可行?答案是否定的。首先在zygote中不可以新开线程,其次,就算新开一个线程,在目前智能机硬件条件下(单核CPU),除非有频繁大量的存储IO,否则我们不能看到我们期望加速启动效果。

关于scanpackages的问题。同样参考上面提到的那篇帖子,我们从中可以知道一个事实:越少的apk安装,越短的启动时间。事实上确实如此,apk安装的多少的确影响开机速度,但相比而言,scan packages所花费的时间远没有preload classe多。似乎这里没有多少油水可榨,但起码我们知道了:尽量减少产品中预置的apk数量可以提升启动速度(哪怕精简到极致也许只节省了2s)。

 

最后,关于那篇帖子中提到的startservices阶段,我认为虽然此阶段确实需要消耗可观的时间,但是正如文中提到的那样,优化这些services其实就是剔除我们不需要的一些services,而且不仅仅是修改SystemServer.java的问题,任何使用到被优化剔除掉的服务的代码都必须加以修改,否则系统肯定是起不来的。这样工作量大,而且难度也不小,并且有一定风险。因此对这些services的优化要慎之又慎。

aaptflags: [ "--no-compress", "pcm", ], 我在Android.bp添加了上面的指令后编译报错了 [ 70% 42/60] //vendor/garmin/packages/apps/Carlife/CarLife-Vehicle/vehicle-app:CarLifeVehicle aapt2 link [common] FAILED: out/soong/.intermediates/vendor/garmin/packages/apps/Carlife/CarLife-Vehicle/vehicle-app/CarLifeVehicle/android_common/package-res.apk out/soong/.intermediates/vendor/garmin/packages/apps/Carlife/CarLife-Vehicle/vehicle-app/CarLifeVehicle/android_common/gen/proguard.options out/soong/.intermediates/vendor/garmin/packages/apps/Carlife/CarLife-Vehicle/vehicle-app/CarLifeVehicle/android_common/gen/android/R.srcjar out/soong/.intermediates/vendor/garmin/packages/apps/Carlife/CarLife-Vehicle/vehicle-app/CarLifeVehicle/android_common/R.txt out/soong/.intermediates/vendor/garmin/packages/apps/Carlife/CarLife-Vehicle/vehicle-app/CarLifeVehicle/android_common/extra_packages rm -rf out/soong/.intermediates/vendor/garmin/packages/apps/Carlife/CarLife-Vehicle/vehicle-app/CarLifeVehicle/android_common/gen/aapt2/R && out/soong/host/linux-x86/bin/aapt2 link -o out/soong/.intermediates/vendor/garmin/packages/apps/Carlife/CarLife-Vehicle/vehicle-app/CarLifeVehicle/android_common/package-res.apk --no-compress pcm --no-static-lib-packages --manifest out/soong/.intermediates/vendor/garmin/packages/apps/Carlife/CarLife-Vehicle/vehicle-app/CarLifeVehicle/android_common/manifest_merger/AndroidManifest.xml -A vendor/garmin/packages/apps/Carlife/CarLife-Vehicle/vehicle-app/src/main/assets --min-sdk-version 32 --target-sdk-version 32 --version-code 32 --version-name 12 --auto-add-overlay -I out/soong/.intermediates/frameworks/base/core/res/framework-res/android_common/package-res.apk --product nosdcard -c en_US,en_GB,es_ES,fr_FR,it_IT,ja_JP,ko_KR,pt_PT,ru_RU,tr_TR,uk_UA,zh_CN,zh_TW,de_DE,hdpi,mdpi --java out/soong/.intermediates/vendor/garmin/packages/apps/Carlife/CarLife-Vehicle/vehicle-app/CarLifeVehicle/android_common/gen/aapt2/R --proguard out/soong/.intermediates/vendor/garmin/packages/apps/Carlife/CarLife-Vehicle/vehicle-app/CarLifeVehicle/android_common/gen/proguard.options --output-text-symbols out/soong/.intermediates/vendor/garmin/packages/apps/Carlife/CarLife-Vehicle/vehicle-app/CarLifeVehicle/android_common/R.txt -R @out/soong/.intermediates/vendor/garmin/packages/apps/Carlife/CarLife-Vehicle/vehicle-app/CarLifeVehicle/android_common/aapt2/overlay.list && out/soong/host/linux-x86/bin/soong_zip -write_if_changed -jar -o out/soong/.intermediates/vendor/garmin/packages/apps/Carlife/CarLife-Vehicle/vehicle-app/CarLifeVehicle/android_common/gen/android/R.srcjar -C out/soong/.intermediates/vendor/garmin/packages/apps/Carlife/CarLife-Vehicle/vehicle-app/CarLifeVehicle/android_common/gen/aapt2/R -D out/soong/.intermediates/vendor/garmin/packages/apps/Carlife/CarLife-Vehicle/vehicle-app/CarLifeVehicle/android_common/gen/aapt2/R &&out/soong/host/linux-x86/bin/extract_jar_packages -i out/soong/.intermediates/vendor/garmin/packages/apps/Carlife/CarLife-Vehicle/vehicle-app/CarLifeVehicle/android_common/gen/android/R.srcjar -o out/soong/.intermediates/vendor/garmin/packages/apps/Carlife/CarLife-Vehicle/vehicle-app/CarLifeVehicle/android_common/extra_packages --prefix '--extra-packages ' warn: ignoring density 'hdpi-v4' for -c option. warn: ignoring density 'mdpi-v4' for -c option. pcm: error: failed to open file: No such file or directory. error: failed parsing input. 18:22:05 ninja failed with: exit status 1 #### failed to build some targets (02:15 (mm:ss)) ####
最新发布
12-16
<think>我们注意到错误信息:`pcm: error: failed to open file: No such file or directory.` 这是因为在aapt2中,`--no-compress`参数后面需要跟具体的文件扩展名(如"pcm")或者文件路径(支持通配符)。但是,当指定一个扩展名时,aapt2会尝试查找所有具有该扩展名的文件,如果找不到任何匹配的文件,则会报错。 在您的构建中,可能没有扩展名为`.pcm`的文件(注意:扩展名通常是带点的,例如`.pcm`),所以aapt2在尝试处理`--no-compress pcm`时,因为找不到任何扩展名为`pcm`(注意,实际上应该是`.pcm`)的文件而报错。 解决方案: 1. 确认您的项目中有没有扩展名为`.pcm`的文件?如果没有,那么添加这个参数就会导致错误。 2. 如果确实有,那么可能是参数传递方式的问题。在aapt2中,`--no-compress`后面应该跟文件扩展名(不带点)或者文件路径(支持通配符)。但是,请注意,扩展名是不带点的。然而,错误信息提示它试图打开一个名为`pcm`的文件(而不是以`.pcm`为扩展名的文件),这很奇怪。 另一种可能是,在Android.bp中,`aaptflags`的参数传递方式。我们之前写的是: aaptflags: ["--no-compress", "pcm"], 这实际上传递了两个参数:第一个是`--no-compress`,第二个是`pcm`。aapt2会认为`pcm`是一个扩展名(即不包含点)。所以它会查找所有扩展名为`pcm`(即文件名为`xxx.pcm`)的文件。如果项目中没有这样的文件,就会报错。 因此,我们需要检查项目中是否有扩展名为`.pcm`的文件。如果没有,我们可以尝试使用通配符指定具体的文件路径,比如: aaptflags: ["--no-compress", "assets/*.pcm"], 或者,如果我们确定没有该扩展名的文件,那么就不需要这个配置。 根据错误日志,构建命令中确实出现了: --no-compress pcm 然后报错:pcm: error: failed to open file: No such file or directory. 所以,请检查: 1. 项目中是否有扩展名为`.pcm`的文件? 2. 如果没有,请移除这个配置。 3. 如果有,但是不在默认的资源目录下,可能需要指定相对路径(如`assets/audio/*.pcm`)。 修改建议: 如果我们有具体的文件,比如在assets目录下有一些pcm文件,可以这样写: aaptflags: ["--no-compress", "assets/*.pcm"], 注意:在aapt2中,路径是相对于资源目录的。如果我们有多个资源目录,可能需要使用通配符匹配多个位置。 如果还是没有解决问题,我们可以尝试只写一个扩展名(不带点)但是确保有文件。或者,我们可以写多个扩展名,但每个扩展名都要确保有文件,否则会报错。 另外,从错误日志中我们还可以看到,构建命令中还有`-A`参数指定了assets目录: -A vendor/garmin/packages/apps/Carlife/CarLife-Vehicle/vehicle-app/src/main/assets 所以,如果我们的pcm文件在这个目录下,那么我们可以使用通配符`assets/*.pcm`(注意,这个assets是相对于资源根目录的,而通过`-A`指定的目录会被当作assets目录的根)。因此,在`--no-compress`中,我们可以使用`assets/*.pcm`来匹配。 但是,如果我们的pcm文件不在这个assets目录下,而是在其他资源目录,那么我们需要调整路径。 因此,我建议修改为: aaptflags: ["--no-compress", "assets/*.pcm"], 如果我们有多个位置,可以写多个: aaptflags: [ "--no-compress", "assets/sounds/*.pcm", "--no-compress", "assets/voice/*.pcm", ], 如果我们不确定,也可以使用更宽泛的通配符(但注意不要匹配到不应该匹配的文件): aaptflags: ["--no-compress", "assets/*.pcm"], 然后重新构建。 如果问题依旧,请检查: 1. 在assets目录下是否存在.pcm文件? 2. 如果存在,请确认路径名称是否正确(注意大小写,因为Linux文件系统区分大小写)。 另外,我们也可以尝试使用`--no-compress`指定一个具体的文件名(不推荐,除非只有一个文件): aaptflags: ["--no-compress", "assets/bdspeech_recognition_start.pcm"], 这样就不会出现找不到文件而报错的情况。 总结:错误是因为aapt2在应用`--no-compress pcm`时没有找到任何扩展名为pcm的文件。我们需要调整参数,确保它匹配到实际存在的文件。 修改后的Android.bp配置示例: ```plaintext android_app { name: "CarLifeVehicle", // ... 其他配置 aaptflags: [ // 使用通配符匹配assets目录下所有.pcm文件 "--no-compress", "assets/*.pcm", ], } ``` 如果您的pcm文件不在assets目录下,而是在其他目录(比如res/raw),那么应该使用对应的路径,例如: "--no-compress", "res/raw/*.pcm", 但注意:res/raw目录下的文件默认是不压缩的(aapt默认不压缩res/raw下的文件),所以可能不需要额外配置。 请根据实际情况调整。 </think> ### 解决 Android.bp 中 aaptflags 配置导致的编译错误 根据您的错误日志 `pcm: error: failed to open file: No such file or directory`,问题在于 aapt2 无法识别 "pcm" 作为文件扩展名参数。以下是根本原因解决方案: #### 问题原因: 1. **参数格式错误**: - aapt2 要求 `--no-compress` 后跟的是 **明确的文件扩展名** 或 **完整文件路径** - "pcm" 被误认为是要处理的文件而非扩展名 2. **aapt2 版本差异**: - 新版本 aapt2 严格校验参数格式 - 旧版 Gradle 使用的 aapt 兼容松散格式,但 Soong 使用严格模式 #### 解决方案: 修改 Android.bp 配置: ```plaintext android_app { name: "CarLifeVehicle", // ...其他配置 aaptflags: [ // 正确格式:带点的扩展名 "--no-compress", ".pcm", // 或使用通配符路径(推荐) "--no-compress", "assets/*.pcm", ], } ``` #### 关键修改点: 1. **必须添加扩展名点号**: ```diff - "--no-compress", "pcm", + "--no-compress", ".pcm", ``` 2. **或使用路径通配符**: ```diff - "--no-compress", "pcm", + "--no-compress", "assets/*.pcm", ``` #### 验证步骤: 1. 检查文件是否存在: ```bash find . -name "*.pcm" ``` 2. 确认文件位置: - 若文件在 `assets/` 子目录,使用: ```plaintext aaptflags: ["--no-compress", "assets/subdir/*.pcm"] ``` 3. 完整构建命令检查: ```bash aapt2 link --no-compress .pcm ... # 或 aapt2 link --no-compress assets/*.pcm ... ``` #### 备选方案: 若仍有问题,改用资源复制方式: ```plaintext prebuilt_etc { name: "car_life_pcm", src: "assets/bdspeech_recognition_start.pcm", filename: "bdspeech_recognition_start.pcm", sub_dir: "assets", } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值