Android面试一天一题(Day 27:ART & Dalvik)

Android的每次版本升级都会带来一些改变,有些改变对于应用开发者来说并没有什么影响,但对于一些重大的改变,我认为Android开发是必要关注和了解一下的,有些改变也许会成为以后的Android进化方向。

面试时,我也比较喜欢问一些每个版本的不同之外,或者问问对方喜欢哪个新版本的特性(如Android 7.0的新特性)。如果比较了解每个版本的不同之外,一般来说都是实践经验比较丰富的,很多都是踩过坑的。而对新版本是否关注,其实也是一个检测一个人的学习热情最好的题目,兴趣是最好的老师,对Android有热情的人很容易从各种途径获知相关的资讯。而没有兴趣的人,仿佛与世无争,只要还能用原来的方式写代码就感觉没有学习新东西的必要。

如,ART和Dalvik,对于应用开发者来说是无缝过渡的,那么你不奇怪Google是怎么做到的吗?

面试题:知道什么是ART吗?它和Dalvik有什么区别?

我们知道到,计算机只能识别机器码,而Java的运行是将class字节码在JVM上进行解析最后再翻译成机器码执行。Dalvik虚拟机就是针对Android应用(.dex)的一个JVM,虽然他们实现和原理有很多不同,但我们可以简单这样理解。

每个应用的进程中都会有一个Dalvik虚拟机实例,它们是相互独立的,一个应用的Dalvik虚拟机Crash了并不影响其他的。APK应用在运行时,就需要Dalvik虚拟机去加载类并转化成机器码执行,这个过程就是JIT(Just-In-Time),虽然dex经过优化会生成一个odex文件,但这个过程仍然是运行时让编译器去解释字节码,相当于多了一道转换工序,对性能的影响不小。

在Android 4.4的版本里用户还可以选择是用Dalvik还是ART,而5.0后的版本直接换成了ART,把Dalvik删除了。

而ART(Android runtime)和Dalvik不一样的地方,就是想法去掉了中间解释字节码的过程,Dalvik是JIT的机制,与JIT相对的是AOT(Ahead-Of-Time),它发生在程序运行之前。如我们用静态语言(例如C/C++)来开发应用程序的时候,编译器直接就把它们翻译成目标机器码。这种静态语言的编译方式也是AOT的一种。

但是很多Android应用开发者并不知道有ART的存在,因为ART虚拟机并不要求开发者将自己的应用直接编译成目标机器码,而是在应用安装时由ART将应用的dex字节码翻译成本地机器码。所以你会发现,新的版本安装应用的时间比之前要长一点。

小结

关于ART方面,我也没有深入研究,有些东西确实是需要兴趣或者压力才能深入进去的。我们在应用层上开发,基本上也很少涉及Framework层以下的修改,但是我们一定要改变一些想法,如感觉和我们无关的就不舍得花时间看一看,然后故步自封偏安一隅。你不看清楚外面的东西,怎么确认和你有没有关呢?

推荐阅读更多精彩内容