为了解释以上概念,我们得从Android 编译过程说起。
我们使用Java开发android,在编译打包APK文件时,会经过以下流程:
Java编译器将应用中所有Java文件编译为class文件,dx工具将应用编译输出的类文件转换为Dalvik字节码,即dex文件之后经过签名、对齐等操作变为APK文件。
科普了概念之后,要开始聊一聊编译打包的前世今生。
在apk运行在手机上的时候,JAVA虚拟机需要将dex文件转换成机器能识别的的机器码,如果每次执行一段代码都执行这个过程,将dex转换成机器能识别的语言的过程(微处理器指令),然后交给系统处理,这样的效率不是很高。
为了解决这个问题,Google在2.2版本添加了JIT编译器,当App运行时,每当遇到一个新类,JIT编译器就会对这个类进行编译,经过编译后的代码,会被优化成相当精简的原生型指令码(即native code),这样在下次执行到相同逻辑的时候,速度就会更快。
那么什么是JIT呢?JIT是"Just In Time Compiler"的缩写,就是"即时编译技术",与Dalvik虚拟机相关。当然,如果你的“这段代码”被重复执行的次数非常少,那么JIT的效果会不太明显。
有一点需要注意,那就是dex字节码翻译成本地机器码是发生在应用程序的运行过程中的,并且应用程序每一次重新运行的时候,都要做重做这个翻译工作,所以这个工作并不是一劳永逸,每次重新打开App,运行代码的时候,都需要JIT编译。
JIT是在2.2版本提出的