我想使用我的静态或共享预建库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不会自动在库名前添加lib
。您必须将lib模块重命名为libmylib
:
LOCAL_MODULE := libmylib
由于您的问题仍然存在,因此了解Android如何查找模块定义以使您可以进一步调试问题可能会有所帮助:
Android将递归遍历$ANDROID_BUILD_TOP
的每个子目录,直到找到第一个Android.mk
。子目录中的任何Android.mk
必须显式包含在父目录Android.mk
的包含中。
示例:
include $(call all-subdir-makefiles)
对Android.bp
的搜索工作有所不同(自Android Pie起),因为查找不会在第一个找到的Android.bp
处停止。因此,不再需要显式包含子目录。
要检查构建系统是否找到了新添加的模块,可以调用m modules
,它将列出所有找到的模块定义名称。
m modules