Android 各目录讲解: system_ext/priv-app/ 、/system/app 或 /system/priv-app 目录

134 阅读4分钟

Android 系统应用目录深度解析

在 Android 系统中,预装应用的存放位置直接决定了它们的权限等级运行特权系统行为。下面详细讲解这三个核心目录的区别。


📂 目录定义与核心区别

表格

复制

目录路径所属分区特权级别系统签名要求主要用途
/system/appsystem普通系统应用可选基础系统应用(计算器、日历等)
/system/priv-appsystem特权系统应用必须系统核心应用(Settings、SystemUI)
/system_ext/priv-appsystem_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 动态分区规范

添加新特权应用的正确步骤

  1. 签名: 使用平台密钥重新签名 APK

  2. 放置: 放入 /system_ext/priv-app/YourApp/YourApp.apk

  3. SELinux: 确保文件有正确的安全上下文

    bash

    复制

    chcon u:object_r:system_file:s0 YourApp.apk
    
  4. 权限声明: 在 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>
    

⚠️ 常见陷阱

  1. 权限缺失: 放在 priv-app 但未在 privapp-permissions.xml 中声明 → Still can't get privileged permission
  2. 签名错误: 使用错误签名 → 无法安装或权限不生效
  3. 路径错误: 直接放 apk 在 /priv-app 而非子目录 → 无法识别
  4. 分区混淆: 在 Android 10+ 误用 system 分区 → OTA 更新困难

📌 总结速查

  • 普通应用/system/app
  • 核心系统应用/system/priv-app + 平台签名
  • OEM/芯片厂商扩展/system_ext/priv-app + 平台签名

记住:特权 = 正确目录 + 平台签名 + 明确授权