apk文件结构
APK (Android Package) 文件,是一个后缀名为.apk的压缩文件,APK文件中包含了一个Android应用程序的所有内容,是Android平台用于安装应用程序的文件。
- assets 存放需要打包到 APK 中的静态文件
- lib 存放应用程序所依赖的 native 库
- res 存放应用程序的资源文件
- META-INF 存放应用程序的签名和证书
- AndroidManifest.xml 应用程序配置文件
- classes.dex dex 可执行文件
- resources.arse 资源索引表,记录资源文件和资源 ID 之间的映射关系
res
是resource的缩写,存放资源文件,存在这个文件夹下的所有文件都会映射到Android工程的.R文件中,生成对应的ID,访问的时候直接使用资源ID,即R.id.filename。
res 文件夹下可以包含多个文件夹,其中
aim
存放动画文件drawable
目录存放图像资源layout
目录存放布局文件values
目录存放一些特征值,colors.xml
存放color颜色值,dimens.xml
定义尺寸值,string.xml
定义字符串的值,styles.xml
定义样式对象xml
文件夹存放任意 xml 文件,在运行时可以通过 Resources.getXML() 读取raw
是可以直接赋值到设备中的任意文件,无需编译
lib
存放应用程序依赖的native库文件,一般是用C/C++编写,这里的lib库可能包含4中不同类型,根据CPU型号的不同,大体可以分为ARM
,ARM-v7a
,MIPS
,X86
,分别对应着ARM架构,ARM-V7架构,MIPS架构和X86架构。
不同的CPU架构对应着不同的目录,每个目录中可以放很多对应版本的so库,且这个目录的结构固定,用户只能按照这个目录存放自己的so库。目前市场上使用的移动终端大多是基于ARM或者ARM-V7a架构的,X86和MIPS架构的移动智能终端比较少,所以有些应用程序lib目录下只包含armeabi目录或者armeabi-v7a目录。
META-INF
保存应用的签名信息,签名信息可以验证APK文件的完整性。AndroidSDK在打包APK时会计算APK包中所有文件的完整性,并且把这些完整性保存到META-INF文件夹下,应用程序在安装的时候首先会根据META-INF文件夹校验APK的完整性,这样就可以保证APK中的每一个文件都不能被篡改。以此来确保APK应用程序不被恶意修改或者病毒感染,有利于确保Android应用的完整性和系统的安全性。
META-INF目录下包含的文件有CERT.RSA
,CERT.DSA
,CERT.SF
和MANIFEST.MF
,其中CERT.RSA是开发者利用私钥对APK进行签名的签名文件,CERT.SF、MANIFEST.MF记录了文件中文件的SHA-1哈希值。
AndroidManifest.xml
是Android应用程序的配置文件,是一个用来描述Android应用“整体资讯”的设定文件,简单来说,相当于Android应用向Android系统“自我介绍”的配置文件,Android系统可以根据这个“自我介绍”完整地了解APK应用程序的资讯,每个Android应用程序都必须包含一个AndroidManifest.xml文件,且它的名字是固定的,不能修改。
我们在开发Android应用程序的时候,一般都把代码中的每一个Activity,Service,Provider和Receiver在AndroidManifest.xml中注册,只有这样系统才能启动对应的组件,另外这个文件还包含一些权限声明以及使用的SDK版本信息等等。
程序打包时,会把AndroidManifest.xml进行简单的编译,便于Android系统识别,编译之后的格式是AXML格式,如下图所示:
axml头:是固定表示 axml 文件的,其值固定是 0x00080003
axml文件长度:标识 axml 文件的大小
StringDataSegment:xml文件中所有字符串类型保存在此。
ResourceIdSegment:xml文件中声明的资源文件ID保存于此。
XmlContentSegment:是xml的内容段,按照xml文件中的结构依次排开,保存xml的数据内容。
classes.dex
传统的Java程序,首先先把Java文件编译成class文件,字节码都保存在了class文件中,Java虚拟机可以通过解释执行这些class文件。
而Dalvik虚拟机是在Java虚拟机进行了优化,执行的是Dalvik字节码,而这些Dalvik字节码是由Java字节码转换而来,一般情况下,Android应用在打包时通过AndroidSDK中的dx工具将Java字节码转换为Dalvik字节码。
dx工具可以对多个class文件进行合并,重组,优化,可以达到减小体积,缩短运行时间的目的。dx工具的转换过程,如下图所示:
如上图所示,dx工具把每个.class文件的每个区域的内容进行去重,重组,优化重排后生成dex文件,生成的dex文件可以在Dalvik虚拟机执行,且速度比较快。
resources.arsc
用来记录资源文件和资源ID之间的映射关系,用来根据资源ID寻找资源。
Android的开发是分模块的,res目录专门用来存放资源文件,当在代码中需要调用资源文件时,只需要调用findviewbyId()就可以得到资源文件,每当在res文件夹下放一个文件,aapt就会自动生成对应的ID保存在.R文件,我们调用这个ID就可以,但是只有这个ID还不够,.R文件只是保证编译程序不报错,实际上在程序运行时,系统要根据ID去寻找对应的资源路径,而resources.arsc文件就是用来记录这些ID和资源文件位置对应关系的文件。
最新文章
- vuejs件同一个挂载点上切换组
- ObjectOutputStream和ObjectInputStream
- Android消息机制之ThreadLocal的工作原理
- STC12C5A60S2 常用的中断源和相关寄存器
- 有趣的JavaScript小程序
- 【MongoDB】使用mongo连接服务器。。。
- Spark学习体会
- sql 自定义函数--固定格式字符转时间类型
- MongoDB appendix
- libsvm参数选择
- (一三〇)UITextField的光标操作扩展
- 自制操作系统Antz(10)——实现shell(上)
- eclipse 保存html 提示 save could not be completed
- UVa 11627 - Slalom 二分. oj错误题目 难度: 0
- ubuntu 16.04下源码安装opencv3.4
- hdu1166敌兵布阵&;&;hdu1754I Hate It(线段树入门)
- sqlserver 实现数据变动触发信息
- ios开发-调用系统自带手势
- Mutations
- 新的开源java反汇编程序Procyon
热门文章
- 线程基础知识10-volatile
- 五大数据类型 - 字符串 - 列表 list - 集合set - 有序集合 - 哈希 hashMap
- JZOJ 4366. 【GDKOI2016】项链
- JZOJ 6800.NOIP2020.9.19模拟spongebob
- JZOJ 3570. 【GDKOI2014】壕壕的寒假作业
- CCRD_TOC_2007年11月_总第12期
- js替换字符中指定所有字符
- K8S 1.20 弃用 Docker 评估之 Docker CLI 的替代产品 nerdctl
- 自己动手从零写桌面操作系统GrapeOS系列教程——7.计算机组成与运行原理
- C#的闭包捕获变量与英语中Nice to meet you的联系