Ошибка добавления готового apk с общими библиотеками в AOSP
Я попытался добавить готовый 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 ответов
BUILD_PREBUILT
звонки prebuild.mk
скрипт. Описание этого скрипта следующее:
Стандартные правила для копирования файлов, которые предварительно собраны
Это не говорит о том, что приложение будет установлено. Поэтому я думаю, что именно поэтому ваше приложение не может найти библиотеки.
Решение состоит в том, чтобы извлечь библиотеки из пакета и скопировать их отдельно от приложения. Подробности как это сделать вы можете найти здесь.
Я сам столкнулся с этой проблемой, причина в том, что когда файлы 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
Мои инструкции не о вашей ошибке! Но это может быть полезно для аналогичной ошибки
Если вы попытаетесь скопировать готовый 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
вставив #
перед каждой строкой
Файлы также могут быть указаны в aospSource:destinationOnImage
формат как это в device-partial.mk
при добавлении пользовательского каталога продавца:
PRODUCT_COPY_FILES += \
vendor/your-custom-vendor/your-device/proprietary/libx.so:system/lib/libx.so
Здесь вы можете добавить практически все, что вам нравится (кроме файлов.apk), и оно будет скопировано в ваше изображение.
Чтобы добавить несколько библиотек в один apk, необходимо добавить один дополнительный раздел (как в ответе Джастина Бьюзера) для каждой отдельной библиотеки.