8

我尝试将预构建的 APK 添加到我的 Android 构建中。APK 包含多个共享库(*.so 文件)。它编译没有问题,但我仍然从应用程序中收到一个错误,表明找不到库。

为什么会这样?

这是android.mk代码:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := apkwithso
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_REQUIRED_MODULES := libx liby libz
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED
include $(BUILD_PREBUILT)

libx、y、z 是我的 libx.so、liby.so 和 libz.so

我还尝试将 .so 从 APK 手动复制到 out lib 目录,但没有成功。

我正在为 Galaxy Nexus Maguro 使用 Android 4.1.2 进行编译。

4

5 回答 5

17

我自己也遇到过这个问题,原因是当 APK 文件包含在构建中时,它们基本上绕过了安装过程。这个安装过程是从 apk 中提取任何共享库并将其放在适当的位置的点,如果这种情况永远不会发生,那么这些库将不可用。这是因为在 AOSP 构建期间从源代码构建的包要么在构建过程中包含其预构建的共享库,要么它们的库也是从源代码构建的,在任何一种情况下,这些库都放在适当的位置。

出于这个原因,除了 apk 模块本身之外,您还应该在同一个 .mk 文件中添加以下内容:

include $(CLEAR_VARS)
LOCAL_MODULE := libapkwithso
LOCAL_SRC_FILES := lib/libapkwithso.so # or wherever your so is
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_SUFFIX := .so
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
include $(BUILD_PREBUILT)

然后加:

LOCAL_REQUIRED_MODULES := libapkwithso
于 2013-04-01T01:52:52.750 回答
6

BUILD_PREBUILT调用prebuild.mk脚本。该脚本的描述如下:

复制预建文件的标准规则

它不会告诉您将安装该应用程序。所以我认为这就是您的应用程序找不到库的原因。

解决方案是从包中提取库并将它们与应用程序分开复制。您可以在此处找到如何执行此操作的详细信息。

于 2013-02-04T16:56:15.367 回答
1

也可以在添加自定义供应商目录时以aospSource:destinationOnImage如下格式指定文件:device-partial.mk

PRODUCT_COPY_FILES += \
    vendor/your-custom-vendor/your-device/proprietary/libx.so:system/lib/libx.so

您可以在此处添加几乎任何您喜欢的内容(.apk 文件除外),它将被复制到您的图像中。

于 2013-03-15T17:07:33.427 回答
1

我的指示与您的错误无关!但它可能对类似的错误有帮助

如果您尝试使用以下方法复制预构建的 apk:

PRODUCT_COPY_FILES += $(LOCAL_PATH)/prebuilt/filename.apk

你得到这个错误:

Prebuilt apk found in PRODUCT_COPY_FILES: ... , use BUILD_PREBUILT instead!. Stop.

您可以删除此检查我的修改文件build/core/MakeFile并评论以下行:

define check-product-copy-files
$(if $(filter %.apk, $(call word-colon, 2, $(1))),$(error \
    Prebuilt apk found in PRODUCT_COPY_FILES: $(1), use BUILD_PREBUILT instead!))
endef

#通过在每一行之前插入

于 2017-04-25T14:16:44.453 回答
0

也应该为每个单独的库添加多个库到一个 apk 一个附加部分(如 Justin Buser 的回答)。

于 2013-10-08T12:51:44.007 回答