apk文件结构
APK 文件
APK (Android application package) ,是应用程序的压缩包形式,将应用程序的原代码、各类资源和清单信息组合在一起,以便在设备上进行安装和运行
接下以ibilibili安装包为例观察其文件结构
下载apk文件
因为其本质上就是一个 zip压缩包。所以直接用win解压解压文件
如图,文件内部可分为
- 静态资源文件(assets)
- 库文件(lib)
- 签名文件(META-INF)
- 编译资源文件(res)
- 配置清单文件(AndroidManifest.xml)
- 核心代码文件(classes.dex)
- 资源映射文件(resources.arsc)
静态资源文件(assets)
静态资源文件是一种未经编译的资源目录,它会被打包进 APK 文件中,在安装应用程序之后可以被访问,用于存放应用程序的原始静态文件,如音频文件、视频文件、HTML文件等
库文件(lib)
用于存放动态及静态链接库的文件夹
签名文件(META-INF)
其中包含MANIFEST.MF、CERT.SF和CERT.RSA文件,MANIFEST.MF文件包含了文件的SHA1摘要值,CERT.SF和CERT.RSA文件为生成的签名文件和签名块文件,应用程序管理器安装apk文件的过程中会检查证书,对比每个文件的摘要值是否匹配,防止应用程序被篡改
文件签名
- 加密:发送方利用接收方的公钥对要发送的明文进行加密。
- 解密:接收方利用自己的私钥对密文进行解密
- 配对:公钥和私钥配对的,用公钥加密的文件,只有对应的私钥才能解密。当然也可以反过来,用私钥加密,用对应的公钥进行解密
- 签名:签名是发送方为发送的文件写上一个自己的签名,所以需要使用的是自己(发送方)的私钥
- 验证签名: 验证签名是接收方需要确认自己接收到的密文文件是否真的是发送方发送过来的,需要确认的是中间有没有被篡改(不同于解密),验签最终是根据报文摘进行对比。
编译资源文件(res)
- res 是 APK文件中存放资源文件的目录,包含了应用程序使用的各种资源,如布局文件、图像文件、字符串资源等。
- 布局文件定义了应用程序界面的结构和组件的位置。
- 图像文件包含了应用程序使用的图标、背景图等图像资源。
- 字符串资源存储了应用程序中使用的文本字符串
配置清单文件(AndroidManifest.xml)
每个应用程序都必须定义和包含的全局配置文件,它描述了应用程序的名称、版本、权限、引用的库文件等信息,其特殊点在于AndroidManifest.xml是经过压缩的,如果直接打开将看到乱码。可以通过相关工具将其解压。
classes.dex
java编译产生class文件,class文件被DX工具转换成一个dex文件,以便在Dalvik虚拟机运行,classes.dex是Java源代码编译后生成的Dalvik虚拟机字节码文件,类似于Java虚拟机使用的.class类文件,将class文件整合到一起,可以减小类文件的尺寸、IO操作,提高类的查找速度,常规来说每个APK文件只有一个classes.dex文件,但一个dex文件储存空间有限(66535),超出的会创建一个新的class.dex文件
资源映射文件(resources.arsc)
一个二进制文件,包含了使用的所有资源索引信息