安装流程总览:
用户触发安装->系统验证APK的合法性->解析APK元数据->检查权限和存储空间->复制APK到目标位置->生成应用私有数据->注册组件到系统->安装完成
关键步骤:
1.用户触发安装:
a.通过应用商店b.通过adb命令c.通过文件管理器
2.验证合法性:
a.验证签名b.验证文件完整性c.安全性扫描-主要是应用商店
3.解析APK元数据
PMS会解析APK中的核心文件,提取应用的基础信息,用于后续的安装决策
1)解析 AndroidManifest.xml
a.包名 版本号 版本名b.最低兼容系统版本 目标系统版本c.权限声明 和危险权限d.组件声明(Activity Service BroadcastReceive ContentProvider)
2)解析 AndroidManifest.xml 中的资源与配置
a.检查应用所需的最小内存、屏幕尺寸等硬件要求(<uses-feature>)。b.解析应用图标、启动 Activity(带 LAUNCHER 类型的 intent-filter)等信息,用于安装后展示。
4.检查权限和存储空间
系统会进行以下前置检查,决定是否允许安装:
1)权限验证
安装未知来源权限(Android 8.0+):若 APK 来自非应用商店(如本地文件),需用户手动授予“安装未知应用”权限(针对浏览器、文 件管理器等来源)。
危险权限预检查:APK 声明的危险权限(如相机、位置)会在安装时提示用户(部分系统会跳过此步骤,改为首次使用时请求)。
2)存储空间检查
检查设备存储(内部/外部)剩余空间是否足够容纳 APK 文件及其运行所需资源(如解压后的 dex、库文件)。
5.复制 APK 到目标位置
验证通过后,系统会将 APK 复制到 安装目录,安装位置由以下规则决定:
(1)默认位置:内部存储(/data/app)
路径示例:/data/app/<包名>-<随机字符串>/base.apk。
特点:
应用卸载时,此目录会被完全删除(包括数据和缓存)。
仅系统应用或拥有 INSTALL_PACKAGES 权限的应用可写入此目录。
(2)外部存储(/sdcard/Android/data/<包名>/app)
路径示例:/storage/emulated/0/Android/data/com.example.app/app/base.apk。
特点:
需用户授权(通过 )。
卸载应用时,此目录的 APK 文件会被删除,但应用私有数据(如 /data/data/<包名>)仍可能保留(取决于 APK 声明)。
6.生成应用私有数据目录
系统会为应用创建 私有数据目录,用于存储应用运行时的数据(如数据库、SharedPreferences、缓存等):
路径:/data/data/<包名>(内部存储)或 /storage/emulated/0/Android/data/<包名>(外部存储)。
子目录结构:
/data/data/com.example.app/
├─ databases/ # SQLite 数据库文件(如 app.db)
├─ shared_prefs/ # SharedPreferences 文件(XML 格式)
├─ files/ # 普通文件(通过 openFileOutput() 创建)
└─ cache/ # 缓存文件(系统可能清理)
安卓应用的安装流程是一个涉及 系统服务、文件操作、权限验证 的复杂过程,核心由系统级的 PackageManagerService(PMS)主导。以下从 用户触发安装 到 应用就绪可用 逐步骤拆解,结合系统组件(如 PMS、Installer)和应用文件(APK 结构)的协作逻辑,帮你彻底理解。
- 注册组件到系统
PMS 会将 APK 中声明的 四大组件(Activity、Service、BroadcastReceiver、ContentProvider) 注册到系统,以便其他应用或系统通过 Intent 调用:
Activity:注册后可通过 startActivity(Intent) 启动(需匹配 intent-filter)。
Service:注册后可通过 startService() 或 bindService() 调用。
BroadcastReceiver:注册后可通过 sendBroadcast(Intent) 触发。
ContentProvider:注册后可通过 ContentResolver 访问数据。
- 安装完成与通知
所有步骤完成后,系统会:
更新应用列表(如桌面添加应用图标)。
触发 ACTION_PACKAGE_ADDED 广播(其他应用可监听此广播感知新应用安装)。
提示用户安装成功(如弹出“应用已安装”提示)。