如何在Android.bp文件中包含预构建的库

How to include prebuilt library in Android.bp file?

本文关键字:包含预 构建 文件 Android bp      更新时间:2023-10-16

我正在使用Android-O,我看到大多数.mk文件都被.bp文件取代了。现在我已经修改了使用 .bp 文件构建的硬件/接口下的源代码之一。

现在我有一个由源代码使用的预构建共享库。

但是我无法弄清楚如何将预构建的库包含在Android.bp文件中。

任何帮助/意见将不胜感激。

在这里挣扎一番后,我找到了解决方案

1(有一个名为androidmk的工具可以从 Android.mk 文件中生成Android.bp文件

使用以下命令构建安卓mk工具

source build/envsetup.sh
    m -j blueprint_tools
Output Path: out/soong/host/linux-x86/bin/androidmk (depending on your host)    

像这样为预构建库编写普通 Android.mk 文件

include $(CLEAR_VARS)
    LOCAL_MODULE := newlib
    LOCAL_SRC_FILES := newlib.so
    LOCAL_MODULE_SUFFIX := .so
    LOCAL_MODULE_CLASS := SHARED_LIBRARIES
    LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)
    LOCAL_MODULE_TAGS := optional
    include $(BUILD_PREBUILT)

现在运行以下命令androidmk Android.mk > Android.bp Android.bp文件将创建

如下
cc_prebuilt_library_shared {
        name: "newlib",
        srcs: ["newlib.so"],
        //ANDROIDMK TRANSLATION ERROR: unspported assignment to LOCAL_MODULE_PATH
        //LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARY)
    }

2(现在使用上面的Android.bp文件,我得到以下错误

**out/target/product/mytest/symbols/system/lib64/newlib.so: no symbols**

所以我添加了这个

strip: {
    none:true,
}

3(现在使用新的Android.bp,我仍然收到此错误

**error: newlib.so incompatible target** 

所以我添加了这个(创建了 2 个目录 lib 和 lib64 与相应的库(

 target: {
        android_arm: {
            srcs: ["lib/newlib.so"],
        },
        android_arm64: {
            srcs: ["lib64/newlib.so"],
        }
  },

所以最后在下面的Android.bp文件上,我的要求得到了满足

cc_prebuilt_library_shared {
        name: "newlib",
        target: {
            android_arm: {
                srcs: ["lib/newlib.so"],
            },
            android_arm64: {
                srcs: ["lib64/newlib.so"],
            },
        },
        strip: {
            none:true,
        },
    }

下面是一个如何做到这一点的示例。

cc_prebuilt_library_shared {
    name: "libPrintString",
    target: {
        android_arm: {
            srcs: ["lib/libPrintString.so"],
        },
        android_arm64: {
            srcs: ["lib64/libPrintString.so"],
        },
    },
    strip: { none:true, },
}
java_import {
    name: "stringutils",
    jars: ["libs/stringutils.jar"],
    sdk_version: "current",
}
android_app {
    name: "HelloWorld",
    manifest: "AndroidManifest.xml",
    srcs: ["src/**/*.java",],
    sdk_version: "current",
    resource_dirs: [
      "res/",
    ],
    static_libs: [
        "com.google.android.material_material",
        "androidx-constraintlayout_constraintlayout",
        "stringutils",
    ],
    jni_libs: ["libPrintString"],
    certificate: "platform",
    privileged: true,
    platform_apis: true,
    optimize: {
      enabled: false,
    },
    dex_preopt: {
      enabled: false,
    },
}

请注意,在使用此更改执行mm时,构建的apk不包含libPrintString.so文件。相反,它将根据您的配置位于目标目录中/system。因此,您不能直接使用 apk,而必须刷新完整版本。