我想使用我的静态或共享预建库libmylib.so or libmylib.a
。我的构建目标是Hikey960设备。我成功构建了纯aosp项目,并刷新到Hikey960设备。接下来,我要/frameworks/av/media/libaudioclient/AudioTrack.cpp
使用进行修改libmylib.so
。
我创建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
我创建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)
我插libmylib
线shared_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",
],
},
}
不幸的是,构建失败:
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?
而且我认为现在使用soong作为构建工具而不是aosp中的nkd-build,所以我应该将上面创建的Android.mk文件更改为Android.bp吗?
如果您知道我的错误步骤,请告诉我该怎么做。谢谢。
关于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)库。
为了将库添加到供应商分区,您需要创建列出所有添加的库的文本文件。从Android N(7.0)或更高版本开始,仅允许应用访问NDK库的特定白名单上的库。
样本文件:
system/core/rootdir/etc/public.libraries.android.txt
对于主要的Androidsystem/core/rootdir/etc/public.libraries.wear.txt
适用于Android Wear设备system/core/rootdir/etc/public.libraries.iot.txt
适用于Android Things设备我们可以为供应商创建对应文件,并在以下路径中创建它: /vendor/etc/public.libraries.txt
接下来,自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文件的输出在:中
out/target/product/generic_x86_64/obj/ETC/file_contexts.bin_intermediates/file_contexts.device.tmp
。所有条目前面都带有注释和file_contexts的路径。在我们的情况下,您应该在文件注释“vendor/[your_vendor]/sepolicy/file_contexts
”中找到。
在[your_vendor]目录中,您应该具有product.mk文件。您可以在中找到此文件的示例/device
。更新您的product.mk文件并添加BOARD_VENDOR_SEPOLICY_DIRS。→
BOARD_VENDOR_SEPOLICY_DIRS += \ vendor/[your_vendor]/sepolicy \
在SELinux文档中,声明了供应商分隔符位于BOARD_SEPOLICY_DIRS路径下,但是在system / sepolicy / Android.mk中,我们可以看到该字段已弃用:
“ BOARD_SEPOLICY_DIRS以前曾用于供应商/ odm隔离定制。它已被BOARD_VENDOR_SEPOLICY_DIRS(强制性)取代...”
将库作为产品包添加到product.mk文件中。
PRODUCT_PACKAGES += \ {your_library_name} \
现在您的库在AOSP中应该可见。
如果要在供应商映像中使用此库,则需要在库.mk /中指定它。bp文件(根据VNDK)。
查看此链接以获取更多信息:
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句