Android16 系统 APEX 模块调试总结
### 文章目录
- [Android16 系统 APEX 模块调试总结](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [@toc](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [一、前言](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [二、APEX 基础概念](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [1、什么是 APEX](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [2、APEX 与传统 system 分区的区别](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [3、为什么不能直接安装 APEX 内的 APK](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [三、APEX 编译产物路径](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [1、中间产物路径(已验证可用)](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [2、最终 system 分区路径](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [3、Soong 单独编译输出路径](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [4、APEX 解包后的 APK 路径(仅供参考,不要直接安装)](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [5、编译命令速查](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [6、控制输出格式:.apex 还是 .capex](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [默认行为(.capex)](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [强制输出 .apex(未压缩)](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [两种格式对比](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [注意事项](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [四、APEX 模块替换流程](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [方案选择](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [方案一:`adb install --apex --staged`(最简,官方推荐)](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [完整流程(两条命令搞定)](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [工作原理](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [优点](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [前提条件](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [验证生效](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [回滚到系统预装版本](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [方案二:`adb push` 到 `/system/apex/`(手动替换)](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [前置条件](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [标准流程(蓝牙模块的举例)](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [关键命令说明](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [方案三:解包 APEX 替换内部文件后重打包](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [大致流程](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [五、验证替换是否生效](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [六、常见踩坑点](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [1、文件扩展名不匹配(.apex vs .capex)](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [2、未清除 APEX 缓存导致旧版本仍在运行](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [3、AVB / dm-verity 验证失败卡开机](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [4、SELinux 权限问题](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [5、Java 代码生效但 native 崩溃](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [6、`adb install --apex` 提示签名不匹配](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [7、Windows 环境下路径和换行问题](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [七、APEX 内部结构与解包查看](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [在 Linux/WSL 中查看](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [验证 APK 内的 dex 是否包含你的代码](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [查看 APEX manifest](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [八、日志与调试](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [1、apexd 守护进程日志](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [2、蓝牙相关日志](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [3、在代码中添加易过滤的调试日志](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [4、崩溃与 ANR](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [九、常见 APEX 模块与编译命令](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [十、失败回退方案](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [回退等级 1:能进 adb(半砖)](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [回退等级 2:完全无法进 adb(真砖)](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [十一、术语总结](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS) - [PS](#文章目录 Android16 系统 APEX 模块调试总结 @[toc] 一、前言 二、APEX 基础概念 1、什么是 APEX 2、APEX 与传统 system 分区的区别 3、为什么不能直接安装 APEX 内的 APK 三、APEX 编译产物路径 1、中间产物路径(已验证可用) 2、最终 system 分区路径 3、Soong 单独编译输出路径 4、APEX 解包后的 APK 路径(仅供参考,不要直接安装) 5、编译命令速查 6、控制输出格式:.apex 还是 .capex 默认行为(.capex) 强制输出 .apex(未压缩) 两种格式对比 注意事项 四、APEX 模块替换流程 方案选择 方案一:
adb install --apex --staged(最简,官方推荐) 完整流程(两条命令搞定) 工作原理 优点 前提条件 验证生效 回滚到系统预装版本 方案二:adb push到/system/apex/(手动替换) 前置条件 标准流程(蓝牙模块的举例) 关键命令说明 方案三:解包 APEX 替换内部文件后重打包 大致流程 五、验证替换是否生效 六、常见踩坑点 1、文件扩展名不匹配(.apex vs .capex) 2、未清除 APEX 缓存导致旧版本仍在运行 3、AVB / dm-verity 验证失败卡开机 4、SELinux 权限问题 5、Java 代码生效但 native 崩溃 6、adb install --apex提示签名不匹配 7、Windows 环境下路径和换行问题 七、APEX 内部结构与解包查看 在 Linux/WSL 中查看 验证 APK 内的 dex 是否包含你的代码 查看 APEX manifest 八、日志与调试 1、apexd 守护进程日志 2、蓝牙相关日志 3、在代码中添加易过滤的调试日志 4、崩溃与 ANR 九、常见 APEX 模块与编译命令 十、失败回退方案 回退等级 1:能进 adb(半砖) 回退等级 2:完全无法进 adb(真砖) 十一、术语总结 PS)
一、前言
之前分析研究了蓝牙 apex的调试,现在简要分享一下系统其他apex知识。
从 Android 10 开始,Google 引入了 APEX(Android Pony EXpress) 格式,用于将核心系统组件模块化打包,支持通过 Google Play 系统更新(Mainline)独立升级,而不依赖完整 OTA。
到了 Android 16,大量系统核心模块都已经 APEX 化,典型的有:
com.android.bt(蓝牙)com.android.wifi(WiFi)com.android.runtime/com.android.art(ART 虚拟机)com.android.media(媒体框架)com.android.conscrypt(加密库)com.android.tzdata(时区数据)com.android.permission(权限控制器)com.android.os.statsd(系统统计)com.android.i18n(国际化 ICU)com.android.neuralnetworks(NNAPI)
这些模块编译后不再是单独的 APK 或 JAR 放在 /system/ 下 ,而是被打包成一个 .apex 或 .capex 容器,放在 /system/apex/ 目录。
设备启动时由 apexd 守护进程挂载为只读 loop 设备后,应用和服务才能访问其中的代码和资源。
这带来一个明显的开发调试痛点:
修改代码后,无法像旧版本那样直接
adb push一个 APK/JAR/SO 到/system/就生效,直接adb install Bluetooth.apk还会导致系统启动失败。
本文系统总结 APEX 模块的文件结构、编译产物路径、三种替换方案(重点推荐 adb install --apex --staged)、
常见坑点、日志调试、回退策略和常用命令,适用于蓝牙、WiFi 等所有 APEX 模块的开发调试。
如果不想看背景知识,直接跳到 第四章【推荐:最简替换流程】 即可。
二、APEX 基础概念
1、什么是 APEX
APEX 是一种容器格式,文件后缀通常为 .apex(未压缩)或 .capex(compressed,压缩)。它本质上是一个 ZIP 文件,内部包含:
com.android.bt.apex(ZIP 容器)
├── apex_manifest.json # APEX 清单(name/version 等)
├── apex_pubkey # APEX 签名公钥
├── META-INF/ # APEX 整体签名
│ ├── CERT.SF
│ ├── MANIFEST.MF
│ └── ...
└── apex_payload.img # ext4 镜像(真正的文件内容)
├── app/ # APK 文件(如 Bluetooth.apk)
├── lib64/ # native so 库
├── javalib/ # framework/service jar
├── etc/ # 配置文件
└── bin/ # 可执行文件
关键点:apex_payload.img 是一个 ext4 文件系统镜像,它同时带有 AVB(Android Verified Boot)签名和 dm-verity 哈希树,保证文件系统中任何字节的修改都会被检测到。
2、APEX 与传统 system 分区的区别
| 特性 | 传统 /system/priv-app/ |
APEX(/system/apex/) |
|---|---|---|
| 文件格式 | 直接 APK/JAR/SO | .apex/.capex 容器(内含 ext4 镜像) |
| 加载方式 | 文件系统直接读取 | apexd 开机时挂载为只读 loop 设备到 /apex/<name>@<ver>/ |
| 签名验证 | APK 自身签名 | APEX 容器签名 + AVB 签名 + dm-verity 三层校验 |
| 替换方式 | adb push 即可 |
必须替换整个 APEX 容器,或使用 adb install --apex |
| 内部依赖 | APK 自带或系统共享库 | APK、JNI 库、JAR、配置文件打包在一起,自包含 |
| 版本管理 | 跟随 system 镜像 | 独立 versionCode,支持回滚 |
| 更新方式 | OTA 刷 system 分区 | Mainline/OTA 或 adb install --apex --staged |
3、为什么不能直接安装 APEX 内的 APK
以蓝牙 Bluetooth.apk 为例,直接 adb install 会导致系统启动失败,原因有三:
① JNI/native 库路径问题
APEX 内的 libbluetooth_jni.so、libbluetooth_gd.so、libbt-stack.so 等只在 APEX 挂载路径(/apex/com.android.bt@version/lib64/)下可用,普通安装的 APK 在 /data/app/ 下找不到这些库,也没有权限加载平台私有 native API。
② classpath fragment 依赖
APEX 内的 framework-bluetooth.jar 通过 bootclasspath_fragment 在开机阶段加入 boot classpath,service-bluetooth.jar 通过 systemserverclasspath_fragment 加入 SystemServer classpath。普通安装的 APK 不会触发这些 fragment 加载,相关 framework 类全部找不到。
③ 签名、SELinux 域与特权权限
APEX 内的 APK 使用模块专属证书签名,运行在独立的 SELinux 域(如 bluetooth 域),并且由 APEX 内的 privapp_allowlist XML 授予特权权限。普通安装会被分配为 untrusted_app 域,缺失所有特权权限,服务无法启动。
❌ 结论:不要尝试直接
adb installAPEX 内的 APK。必须替换整个 APEX。
三、APEX 编译产物路径
以产品名 akee、模块 com.android.bt 为例,编译后会在多个目录看到 APEX 文件,不要混淆。
1、中间产物路径(已验证可用)
out/target/product/akee/obj/PACKAGING/target_files_intermediates/akee_arm64-target_files/SYSTEM/apex/com.android.bt.apex
这是 target-files-package 组装过程中的目录,用于生成 OTA 包。
这里的文件是完整、签名好的,可以直接用于替换。
2、最终 system 分区路径
out/target/product/akee/system/apex/com.android.bt.apex
最终会被打包进 system.img,对应设备上的 /system/apex/ 目录。
3、Soong 单独编译输出路径
执行 m com.android.bt 后:
out/soong/.intermediates/packages/modules/Bluetooth/apex/com.android.bt/android_common/com.android.bt.apex
4、APEX 解包后的 APK 路径(仅供参考,不要直接安装)
out/target/product/akee/apex/com.android.bt/app/Bluetooth@<version>/Bluetooth.apk
⚠️ 这是 APEX 构建过程中解包状态的 APK,用于装入 APEX 容器,不能独立安装运行。
5、编译命令速查
bash
# 编译整个 APEX(推荐)
m com.android.bt
# 只编译 APEX 内的 APK(用于快速验证编译错误,但不能直接安装)
m Bluetooth
# 编译所有 APEX(不推荐,耗时)
m apex
6、控制输出格式:.apex 还是 .capex
Android 构建系统默认可能生成压缩 APEX(.capex) ,这由源码配置中的 PRODUCT_COMPRESSED_APEX 决定。如果需要输出未压缩的 .apex 文件,可以通过环境变量临时覆盖。
默认行为(.capex)
不做任何设置直接编译:
bash
m com.android.bt
产物路径:
out/target/product/akee/system/apex/com.android.bt.capex
强制输出 .apex(未压缩)
在编译前导出环境变量 OVERRIDE_PRODUCT_COMPRESSED_APEX=false:
bash
export OVERRIDE_PRODUCT_COMPRESSED_APEX=false
m com.android.bt
设置后产物路径:
out/target/product/akee/system/apex/com.android.bt.apex
有时候需要把out相关文件删除才能重新生成apex文件。
两种格式对比
| 格式 | 环境变量设置 | 产物大小 | 设备端处理 | 适用场景 |
|---|---|---|---|---|
.capex(默认) |
不设置或 true |
较小(压缩) | 开机时由 apexd 解压到 /data/apex/decompressed/ |
正式版本、user 版本,节省 system 分区空间 |
.apex |
export OVERRIDE_PRODUCT_COMPRESSED_APEX=false |
较大(未压缩) | 直接 loop 挂载,无需解压 | 调试开发、设备使用未压缩 APEX 时 |
注意事项
-
⚠️ 替换时扩展名必须与设备
/system/apex/下已有文件一致。设备上是
.apex就只能替换.apex,是.capex就替换.capex,不能直接改名互换。 -
如果设备上只有
.capex,而你想用adb install --apex --staged安装.apex,通常也是可以的(
adb install支持两种格式),但 push 到/system/apex/时必须保持扩展名一致。 -
该环境变量是全局生效的,设置后所有 APEX 模块都会输出对应格式。
-
如果想永久修改产品默认输出格式,可以在产品的
.mk文件中设置:makefilePRODUCT_COMPRESSED_APEX := false
四、APEX 模块替换流程
方案选择
| 方案 | 是否需要 disable-verity | 是否需要 remount | 是否需要备份 | 复杂度 | 稳定性 | 推荐度 |
|---|---|---|---|---|---|---|
① adb install --apex --staged |
❌ 不需要 | ❌ 不需要 | ❌ 自动回滚 | 极简 | 高 | ⭐⭐⭐⭐⭐ |
② adb push 到 /system/apex/ |
✅ 需要 | ✅ 需要 | ✅ 必须手动备份 | 中等 | 中 | ⭐⭐⭐ |
| ③ 解包重打包 APEX | 视情况 | 视情况 | ✅ 必须 | 复杂 | 低 | ⭐⭐ |
下面详细说明。
方案一:adb install --apex --staged(最简,官方推荐)
这是 Android 官方提供的 APEX 安装方式,也是最省心、最不容易变砖的方法。
完整流程(两条命令搞定)
bash
# 1. 编译
m com.android.bt
# 2. 找到产物(.apex 或 .capex 都可以,install 命令都支持)
# 例如:out/target/product/akee/system/apex/com.android.bt.apex
# 3. 以 staged 方式安装 APEX(写入 /data/apex,下次重启生效)
adb install --apex --staged out/target/product/akee/system/apex/com.android.bt.apex
# 成功输出:Success
# 4. 重启(重启时 apexd 原子化激活新 APEX)
adb reboot
工作原理
--staged表示暂存安装 :APEX 先被写入/data/apex/staged/,不立即生效。- 下次开机时,
apexd在 init 早期阶段校验 staged APEX 的签名和完整性。 - 校验通过 → 激活新版本,旧版本保留在
/data/apex/active/作为回滚备份。 - 校验失败 → 自动回滚到上一个可用版本,设备正常启动,不会变砖。
优点
- 不需要
disable-verity,不修改 system 分区。 - 不需要
adb remount,不需要 root 写 system 权限(需要 userdebug/eng 的 root 用于安装,但这是 adb install 本身的权限)。 - 不需要手动备份,系统自动保留上一版本用于回滚。
- 不需要手动 chmod/restorecon/清缓存,全部由 apexd 自动处理。
- 签名不匹配/文件损坏会自动拒绝,不会卡开机。
前提条件
- adb/platform-tools 版本要足够新,支持
--apex参数(SDK 30+ 的 platform-tools 基本都支持)。如果提示--apex不识别,升级 platform-tools。 - APEX 文件必须使用设备接受的密钥签名。自己源码树编译出的 APEX 使用
com.android.bt.pem等模块专属密钥,与系统镜像匹配,没问题。 - 构建类型建议为
userdebug或eng。
验证生效
bash
# 查看 APEX 版本号和路径
adb shell pm list apexes com.android.bt //这个试过是没用的
adb shell //下面这个命令是可以的
dumpsys package com.android.bluetooth | grep -E "version|path"
# 查看 APK 实际加载路径
adb shell pm path com.android.bluetooth
# 查看 APEX 挂载信息
adb shell
mount | grep com.android.bt
# 功能测试 + logcat
adb logcat -s BluetoothAdapter BluetoothService BluetoothOpp
回滚到系统预装版本
bash
# 卸载通过 adb install 安装的 APEX 更新(回到 /system/apex 中的版本)
adb uninstall --apex com.android.bt
adb reboot
方案二:adb push 到 /system/apex/(手动替换)
适用于:需要替换系统分区中的原始 APEX、或者设备不支持 staged install(低版本安装失败) 的场景。
前置条件
| 检查项 | 要求 | 命令 |
|---|---|---|
| 构建类型 | userdebug 或 eng | adb shell getprop ro.build.type |
| root 权限 | 可获取 root | adb root |
| verity | 已禁用(首次) | adb disable-verity 后重启 |
| 扩展名 | 与设备一致 | `adb shell ls /system/apex/ |
标准流程(蓝牙模块的举例)
bash
# ===== 首次准备:禁用 verity 并重启 ===== (参考命令)
adb root
adb disable-verity
adb reboot
adb wait-for-device
adb root
adb remount
# ===== 每次修改代码后的替换流程 =====
# 1. 编译
m com.android.bt
# 2. 确认扩展名是 .apex 还是 .capex
adb shell ls -la /system/apex/ | grep bluetooth
# 3. 备份原文件(可选)
adb shell cp /system/apex/com.android.bt.apex /data/local/tmp/bt-backup.apex
# 4. 推送新 APEX
adb push out/target/product/akee/system/apex/com.android.bt.apex /system/apex/
# 5. 修复权限和 SELinux 上下文(可选)
adb shell chmod 644 /system/apex/com.android.bt.apex
adb shell restorecon /system/apex/com.android.bt.apex
# 6. 清除 APEX 缓存(可选)
adb shell rm -rf /data/apex/active/com.android.bt*
adb shell rm -rf /data/apex/decompressed/com.android.bt*
# 7. 重启
adb reboot
关键命令说明
| 命令 | 作用 |
|---|---|
adb disable-verity |
禁用 dm-verity,否则修改 system 分区后无法开机 |
adb remount |
将 system/vendor 等分区重新挂载为可写(底层基于 overlayfs) |
chmod 644 |
确保文件权限正确(owner 可写,其他可读) |
restorecon |
恢复 SELinux 安全上下文,否则 apexd 可能无法读取 |
rm -rf /data/apex/active/ |
清除激活记录,强制 apexd 重新加载新版本 |
方案三:解包 APEX 替换内部文件后重打包
不推荐日常使用,仅适用于:没有完整编译环境、只有 APEX 文件、需要小改内部资源/配置的场景。
需要 Linux/WSL 环境,使用 deapexer、debugfs、apexer、avbtool 等工具。
大致流程
bash
# 1. 解包 APEX(deapexer 在 AOSP 的 system/tools/apex/ 下)
deapexer extract com.android.bt.apex ./bt_unpacked
# 2. 查看内部结构
ls ./bt_unpacked/
# apex_payload.img
# apex_pubkey
# etc/
# 3. 使用 debugfs 或挂载方式修改 apex_payload.img
mkdir mnt
sudo mount -o loop bt_unpacked/apex_payload.img mnt/
# 替换 mnt/app/Bluetooth/Bluetooth.apk 等文件
sudo umount mnt
# 4. 重新对 apex_payload.img 做 AVB 签名(需要对应密钥)
avbtool add_hashtree_footer \
--image bt_unpacked/apex_payload.img \
--partition_name apex \
--key com.android.bt.key \
--algorithm SHA256_RSA4096
# 5. 使用 apexer 重新打包并签名
apexer --manifest bt_unpacked/apex_manifest.json \
--pubkey com.android.bt.avbpubkey \
--private_key com.android.bt.pem \
--payload bt_unpacked/apex_payload.img \
--output com.android.bt-patched.apex
上面的命令可能无效,仅供参考。
⚠️ 此方法非常容易出错:AVB 哈希、签名、文件权限、SELinux xattr 任何一个不对都会导致 apexd 拒绝加载。除非必须,否则请使用方案一。
五、验证替换是否生效
重启后,按以下顺序确认新版本是否真正被加载:
bash
# 1. 确认 APEX 版本和状态
adb shell
dumpsys package com.android.bluetooth | grep -E "version|path"
# 2. 确认 APK 加载路径
adb shell pm path com.android.bluetooth
# 示例:package:/apex/com.android.bt@1/app/Bluetooth/Bluetooth.apk
# 3. 查看包信息(版本、更新时间)
adb shell dumpsys package com.android.bluetooth | grep -E "versionCode|versionName|lastUpdateTime|codePath"
# 4. 查看 APEX 挂载点
adb shell mount | grep com.android.bt
# 应能看到 /dev/block/loopX 挂载到 /apex/com.android.bt@...
# 5. 查看日志中你自己添加的标记
adb shell
logcat | grep -iE "your_debug_tag|XXX"
✅ 生效标志 :pm path 显示新版本路径,且功能表现符合预期。
六、常见踩坑点
1、文件扩展名不匹配(.apex vs .capex)
⚠️ 症状 :替换后重启,蓝牙/WiFi 不启动,logcat -s apexd 显示 Can't open APEX file 或 Invalid APEX。
原因:
.apex是未压缩格式;.capex是压缩格式,由 apexd 在开机时解压到/data/apex/decompressed/。- 两者不是简单改扩展名就能互换的,内部封装和签名方式不同。
- 设备
/system/apex/下原来是什么扩展名,就必须替换成对应格式。
解决:
bash
adb shell ls /system/apex/ | grep com.android.bt
# 看到 .apex 就 push .apex;看到 .capex 就 push .capex
2、未清除 APEX 缓存导致旧版本仍在运行
⚠️ 症状:明明 push 了新文件,重启后行为还是旧的。
原因 :apexd 在 /data/apex/active/ 和 /data/apex/decompressed/ 中保留了激活记录和解压缓存,版本号未变时可能继续使用缓存。
解决:
bash
adb shell rm -rf /data/apex/active/com.android.bt*
adb shell rm -rf /data/apex/decompressed/com.android.bt*
3、AVB / dm-verity 验证失败卡开机
⚠️ 症状:重启后卡在开机动画,或进入 recovery。
原因:
- 方案二替换时没有执行
adb disable-verity。 - APEX 签名密钥与系统不匹配(比如用了其他源码树编的)。
- user 版本不允许关闭 verity。
解决:
bash
# 还能进 adb:恢复备份
adb root && adb remount
adb shell cp /data/local/tmp/bt-backup.apex /system/apex/
adb shell rm -rf /data/apex/active/com.android.bt*
adb reboot
# 完全无法进系统:进 fastboot 重刷 system.img
fastboot flash system out/target/product/akee/system.img
fastboot reboot
4、SELinux 权限问题
⚠️ 症状 :logcat 出现 avc: denied 或 Permission denied 读取 APEX。
解决:
bash
adb shell chmod 644 /system/apex/com.android.bt.apex
adb shell restorecon /system/apex/com.android.bt.apex
adb shell ls -Z /system/apex/ | grep com.android.bt
# 上下文应为 u:object_r:system_file:s0 或 apex_file 相关
5、Java 代码生效但 native 崩溃
⚠️ 症状 :UI/日志显示新 Java 代码生效了,但出现 UnsatisfiedLinkError、JNI crash 或 native tombstone。
原因:修改了 C/C++ 代码或 AIDL 接口,导致 Java 层与 native 层签名/结构体不一致;或者只替换了 APK 没替换整个 APEX。
解决 :只要改了 system/(native)、framework/、service/ 代码或 etc/ 配置,必须整体替换 APEX。
6、adb install --apex 提示签名不匹配
⚠️ 症状 :adb install --apex --staged 返回 INSTALL_FAILED_VERIFICATION_FAILURE 或类似错误。
原因:APEX 使用的签名密钥与设备中预置的公钥不一致。
解决:
- 确认使用的是同一源码树(且签名配置一致)编译的 APEX。
- 检查
apex/key/下的密钥是否被修改过。 - 确认
PRODUCT_APEX_KEYS等产品配置没有覆盖密钥路径。
7、Windows 环境下路径和换行问题
如果在 Windows PowerShell 中执行脚本推送到设备:
- PowerShell 对
$()、{}、|有自己的解析,向adb shell传复杂命令时建议用单引号 包裹,或先写入本地.sh文件再adb push到设备执行。 - 本地编辑的 shell 脚本可能带 CRLF 换行,推到设备后用
sed -i 's/\r$//' script.sh去掉\r。
七、APEX 内部结构与解包查看
有时候你需要确认自己的代码是否真的被打进了 APEX,可以解包查看。
下面命令仅供参考,未做实际测试。
在 Linux/WSL 中查看
bash
# 方法 1:使用 deapexer(推荐)
deapexer extract out/.../com.android.bt.apex ./bt_apex
ls -la bt_apex/
# 能看到 apex_payload.img、apex_pubkey、etc/ 等
# 挂载 apex_payload.img 查看内部文件
mkdir bt_mnt
sudo mount -o loop bt_apex/apex_payload.img bt_mnt/
find bt_mnt/ -maxdepth 3 -type f
# bt_mnt/app/Bluetooth/Bluetooth.apk
# bt_mnt/lib64/libbluetooth_jni.so
# bt_mnt/javalib/framework-bluetooth.jar
# bt_mnt/etc/bluetooth/bt_stack.conf
sudo umount bt_mnt
# 方法 2:把 apex_payload.img 当作 ext4 镜像用 debugfs 查看
debugfs -R "ls -l /app/Bluetooth" bt_apex/apex_payload.img
验证 APK 内的 dex 是否包含你的代码
bash
# 从挂载目录取出 APK
cp bt_mnt/app/Bluetooth/Bluetooth.apk ./
# 用 jadx 反编译查看
jadx Bluetooth.apk -d bt_src
grep -r "your_custom_tag_or_method" bt_src/
查看 APEX manifest
bash
unzip -p com.android.bt.apex apex_manifest.json | python3 -m json.tool
典型内容:
json
{
"name": "com.android.bt",
"version": 360000000,
"versionName": "36",
"preInstallHook": {},
"postInstallHook": {}
}
八、日志与调试
1、apexd 守护进程日志
APEX 加载、验证、激活、回滚相关的日志都由 apexd 输出:
bash
# 实时查看 apexd 日志
adb logcat -s apexd *:S
# 关键日志含义:
# Successfully activated com.android.bt → 激活成功
# Failed to verify com.android.bt → 签名/完整性验证失败
# Reverting to previous version → 新版本激活失败,自动回滚
# Decompressed com.android.wifi.capex → capex 解压成功
2、蓝牙相关日志
bash
# 蓝牙应用 + 服务
adb logcat -s BluetoothAdapter BluetoothService BluetoothManagerService
# 蓝牙 OPP 文件传输(你当前在调试的模块)
adb logcat -s BluetoothOpp BluetoothOppObexClientSession BluetoothOppObexServerSession BluetoothOppService
# native 蓝牙栈
adb logcat -s bt_stack btif_dm BtGatt
# 全部蓝牙相关(可能很多)
adb logcat | grep -i bluetooth
3、在代码中添加易过滤的调试日志
建议统一加一个固定标记,方便从 logcat 中过滤:
java
private static final String TAG = "BluetoothOppObexClientSession";
private static final boolean DBG = true;
private static final String MARK = "[BT_DEBUG]";
Log.d(TAG, MARK + " sendFile name=" + filename + " index=" + index);
过滤:
bash
adb logcat -s BluetoothOppObexClientSession | grep BT_DEBUG
4、崩溃与 ANR
bash
# Java 崩溃
adb logcat -b crash | grep -i bluetooth
# native tombstone
adb shell ls -lt /data/tombstones/ | head -5
adb shell cat /data/tombstones/tombstone_00
# ANR traces
adb shell ls -lt /data/anr/ | head -5
九、常见 APEX 模块与编译命令
| 模块名 | 说明 | 编译命令 | 应用包名(验证用) |
|---|---|---|---|
com.android.bt |
蓝牙 | m com.android.bt |
com.android.bluetooth |
com.android.wifi |
WiFi 服务 | m com.android.wifi |
com.android.wifi / com.android.wifi.resources |
com.android.tethering |
网络共享 | m com.android.tethering |
- |
com.android.runtime |
ART 运行时 | m com.android.runtime |
- |
com.android.art |
ART 组件 | m com.android.art |
- |
com.android.media |
媒体框架 | m com.android.media |
com.android.providers.media.module |
com.android.permission |
权限控制器 | m com.android.permission |
com.android.permissioncontroller |
com.android.os.statsd |
系统统计 | m com.android.os.statsd |
- |
com.android.tzdata |
时区数据 | m com.android.tzdata |
- |
com.android.i18n |
国际化 ICU | m com.android.i18n |
- |
com.android.conscrypt |
TLS/SSL | m com.android.conscrypt |
- |
com.android.neuralnetworks |
NNAPI | m com.android.neuralnetworks |
- |
com.android.cellbroadcast |
小区广播 | m com.android.cellbroadcast |
com.android.cellbroadcastservice |
查看设备上所有 APEX:
bash
adb shell pm list apexes
# 或
adb shell ls /system/apex/
# 以及 data 分区已更新的 APEX
adb shell ls /data/apex/active/
十、失败回退方案
回退等级 1:能进 adb(半砖)
bash
adb wait-for-device
adb root
# 方案二(push 方式)的回退:恢复备份
adb shell cp /data/local/tmp/bt-backup.apex /system/apex/com.android.bt.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
# 方案一(install --apex --staged)的回退:卸载更新
adb uninstall --apex com.android.bt
adb reboot
回退等级 2:完全无法进 adb(真砖)
bash
# 进入 fastboot(通常是 电源键 + 音量下)
fastboot devices
# 重刷 system 分区
fastboot flash system out/target/product/akee/system.img
# 必要时清除 userdata/cache
fastboot erase userdata
fastboot erase cache
fastboot reboot
📌 预防措施:
- 使用方案一(
adb install --apex --staged)几乎不会真砖,失败自动回滚。 - 使用方案二前,务必
adb shell cp备份原始 APEX 到/data/local/tmp/。 - 保留一份与设备匹配的
system.img,用于紧急恢复。
十一、术语总结
| 术语 | 解释 |
|---|---|
| APEX | Android Pony EXpress,Android 10+ 引入的系统模块容器格式 |
| .apex | 未压缩 APEX 文件,ZIP 容器内直接包含 apex_payload.img |
| .capex | Compressed APEX,压缩格式,开机时由 apexd 解压 |
| apexd | Native 守护进程,在 init 早期启动,负责 APEX 的校验、挂载、激活、回滚 |
| apex_payload.img | APEX 内的 ext4 文件系统镜像,存放真正的 APK/SO/JAR/配置 |
| AVB | Android Verified Boot,使用 dm-verity 对分区/镜像做完整性校验 |
| dm-verity | Linux 内核块设备完整性校验机制,基于哈希树检测任何篡改 |
| bootclasspath_fragment | APEX 向 boot classpath 贡献 JAR 的机制 |
| systemserverclasspath_fragment | APEX 向 SystemServer classpath 贡献 JAR 的机制 |
| apex_available | Android.bp 中标记模块可被哪些 APEX 使用的属性 |
| staged install | 暂存安装,APEX 先写入 data 分区,下次重启时激活 |
| Mainline | Google Play 系统更新计划,APEX 是其核心技术 |
| flattened APEX | 一种构建变体,APEX 内容直接解包到 system 分区(无 loop 挂载),常用于资源受限设备 |
| deapexer / apexer | AOSP 提供的 APEX 解包/打包工具 |
PS
核心要点回顾:
- Android 16 中蓝牙、WiFi 等核心模块都是 APEX,不能直接安装里面的 APK。
- 最简调试方式 :
m <module>→adb install --apex --staged <file>→adb reboot,两条命令搞定,失败自动回滚,几乎不会砖。 - 手动 push 方式 需要
disable-verity+remount+ 备份 + 修权限 + 清缓存,适合需要修改/system/apex/原文件的场景。 - 扩展名必须匹配 :设备上是
.apex就替换.apex,是.capex就替换.capex。 - 验证生效 :
dumpsys package XXX | grep XXX、pm path、logcat -s apexd三件套。 - 出问题不要慌 :
adb uninstall --apex <module>或恢复备份,最坏情况 fastboot 重刷 system.img。
不积跬步,无以至千里;不积小流,无以成江海。APEX 是 Android 系统模块化的未来,理解它的加载机制和调试方法,对系统开发效率提升非常明显。