Apk 安装过程

1、apk结构

我们知道,Apk的本质其实是一个压缩包,我们可以手动把一个Apk文件的后缀名.apk改为.zip,然后就会将apk变为一个压缩包的形式。解压缩之后可以看到apk中的内容,大概是如下图所示的几个部分。

(以上操作也可以简化,直接在Android Studio中打开.apk文件,就可以看到apk内部文件结构了)


META-INF文件夹中存储的是apk签名相关的一些文件。

res文件夹中存储的是项目中用到的一些资源文件,包括color、layout、drawable等等。

classes.dex 就是android系统中的可执行文件,其本质是多个.class文件的集合。

resources.arsc 保存的是资源文件的索引。用AS打开可以看见其内部结构如下图所示。


2、几个重要文件目录

apk的安装主要分为两个部分,拷贝和解析。首先要了解一下android设备几个重要的文件夹的作用。

system/app 系统自带app,访问需要有root权限

vender/app设备厂商提供的app

data/app用户自己安装的app

data/data/packageName用于存储应用数据

data/dalvik-cache将apk中的dex文件放在这个目录中

system/priv-app 存放比system/app中权限更高一级的应用,如Launcher,系统设置等

2.1、system/app中保存系统自带应用,需要有root权限才能访问。所以系统app在root之前是无法删除和修改的。当需要升级系统应用的时候,会将更新版本安装在data/app目录中,当启动app的时候,系统会将应用指向data/app目录中。用户当然可以删除更新版本,但是删除之后,系统会再次将system/app中的版本提供给你,即删除新版,还你旧版。

2.2、当然在root之后,我们是可以对system/app目录进行操作。但是更新时仍将更新版本安装在data/app中。所以如果用户想替换system/app中的版本,就只能手动将新版apk push到system/app中,待系统重启之后,会安装push版本。

3、apk安装过程

3.1、创建应用数据目录data/data/packageName,用于存储譬如数据库、share_preferences、so库等;

3.2、解压缩apk,提取dex可执行文件,存放于data/dalvik-cache目录中,系统会对dex文件做一些优化,生成odex文件,将其存储。

When you install an application on Android, it performs some modifications and optimizations on that application's dex file (the file that contains all the dalvik bytecode for the application). It then caches the resulting odex (optimized dex) file in the /data/dalvik-cache directory, so that it doesn't have to perform the optimization process every time it loads an application.

3.3、检查apk的签名文件;

3.4、使用PMS解析AndroidMenifest.xml文件,包括:四大组件的信息,包括Receiver,默认启动的Activity等;

3.5、根据sharedUserId,为应用分配UID,用户id是唯一的,因为android是一个linux系统。同时会为应用分配用户组id,用户组id指的是各种权限,每个权限都在一个用户组中。分配了哪些用户组,就拥有了哪些权限。

3.6、在Luancher上添加应用图标;

3.7、将app的包名、版本号、安装路径等保存在data/system/packages.xml文件中,以备下次安装时再次使用;

安卓系统在每次重启时,都会将所有app都重新安装一遍。1、首先读取上次安装时保存的xml文件;2、扫描安装保存在特定目录下的apk,包括system/app、vender/app、data/app等;3、为每个app分配UID;4、再次将安装信息保存在本地xml中,便于下次访问。

你可能感兴趣的:(Apk 安装过程)