安装流程总览:

用户触发安装->系统验证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 结构)的协作逻辑,帮你彻底理解。

  1. 注册组件到系统
    PMS 会将 APK 中声明的 ​​四大组件(Activity、Service、BroadcastReceiver、ContentProvider)​​ 注册到系统,以便其他应用或系统通过 Intent 调用:

​​Activity​​:注册后可通过 startActivity(Intent) 启动(需匹配 intent-filter)。
​​Service​​:注册后可通过 startService() 或 bindService() 调用。
​​BroadcastReceiver​​:注册后可通过 sendBroadcast(Intent) 触发。
​​ContentProvider​​:注册后可通过 ContentResolver 访问数据。

  1. 安装完成与通知
    所有步骤完成后,系统会:

更新应用列表(如桌面添加应用图标)。
触发 ACTION_PACKAGE_ADDED 广播(其他应用可监听此广播感知新应用安装)。
提示用户安装成功(如弹出“应用已安装”提示)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/91722.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/91722.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/91722.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于 Amazon Bedrock 与 Anthropic Claude 3 智能文档处理方案:从扫描件提取到数据入库全流程实践

基于 Amazon Bedrock 与 Anthropic Claude 3 智能文档处理方案&#xff1a;从扫描件提取到数据入库全流程实践 文章目录基于 Amazon Bedrock 与 Anthropic Claude 3 智能文档处理方案&#xff1a;从扫描件提取到数据入库全流程实践方案架构前提准备&#xff1a;亚马逊云科技注册…

深入浅出设计模式——创建型模式之单例模式 Singleton

文章目录“天上天下&#xff0c;唯我独尊”——单例模式单例模式简介单例模式结构饿汉式懒汉式客户端示例运行结果单例模式总结构建型模式 Creational Patterns 小结 Summary代码仓库“天上天下&#xff0c;唯我独尊”——单例模式 你能在电脑上调出两个Windows任务管理器吗&a…

静电释放检测漏报率↓85%!陌讯多模态融合算法在电子厂ESD防护实战解析

​摘要​​ 基于边缘计算的静电释放(ESD)视觉检测方案&#xff0c;通过多模态融合技术显著提升复杂场景鲁棒性。实测显示&#xff1a;在电子元件装配线上&#xff0c;ESD事件检测mAP0.5达89.1%&#xff0c;较基线模型提升28.3%。一、行业痛点&#xff1a;ESD检测的隐形危机根据…

RAL-2025 | “藏宝图”驱动的具身导航!HAM-Nav:基于手绘地图引导的机器人导航

作者&#xff1a;Aaron Hao Tan, Angus Fung, Haitong Wang, Goldie Nejat单位&#xff1a;多伦多大学机械与工业工程系论文标题&#xff1a;Mobile Robot Navigation Using Hand-Drawn Maps: A Vision Language Model Approach出版信息&#xff1a;IEEE ROBOTICS ANDAUTOMATI…

Vue.js 与后端技术结合开发指南

Vue.js 作为现代化的前端框架&#xff0c;可以与多种后端技术完美结合&#xff0c;构建全栈应用。下面我将详细介绍 Vue 可以与哪些后端技术结合开发&#xff0c;并提供可视化示例。Vue 可结合的后端技术概览主流组合方案对比后端技术适合场景优点缺点学习曲线Node.js全栈JavaS…

逻辑回归在银行贷款审批中的应用:参数选择与实践

目录 一、数据背景与预处理 1.数据前五行 2.数据预处理步骤 二、逻辑回归的正则化参数选择 1.交叉验证选择最优C 2.为什么选择召回率作为评估指标&#xff1f; 三、参数选择的核心结论 四、后续优化方向 在银行贷款审批场景中&#xff0c;准确判断贷款人是否符合贷款条…

数据结构前篇 - 深入解析数据结构之复杂度

目录一、数据结构前言1.1 数据结构1.2 算法二、算法效率2.1 复杂度的概念三、时间复杂度3.1 大O的渐进表示法3.2 时间复杂度计算示例3.2.1 示例13.2.2 示例23.2.3 示例33.2.4 示例43.2.5 示例53.2.6 示例63.2.7 示例7四、空间复杂度4.1 空间复杂度计算示例4.1.1 示例14.1.2 示例…

Master Prompt:AI时代的万能协作引擎

1. Master Prompt&#xff1a;为什么它正在重塑AI协作范式大模型落地的最大痛点不是技术本身&#xff0c;而是人机协作的断裂。当企业采购了昂贵的AI系统&#xff0c;却发现输出内容反复偏离预期&#xff0c;团队成员抱怨“AI总听不懂我要什么”&#xff0c;这种场景每天在无数…

《Kubernetes部署篇:基于Kylin V10+ARM架构CPU使用containerd部署K8S 1.33.3容器板集群(一主多从)》

