Android16 系统 APEX 模块说明
文章目录
- [Android16 系统 APEX 模块说明](#Android16 系统 APEX 模块说明)
一、前言
从 Android 10 开始,Google 引入 APEX(Android Pony EXpress)格式对系统核心组件进行模块化打包。
到了 Android 16,蓝牙、WiFi、ART、媒体等核心模块都以 APEX 形式存放在 /system/apex/ 目录,
不再是传统的 /system/priv-app/ 或 /system/framework/ 下的独立文件。
APEX 的好处是支持 Mainline 独立更新,但对开发调试带来了变化:
不能像以前那样直接 push 单个 APK/jar/so,需要替换整个 APEX 容器。
本文以实际产品 akee 的编译产物为例,说明设备上每个 APEX 文件的作用、对应源码路径,以及最简调试替换方法。
二、APEX 模块功能与源码路径对照表
以下是 out/target/product/akee/system/apex/ 目录下所有 APEX 文件:
| APEX 文件名 | 模块说明 | 功能 | 源码路径 |
|---|---|---|---|
com.android.adbd.apex |
ADB 守护进程 | adbd 服务,USB/网络调试连接 | packages/modules/adb/ |
com.android.adservices.apex |
广告服务 | Topics、Measurement、FLEDGE 等隐私广告 API | packages/modules/AdServices/ |
com.android.apex.cts.shim.apex |
CTS 兼容垫片 | CTS 测试兼容层,无实际功能代码 | system/apex/cts/shim/ |
com.android.appsearch.apex |
应用搜索 | AppSearch 本地全文搜索引擎 | packages/modules/AppSearch/ |
com.android.art.apex |
ART 运行时 | Java 运行时、libart、dex2oat、libcore | art/、libcore/ |
com.android.bt.apex |
蓝牙 | Bluetooth.apk、libbluetooth_jni.so、蓝牙协议栈 | packages/modules/Bluetooth/ |
com.android.configinfrastructure.apex |
配置基础设施 | 设备配置推送、Feature Flags 管理 | packages/modules/ConfigInfrastructure/ |
com.android.conscrypt.apex |
加密库 | TLS/SSL、BoringSSL、加密算法提供者 | external/conscrypt/ |
com.android.crashrecovery.apex |
崩溃恢复 | 系统崩溃检测与自动恢复 | packages/modules/CrashRecovery/ |
com.android.devicelock.apex |
设备锁 | 设备租赁/分期付款场景锁机控制 | packages/modules/DeviceLock/ |
com.android.extservices.apex |
扩展服务 | WallpaperManager、TextClassifier、SpellChecker 等 | packages/modules/ExtServices/ |
com.android.healthfitness.apex |
健康健身 | HealthConnect 统一运动健康数据管理 | packages/modules/HealthFitness/ |
com.android.i18n.apex |
国际化 | ICU 库、Unicode、日期/数字格式化 | external/icu/、packages/modules/I18n/ |
com.android.ipsec.apex |
IPsec | IKEv2/VPN 守护进程和安全库 | packages/modules/IPsec/ |
com.android.media.apex |
媒体框架 | mediaserver、codec、extractor 框架 | frameworks/av/、packages/modules/Media/ |
com.android.media.swcodec.apex |
软件编解码器 | 软编解码库(libstagefright_soft_*.so) | frameworks/av/media/module/codecs/ |
com.android.mediaprovider.apex |
媒体提供器 | MediaProvider、媒体数据库、Storage Access Framework | packages/modules/MediaProvider/ |
com.android.neuralnetworks.apex |
神经网络 | NNAPI 运行时和驱动适配层,ML 推理加速 | packages/modules/NeuralNetworks/ |
com.android.nfcservices.apex |
NFC 服务 | NFC 系统服务和应用 | packages/modules/Nfc/ |
com.android.ondevicepersonalization.apex |
端侧个性化 | ODP 联邦学习/本地推理隐私服务 | packages/modules/OnDevicePersonalization/ |
com.android.os.statsd.apex |
系统统计 | statsd 守护进程、系统指标和电池统计 | frameworks/base/cmds/statsd/ |
com.android.permission.apex |
权限控制器 | PermissionController、运行时权限、隐私指示器 | packages/modules/Permission/ |
com.android.profiling.apex |
性能分析 | 系统级性能数据采集服务 | packages/modules/Profiling/ |
com.android.resolv.apex |
DNS 解析 | DNS resolver 守护进程、DNS over TLS | packages/modules/DnsResolver/ |
com.android.rkpd.apex |
远程密钥配置 | Remote Key Provisioning 服务,KeyMint 证书管理 | packages/modules/RemoteKeyProvisioning/ |
com.android.runtime.apex |
运行时基础 | bionic linker、基础运行时环境 | bionic/、system/core/、system/apex/runtime/ |
com.android.scheduling.apex |
任务调度 | 后台任务调度优化服务 | packages/modules/Scheduling/ |
com.android.sdkext.apex |
SDK 扩展 | SDK Extensions,不升级系统即可扩展 API level | packages/modules/SdkExtensions/ |
com.android.tzdata.apex |
时区数据 | 时区数据库(tzdb),可独立更新 | system/timezone/ |
com.android.uprobestats.apex |
Uprobe 统计 | uprobe 性能统计守护进程 | system/extras/uprobestats/ |
com.android.uwb.apex |
超宽带 | UWB/FiRa 协议栈,高精度测距 | packages/modules/Uwb/ |
com.android.virt.apex |
虚拟化 | AVF 虚拟化框架、pKVM、Microdroid | packages/modules/Virtualization/ |
com.android.wifi.apex |
WiFi | WifiStack APK、wificond、WiFi native 库 | packages/modules/Wifi/ |
com.amlogic.mediaextractor.apex |
Amlogic 媒体提取器 | 晶晨厂商定制音视频容器解封装器 | vendor/amlogic/ 或 hardware/amlogic/media/ |
三、按功能分类
核心运行时(系统启动必须)
| 模块 | 作用 |
|---|---|
com.android.art / com.android.runtime |
Java/Kotlin 运行环境 |
com.android.i18n |
国际化 ICU 库 |
com.android.tzdata |
时区数据 |
com.android.conscrypt |
TLS/SSL 加密 |
com.android.sdkext |
SDK 扩展 |
连接类(与蓝牙类似,常用)
| 模块 | 作用 |
|---|---|
com.android.bt |
蓝牙 |
com.android.wifi |
WiFi |
com.android.uwb |
UWB 超宽带 |
com.android.nfcservices |
NFC |
com.android.ipsec |
VPN/IPsec |
com.android.resolv |
DNS 解析 |
媒体类
| 模块 | 作用 |
|---|---|
com.android.media |
媒体框架 |
com.android.media.swcodec |
软件编解码器 |
com.android.mediaprovider |
媒体库 |
com.amlogic.mediaextractor |
Amlogic 定制解封装 |
安全/隐私类
| 模块 | 作用 |
|---|---|
com.android.permission |
权限管理 |
com.android.rkpd |
密钥配置 |
com.android.devicelock |
设备锁 |
com.android.adservices |
广告隐私 |
com.android.ondevicepersonalization |
端侧个性化 |
系统服务/工具类
| 模块 | 作用 |
|---|---|
com.android.adbd |
ADB 调试 |
com.android.os.statsd |
系统统计 |
com.android.extservices |
扩展服务 |
com.android.appsearch |
应用搜索 |
com.android.healthfitness |
健康数据 |
com.android.virt |
虚拟化 |
com.android.neuralnetworks |
ML 推理 |
四、APEX 文件格式说明
1、.apex 与 .capex 的区别
| 格式 | 说明 | 特点 |
|---|---|---|
.apex |
未压缩 APEX | 直接 loop 挂载,无需解压,占用 system 空间较大 |
.capex |
Compressed APEX(压缩) | 开机时由 apexd 解压到 /data/apex/decompressed/,节省 system 空间 |
2、控制编译输出格式
默认可能输出 .capex,如需输出 .apex:
bash
# 强制输出未压缩的 .apex
export OVERRIDE_PRODUCT_COMPRESSED_APEX=false
m com.android.bt
# 产物:out/target/product/XXX/system/apex/com.android.bt.apex
如果不设置则默认:
bash
m com.android.bt
# 产物:out/target/product/XXX/system/apex/com.android.bt.capex
⚠️ 替换时文件扩展名必须与设备
/system/apex/下原有文件一致,不能直接改名互换。
五、简要调试说明
方法一:adb install --apex --staged(最简,推荐)
两条命令搞定,不需要 disable-verity、不需要 remount、失败自动回滚:
bash
# 1. 编译对应模块(以蓝牙为例)
m com.android.bt
# 2. 以 staged 方式安装(下次重启生效)
adb install --apex --staged out/target/product/akee/system/apex/com.android.bt.apex
# 3. 重启
adb reboot
其他模块同理,把模块名换掉即可:
bash
# WiFi
m com.android.wifi
adb install --apex --staged out/target/product/akee/system/apex/com.android.wifi.apex
# ART
m com.android.art
adb install --apex --staged out/target/product/akee/system/apex/com.android.art.apex
回滚到系统版本:
bash
adb uninstall --apex com.android.bt
adb reboot
方法二:直接 push 到 /system/apex/(需要 root)
bash
adb root
adb disable-verity # 首次需要,之后重启
adb reboot
adb root
adb remount
# 备份
adb shell cp /system/apex/com.android.bt.apex /data/local/tmp/
# 推送
adb push out/target/product/akee/system/apex/com.android.bt.apex /system/apex/
# 修复权限
adb shell chmod 644 /system/apex/com.android.bt.apex
adb shell restorecon /system/apex/com.android.bt.apex
# 清缓存重启
adb shell rm -rf /data/apex/active/com.android.bt*
adb shell rm -rf /data/apex/decompressed/com.android.bt*
adb reboot
首先要确认系统使用的是apex文件,有些系统也可能使用capex文件,就要用capex文件替换。
验证生效
bash
# 查看 APEX 是否激活
adb shell
dumpsys package com.android.bluetooth | grep -E "version|path"
# 查看 APK 路径
adb shell pm path com.android.bluetooth
# 查看 apexd 加载日志
adb logcat -s apexd *:S
常用编译命令
bash
m com.android.bt # 蓝牙
m com.android.wifi # WiFi
m com.android.art # ART
m com.android.media # 媒体
m Bluetooth # 只编译蓝牙 APK(不能单独安装)
六、注意事项
- 不要直接
adb installAPEX 内的 APK。APEX 内的 APK 依赖同 APEX 内的 JNI 库、jar 包和配置文件,单独安装会导致系统服务启动失败。 - 替换整个 APEX,不要尝试只替换 APEX 内部的某个文件(apk/so/jar),否则签名和 dm-verity 校验失败。
- 使用
adb install --apex --staged最安全 ,系统会自动备份旧版本,新版本有问题自动回滚,不会变砖。
install 后一定要重启,不然无法生效,并且不支持install两次。 - 厂商定制 APEX (如
com.amlogic.mediaextractor)不在 AOSP 的packages/modules/下,需要到vendor/或hardware/目录查找源码。
PS
生活其实并不难,只是很多人没找到自己的那片土地。