前言作为Android开发者,你必须了解apk的编译打包流程;那么今天我们将学习;apk编译过程1、apk文件apk是AndroidPackage的缩写;解压apk文件后,里面包含AndroidManifest.xml、assets目录、classes.dex(可能还有classes2.dex、classes3.dex...classesN.dex)、lib目录、META-INF目录、res目录和resources.arsc;classes.dex是.dex文件;resources.arsc为resources资源文件;AndroidManifest.xml为AndroidManifest.xml文件;res是未编译的资源;META-INF为签名文件夹;${ANDROID_SDK_HOME}/platform-tools/apptaidl:Android界面描述语言转换为.java文件的工具,${ANDROID_SDK_HOME}/platform-tools/aidljavac:JavaCompiler,${JDK_HOME}/javac或/usr/bin/javacdex:将.class文件转换为DavikVM识别的.dex文件,${ANDROID_SDK_HOME}/platform-tools/dxapkbuilder:生成apk包,${ANDROID_SDK_HOME}/tools/opkbuilderjarsigner:.jar文件签名工具,${JDK_HOME}/jarsigneror/usr/bin/jarsignerzipalign:字节码对齐工具,${ANDROID_SDK_HOME}/tools/zipalign2.1打包资源文件,生成R.java文件使用aapt打包res资源文件,生成R.java、resources.arsc和res文件(二进制和非二进制,如res/raw和pic保持原样);res目录下的animator:该类资源以XML文件形式保存在res/animator目录下,用于描述属性动画;anim:该类资源保存在res/anim目录下的XML文件中,用于描述补间动画;color:该类资源以XML文件的形式保存在res/color目录下,用于描述对象的颜色状态选择器;drawable:此类资源以XML或Bitmap文件的形式保存在res/drawable目录下,用于描述drawable对象。比如我们可以在其中放置一些图片(.png、.9.png、.jpg、.gif)作为程序界面视图的背景图;layout:这种资源以XML文件的形式保存在res/layout目录下,用于描述Application界面布局;menu:该类资源以XML文件的形式存放在res/menu目录下,用于描述应用菜单;raw:这类资源以任意格式的文件形式存放在res/raw目录下,和assets类资源一样,都是在原包中打包到apk文件中,但是它们会被赋予一个资源ID,这样我们就可以在程序中通过这个ID来访问它们。例如,假设在res/raw目录下有一个名为filename的文件,正在编译,分配给它的资源ID是R.raw.filename,那么就可以使用下面的代码访问它:Resourcesres=getResources();InputStreamis=res.openRawResource(R.raw.filename);values:这类资源以XML文件的形式存放在res/values目录下,用来描述一些简单的值,比如数组、颜色、大小、字符串和样式值等。一般来说,这六种不同的值分别存储在名为arrays.xml、colors.xml、dimens.xml、strings.xml和styles.xml的文件中;xml:这类资源存储在一个XML文件中,res/xml目录一般用来描述应用的配置信息;resources.arsc文件resources.arsc记录了应用资源目录的所有信息,包括每个资源的名称、类型、值、ID以及所有的Configuration维度信息;我们可以把这个resources.arsc文件看成是一个资源索引表,可以快速找到最匹配的资源;R.java文件R.java文件包含很多静态内部类,比如layout、string等;每当添加此类资源时,在R.java文件中添加静态内部类静态常量类成员,所有成员均为int类型;2.2处理AIDL文件并生成对应的.java文件AIDL(AndroidInterfaceDefinitionLanguage),Android接口定义语言,IPC(InterProcessCommunication,进程间通信)是Android提供的.aidl文件在这个阶段的唯一实现,并生成相应的Java接口文件;2.3编译Java文件,生成对应的.class文件,编译工程源码,生成对应的class文件。处理文件包括src生成的java文件、R.java、AIDL、库jar文件;调用javac编译项目src目录下的所有java源文件,生成的class文件位于项目的bin\classess目录下;2.4.将类文件转换为DavikVM支持的.dex文件将所有类文件转换为生成classes.dex文件。处理文件为上一步生成的.class文件;使用dx工具将java字节码转为dalvik字节码,压缩常量池,剔除冗余信息等;使用dex命令将.class文件和第三方库中的.class文件进行处理,生成classes.dex;2.5打包生成未签名的.apk文件。classes.dex、resources.arsc、res文件夹(res/raw资源打包到APK中,其他资源会编译或处理)、OtherResources(assets文件夹)、AndroidManifest.xml打包成apk文件;注意:res/raw和assets的相同点:两个目录下的文件打包后会原封不动的保存在apk包中,不会编译成二进制;res/raw和assets的区别:res/raw中的文件会映射到R.java文件,访问R.id.filename时直接使用资源ID;assets文件夹下的文件不会映射到R.java,访问需要AssetManager类;res/raw不能有目录结构,而assets可以有目录结构,即可以在assets目录下创建文件夹;2.6对未签名的.apk文件进行签名Android应用程序需要进行签名才能安装到Android设备上。对apk文件进行签名有两种情况:在调试应用的时候,也就是我们通常所说的debug模式的签名,通常开发编译调试程序的时候,会使用一个debug.keystore来对apk进行签名;当它正式发布时,它会签署应用程序包。在这种情况下,需要提供符合android开发文档中要求的签名文件。这种签名也分为两种:JDK中提供的jarsigner工具签名,以及android源码中提供的signapk工具;2.7对签名后的.apk文件进行对齐在release模式下,使用aipalign对签名后的apk进行对齐处理;Zipalign是一个在android平台上用于排列APK文件的工具。它将apk中未压缩的数据对齐到4个字节。对齐之后就可以使用mmap函数读取文件了,可以像读取内存一样对普通文件进行读取。操作。如果没有4字节对齐,则必须显式读取,速度慢,消耗额外内存;AndroidSDK包含一个名为“zipalign”的工具,可以优化打包的应用程序。它位于SDK的build-tools目录下;总结人生很有趣,就像升级和打怪一样,打一个又一个的怪,虽然过程艰辛,有失败的风险,也有退缩的风险,但是打怪的感觉非常好;来打工人!!!
