如何在 AOSP 项目中使用我预构建的 C++ 静态/共享库

Tom*_*hoi 6 android android-source

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

设置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
Run Code Online (Sandbox Code Playgroud)

第2步

我创建的Android.mk文件/system/mylib如下

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)
Run Code Online (Sandbox Code Playgroud)

步骤3

我将libmylibshared_libs: [插入frameworks/av/media/libaudioclient/Android.bp如下

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",
        ],
    },
}
Run Code Online (Sandbox Code Playgroud)

输出

不幸的是,构建失败了:

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
Run Code Online (Sandbox Code Playgroud)

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

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

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

bog*_*998 7

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

\n\n

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

\n\n\n\n
\n\n

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

\n\n

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

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

    \n\n

    样本文件:

    \n\n
      \n
    • system/core/rootdir/etc/public.libraries.android.txt适用于主要安卓系统
    • \n
    • system/core/rootdir/etc/public.libraries.wear.txt适用于 Android Wear 设备
    • \n
    • system/core/rootdir/etc/public.libraries.iot.txt适用于 Android Things 设备
    • \n
  2. \n
\n\n

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

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

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

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

    • \n
    \n\n
    \n

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

    \n
    \n\n
      \n
    • 请记住在输入后添加新行。否则,下一个“file_contexts”文件的第一行将在构建期间连接,并且您将收到错误。
    • \n
    \n\n
    \n

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

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

    \n\n

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

    \n\n
    \n

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

    \n\n

    “BOARD_SEPOLICY_DIRS 之前用于供应商/odm sepolicy 自定义。它已被 BOARD_VENDOR_SEPOLICY_DIRS 取代(强制)...”

    \n
  4. \n
  5. 将库作为产品包添加到您的product.mk 文件中。

  6. \n
\n\n

PRODUCT_PACKAGES += \\ {your_library_name} \\

\n\n
    \n
  1. 构建和测试
  2. \n
\n\n

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

\n\n

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

\n\n

查看此链接以获取更多信息:

\n\n\n