mark一下一个apk的目录结构和安装过程:
文件结构:
asserts:
用于存放需要打包到APK中的静态文件,和res的不同点在于,assets目录支持任意深度的子目录,用户可以根据自己的需求任意部署文件夹架构,而且res目录下的文件会在.R文件中生成对应的资源ID,assets不会自动生成对应的ID,访问的时候需要AssetManager类。
lib:
存放应用程序依赖的native库文件,一般是用C/C++编写,这里的lib库可能包含4中不同类型,根据CPU型号的不同,大体可以分为ARM,ARM-v7a,MIPS,X86,分别对应着ARM架构,ARM-V7架构,MIPS架构和X86架构。
res:
存放资源文件,存在这个文件夹下的所有文件都会映射到Android工程的.R文件中,生成对应的ID。
res又分以下几个部分,每个对应单独的文件夹:
- anim存放动画文件;
- drawable目录存放图像资源;
- layout目录存放布局文件;
- values目录存放一些特征值;
- colors.xml存放color颜色值;
- dimens.xml定义尺寸值;
- string.xml定义字符串的值;
- styles.xml定义样式对象;
- xml文件夹存放任意xml文件
META-INF:签名信息,用于验证APK文件的完整性,确保apk没有被恶意修改或者病毒感染。META-INF目录下包含的文件有CERT.RSA/CERT.DSA,CERT.SF和MANIFEST.MF,其中CERT.RSA是开发者利用私钥对APK进行签名的签名文件,RSA和DSA表示使用的加密算法,CERT.SF,MANIFEST.MF记录了文件中文件的SHA-1哈希值。
RSA 与 DSA 都是非对称加密算法。其中RSA的安全性是基于极其困难的大整数的分解(两个素数的乘积);DSA 的安全性是基于整数有限域离散对数难题。虽然理论上可以生成更长长度的 DSA 密钥 (NIST FIPS 186-3),但ssh-keygen在生成 DSA 密钥时,其长度只能为1024位(基于NIST FIPS 186-2);而 ssh-keygen 在 RSA 的密钥长度上没有限制。由于小于1024位密钥长度的 RSA 已经有被攻破的记录,所以说现在:RSA 2048 位密钥是更好的选择。当然相比RSA和DSA,还有更好的算法:ECC(Elliptic Curves Cryptography)椭圆曲线算法。在 ssh-keygen 中,ECC 算法的相应参数是 “-t ecdsa”。可惜的是由于椭圆曲线算法只有在较新版本的 openssl 与 ssh-keygen 中才被支持,而无法得到普遍使用而去完全替代 RSA/DSA。(以上内容从这抄的:https://blog.csdn.net/qq_35180983/article/details/82665269)
AndroidManifest.xml:
Android应用程序的配置文件。在开发Android应用程序的时候,通常需要在AndroidManifest.xml中注册每一个Activity,Service,Provider和Receiver,另外这个文件还包含一些权限声明以及使用的SDK版本信息等等。打包时,会把AndroidManifest.xml进行简单的编译,便于Android系统识别,编译之后的格式是axml。
盗个图
axml头:文件标志,固定是 0x00080003
axml文件长度:标识 axml 文件的大小
StringDataSegment:保存xml文件中所有字符串类型。
ResourceIdSegment:保存xml文件中声明的资源文件ID。
XmlContentSegment:保存xml的数据内容。
classes.dex:
Android应用在打包时通过AndroidSDK中的dx工具将Java字节码转换为Dalvik字节码。dx工具可以对多个class文件进行合并,重组,优化,可以达到减小体积,缩短运行时间的目的。
resources.arsc:
记录资源文件和资源ID之间的映射关系,根据资源ID寻找资源。
apk的安装过程:
1.将apk拷贝到/data/app下(系统应用会放在/system分区下);
2.校验APK的签名,解压并且校验APK中的dex文件,再把dex优化成odex,使得应用程序启动时间加快,同时在/data/data目录下应用包名同名文件夹,存放相关数据:数据库,xml文件,二进制的so动态库。
3.解析AndroidMainfinest.xml文件。Android有个类似注册表的文件会记录所有安装的应用信息,它是:data/system/packages.xml。安装应用时,会解析AndroidMainfinest.xml,写入到packages.xml中。并将解析出的组件、权限注册到PackageManagerService,完成后广播。
参考文档: