一、打包步骤
第一步:打包资源文件,通过Appt工具生成R.java和resources.ap文件
Resource文件(就是工程中res中的文件)、Assets文件、AndroidManifest.xml文件。
如果是多moudle或project项目,都会合并到主工程目录下的resources.ap.
第二步:处理AIDL文件,通过aidi工具生成对应的.java文件
第三步:处理源文件(包括R.java和AIDL生成的.java文件)、库文件(.jar文件),通过Javac生成对应的.class文件
第四步:将第3步生成的class文件通过dx工具转化成1个或多个dex文件
第五步:通过apkbuilder工具打包生成未签名的.apk文件
第六步:通过jarsigner工具对未签名.apk文件进行签名
第七步:通过zipalign工具对签名后的.apk文件进行对齐处理(不进行对齐处理是不能发布到Google Market的)
步骤中提到的工具如下表:
名称 功能介绍 在操作系统中的路径
aapt Android资源打包工具 ${ANDROID_SDK_HOME}/platform-tools/appt
aidl Android接口描述语言转化为.java文件的工具 ${ANDROID_SDK_HOME}/platform-tools/aidl
javac Java Compiler ${JDK_HOME}/javac或/usr/bin/javac
dex 转化.class文件为Davik VM能识别的.dex文件 ${ANDROID_SDK_HOME}/platform-tools/dx
apkbuilder 生成apk包 ${ANDROID_SDK_HOME}/tools/opkbuilder
jarsigner .jar文件的签名工具 ${JDK_HOME}/jarsigner或/usr/bin/jarsigner
zipalign 字节码对齐工具 ${ANDROID_SDK_HOME}/tools/zipalign
二、打包后文件结构
1、assets目录 - 保留工程中assets目录,其他moudle、jar包中的assets也会合并到该assets目录下。
2、lib目录 - 编译的时候jar文件已经合并到主工程中,所以lib目录下不会有jar文件,但是lib中包含所有的so文件,so目录的路径保留原有的路径。
3、META-INF目录,信息描述,签名等用途。
4、res目录 - 工程资源文件,以主工程为主,其他文件如jar包会合并到该目录下;但是values文件将不会出现在此目录下,因为已经将其编译到resources.arsc文件中;raw文件将保持原有的内容不会被编译。
5、AndroidManifest - 用来做组件查找。
6、classes.dex - 虚拟机执行文件。
7、resources.arsc - 资源文件索引。
三、raw和assets区别
相同点:
1、两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。
不同点:
1、res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename;assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类。
2、res/raw不可有目录结构,也就是raw目录下不可以再建立子文件夹,而assets可以建。
四、Resouces和AssetManager关系
Resources对象创建后,就解析好了其所需要的所有的资源包的resources.arsc,并且这些resources.arsc的所有字符串池已经被保存在了与Resources对象关联的 java层AssetManager对象的mStringBlocks数组中
https://www.jianshu.com/p/56d6e00bb0a1
参考:
https://www.cnblogs.com/sjm19910902/p/6416022.html
https://www.jianshu.com/p/7c288a17cda8