Android 原生开发基础
概述
五层架构,详细介绍见 官方中文文档

Java 运行环境
在Android 5.0之前,谷歌使用自行开发的开源的Dalvik虚拟机作为Java的运行环境。
Android程序通常用Java编写,并编译成Java虚拟机的字节码,然后翻译成Dalvik字节码并存储在.dex(Dalvik Executable)和.odex(Optimized Dalvik Executable)文件中;相关术语odex和de-odex与各自的字节码转换有关。紧凑的Dalvik可执行文件格式是为内存和处理器速度受限的系统而设计的。
与Java虚拟机(即堆栈机)不同,Dalvik VM使用基于寄存器的体系结构,该体系结构需要较少的(通常是更复杂的)虚拟机指令。Dalvik程序使用Android 应用程序编程接口(API)用Java编写,编译为Java字节码,并根据需要转换为Dalvik指令。
一个名为dx的工具用于将Java .class文件转换为.dex格式。未压缩的.dex文件的大小通常比从相同的.class文件导出的压缩Java归档文件(JAR)小百分之几。
Dalvik的后继者是Android Runtime(ART),它使用相同的字节码和.dex文件(但不是.odex文件)。在Android 4.4中作为技术预览版首次被包含,并在后来的版本中完全取代了Dalvik,Android 5.0开始,仅使用ART作为唯一运行环境。

ART与Dalvik的区别
不同之处:
Android 2.2 为Dalvik带来了基于跟踪的及时编译(JIT),通过在每次运行时不断地对应用程序进行分析,并将其字节码中频繁执行的短段字节码动态编译成本地机器代码,从而优化应用程序的执行。当Dalvik解释应用程序的其他字节码时,这些短字节码段的本机执行(称为"traces")可以显着提高性能。
与Dalvik不同,ART引入了超前编译(AOT)的使用,在安装应用程序时将整个应用程序编译成本地机器码。通过消除Dalvik的解释和基于跟踪的JIT编译,ART提高了整体执行效率,降低了功耗,从而提高了移动设备的电池自主性。同时,ART还带来了更快的应用执行速度、改进的内存分配和垃圾收集(GC)机制、新的应用调试功能以及更准确的应用高层剖析。
在使用ART的设备上安装一个Apk应用程序,首先需要使用dex2oat工具进行编译,编译后产生ELF可执行文件,当启动应用时从该ELF文件中运行;因此,ART消除了与Dalvik的解释和基于跟踪的JIT编译相关的各种应用程序执行开销。但作为一个缺点,ART在安装应用程序时需要额外的时间进行编译,导致安装APP需要更长时间,而且应用程序会占用更大的存储空间(通常是闪存)来存储编译后的代码。
相同之处:
为了保持向后的兼容性,ART使用与Dalvik相同的输入字节码,通过标准的.dex文件作为APK文件的一部分,而.odex文件则被可执行和可链接格式(ELF)所取代。
混合模式
Android 7.0 为ART引入了带有代码剖析功能的JIT编译器,让它在运行Android应用的过程中不断提升性能。重新引入JIT是因为ART的缺点很明显,安装APP慢,占用更多存储空间,每当系统升级时,所有的应用都需要重新安装,这会导致所有的应用都需要在重新编译一遍。因此最新的安卓系统使用了混合模式,即首次安装APP,并不会马上进行编译,此时用户若启动应用,会使用类似原来的Dalvik方式,对频繁代码执行JIT编译,同时会生成一个离线的 profile 文件,这个 profile 文件会记录JIT运行时的所有 hot code(热点代码)信息。然后在未来的某个时间,安卓系统框架会基于这个 profile 文件来启动一个预编译行为,它只编译记录的热点代码。
需要注意的是JIT编译是一种动态编译,仅在内存中,每次启动应用时,都会重新对热点代码进行编译,耗费额外的性能和电量。混合模式混合了两者的优点,摒弃了缺点,是一种非常好的解决方案。

打包原理
Android的包文件APK分为两个部分:代码和资源。
所以打包方面也分为资源打包和代码打包两个方面,
具体说来:
- 通过AAPT工具进行资源文件(包括AndroidManifest.xml、布局文件、各种xml资源等)的打包,生成R.java文件。
- 通过AIDL工具处理AIDL文件,生成相应的Java文件。
- 通过Javac工具编译项目源码,生成Class文件。
- 通过DX工具将所有的Class文件转换成DEX文件,该过程主要完成Java字节码转换成Dalvik字节码,压缩常量池以及清除冗余信息等工作。
- 通过ApkBuilder工具将资源文件、DEX文件打包生成APK文件。
- 利用KeyStore对生成的APK文件进行签名。
- 如果是正式版的APK,还会利用ZipAlign工具进行对齐处理,对齐的过程就是将APK文件中所有的资源文件距离文件的起始距离都偏移4字节的整数倍,这样通过内存映射访问APK文件的速度会更快

基础文档
公众号“编程之路从0到1”