将带有共享库的预构建apk添加到AOSP时出错

时间:2013-02-04 12:58:18

标签: android android-ndk android-source apk

我尝试将预建的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复制到lib目录,但它不起作用。

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

5 个答案:

答案 0 :(得分:15)

我自己遇到过这个问题,原因是当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

答案 1 :(得分:6)

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

  

复制预建文件的标准规则

它不会告诉应用程序将被安装。所以我认为这就是为什么你的应用程序找不到库。

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

答案 2 :(得分:1)

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

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

您可以在此处添加任何您喜欢的内容(.apk文件除外),并将其复制到您的图片中。

答案 3 :(得分: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

在每行之前插入#

答案 4 :(得分:0)

如果要为一个apk添加多个库,则应为每个单独的库添加一个附加部分(如Justin Buser的答案)。