深入理解Android Runtime

源代码 2024-10-4 02:57:33 122 0 来自 中国
1.png 上图是Android团体的架构,Android Runtime之于Android而言相称于心脏之于人体,是Android步调加载和运行的环境。这篇文章告急针对Android Runtime部门进行睁开,探究Android Runtime的发展以及现在近况,并先容应用Profile-Guided Optimization(PGO)技能对应用启动速率进行优化的可行性。转载请注明泉源「申国骏」
App运行时演进

JVM

Android原生代码利用Java大概Kotlin编写,这些代码会通过javac大概kotlinc编译成.class文件,在Android之前,这些.class文件会被输入到JVM中实行。JVM可以简单分为三个子体系,分别是Class Loader、Runtime Data Area以及Execution Engine。此中Class Loader告急负责加载类、校验字节码、符号引用链接及对静态变量和静态方法分配内存并初始化。Runtime Data负责存储数据,分为方法区、堆区、栈区、步调计数器以及当地方法栈。Execution Engine负责二进制代码的实行以及垃圾采取。
2.png Execution Engine中,会采取Interpreter大概JIT实行。此中Interpreter表现在运行的过程中对二进制代码进行表明,每次实行类似的二进制代码都进行表明比力浪费资源,因此对于热区的二进制代码会进行JIT即时编译,对二进制代码编译成呆板码,如许类似的二进制代码实行时,就不消再次进行表明。
DVM(Android 2.1/2.2)

JVM是stack-based的运行环境,在移动装备中对性能和存储空间要求较高,因此Android利用了register-based的Dalvik VM。从JVM转换到DVM我们须要将.class文件转换为.dex文件,从.class转换到.dex的过程须要颠末 desugar -> proguard -> dex compiler三个过程,这三个过程厥后渐渐变成 proguard -> D8(Desugar) 直到演变到本日只须要一步R8(D8(Desugar))。
我们告急关注Android中Runtime Engine与JVM的区别。在Android早期的版本内里,只存在Interpreter表明器,到了Android2.2版本将JIT引入,这个版本Dalvik与JVM的Runtime Engine区别不大。
5.png ART-AOT(Android 4.4/5.0)

为了加快应用的启动速率和体验,到了Android4.4,Google提供了一个新的运行时环境ART(Android Runtime),到了Android5.0,ART更换Dalvik成为唯一的运行时环境。
ART运行时环境中,采取了AOT(Ahead-of-time)编译方式,即在应用安装的时间就将.dex提前编译成呆板码,颠末AOT编译之后.dex文件会生成.oat文件。如许在应用启动实行的时间,由于不须要进行表明编译,大大加快了启动速率。
然而AOT带来了以下两个标题:

  • 应用安装时间大幅增长,由于在安装的过程中同时须要编译成呆板码,应用安装时间会比力长,特殊在体系升级的时间,须要对全部应用进行重新编译,出现了经典的升级等候噩梦。
8.png

  • 应用占用过多的存储空间,由于全部应用都被编译成.oat呆板码,应用所占的存储空间大大增长,使得原来并不充裕的存储空间变得雪上加霜。
进一步思索对应用全量进行编译大概是没有须要的,由于用户大概只会用到一个应用的部门常勤奋能,而且全量编译之后更大的呆板码加载会占用IO资源。
ART-PGO(Android 7.0)

从Android7.0开始,Google重新引入了JIT的编译方式,不再对应用进行全量编译,结合AOT、JIT、Interpreter三者的上风提出了PGO(Profile-guided optimization)的编译方式。
在应用实行的过程中,先利用Interpreter直接表明,当某些二进制代码被调用次数较多时,会生成一个Profile文件纪录这些方法存储起来,当二进制代码被频仍调用时,则直接进行JIT即时编译并缓存起来。
当应用处于空闲(屏幕关闭且充电)的状态时,编译守卫进程会根据Profile文件进行AOT编译。
当应用重新打开时,进行过JIT和AOT编译的代码可以直接实行。
如许就可以在应用安装速率以及应用打开速率之间取得均衡。
9.png 10.png JIT 工作流程:
ART-Cloud Profile(Android 9.0)

