apk文件以及打包流程

  我使用的电脑是mac,发现在本文中使用到的一些工具所在的位置与看到的其他博客中的位置不一致;

apk文件

  .apk文件就是一个压缩文件,我们可以把.apk文件修改后缀为.zip,然后使用解压软件进行解压,解压以后会得到好几个文件,这里主要讲以下几个文件:
1 . lib(文件夹):存放的是so动态链接库,so动态链接库是不需要在做apk打包时一系列压缩处理的;
2 . META-INF(文件夹):是签名文件夹,其中里面存放的三个文件,有两个是对资源文件做的SHA1 hash处理,一个是签名和公钥证书;
3 . res(文件夹):是资源文件夹,里面还会分animator,anim,color,drawable,layout,menu和raw等这些文件夹;
4 . AndroidManifest.xml(文件):是清单文件,是每个android程序中必须的文件。它位于整个项目的根目录,描述了package中暴露的组件(activitiy、service等),他们各自的实现类,各种能被处理的数据和启动位置。 除了能声明程序中的Activity,ContentProvider,Service, 和BroadcastReceiver,还能指定permissions和instrumentation(安全控制和测试)。这个文件是很重要的,里面有我们的Android四大组件和申请的权限;
5 . classes.dex(文件,可能会有多个,文件名依次数字增加,如classes2.dex):是Android平台上的可执行文件,Android虚拟机Dalvik支持的字节码文件格式Google在新发布的Android平台上使用了自己的Dalvik虚拟机来定义, 这种虚拟机执行的并非Java字节码, 而是另一种字节码: dex格式的字节码。在编译Java代码之后,通过Android平台上的工具可以将Java字节码转换成Dex字节码。虽然Google称Dalvik是为了移动设备定做的,但是业界很多人认为这是为了规避向sun申请Javalicense。这个DalvikVM针对手机程式/CPU做过最佳化,可以同时执行许多VM而不会占用太多Resource。classes.dex也是由java的class文件重新编排而来,我们也可以通过反编译工具把dex文件转换成class文件。如果做了拆包那么会有classes1.dex,classes2.dex ...多个classes.dex文件;
6 . resoreces.arsc(文件):记录了所有的应用程序资源目录的信息,包括每一个资源名称、类型、值、ID以及所配置的维度信息。我们可以将这个resources.arsc文件想象成是一个资源索引表,这个资源索引表在给定资源ID和设备配置信息的情况下,能够在应用程序的资源目录中快速地找到最匹配的资源;

apk打包流程

  从上面的图中,我们可以看出apk打包流程可以分为以下7步:
1 . 通过aapt打包res资源文件,生成R.java、resources.arsc、res文件(二进制和非二进制文件保持原样,比如res/raw目录下的文件);
  打包资源的工具是aapt(The Android Asset Packaing Tool),位于android-sdk/build-tools目录下。在这个过程中,项目中的AndroidManifest.xml文件和布局文件XML都会编译,然后生成相应的R.java。
  Android Gradle Plugin3.0.0或者更高版本默认使用aapt2。当然可以在配置文件中手动关闭aapt2.

2 . 处理.aidl文件,生成对应的Java接口文件;
  这一过程中使用到的工具是aidl(Android Interface Definition Language),即Android接口描述语言。位于android-sdk/build-tools目录下。aidl工具解析接口定义文件然后生成相应的Java代码接口供程序调用。
  如果在项目没有使用到aidl文件,则可以跳过这一步。

3 . 通过Java Compiler编译R.java、Java接口文件、Java源文件,生成.class文件;
  项目中所有的Java代码,包括R.java和.aidl文件,都会变Java编译器(javac)编译成.class文件,生成的class文件位于工程中的bin/classes目录下。

4 . 通过dex命令,将.class文件和第三方库中的.class文件处理生成classes.dex文件;
  dex工具生成可供Android系统Dalvik虚拟机执行的classes.dex文件,该工具位于android-sdk/build-tools 目录下。
  任何第三方的libraries和.class文件都会被转换成.dex文件。
  dx工具的主要工作是将Java字节码转成成Dalvik字节码、压缩常量池、消除冗余信息等。

5 . 通过apkbuilder工具,将aapt生成的resources.arsc和res文件、assets文件和classes.dex一起打包生成apk;
  所有没有编译的资源(如images等)、编译过的资源和.dex文件都会被apkbuilder工具打包到最终的.apk文件中。
  打包的工具apkbuilder位于 android-sdk/tools目录下。apkbuilder为一个脚本文件,实际调用的是android-sdk/tools/lib/sdklib.jar文件中的com.android.sdklib.build.ApkbuilderMain类。
  对该步骤存疑,我没有在我的电脑中找到该工具,查看资料看到说是Android 3.0以后废弃了该文件,而是换成了使用sdklib.jar文件。但是我在Android 3.0之前的文件中也没有找到该工具。

6 . 通过Jarsigner工具,对上面的apk文件进行debug或者release签名;
  一旦APK文件生成,它必须被签名才能被安装在设备上。
  在开发过程中,主要用到的就是两种签名的keystore。一种是用于调试的debug.keystore,它主要用于调试,在Eclipse或者Android Studio中直接run以后跑在手机上的就是使用的debug.keystore。另一种就是用于发布正式版本的keystore。

7 . 通过zipalign工具,将签名后的apk文件进行齐处理;
  如果你发布的apk是正式版的话,就必须对APK进行对齐处理,用到的工具是zipalign,它位于android-sdk/build-tools目录下。
  对齐的主要过程是将APK包中所有的资源文件距离文件起始偏移为4字节整数倍,这样通过内存映射访问apk文件时的速度会更快。
  对齐的作用就是减少运行时内存的使用。

  下面是详细的打包流程图

-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
--------------last line for now-------------