Android 编译器原理

Android 编译器原理


首先,不少程序员可能都知道,对于 CPU 而言,无论是用 Java、C/C++、还是用 Python 来写应用,结果都一样,因为其根本无法直接识别代码。毕竟当前的计算机只能根据电压的高低变化来计算,即高电压是 1 ,低电压是 0, 而这种数制方式被称之为二进制。二进制代码语言又被称为机器语言,计算机可以直接识别。因此无论是 Android 应用还是 iOS 应用,想要在 CPU 中运行,都需要经过翻译或者编译成机器码。

接下来,将以 Android 平台举例说明,众所周知,大多数的 Android 应用都是由 Java 开发而成,而 Java 代码的执行依赖于 Java 虚拟机(JVM),其提供了字节码文件(.class)的运行环境支持,即在 Java 程序编译成 .class 文件之后,由 JVM 将程序解释给本地系统执行,其中,后者的过程通常被叫做「解释执行」。

此外,还有一种叫做「编译执行」的模式,这种模式主要分为两种:

    JIT(Just-in-time,即时编译),边运行边编译;

    AOT(Ahead-Of-Time,运行时编译),在程序运行前编译,可以避免在运行时的编译性能消耗和内存消耗。

就 Android 系统而言,首次引入 JIT 功能是在 Android 2.2 版本中,彼时Google 的目的是为了提高 Android 的运行速度,即当 App 运行时,JIT 编译器就会对新类进行编译,经过编译后的代码,会被优化成相当精简的原生型指令码,这样在下次执行到相同逻辑的时候,速度就会更快。不过好景不长,JIT 在运行时编译开销大,容易造成卡顿,所以在 4.4 版本之后,Dalvik 虚拟机被逐渐抛弃的过程中,JIT 也被弃用了。

而在随后的 Android 5.0 系统中,ART 正式取代了 Dalvik,ART 中完全抛弃了 JIT,使用的是 AOT 的编译方式,这种方式的好处是,当 App 在第一次安装时,字节码会预先编译成原型指令码,让其成为真正的本地应用,这样App 的启动及运行速度都会大幅提升。不过这种方式也存在巨大的缺陷,一是安装应用时需要全面编译,用户等待安装的时间过长;二是安装过程中翻译出来的机器码占用了大量的内存空间。

因此,Google 为在安装时间、内存占用、电池消耗和性能之间获得折中方案,又于 Android 7.0 版本重新加入了 JIT 编译模式,即当前的 Android 系统引入的是包含编译、解释和 JIT 的混合运行时。详细而言,当 App 安装时,首先不用像 Android 6.0 中对应用进行完整的预编译,而会根据 JIT 编译器的分析结果,一方面,在设备充电或其余空闲时间对「cold code」进行解释;另一方面,对「hot code」在实际使用时由 JIT 进行编译。

来源:https://source.android.google.cn/devices/tech/dalvik/jit-compiler

以上即为华为所述的原有 Android 系统存在边解释边执行的低效现象,至于方舟编译器如何达成全程执行机器码高效运行程序的?

由于该项目暂时还上线开源,目前尚未可知。不过对此不少开发者猜测,方舟编译器更可能是直接将应用程序的安装包,即 APK 打包成机器码格式,得以让系统可以直接识别。最终结果我们还需等待该项目开源之后才能揭晓谜底。
---------------------
作者:CSDN资讯
来源:CSDN
原文:https://blog.csdn.net/csdnnews/article/details/89346465
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/lizhengyu891231/article/details/89359256