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命令解压,解压后的内容包含以下几部分:
可以看到,和IDE (Android Studio或者Eclipse) 工程的文件层次结构十分相似。
lib – 用于存放与处理器相关的二进制文件,其内部根据处理器不同细分为armeabi, x86, mips等目录。
META-INF – 用于存放APK的签名信息。
res – 包含APK图形界面和字符串相关的资源文件,对应IDE中的res目录。
Android资源文件由如下内容组成:
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)简要介绍和学习计划
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 | 应用程序的一些配置信息 |
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)简要介绍和学习计划
相关文章推荐
- Android 控件之AutoComplete(自动提示功能)
- Android打包程序
- Android LocalSocket与Socket 区别
- Android ThreadLocal工作原理
- Android之取消ListView的点击效果
- Android TextFields
- android L新控件RecyclerView详解与DeMo
- Android开发 在AndoridStudio中引入GreenDAO
- [转]Android - 文件读写操作 总结
- android view类的xml属性,相关的方法与说明
- Android NDK and OpenCV Development With Android Studio
- android后台发送短信的实现
- android系统的常用权限
- android布局------LinearLayout(线性布局)详解
- android 设置全局的页面切换动画问题
- Android SDK 开发范例大全 ---3.12具有交互功能的对话框
- Android SDK>开发指南>检索功能
- Android——注释框架ButterKnife使用教程
- Android开发自学笔记(Android Studio)—4.5 ProgressBar及其子类
- Android中监听EditText文本输入