对于这样的应用, 个人认为最佳的情况应当是跟Go语言写的后端一样, 先进行AOT再PGO, 也就是先编译一个二进制文件, 然后直接运行已经AOT过的文件拿PGO的perf文件得到热点函数排列表, 然后再重新进行完整的AOT+PGO编译
现在的部分安卓厂商的系统 (ColorOS/OriginOS) 对于国民级应用应该也是这么特调的, 通过海量用户使用产生的perf数据, 得到几乎最科学的perf热点函数表, 然后在dex2oat处理这些应用时, 直接把perf表往里一塞完成完整的AOT+PGO全量编译


中文 
(如果你们认为该帖过于Off-topic, 我会及时将其移至生活园地)
注: 该帖不讨论Speed/Everything引发的存储空间占用与编译时间问题, 单纯讨论应用运行时效果
且手机厂商dex2oat特调应当认定是特殊处理, 本帖讨论AOSP为主 (LineageOS, crDroid, PixelOS, etc), 我用的系统是LineageOS 23.2 (AOSP 16 QPR2): https://download.lineageos.org/devices/astonc/builds
1. dex2oat的speed/everything模式起源
AOSP (Android Open Source Project) 自诞生后就被认定是Linux内核上运行的大号Java JVM运行时, 而导致应用运行极其缓慢 (这个缓慢指的是卡成一坨的澎湃OS与之相比都算运行非常高效的那种)
于是从AOSP 4.4 (KitKat)开始, 为了改进应用运行速度, AOSP引入了像C/C++那样的全量编译的机制, 也就是dex2oat的speed/everything模式, 该模式可以让应用的字节码(.vdex)完全编译为机器码(.odex), 例如这是Android QQ经过跟C/C++那样完全AOT编译后的产物: (别看了状态栏以为是苹果, 而是AOSP 16 QPR2本来就长这样, 为什么这么设计请去找谷歌)
2. dex2oat"智能化"编译的引入
而这么操作, 导致AOSP安装应用速度很慢, 而且机器码.odex文件占用还不少, 于是谷歌又想出了一个办法, 就是speed-profile模式(PGO编译模式), 在AOSP 7.0之后引入:
speed-profile模式的理想情况下, 新安装的应用先以完全跑.vdex字节码的方式运行, 虽然这时运行效率比较低下, 但是AOSP的ART(Android Runtime)会在后台偷偷观察你使用的这个应用最常触发的热点函数与函数最常见的触发路径, 然后在你手机闲置(锁屏)时偷偷进行导向型编译, 将应用最常用的热点函数与触发路径通过PGO精准编译, 让CPU缓存能预先读取, 从而让编译后的.odex体积变小, 而且在理想状况下能达到逼近甚至超越完全AOT(开Speed/Everything模式)的效果
3. 我对speed-profile模式的质疑
speed-profile模式固然听着很美好, 但我用speed-profile预编译我用了一天的QQ后, 产生的.odex机器码体积只有30多M, 而实际上整个QQ编译完的机器码实际上有接近600M (见上图)
如果说多出来的560多M机器码里包含的函数都是冷门函数, 那我个人肯定不信
对于国内QQ,微信,钉钉这样国民级别的应用, 体积超级大, 功能超级多的情况下, 我看到的却是dex2oat的speed-profile编译的机器码体积与它本体完整编译后的odex体积严重不符, 同样QQ和腾讯元宝冷启动刚打开时在我骁龙8Gen2的手机上滑动居然会掉帧, 于是我对这个speed-profile模式提出质疑, 而使用了dex2oat的传统everything模式力大砖飞编译了所有应用, 于是QQ和元宝app滑动再也没掉帧过
对于我手机这个现象, 我个人提出猜测: 这种巨无霸应用中, 最广大的函数调用频率卡在ART认定的热点函数与冷门函数中间, 但因为调用频率又没有够到被认定为高频函数而没有被AOT预编译, 最终导致应用启动时仍然有一大堆需要进行即时JIT的函数, 而影响用户使用的流畅度体验
但是speed/everything已经把应用完整编译成机器码, 使用应用体验与GNU/Linux打开二进制文件几乎无异, 所以在这些国民级应用上, 完整的AOT编译可以接近完全消除跑app中动不动就JIT一下的损耗, 而带来更流畅稳定的体验
Everything模式在我骁龙8Gen2的机器上并不会载入过多无用函数进RAM带来额外开销, 这是我开了Everything模式后, 保留QQ和微信完整后台+后台保护后的RAM占用:
因此在国内应用功能和体积, 以及函数量指数级膨胀的情况下, 指责厂商为什么塞这么多(_)进去固然有必要, 但是就AOSP来说, dex2oat的speed-profile在应用流畅度的改进上, 在现在对于speed/everything模式是否还有所谓动态PGO的优势, 我认为应该打上问号研究一下