根据自己查询的文件,在AI帮助下,简单整理于此,方便自己查阅和学习。
正文
模块类型与文件类型对应表
| 模块类型 | 编译产物文件类型 | 默认安装位置 |
|---|---|---|
cc_binary | 可执行二进制文件 (无扩展名) | /system/bin/ |
cc_library_shared | 动态链接库 (.so) | /system/lib[64]/或 /vendor/lib[64]/ |
cc_library_static | 静态链接库 (.a) | 不安装,仅编译中间文件 |
cc_library_headers | 头文件 (.h) | 不安装,仅提供编译时头文件 |
java_library | Java库 (.jar) | /system/framework/ |
java_library_static | Java静态库 (.jar) | 不安装,供其他模块链接 |
java_genrule | 处理后的Java库 (.jar) | 中间文件 |
aidl_interface | 1. Java接口库 (.jar) 2. C++库 (.so) 3. NDK库 (.so) | /system/framework/和 /system/lib[64]/ |
filegroup | 无编译产物,仅源码分组 | 不安装 |
genrule | 生成的源文件 | 中间目录 |
prebuilt_etc | 配置文件 | /system/etc/或 /vendor/etc/ |
cc_defaults | 配置模板,无产物 | 不安装 |
分区属性与路径规则
分区属性决定根目录
| 属性 | 分区 | 默认库路径 | 默认二进制路径 |
|---|---|---|---|
| 无分区属性 | system | /system/lib[64]/ | /system/bin/ |
vendor: true | vendor | /vendor/lib[64]/ | /vendor/bin/ |
system_ext_specific: true | system_ext | /system_ext/lib[64]/ | /system_ext/bin/ |
product: true | product | /product/lib[64]/ | /product/bin/ |
odm: true | odm | /odm/lib[64]/ | /odm/bin/ |
特殊路径属性
| 属性 | 效果 | 示例路径 |
|---|---|---|
relative_install_path: "hw" | 在基础路径后添加 hw/ | /vendor/lib/hw/ |
relative_install_path: "egl" | 在基础路径后添加 egl/ | /vendor/lib/egl/ |
架构与多版本规则
架构位宽
| 属性 | 32位路径 | 64位路径 |
|---|---|---|
compile_multilib: "32" | /lib/ | 不生成 |
compile_multilib: "64" | 不生成 | /lib64/ |
| 默认(无属性) | /lib/和 /lib64/ | 都生成 |
供应商与专有代码
| 属性 | 含义 | 典型路径 |
|---|---|---|
proprietary: true | 专有代码,不开放源码 | /vendor/分区 |
vendor_available: true | 供应商可用 | /vendor/或 /system/vendor/ |
案例分析表
音频HAL驱动
vendor/sprd/modules/audio/vendor/whale/Android.bp
cc_library_shared { name: "audio.primary.whale", relative_install_path: "hw", compile_multilib: "32", proprietary: true, }
根据上面可以得出:
文件名:
audio.primary.whale.so分区:vendor(proprietary: true)
架构:32位(compile_multilib: "32")
路径:
/vendor/lib/hw/audio.primary.whale.so
系统守护进程vold
system/vold/Android.bp
cc_binary { name: "vold", // 无分区属性 }
根据上面可以得出:
文件名:
vold分区:system(默认)
路径:
/system/bin/vold
Java系统服务
framework/base/services/Android.bp
java_library { name: "services.core", // 无分区属性 }
根据上面可以得出:
文件名:
services.core.jar分区:system(默认)
路径:
/system/framework/services.core.jar
供应商扩展库
/vendor/sprd/platform/system/vold/Android.bp
cc_library_shared { name: "libunisocvold", system_ext_specific: true, }
根据上面可以得出:
文件名:
libunisocvold.so分区:system_ext
路径:
/system_ext/lib[64]/libunisocvold.so
快速判断流程图
1. 查看模块类型 ↓ 2. 检查分区属性 - vendor: true → /vendor/ - system_ext_specific: true → /system_ext/ - 无属性 → /system/ ↓ 3. 检查路径属性 - relative_install_path → 添加子目录 - compile_multilib → 确定lib/lib64 ↓ 4. 组合完整路径
特殊模块说明
AIDL接口多重输出
aidl_interface {
name: "android.media.permission"
}
↓
生成:
1. Java: /system/framework/android.media.permission-V1.jar
2. C++: /system/lib[64]/libandroid.media.permission.so
3. NDK: /system/lib[64]/libandroid.media.permission-V1-ndk.so
文件扩展名规则
| 模块类型 | 自动添加前缀/后缀 | 示例 |
|---|---|---|
cc_library_shared | 自动加 lib前缀和 .so后缀 | name: "vold"→ libvold.so |
cc_binary | 不加任何前缀后缀 | name: "vold"→ vold |
java_library | 加 .jar后缀 | name: "services"→ services.jar |
名称已包含 lib | 不重复添加 | name: "libvold"→ libvold.so |
实用查询命令
# 1. 查找编译产物 find out/target/product -name "模块名*" 2>/dev/null # 2. 查看模块安装信息 cat out/target/product/<device>/installed-files.txt | grep 模块名 # 3. 查看模块依赖 grep -r "模块名" out/soong/build.ninja 2>/dev/null # 4. 查看中间文件 find out/soong/.intermediates -name "*模块名*" 2>/dev/null
小结
无分区属性 = system分区
cc_binary = /system/bin/
cc_library_shared = /system/lib[64]/
java_library = /system/framework/
vendor: true 或 proprietary: true = /vendor/
文件名规则:模块名就是基础文件名,系统会按类型自动添加前后缀
中间文件:都在
out/soong/.intermediates/目录下最终文件:都在
out/target/product/<device>/对应分区下
参考文章
联系我们

微信号:rssme_com