您的位置:首页 > 移动开发 > Android开发

Android笔记-APK打包流程

2015-12-04 20:14 381 查看
Android APK (Android Application Package) 是Android系统中应用程序安装包的文件格式,以.apk作为文件后缀名,MIME类型为application/vnd.android.package-archive。通过分析APK的组成内容和打包流程,可以对Android应用程序开发有一个整体的认识。

APK文件是一个zip包,通过unzip命令解压,解压后的内容包含以下几部分:

[code]APK
│
└──lib/ 
└──META-INF/
└──res/ 
└──assets/
└──AndroidManifest.xml 
└──resources.arsc
└──classes.dex


可以看到,和IDE (Android Studio或者Eclipse) 工程的文件层次结构十分相似。

lib – 用于存放与处理器相关的二进制文件,其内部根据处理器不同细分为armeabi, x86, mips等目录。

META-INF – 用于存放APK的签名信息。

res – 包含APK图形界面和字符串相关的资源文件,对应IDE中的res目录。

Android资源文件由如下内容组成:

目录用途
layout存放布局文件 (layout-land保存横屏布局文件,layout-port保存竖屏布局文件)。
menu存放菜单布局文件,比如Options Menu, Context Menu, Sub Menu等
drawable存放应用中使用的图片资源,也包含帧动画 (Frame Animations) 文件
mipmap存放应用在Launcher中的显示图标
animator动画资源,主要是属性动画 (Property Animations) 文件
anim动画资源,主要是补间动画 (Tween Animations) 文件
color颜色资源,定义ColorStateList对象
raw保存原始文件格式的任意文件,可通过Resources.openRawResource()来读取
values存放字符串资源,比如dimens, strings, colors, styles, arrays, integers。
xml应用程序的一些配置信息
Notice:

1. 布局文件命名应尽可能遵循一定的规范,不然文件很多时会感觉混乱,可以参考android-best-practices统一布局文件命名。也可以通过gradle来实现layout Nesting,以解决布局文件太多的问题。

2. 为了节省存储空间,存放在drawable中的图片资源会经过aapt工具编译后再打包,如果不想某些图片资源被优化,可以将其存放在raw目录。

3. APK中res不包含values,为了提高解析和访问效率,values下的资源文件都会编译进resource.arsc中。

4. 资源的组织方式异常丰富,有19个维度,常用的有smallestWidth, Available width, Available height, Screen size, Screen orientation等,可以查阅Providing Resources小节。

接触过Web开发的人都了解skeleton。目前看来,Google定义的资源文件的skeleton还是蛮合理的。更多内容可以查阅官网Resource Types这一小节。

assets – 用于存放保持原始文件内容的任意文件,比如音频,视频,主题包等。assets与res/raw中的文件都会保持原始文件内容。两者不同之处在于,res/raw中存放的文件在R.java中有资源ID,在代码中可以通过引用资源ID来使用资源。而assets中存放的文件没有分配资源ID,因此assets中存放的文件只能通过AssetManager来读取。

AndroidManifest.xml – APK的配置文件,包含以下主要部分:

1. 声明应用的包名,这个包名作为应用安装到Android系统中的唯一标识

2. 描述应用中使用的组件 (activity, service, broadcast receiver和content provider)

3. 声明应用组件运行时所在的进程

4. 申请应用运行时必须具备的权限

5. 声明应用支持运行的最低SDK版本

6. 应用需要链接的库

更多内容可以查阅官网App Manifest

resources.arsc – APK的资源索引文件,该文件生成具体过程可以参考老罗的Android应用程序资源的编译和打包过程分析

classes.dex – Android应用程序的逻辑部分。由java源代码编译生成的可由Dalvik/ART虚拟机解析执行的可执行文件。

classes.dex可以通过apktool反编译成smali格式文件,或者通过dex2jar反编译成.class文件。

Android工程编译生成APK过程如下图所示:




以上步骤都可由IDE自动完成,流程如下:

1. 所有的XML文件,都会被aapt (Android Asset Package Tool) 解析成二进制格式。通过编译时进行XML的解析,能够节省运行时的开销。解析后的资源会在R.java中保存一个索引ID。

2. 所有的java文件,都会被JDK中的javac编译成按源代码包结构组织的.class字节码文件。然后会再通过SDK中提供的dx工具转换成可以被Dalvik/ART虚拟机解析执行的classes.dex文件。

3. 然后,前两步生成的二进制资源文件和classes.dex可执行文件,会通过apkbuilder工具,使用zip压缩算法打包成一个APK文件。

4. 最后,通过jarsigner工具对APK包进行校验和数字签名。为了提高虚拟机访问内存的效率,通过zipalign工具对APK中的资源进行4字节对齐。最后得到可以分发安装的APK文件。

参考学习资料:

1. Android application package

2. Android应用程序开发以及背后的设计思想深度剖析(1)

2. Android资源管理框架(Asset Manager)简要介绍和学习计划
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: