Android 9/14/15 预装 APK 的构建入口与分区差异 📅 发布时间:2026/8/26 19:38:08 👁 浏览次数: 摘要同一个 APK 在 Android 9、Android 14 和 Android 15 上可能需要使用不同的源码目录、构建规则和安装路径。EShare 在 Android 9/14 中位于device目录而 Android 15 位于vendor目录Android 14 支持的system_ext模块规则在 Android 9 中可能不生效。本文介绍如何判断当前平台的构建入口、选择模块编译或PRODUCT_COPY_FILES并通过最终产物确认 APK 的真实分区位置。1. 三个平台的目录并不相同项目中的 EShare 模块位于Android 9 device/hisilicon/bigfish/packages/modules/eshareserver Android 14 device/hisilicon/bigfish/packages/modules/eshareserver Android 15 vendor/kitking/packages/modules/eshareserver这不是简单的目录迁移。源码目录通常还决定哪个产品文件引入模块模块属于 system 还是 vendor使用哪套 Make/Soong 规则最终安装到哪个分区。因此跨 Android 版本移植时第一步不是复制目录而是找到当前产品的构建入口。2. 模块编译与原样拷贝如果 APK 能够被当前构建系统正确处理可以定义预编译模块include $(CLEAR_VARS) LOCAL_MODULE : EService LOCAL_SRC_FILES : apk/EService.apk LOCAL_MODULE_CLASS : APPS LOCAL_CERTIFICATE : platform include $(BUILD_PREBUILT)然后在产品配置中加入PRODUCT_PACKAGES EService这种方式的优点是构建系统知道模块依赖可以处理 JNI 库可以自动生成安装文件列表便于统一管理模块开关。但如果 APK 必须保持原始签名或者当前版本的模块规则不兼容可以使用PRODUCT_COPY_FILES \ path/EShareServer.apk:system/system_ext/app/EShareServer/EShareServer.apk这会把 APK 按原样复制到镜像指定位置。3.LOCAL_SYSTEM_EXT_MODULE不能跨版本想当然Android 14 模块中可能使用LOCAL_SYSTEM_EXT_MODULE : true它用于表达模块应安装到system_ext分区。但 Android 9 的构建系统不一定完整支持该变量。即使源码中写了它最终 APK 仍可能进入/system/app而不是/system/system_ext/app所以变量写在Android.mk中不等于最终路径一定符合预期。必须检查实际构建产物。4. 如何确认 APK 最终落在哪个分区常用检查文件out/target/product/product/installed-files.txt out/target/product/product/installed-files-system.txt out/target/product/product/installed-files-vendor.txt也可以直接搜索find out/target/product/product -iname *EShare*板端检查adb shell pm path com.eshare.receiver.tv adb shell ls -l /system/app adb shell ls -l /system/system_ext/app adb shell ls -l /vendor/app如果源码配置和最终产物不一致应优先检查产品文件是否真正includePRODUCT_PACKAGES条件是否满足目标模块是否被其他配置覆盖out目录是否残留旧产物当前 lunch 目标是否正确。5. 跨版本移植的正确顺序建议按照以下顺序操作确认 Android 版本和产品目标 ↓ 找到当前版本的产品配置入口 ↓ 确认可用的构建规则 ↓ 决定使用模块编译还是 PRODUCT_COPY_FILES ↓ 确认目标分区和安装路径 ↓ 查看 installed-files 产物 ↓ 烧录后通过 pm path 验证不要直接把 Android 14 的Android.mk复制到 Android 9也不要只根据源码变量判断 APK 是否进入了目标分区。