参考:Android.mk 转换为 Android.bp简介 https://blog.csdn.net/sinat_37343534/article/details/89175433
背景:为了增加第三方动态库而修改Android.bp造成系统无法启动的严重后果,进行问题分析也算是对bp文件的进一步学习用。
初始状态
$ vendor/MOD**/test1/lib ls
libtest1.so
Source /test1/Android.bp
cc_library_headers {
name: "libtest1_headers",
export_include_dirs: ["inc"],
vendor_available: true,
}
cc_prebuilt_library_shared {
name: "libtest1",
compile_multilib: "both",
multilib: {
lib64: {
srcs: ["lib64/libtest1.so"],
},
lib32: {
srcs: ["lib/libtest1.so"],
},
},
clang: true,
owner: "test",
proprietary: false,
}
新增文件
$ vendor/MOD**/test1/lib ls
libtest1.so libtest2.so
Changed Android.bp to Android.bp2
cc_library_headers {
name: "libtest1_headers",
export_include_dirs: ["inc"],
vendor_available: true,
}
cc_prebuilt_library_shared {
name: "libtest1",
compile_multilib: "both",
multilib: {
lib64: {
srcs: ["lib64/libtest1.so"],
},
lib32: {
srcs: ["lib/libtest1.so"],
},
},
clang: true,
owner: "test",
proprietary: false,
}
cc_library_headers {
name: "libtest2_headers",
export_include_dirs: ["inc"],
vendor_available: true,
}
cc_prebuilt_library_shared {
name: "libtest2",
compile_multilib: "both",
multilib: {
lib64: {
srcs: ["lib64/libtest2.so"],
},
lib32: {
srcs: ["lib/libtest2.so"],
},
},
clang: true,
owner: "test",
proprietary: false,
}
这时,在vendor/MOD**/test1/下执行mma 可以将libtest1.so 和libtest2.so编译成功至out目录。
但是如果编译androidu,也就是andorid AP侧的整个工程进行编译,则无法生成libtest2.so 导致生成的系统在启动时依赖不到libtest2.so而无法启动。
解决方案:
$ mkdir vendor/MOD**/test2/lib
将libtest2.so放入/test2/lib 中
在/test2目录下创建Android.bp
cc_prebuilt_library_shared {
name: "libtest2",
compile_multilib: "both",
arch: {
arm64: {
srcs: ["arm64/libtest2.so"],
},
arm: {
srcs: ["arm/libtest2.so"],
},
},
}
到此,libtest2.so 文件已经可以正常编译出来了。如果有必要修改修改/test1目录下的Android.bp,使libtest2.so被libtest1.so引用。具体如下:
修改/test1目录下的Android.bp
lib32: {
srcs: ["lib/libtest1.so"],
},
},
+ shared_libs: [
+ "libtest2",
+ ],
clang: true,
owner: "test",
问题的根因一直无法找到。
问题1.一个Android.bp文件是否可以写两个cc_prebuilt_library_shared {}文件?
是可以的,Android源码中就有案例
知识扩展:
简介:Android.bp,是用来替换Android.mk的配置文件。 它使用Blueprint框架来解析,最终转换成Ninja文件。
从Ninja文件入手:
out/build-Model.ninja
out/build-Model-custom_images.ninja
out/combined-Model.ninja
out/combined-Model-custom_images.ninja
out/soong_ui
相关链接:androidmk 工具转换Android.mk为 Android.bp https://blog.csdn.net/sinat_37343534/article/details/89175433