Вопрос по android – Android NDK и фильтрация Google Play

9

Магазин приложений Google Play автоматически фильтрует ваше приложение на устройствах с совместимой архитектурой процессора. Например. если у вас есть библиотека, скомпилированная только для ARMv5, ваше приложение будет отображаться только для устройств с процессорами ARMv5 или ARMv7.

Что, если у меня есть альтернатива Java и я хочу, чтобы мое приложение также загружалось не на ARM-устройствах? Например. Я ловлю исключение при попытке загрузить внешнюю библиотеку и реализую работоспособную альтернативу в байт-коде Dex (Java).

Когда я загружаю .apk, Android Developer Console говорит: «Этот apk запрашивает 1 нативную платформу, которая будет использоваться для фильтрации Google Play. Armeabi»

Нужно ли мне компилировать фиктивные библиотеки для x86 и MIPS? Затем в моем Java-коде проверьте архитектуру процессора, чтобы узнать, могу ли я на самом деле использовать библиотеку? Там должно быть лучшее решение.

Насколько я знаю, в Манифесте нет ничего об архитектуре процессора, и я не могу найти способ в консоли разработчика отключить этот фильтр.

Надеюсь, кто-то, кто знает намного больше, чем я, о фильтрации Google Play, а NDK знает ответ.

Возможная работа вокруг / насмешливая идея: / Stackoverflow.com вопросы / 15146174 / ... auselen

Ваш Ответ

2   ответа
11

крайней мере, все, что я пробовал, включая GTV), но Play Store не будет отображаться на устройствах, если в apk не существует ABI для этой платформы.

Из документов http: //developer.android.com/guide/appendix/market-filters.htm): Приложение, содержащее собственные библиотеки, предназначенные для конкретной платформы (например, ARM EABI v7 или x86), отображается только на устройствах, поддерживающих эту платформу.

В теории, сборка для всех платформ могла бы быть нацелена на все устройства, но на практике есть некоторые устройства, такие как Google Tv, которые не сообщают ABI, что означает, что только те apks, которые не имеют собственного кода, появятся в магазине Play на тех устройства. Однако вы можете использовать несколько apks, 1 без собственного кода и 1 со всеми платформами, которые поддерживают ваш собственный код.

Вы можете прочитать о поддержке нескольких apk здесь:http: //developer.android.com/guide/market/publishing/multiple-apks.htm

А как же наоборот (что я хочу сейчас сделать)? У меня есть приложение v7, которое использует библиотеки v5 (или что-то). Это означает, что у меня есть библиотеки для обеих архитектур, хотя основное приложение только для v7. В настоящее время мы только что переместили файлы, не относящиеся к v7, в папку v7, и это, похоже, работает, но это действительно уродливо и неправильно. Мы не можем разделить его на несколько apks, так как нужны обе нативные библиотеки. alaeus
@ alaeus Это должен быть отдельный вопрос. Это также хорошо - Android сохранил ABI-обратную совместимость, поэтому код ARMv5 будет отлично работать на устройствах ARMv6 / 7 (в частности, все они используют ABI «софт-поплавок», который может иметь значительное снижение производительности, но это что-то нам придется жить с). tc.
6

http: //grokbase.com/t/gg/android-ndk/125v31e6wy/play-store-market-filtering-of-ndk-lib

Позвольте мне опубликовать мое собственное решение, оно почти такое же, как я разместил здесь: Библиотека Android. Так с архитектурой x86 нет? (Vuforia)

Так что у вас есть обычный Android.mk, который не может компилироваться на архитектуре x86, потому что используемая вами библиотека (libExternalLibrary.so) предоставляется только для arm archi. Вы хотите создать .so (libMyLibraryBasedOnExternalLibrary.so) на основе этой библиотеки, и, конечно, он никогда не будет компилироваться на x86 без библиотеки.

Идея состоит в том, чтобы создавать библиотеки Dummy для x86 непосредственно непосредственно в Android.mk, используя инструкции условной компиляции.

1) Создайте 2 фиктивных файла .cpp Dummy0.cpp и Dummy1.cpp, например Dummy0.cpp, выглядит следующим образом:

#include <jni.h>
#include <android/log.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <math.h>
#include <string>

#ifdef __cplusplus
extern "C"
{
#endif

int dummy0                        =  0;

#ifdef __cplusplus
}
#endif

Затем отредактируйте Android.mk, который собирает вашу библиотеку, и измените ее следующим образом:

LOCAL_PATH := $(call my-dir)

ifeq ($(TARGET_ARCH_ABI), armeabi)


# In this condtion block, we're compiling for arm architecture, and the libExternalLibrary.so is avaialble
# Put every thing the original Android.mk was doing here, importing the prebuilt library, compiling the shared library, etc...
# ...
# ...

else

# In this condtion block, we're not compiling for arm architecture, and the libExternalLibrary.so is not availalble.
# So we create a dummy library instead.

include $(CLEAR_VARS)
# when LOCAL_MODULE equals to ExternalLibrary, this will create a libExternalLibrary.so, which is exactly what we want to do.
LOCAL_MODULE := ExternalLibrary
LOCAL_SRC_FILES := Dummy0.cpp
include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)
# This will create a libMyLibraryBasedOnExternalLibrary.so
LOCAL_MODULE := MyLibraryBasedOnExternalLibrary
# Don't forget to tell this library is based on ExternalLibrary, otherwise libExternalLibrary.so will not be copied in the libs/x86 directory
LOCAL_SHARED_LIBRARIES := ExternalLibrary
LOCAL_SRC_FILES := Dummy1.cpp
include $(BUILD_SHARED_LIBRARY)

endif

Конечно, в своем коде убедитесь, что вы никогда не вызываете библиотеку, когда ваше приложение работает на устройстве только для x86:

if ((android.os.Build.CPU_ABI.equalsIgnoreCase("armeabi")) || (android.os.Build.CPU_ABI2.equalsIgnoreCase("armeabi"))) {
    // Good I can launch
    // Note that CPU_ABI2 is api level 8 (v2.2)
    // ...
}
Я получаю приведенную ниже ошибку при попытке выполнить аналогичные действия: /android/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6/bin/../lib/gcc/arm-linux-androideabi/ 4.6.x-google /../../../../ arm-linux-androideabi / bin / ld: ошибка: не удается найти -lExternalLibrary.so collect2: ld вернул 1 состояние выхода Ankit Jain
Для какой архитектуры это ошибка компиляции? Можете ли вы увидеть в журналах компиляцию Dummy0.cpp? jptsetung
Я строю для архитектуры Arm, но первая библиотека ExternalLibrary.so генерируется. Я не знаю, почему она переходит в другую часть, когда я строю на архитектуре arm. Должен ли я использовать Ndk-подход вместо этого? Ankit Jain
Извините, не уверен, что понял проблему. Думаю, для ARM предоставляется сторонняя библиотека .so? Если так, у вас не должно быть проблем с ARM? Или, может быть, вы имеете в виду предоставленную библиотеку .so перезаписывается фиктивной библиотекой? (Может быть, вам стоит открыть отдельный вопрос с более подробной информацией, я думаю) jptsetung

Похожие вопросы