不外这里还是有一个标题,就是当用户第一次安装应用的时间并没有进行任何的AOT优化,通常会颠末用户多次的利用才气使得启动速率得到优化。
思量到一个应用通常会有一些用户经常利用实行的代码(比方启动部门以及用户常勤奋能)而且大多数时间会有先行版本用于网络Profile数据,因此Google思量将用户生成的Profile文件上传到Google Play中,并在应用安装时同时带上这个Profile文件,在安装的过程中,会根据这个Profile对应用进行部门的AOT编译。如许当用户安装完第一次打开的时间,就能到达较快的启动速率。
Profile in cloude 须要体系应用市场支持,在国内市场利用Google Play的占比非常低,因此cloud profile的优化在国内险些是没有作用的,不外Profile的机制提供了一个可以做启动优化的思绪。早在2019年,付出宝就在秒开技能的回应的内里提到过profile-based compile的技能,参考:怎样对待今日头条自媒体发布谎话称「付出宝险些秒开是由于采取华为方舟编译器」?,这也是我们不绝研究Profile技能的缘故起因。困扰着我们的不绝有两个标题,第一个标题是怎样生成Profile文件,第二个标题是怎么利用生成的Profile文件。对于第一个标题的办理相对还是有思绪的,由于app运行就会生成profile文件,因此我们手动运行几次app就能在文件体系中网络到这个文件,不外怎样以一种较为自动化的本领网络仍然是个标题。第二个标题我们知道Profile文件最终生成的位置,因此我们可以把生成的文件放到相应的体系目次,不外大多数手机和应用都没有权限直接放置这个文件。因此Profile优化技能不绝都没有落地,直到Baseline Proflie让我们看到了渴望。
Baseline Profile

Baseline Profile是一套生成和利用Profile文件的工具,在2022年一月份开始进入视野,随后在Google I/O 2022随着Jetpack新厘革得到广泛关注。其背景是Google Map加快了发版速率,Cloud Profle还没完全网络好就上新版,导致Cloud Proflie失效。另有一个背景是Jetpack Compose 不是体系代码,因此没有完全编译成呆板码,而且Jetpack Compose库比力大,因此在Profile生成之前利用了Jetpack Compose的应用启动会产生性能标题。末了Google为了办理这些标题,创造了网络Profile的BaselineProfileRule Macrobenchmark以及利用Profile的ProfileInstaller。
利用Baseline Profile的机制可以在Android7及以上的手机上得到应用的启动加快,由于从上述知道Android7就已经开始有PGO(Profile-guided optimization)的编译方式。生成的Profile文件会打包到apk内里,而且会结合Google Play的Cloud Profile来引导AOT编译。固然在国内根本上用不了Cloud Profile,不外Baseline Profile是可以独立于Google Play单独利用的。
在利用了Baseline Proflie之后,有道辞书的启动速率从线上统计上看,冷启动时间有15%的提拔。
这篇文章告急先容了Android Runtime的演进以及对于应用启动的影响,下一篇文章我会详细先容关于Profile&dex文件优化、Baseline Profile工具库原理,以及在现实操纵上怎样利用的标题,敬请各人等候一下!
参考


  • Android CPU, Compilers, D8 & R8
  • Implementing ART Just-In-Time (JIT) Compiler
  • Configuring ART
  • Improving app performance with ART optimizing profiles in the cloud
  • Understanding Android Runtime (ART) for faster apps (Google I/O'19)
  • What's new in Android Runtime (Google I/O '18)
  • Performance and memory improvements in Android Run Time (ART) (Google I/O '17)
  • The Evolution of ART - Google I/O 2016
  • Google I/O 2014 - The ART runtime
  • Google I/O 2010 - A JIT Compiler for Android's Dalvik VM
  • Android Runtime  -  How Dalvik and ART work?
  • Android Debug Bridge - Read ART profiles for apps
  • Deep dive into the ART runtime (Android Dev Summit '18)
  • Deep dive into ART(Android Runtime) for dynamic binary analysis | SungHyoun Song | Nullcon 2021
  • Baseline Profiles
  • Google I/O 2022: What’s new in Jetpack
  • Improving App Performance with Baseline Profiles
  • Android 强推的 Baseline Profiles 国内能用吗?我找 Google 工程师求证了!
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-11-23 17:32, Processed in 0.195279 second(s), 35 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表