APK安装流程详解(二)

APK安装流程详解(二)

一.Installer、InstallerConnection和Installd守护进程

1.1Installer

Installer继承自SystemService,在Android中有两个SystemServer,一个是os/SystemService.java,另一个是server/SystemService.java,这里Installer继承的是server/SystemService.java,所以我们可以说Installer其实是一个系统服务。

1.2InstallerConnection

InstallerConeection就是一个连接类,负责连接installd

1.3Installd守护进程

1.3.1概述

上一篇文章我们知道PMS负责应用的安装、卸载等工作,但是里面主要是“Manager”,Installd才是真正干活的,PMS是通过访问installd服务来执行程序包的安装与卸载的。

1.3.2为什么要用installd

有的同学可能要问,PMS已经有一万多行了,为什么还要再加一个installd服务呢?这样不是画蛇添足了吗?
其实不是的,因为PMS只有system权限,而installid具有root权限。如下图:


1.3.3installd支持的命令
struct cmdinfo cmds[] = {
    { "ping",                 0, do_ping }, // 用于测试的空操作
    { "install",              5, do_install }, // 安装应用
    { "dexopt",               9, do_dexopt }, //将dex转换为oat或者patchoat oat文件
    { "markbootcomplete",     1, do_mark_boot_complete },
    { "movedex",              3, do_move_dex },  //把apk文件从一个目录移动到另一个目录
    { "rmdex",                2, do_rm_dex }, // 删除apk文件
    { "remove",               3, do_remove }, // 卸载应用
    { "rename",               2, do_rename }, // 更改应用数据目录的名称
    { "fixuid",               4, do_fixuid }, // 更改应用数据目录的uid
    { "freecache",            2, do_free_cache }, // 清除/cache目录下的文件
    { "rmcache",              3, do_rm_cache }, // 删除/cache下某个应用的目录
    { "rmcodecache",          3, do_rm_code_cache }, // 删除数据目录中code_cache文件夹
    { "getsize",              8, do_get_size }, // 计算一个应用占用的空间大小,包括apk大小,数据目录,cache目录等
    { "rmuserdata",           3, do_rm_user_data },// 删除一个用户中某个app的应用数据
    { "cpcompleteapp",        6, do_cp_complete_app },
    { "movefiles",            0, do_movefiles },//执行/system/etc/updatecmds/中的脚本
    { "linklib",              4, do_linklib }, // 建立 jib连接
    { "mkuserdata",           5, do_mk_user_data },// 为某个用户创建应用数据目录
    { "mkuserconfig",         1, do_mk_user_config },// 创建/data/misc/user/userid/
    { "rmuser",               2, do_rm_user },// 删除一个user的所有文件
    { "idmap",                3, do_idmap },
    { "restorecondata",       4, do_restorecon_data },// 恢复目录的SEAndroid安全上下文
    { "createoatdir",         2, do_create_oat_dir }, // 创建 /data/app/包名/oat/<inst>文件夹
    { "rmpackagedir",         1, do_rm_package_dir },// 删除/data/app/包名
    { "linkfile",             3, do_link_file } // 创建软连接
};

上表我们可以看到,几乎所有跟包相关的文件操作都是installid的指令集完成的。

1.3.4小结

PMS启动过程中使用了Installer的之个方法。APK的安装和卸载主要是由Installer和Installd完成的。Installer是Java层提供的Java API接口,Installd则是init进程启动的Daemon Service。Installer与Installd通过Socket通信,Installer是Socket的Client端,Installd则是Socket的Server端。通过Socket通信,将Installer的API调用转化为Installd中具体命令

二.APK安装流程

Android应用最终是打成APK文件然后安装至手机运行的。其中APK是Android Package的缩写。

2.1应用安装涉及到的目录

  • /system/app :系统自带应用程序,获得root权限才可删除
  • /data/app: 用户程序安装的目录,安装时把APK文件复制到此目录
  • /data/data:存放应用程序的数据
  • /data/dalvik-cache:将apk中的dex文件copy到该目录下,ART可执行文件为.oat,启动ART时,系统会执行dex文件转换至oat
  • /data/system:该目录下的packages.xml文件,类似于Windows的注册表,记录了系统的permissions,每个apk的name,codePath,,version,userid等信息,这些信息主要通过AndroidManifest.xml文件解析获取,解析完apk后将更新信息写入这个文件并保存到flash,下次开机的时候直接从里面读取相关信息并添加到内存相关列表中。当有APK安装、升级或者删除时会更新这个文件。
  • /data/system/packages.xml /data/system/packages.list:packages.list指定了应用的默认存储位置/data/data/com.xxx.xxx;package.xml中包含了该应用权限、应用包名、APK的安装位置、版本、userID等信息,并且两者都有同一个userld。之所以每个应用都要一个userId,是因为Android在系统设计上把每个应用当做Linux系统上的一个用户对待,这样就可以利用已有的Linux用户管理机制来设计Android应用,比如应用目录,应用权限,应用进程管理等。

2.2安装流程概述

apk的大体流程如下:

  • 第一步,拷贝文件到指定目录:在Android中,APK文件是会被保存起来的,默认情况下,用户安装的app首先会被拷贝到/data/app目录下,/data/app目录是用户有权限访问的目录,在安装apk的时候会自动选择该目录存放用户安装的文件,而系统出厂apk被放到/system分区下,这就是没有ROOT手机前,我们无法删除系统app的原因。
  • 第二步,解压缩apk,copy文件,创建应用的数据目录:为了加快app的启动速度,apk在安装的时候,会首先将app的可执行文件dex拷贝到/data/dalvik-cache目录,缓存起来。然后,在/data/data/目录下创建应用程序的数据目录(以应用的包名命名),存放在应用的相关数据,如数据库、xml文件、cache、二进制的so动态库等。
  • 解析apk中的AndroidManifest.xml文件:系统在安装apk的过程中,会提取AndroidManifest.xml中的信息,用来更新/data/system/packages.xml文件
  • 显示快捷方式:安装完毕之后,我们需要有一个Home应用,负责从PMS中把安装好的应用程序取出来,并以友好的方式在桌面上展现出来,在Android系统中,发挥这个作用的应用就是Launcher

2.3APK安装的界面

我们在安装应用时,出现的界面是系统的安装APP-PackageInstall.apk,篇幅和时间关系我们就不展开分析了,大致上,这个app就是封装了对PMS的调用,感兴趣的同学可以查阅相关资料。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容