Android16 系统 APEX 模块调试总结

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.solibbluetooth_gd.solibbt-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 install APEX 内的 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 文件中设置:

    makefile 复制代码
    PRODUCT_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/ 作为回滚备份。
  • 校验失败 → 自动回滚到上一个可用版本,设备正常启动,不会变砖。
优点
  1. 不需要 disable-verity,不修改 system 分区。
  2. 不需要 adb remount,不需要 root 写 system 权限(需要 userdebug/eng 的 root 用于安装,但这是 adb install 本身的权限)。
  3. 不需要手动备份,系统自动保留上一版本用于回滚。
  4. 不需要手动 chmod/restorecon/清缓存,全部由 apexd 自动处理。
  5. 签名不匹配/文件损坏会自动拒绝,不会卡开机。
前提条件
  • adb/platform-tools 版本要足够新,支持 --apex 参数(SDK 30+ 的 platform-tools 基本都支持)。如果提示 --apex 不识别,升级 platform-tools。
  • APEX 文件必须使用设备接受的密钥签名。自己源码树编译出的 APEX 使用 com.android.bt.pem 等模块专属密钥,与系统镜像匹配,没问题。
  • 构建类型建议为 userdebugeng
验证生效
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 环境,使用 deapexerdebugfsapexeravbtool 等工具。

大致流程
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 fileInvalid 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: deniedPermission 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

核心要点回顾:

  1. Android 16 中蓝牙、WiFi 等核心模块都是 APEX,不能直接安装里面的 APK。
  2. 最简调试方式m <module>adb install --apex --staged <file>adb reboot,两条命令搞定,失败自动回滚,几乎不会砖。
  3. 手动 push 方式 需要 disable-verity + remount + 备份 + 修权限 + 清缓存,适合需要修改 /system/apex/ 原文件的场景。
  4. 扩展名必须匹配 :设备上是 .apex 就替换 .apex,是 .capex 就替换 .capex
  5. 验证生效dumpsys package XXX | grep XXXpm pathlogcat -s apexd 三件套。
  6. 出问题不要慌adb uninstall --apex <module> 或恢复备份,最坏情况 fastboot 重刷 system.img。

不积跬步,无以至千里;不积小流,无以成江海。APEX 是 Android 系统模块化的未来,理解它的加载机制和调试方法,对系统开发效率提升非常明显。

相关推荐
亘元有量-流量变现21 分钟前
2026安卓ASO增量攻略:摆脱iOS思维依赖,吃透多商店自然免费流量
android·aso优化·亘元有量·方糖试玩
OPEN-F23 分钟前
C++进阶教程:类与对象深入
java·开发语言·c++
数智启示录24 分钟前
Flink CDC 机制精讲(七):用故障注入证明链路是否可靠 【面试宝典】
大数据·经验分享·面试·flink
ttwosix39 分钟前
JavaEE初阶 多线程:单例模式 | 阻塞队列
java·开发语言
独立开发之道40 分钟前
【Three.js教程】 图元速查:官方内置的立体图形
开发语言·javascript·ecmascript
Htr_42 分钟前
Python面向对象编程:类与对象基础
开发语言·python
RD_daoyi43 分钟前
谷歌改写了76%的标题:超60字符的,95%会被谷歌自己重写
大数据·服务器·开发语言·前端·搜索引擎·html
cspttty44 分钟前
哪些证书可以弥补学历不足
大数据·数据库·数据挖掘
weixin_3077791344 分钟前
AI生成代码的隐患与治理:人工审查流程及提示词驱动的修复策略
开发语言·人工智能·算法