【问题标题】:How to use my prebuilt c++ static/shared library in AOSP project如何在 AOSP 项目中使用我预建的 C++ 静态/共享库
【发布时间】:2020-05-02 04:27:21
【问题描述】:

我想使用我的静态或共享预建库libmylib.so or libmylib.a。我的构建目标是 Hikey960 设备。我成功构建了纯 aosp 项目并闪烁到 Hikey960 设备。接下来我想用我的libmylib.so修改/frameworks/av/media/libaudioclient/AudioTrack.cpp

设置 1

我将mylib 目录设为/system 并复制了预建库。

|-- Andoird.mk
|-- arm64-v8a
|   |-- shared
|   |   `-- Release
|   |       `-- libmylib.so
|   `-- static
|       `-- Release
|           `-- libmylib.a
|-- armeabi
|   |-- shared
|   |   `-- Release
|   |       `-- libmylib.so
|   `-- static
|       `-- Release
|           `-- libmylib.a
|-- armeabi-v7a
|   |-- shared
|   |   `-- Release
|   |       `-- libmylib.so
|   `-- static
|       `-- Release
|           `-- libmylib.a
|-- include
|   `-- mylib.h
|-- x86
|   |-- shared
|   |   `-- Release
|   |       `-- libmylib.so
|   `-- static
|       `-- Release
|           `-- libmylib.a
`-- x86_64
    |-- shared
    |   `-- Release
    |       `-- libmylib.so
    `-- static
        `-- Release
            `-- libmylib.a

第二步

我在/system/mylib 中创建了Android.mk 文件,如下所示

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := mylib
LOCAL_SRC_FILES := system/mylib/$(TARGET_ARCH_ABI)/shared/Release/libmylib.so
LOCAL_EXPORT_C_INCLUDES:= include
include $(PREBUILT_SHARED_LIBRARY)

第三步

我在frameworks/av/media/libaudioclient/Android.bp 中插入libmylib 行到shared_libs: [ 如下

cc_library_shared {
    name: "libaudioclient",

    aidl: {
        export_aidl_headers: true,
        local_include_dirs: ["aidl"],
        include_dirs: [
            "frameworks/av/media/libaudioclient/aidl",
        ],
    },

    srcs: [
        // AIDL files for audioclient interfaces
        // The headers for these interfaces will be available to any modules that
        // include libaudioclient, at the path "aidl/package/path/BnFoo.h"
        ":libaudioclient_aidl_private",
        ":libaudioclient_aidl",

        "AudioEffect.cpp",
        "AudioRecord.cpp",
        "AudioSystem.cpp",
        "AudioTrack.cpp",
        "AudioTrackShared.cpp",
        "IAudioFlinger.cpp",
        "IAudioFlingerClient.cpp",
        "IAudioPolicyService.cpp",
        "IAudioPolicyServiceClient.cpp",
        "IAudioTrack.cpp",
        "IEffect.cpp",
        "IEffectClient.cpp",
        "ToneGenerator.cpp",
        "PlayerBase.cpp",
        "RecordingActivityTracker.cpp",
        "TrackPlayerBase.cpp",
    ],
    shared_libs: [
        "libaudiofoundation",
        "libaudioutils",
        "libaudiopolicy",
        "libaudiomanager",
        "libbinder",
        "libcutils",
        "libdl",
        "liblog",
        "libmedia_helper",
        "libmediametrics",
        "libmediautils",
        "libnblog",
        "libprocessgroup",
        "libutils",
        "libvibrator",
        "libmylib",
    ],
    export_shared_lib_headers: ["libbinder"],

    local_include_dirs: ["include/media", "aidl"],
    header_libs: [
        "libaudioclient_headers",
        "libbase_headers",
        "libmedia_headers",
    ],
    export_header_lib_headers: ["libaudioclient_headers"],

    // for memory heap analysis
    static_libs: [
        "libc_malloc_debug_backtrace",
    ],
    cflags: [
        "-Wall",
        "-Werror",
        "-Wno-error=deprecated-declarations",
    ],
    sanitize: {
        misc_undefined : [
            "unsigned-integer-overflow",
            "signed-integer-overflow",
        ],
    },
}

输出

不幸的是,构建失败:

error: frameworks/av/media/libaudioclient/Android.bp:39:1: "libaudioclient" depends on undefined module "libmylib"
06:32:39 soong bootstrap failed with: exit status 1

我认为在构建 aosp 时不包括我的预构建库文件。如何将我的库包含到 aosp 构建中。我应该在哪里指定 mylib?

而且我认为现在在 aosp 中使用 soong 作为构建工具而不是 nkd-build 所以我应该将上面创建的 Android.mk 文件更改为 Android.bp 吗?

如果您知道我的错误步骤,请告诉我该怎么做。谢谢。

【问题讨论】:

    标签: android android-source


    【解决方案1】:

    关于 Android.mk 与 Android.bp 文件,可能学习 Soong 是一个不错的选择,因为 Google 正在慢慢地将 make 文件转换为新的构建系统。

    如果您想开始使用 Soong,可以从这里开始:


    关于添加自定义库。由于Android的项目高音定制应该在供应商图像中完成。如果您以后想更新 Android 框架,您将遇到更少的问题。 https://android-developers.googleblog.com/2017/05/here-comes-treble-modular-base-for.html

    为了向供应商添加自定义库,您需要做几件事。 通过这些步骤,我成功地添加了预构建的共享 (.so) 库。仍然不知道如何将预构建静态 (.a) 库添加到系统。

    1. 为了将库添加到供应商分区,您需要创建列出所有添加的库的文本文件。从 Android N (7.0) 或更高版本开始,应用只能访问特定 NDK 库白名单上的库。

      示例文件:

      • system/core/rootdir/etc/public.libraries.android.txt 用于主要 Android
      • system/core/rootdir/etc/public.libraries.wear.txt 适用于 Android Wear 设备
      • system/core/rootdir/etc/public.libraries.iot.txt 适用于 Android Things 设备

    我们可以为供应商创建对应文件并在以下路径中创建它:/vendor/etc/public.libraries.txt

    1. 接下来,从 Android 8.0 (Oreo) 开始,必须正确标记供应商中的本机库,以便应用可以访问它。我们需要更新 SELinux 文件并为资源文件(我们的库)添加适当的上下文。

      • 创建目录vendor/[your_vendor]/sepolicy并添加“file_contexts”文件

      • 在“file_contexts”中为我们的文件资源添加标签 -> vendor/lib(64)?/[your_lib_name]\.so u:object_r:same_process_hal_file:s0

      文件上下文标签遵循user:role:type:sensitivity 的形式。如果任何应用程序(包括第三方应用程序)需要访问,则该库必须标记为 same_process_hal_file。该规则定义在system/sepolicy/public/file.te

      • 记得在输入后添加新行。否则下一个“file_contexts”文件的第一行将在构建过程中连接,你会得到错误。

      构建后,您可以检查您的“file_contexts”是否已正确添加。 所有 file_contexts 文件的输出位于:out/target/product/generic_x86_64/obj/ETC/file_contexts.bin_intermediates/file_contexts.device.tmp。 所有条目前面都有注释和 file_contexts 的路径。在我们的例子中,您应该在文件注释“vendor/[your_vendor]/sepolicy/file_contexts”中找到。

    2. 在 [your_vendor] 目录中,您应该有您的 product.mk 文件。您可以在/device 中找到此文件的示例。更新您的 product.mk 文件并添加 BOARD_VENDOR_SEPOLICY_DIRS。 →

      BOARD_VENDOR_SEPOLICY_DIRS += \ vendor/[your_vendor]/sepolicy \

      在 SELinux 文档中声明 Vendor sepolicy 位于 BOARD_SEPOLICY_DIRS 路径下,但在 system/sepolicy/Android.mk 中我们可以读到该字段已被弃用:

      “BOARD_SEPOLICY_DIRS 之前用于 vendor/odm sepolicy 自定义,现在已替换为 BOARD_VENDOR_SEPOLICY_DIRS(强制)...”

    3. 将库作为产品包添加到您的 product.mk 文件中。

    PRODUCT_PACKAGES += \ {your_library_name} \

    1. 构建和测试

    现在您的库应该在 AOSP 中可见。

    如果你想在供应商镜像中使用这个库,你需要在 library .mk / 中指定它。根据 VNDK 的 bp 文件。

    查看此链接了解更多信息:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-03
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      • 1970-01-01
      相关资源
      最近更新 更多