前言

Android源码开发时需要经常编译系统jar或so库文件,生成的产物都是以Android.bp中配置为准,其中配置了模块类型与编译产物路径等信息。

根据自己查询的文件,在AI帮助下,简单整理于此,方便自己查阅和学习。

正文

模块类型与文件类型对应表

模块类型编译产物文件类型默认安装位置
cc_binary可执行二进制文件 (无扩展名)/system/bin/
cc_library_shared动态链接库 (.so)/system/lib[64]//vendor/lib[64]/
cc_library_static静态链接库 (.a)不安装,仅编译中间文件
cc_library_headers头文件 (.h)不安装,仅提供编译时头文件
java_libraryJava库 (.jar)/system/framework/
java_library_staticJava静态库 (.jar)不安装,供其他模块链接
java_genrule处理后的Java库 (.jar)中间文件
aidl_interface1. 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: truevendor/vendor/lib[64]//vendor/bin/
system_ext_specific: truesystem_ext/system_ext/lib[64]//system_ext/bin/
product: trueproduct/product/lib[64]//product/bin/
odm: trueodm/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,
}

根据上面可以得出:

  1. 文件名:audio.primary.whale.so

  2. 分区:vendor(proprietary: true)

  3. 架构:32位(compile_multilib: "32")

  4. 路径:/vendor/lib/hw/audio.primary.whale.so

系统守护进程vold

system/vold/Android.bp


cc_binary {
    name: "vold",
    // 无分区属性
}

根据上面可以得出:

  1. 文件名:vold

  2. 分区:system(默认)

  3. 路径:/system/bin/vold

Java系统服务

framework/base/services/Android.bp


java_library {
    name: "services.core",
    // 无分区属性
}

根据上面可以得出:

  1. 文件名:services.core.jar

  2. 分区:system(默认)

  3. 路径:/system/framework/services.core.jar

供应商扩展库

/vendor/sprd/platform/system/vold/Android.bp


cc_library_shared {
    name: "libunisocvold",
    system_ext_specific: true,
}

根据上面可以得出:

  1. 文件名:libunisocvold.so

  2. 分区:system_ext

  3. 路径:/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

小结

  1. 无分区属性 = system分区

  2. cc_binary = /system/bin/

  3. cc_library_shared = /system/lib[64]/

  4. java_library = /system/framework/

  5. vendor: true 或 proprietary: true = /vendor/

  6. 文件名规则:模块名就是基础文件名,系统会按类型自动添加前后缀

  7. 中间文件:都在 out/soong/.intermediates/目录下

  8. 最终文件:都在 out/target/product/<device>/对应分区下

参考文章

  1. Android源码

  2. 《AI助手》

  3. 腾讯元宝

  4. 豆包

  5. Deepseek

  6. 千问

暂无评论

评论审核已启用。您的评论可能需要一段时间后才能被显示。

none
暂无评论...