总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:企业级K8s集群运维实战 一、架构图 如下图所示: 二、环境信息 基于x86_64+aarch64架构使用containerd部署K8S 1.33.3集群资源合集(一主多从) 2、部署规划 主机名 K8S版本 系统版本 CPU架构 内核版…

一次性接收大量上传图片,后端优化方式

文章目录1. 分块接收与流式处理2. 异步处理3. 内存映射与临时文件4. 数据库优化5. 缓存策略6. 压缩与格式优化7. 限流与并发控制8. 分布式存储9. 响应优化10. 监控与错误处理11. 数据库连接池优化1. 分块接收与流式处理 使用流式处理避免将所有图片加载到内存中&#xff1a; …

二分查找(基础)

竞赛中心 - 蓝桥云课 #include <iostream> #include<bits/stdc.h> using namespace std; #define int long long int N; struct NO {int A,B; }a[10001]; bool ok(int V) {for (int i 0; i < N; i){if (a[i].A / V ! a[i].B){return false;}}return true; } …

流式编程学习思路

流式编程学习思路 作为Java初级工程师,想要掌握流式编程并向高级工程师进阶,需要从基础到进阶逐步掌握,结合实战场景深化理解。以下是为你量身定制的学习清单和思路: 一、基础阶段:吃透 Java Stream 核心API 1. 掌握 Stream 的基本概念 什么是 Stream:理解它与集合(Co…

13-14linux三剑客grep,sed,awk

目录 三剑客支持扩展正则写法 grep命令 sed命令 sed指定行查找&#xff1a; sed模糊过滤文件内容 sed之删除&#xff1a; sed之替换&#xff1a; sed追加插入替换&#xff1a; sed后向引用&#xff1a; awk命令 awk按照行查找 awk模糊过滤文件内容 awk取列 awk指…

损失函数和调度器相关类代码回顾理解 |nn.CrossEntropyLoss\CosineAnnealingLR

目录 nn.CrossEntropyLoss CosineAnnealingLR nn.CrossEntropyLoss loss_func nn.CrossEntropyLoss(reduction"sum") 定义nn.CrossEntropyLoss交叉熵损失函数&#xff0c;reduction参数设置为"sum"&#xff0c;表示将所有样本的损失相加。reduction 参…

中国不同类型竹林分布数据

中国竹林分布的主要特点简介&#xff1a;总体分布格局&#xff1a;核心区域&#xff1a; 主要分布在长江流域及以南的广大亚热带和热带地区。北界&#xff1a; 大致以黄河流域为北界&#xff0c;但天然成片竹林在秦岭-淮河一线以南才比较普遍。人工引种或特殊小环境下&#xff…

Sqlserver备份恢复指南-完整备份恢复

博主会用简单清晰的方式&#xff0c;带你系统学习使用T-SQL命令行的方式 给SQL Server 做备份与恢复。我们按照从零开始、逐步深入的路线来讲解&#xff01; 完整备份恢复-差异增量备份恢复-事务日志备份恢复 &#x1f538; SQL Server 备份类型&#xff1a;类型说明完整备份&a…

AI 调酒师上岗!接管酒吧吧台

7月29日&#xff0c;马老师的 HHB 音乐酒吧在阿里巴巴西溪园区正式开业&#xff0c;开业这天迎来了一位神秘嘉宾“AI 调酒师”&#xff01; 这位 AI 调酒师不仅能根据你的MBTI、今日情绪、星座运势、江湖花名等为你特调一杯鸡尾酒&#xff0c;还能为这杯酒配上故事和诗文。 点…

【C++进阶】一文吃透静态绑定、动态绑定与多态底层机制(含虚函数、vptr、thunk、RTTI)

【C进阶】一文吃透静态绑定、动态绑定与多态底层机制&#xff08;含虚函数、vptr、thunk、RTTI&#xff09;作者&#xff1a;你的C教练 日期&#xff1a;2025-08-01目录 静态绑定 vs 动态绑定非虚函数的三大坑多态的四要素虚析构函数为什么必须写&#xff1f;探秘 vptr/vftable…

VUE基础知识2

1.计算属性&#xff1a;使用计算属性来描述依赖响应式状态的复杂逻辑。关键字computed:{}//计算属性&#xff0c;使用的时候和函数方法不一样&#xff0c;不需要加括号。简单来说就是模板方法的复杂逻辑放到了计算属性中去。2.计算属性缓存VS方法&#xff1a;计算属性值会基于其…

在PyCharm中将现有Gitee项目重新上传为全新项目

如果你想将当前本地的Gitee项目重新上传为一个全新的Gitee项目&#xff08;保留本地代码但断开与原仓库的关联&#xff09;&#xff0c;可以按照以下步骤操作&#xff1a; 删除旧的Git远程仓库关联 打开PyCharm&#xff0c;进入你的项目 点击顶部菜单 Git > Manage Remotes …