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

问题描述 投票:0回答:6

我尝试将预构建的 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 目录,但没有成功。

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

android android-ndk android-source apk
6个回答
18
投票

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

8
投票

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

复制预建文件的标准规则

它并不表明该应用程序将被安装。所以我认为这就是您的应用程序找不到库的原因。

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


2
投票

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

如果您尝试使用以下方式复制预构建的 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

在每行之前插入

#


1
投票

添加自定义供应商目录时,也可以在

aospSource:destinationOnImage
中以
device-partial.mk
格式指定文件:

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

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


0
投票

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


0
投票

为此特定目的,需要使用参数“4”对 apk 进行 zipaligned。如果使用外部 apk,则必须手动完成 zipalign,否则 apk 内的 .so 文件将因对齐错误而拒绝加载。即使您可能认为应用程序的 gradle 构建已经执行了 zipalign,但 zipalign 可能不会与所需的偏移量对齐。如果 zipalign 不能解决问题,请检查 Android 源代码:bionic/linker/linker.cpp,函数 open_library_in_zipfile() 这可能会为您提供更多线索,说明库未加载的原因。

© www.soinside.com 2019 - 2024. All rights reserved.