我尝试将预建的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编译。
答案 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的答案)。