参考文章 https://source.android.google.cn/setup/build
命名空间模块
在 Android 完全从 Make 转换为 Soong 之前,Make 产品配置必须指定 PRODUCT_SOONG_NAMESPACES
值。它的值应该是一个以空格分隔的列表,其中包含 Soong 导出到 Make 以使用 m
命令进行编译的命名空间。在 Android 完成到 Soong 的转换之后,启用命名空间的详细信息可能会发生变化。
Soong 可以让不同目录中的模块指定相同的名称,只要每个模块都在单独的命名空间中声明即可。可以按如下方式声明命名空间:
soong_namespace {
imports: ["path/to/otherNamespace1", "path/to/otherNamespace2"],
}
请注意,命名空间没有 name
属性;其路径会自动指定为其名称。
系统会根据每个 Soong 模块在目录树中的位置为其分配命名空间。每个 Soong 模块都会被视为处于 Android.bp(位于当前目录或最近的父级目录中的 soong_namespace
文件内)定义的命名空间中。如果未找到此类 soong_namespace 模块,则认为该模块位于隐式根命名空间中。
判断依赖是哪里
的例子:
Soong 尝试解析由模块 M
在名称空间 N
(导入命名空间 I1、I2、I3…
)中声明的依赖项 D
。
-
如果
D
是//namespace:module
格式的完全限定名称,系统将仅在指定的命名空间中搜索指定的模块名称。 -
否则,Soong 将首先查找在命名空间 N 中声明的名为
D
的模块。 -
如果该模块不存在,Soong 会在命名空间
I1、I2、I3…
中查找名为D
的模块。 -
最后,Soong 在根命名空间中查找。
判断是否编译模块
的应用的例子
高通Android R基线上面 Bluetooth 的例子
在vendor/qcom/opensource/commonsys-intf/bluetooth/bt-system-opensource-product.mk
中
PRODUCT_SOONG_NAMESPACES += vendor/qcom/opensource/commonsys/packages/apps/Bluetooth
PRODUCT_SOONG_NAMESPACES += vendor/qcom/opensource/commonsys/system/bt/conf
在vendor/qcom/opensource/commonsys/packages/apps/Bluetooth/Android.bp
中
soong_namespace {
}
...
android_app {
name: "Bluetooth",
....
在packages/apps/Bluetooth/Android.bp
中
// Bluetooth is in it's own namespace to allow it to be replaced with an
// alternate implementation.
soong_namespace {
}
...
// Bluetooth APK
android_app {
name: "Bluetooth",