面试题之Android项目构建流程

前言

这篇文章我们来分析一波Apk的生成流程,原先我只知道在Studio中去build Apk去生成Apk文件,但是至于这个Apk具体是如何生成的,我并不太了解,但是通过解压Apk我们可以了解到Apk文件中包括哪些文件。

  • META-INF文件夹,该文件夹中包含该Apk的签名信息以及该Apk中所有文件的哈希值的计算结果
  • res文件夹,存放的是资源文件,例如动画、颜色、图片和布局等资源
  • dex文件,该文件是适用于Dalvik虚拟机的字节码文件
  • resources.arsc,它是一个资源索引表,是由aapt根据res资源文件生成的二进制文件
  • AndroidManifest.xml清单文件,配置了各种权限以及注册Activity,Service等组件

打包流程

面试题之Android项目构建流程_第1张图片
Apk构建流程

首先我们来分析一波上图的大致的流程:

  1. 通过aapt工具将我们res目录下面的资源文件生成R.java文件和resources.arsc文件
  2. 通过aidl工具将我们项目中的aidl接口文件转化为java
  3. 通过Java Compiler编译器将我们的java类编译成class文件
  4. 通过dx.bat工具将所有的class文件转化成为我们android虚拟机Dalvik可以识别的dex文件
  5. 通过apkbuilder工具将我们所有的资源文件和上面生成的dex文件打包生成一个Apk文件
  6. 通过Jarsigner包给我们的Apk进行签名
  7. 使用Zipalign对我们签名后的Apk进行对齐优化,使我们的Apk更加减少内存,最终生成我们可以运行的Apk文件。

关于资源打包

  1. assetsres下的raw资源被原装不动地打包进APK之外,其它的资源文件都会被编译(xml文件会被编译为二进制的xml)。
  2. 除了assets资源之外,其它的资源都会被赋予一个资源ID
  3. 打包工具负责编译和打包资源,编译完成之后,会生成一个resources.arsc文件和一个R.java,前者保存的是一个资源索引表,后者定义了各个资源ID常量,供在代码中索引资源。
  4. 应用程序配置文件AndroidManifest.xml同样会被编译成二进制的XML文件,然后再打包到APK里面去。
  5. 应用程序在运行时最终是通过AssetManager来访问资源,或通过资源ID来访问,或通过文件名来访问。

Dalvik(Android虚拟机)

DalvikGoogle公司自己设计用于Android平台的Java虚拟机,它是Android平台的重要组成部分,支持dex格式的Java应用程序的运行。dex格式是专门为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。Google对其进行了特定的优化,使得Dalvik具有高效、简洁、节省资源的特点。从Android系统架构图知,Dalvik虚拟机运行在Android的运行时库层。

JVMDalvik虚拟机的区别

  1. Java虚拟机运行的是Java字节码,文件是以.class结尾,Dalvik运行的是Dalvik字节码,其dex文件是由dx.bat工具编译class文件而来。
  2. Dalvik可执行文件比JVM更小,dex文件对常量池进行了压缩,使得相同字符串、常量在DEX文件中只出现一次。
  3. Java虚拟机与Daivik虚拟机架构不同,Java虚拟机基于栈结构,资源开销大,Dalvik虚拟机基于寄存器结构,数据由寄存器直接传递,这样的方式比基于栈结构的方式快得多。

参考

Android项目构建Apk包流程

你可能感兴趣的:(面试题之Android项目构建流程)