Android 系统应用目录深度解析
在 Android 系统中,预装应用的存放位置直接决定了它们的权限等级、运行特权和系统行为。下面详细讲解这三个核心目录的区别。
📂 目录定义与核心区别
表格
复制
| 目录路径 | 所属分区 | 特权级别 | 系统签名要求 | 主要用途 |
|---|---|---|---|---|
/system/app | system | 普通系统应用 | 可选 | 基础系统应用(计算器、日历等) |
/system/priv-app | system | 特权系统应用 | 必须 | 系统核心应用(Settings、SystemUI) |
/system_ext/priv-app | system_ext | 扩展特权应用 | 必须 | OEM/芯片厂商特权应用 |
🔍 详细特性对比
1. /system/app - 普通系统应用
特性:
-
权限: 只能访问标准系统 API,无法获取 signature-level 权限
-
签名: 可以用平台签名或普通签名
-
更新: 可通过 OTA 或用户手动更新(如果允许)
-
示例应用:
Calendar.apk(日历)Email.apk(邮件)Calculator.apk(计算器)
适用场景:
- 普通系统工具,不需要特殊权限
- 可被用户禁用/卸载(如果系统允许)
2. /system/priv-app - 特权系统应用
特性:
-
权限: 可访问 signature|privileged 级别权限
-
签名: 必须使用与系统 framework 相同的平台签名
-
更新: 只能通过 OTA 更新,用户无法卸载
-
示例应用:
Settings.apk(系统设置)SystemUI.apk(状态栏/导航栏)PackageInstaller.apk(包安装器)
关键机制:
xml
复制
<!-- 仅在 priv-app 中可用的权限示例 -->
<permission android:name="android.permission.WRITE_SECURE_SETTINGS"
android:protectionLevel="signature|privileged" />
适用场景:
- 需要修改全局系统设置
- 需访问受保护的核心系统服务
- 必须是系统不可缺失的组件
3. /system_ext/priv-app - 扩展分区特权应用
特性:
-
权限: 同
/system/priv-app的特权级别 -
签名: 需要平台签名
-
分区: 属于 system_ext 分区(从 Android 10 引入)
-
示例应用:
- OEM 定制的核心应用(如 OPPO 的 SystemUI 插件)
- 芯片厂商提供的系统服务(如 Qualcomm 的 QtiTelephony)
历史背景:
- Android 10 引入 动态分区 和 super 分区 概念
- 将 OEM 定制与原生 AOSP 系统分离,便于 OTA 更新
- system_ext 是 system 分区的 逻辑扩展,在运行时合并到 system
目录结构:
复制
/system_ext/
├── priv-app/ ← 特权应用
├── app/ ← 普通应用(较少使用)
├── etc/ ← 扩展配置
└── framework/ ← 扩展 framework jar
📜 分区架构演变
Android 9 及之前
复制
/system/
├── app/
├── priv-app/
└── framework/
Android 10+ (动态分区)
复制
super 分区 (物理)
├── system 分区 (逻辑)
│ ├── app/
│ ├── priv-app/
│ └── framework/
├── system_ext 分区 (逻辑) ← 新增
│ ├── priv-app/
│ └── framework/
└── product 分区 (逻辑) ← 新增
└── priv-app/
优势:
- 解耦: OEM 定制与 AOSP 源码分离
- OTA 效率: 可独立更新 system_ext 而不动 system
- 模块化: 符合 Project Treble 的模块化设计
🎯 实际应用示例
典型的 /system/priv-app 应用
bash
复制
adb shell ls /system/priv-app/
Settings/ # 系统设置(核心权限)
SystemUI/ # 状态栏(MODIFY_PHONE_STATE 等)
PackageInstaller/ # 应用安装器(INSTALL_PACKAGES)
Shell/ # adb shell 交互
PermissionController/ # 权限管理
典型的 /system_ext/priv-app 应用
bash
复制
adb shell ls /system_ext/priv-app/
OplusSystemUI/ # OPPO 定制的 SystemUI 扩展
QtiSystemService/ # Qualcomm 系统服务
GooglePermissionController/ # Google 权限控制(GApps)
🔐 安全机制详解
权限提升流程
Mermaid
全屏
下载
复制
代码预览
是
否
签名匹配
签名不匹配
应用安装是否在 priv-app?验证签名普通权限授予 privileged 权限安装失败
签名验证
bash
复制
# 验证应用签名
adb shell dumpsys package com.android.settings | grep signatures
# 对比 framework 签名
adb shell dumpsys package android | grep signatures
必须完全一致,否则即使放在 priv-app 也无法获得特权!
🛠️ 开发与定制建议
ROM 开发时如何选择目录?
表格
复制
| 应用类型 | 推荐目录 | 理由 |
|---|---|---|
| 纯 AOSP 核心应用 | /system/priv-app | 原生系统不可分割部分 |
| OEM 定制核心功能 | /system_ext/priv-app | 保持与 AOSP 分离 |
| 第三方系统应用 | /system/app | 无特殊权限需求 |
| GApps 核心套件 | /system_ext/priv-app | 遵循 Google 动态分区规范 |
添加新特权应用的正确步骤
-
签名: 使用平台密钥重新签名 APK
-
放置: 放入
/system_ext/priv-app/YourApp/YourApp.apk -
SELinux: 确保文件有正确的安全上下文
bash
复制
chcon u:object_r:system_file:s0 YourApp.apk -
权限声明: 在
privapp-permissions.xml中明确授权xml
复制
<!-- /system_ext/etc/permissions/privapp-permissions-oem.xml --> <permissions> <privapp-permissions package="com.oem.specialapp"> <permission name="android.permission.WRITE_SECURE_SETTINGS"/> </privapp-permissions> </permissions>
⚠️ 常见陷阱
- 权限缺失: 放在 priv-app 但未在
privapp-permissions.xml中声明 → Still can't get privileged permission - 签名错误: 使用错误签名 → 无法安装或权限不生效
- 路径错误: 直接放 apk 在
/priv-app而非子目录 → 无法识别 - 分区混淆: 在 Android 10+ 误用 system 分区 → OTA 更新困难
📌 总结速查
- 普通应用 →
/system/app - 核心系统应用 →
/system/priv-app+ 平台签名 - OEM/芯片厂商扩展 →
/system_ext/priv-app+ 平台签名
记住:特权 = 正确目录 + 平台签名 + 明确授权