Android.bp 中如何引用第三方动态库

参考: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

你可能感兴趣的:(Android,build)