NDK的Android和谷歌Play筛选(Android NDK and Google Play f

2019-06-25 01:20发布

该谷歌播放AppStore的自动过滤您的应用程序与兼容的CPU架构的设备。 例如,如果您有这只是编译的ARMv5库,您的应用程序将只显示与ARMv5中或ARMv7的处理器的设备。

如果我有一个Java的替代,并希望我的应用程序由非ARM的设备也可以下载? 例如,我试图加载外部库,并实现敏捷的字节码(Java)的一个可行的替代方案时捕获异常。

当我上传.apk文件,Android开发者控制台说:“这apk请求将被用于谷歌Play筛选1个的原生平台armeabi。”

我需要编译虚拟库x86和MIPS? 然后在我的Java代码,检查处理器架构知道如果我可以实际使用的图书馆吗? 应该有一个更好的解决方案。

据我所知,目前没有在清单有关CPU架构,我无法找到在开发者控制台的方式来关闭这个滤波器。

但愿有人谁知道比我做的关于谷歌Play筛选和NDK知道答案了很多。

Answer 1:

虽然俘获了调用LoadLibrary失败在任何设备上就可以了(至少一切,我都试过,包括GTVs),但Play商店不会在装置上显示,如果ABI该平台不会在APK存在。

从文档( http://developer.android.com/guide/appendix/market-filters.html ):一个包括针对特定平台的本地库(ARM EABI V7或x86,例如)应用程序是可见的仅上支持该平台的设备。

在理论上,建立适用于所有平台将能够定位到所有设备,但在实践中也有像谷歌电视的一些设备是报告没有ABI,这意味着只有那些没有原生代码的APK将出现在这些设备上的Play商店。 您可以使用多个APK,但是,1,没有本地代码和1个与支持本地代码的所有平台。

你可以在这里阅读有关多APK支持: http://developer.android.com/guide/market/publishing/multiple-apks.html



Answer 2:

这里有一个非常完整的回答了这个同样的问题: http://grokbase.com/t/gg/android-ndk/125v31e6wy/play-store-market-filtering-of-ndk-libs

:让我发表我自己的解决方案,它几乎是相同的,我在这里公布的.so的Android库与x86架构的缺失? (Vuforia)

所以,你必须经常Android.mk不能在x86架构上编译,因为你使用的库(libExternalLibrary.so)仅供手臂阿尔基。 你想建立一个基于这个库一个.so(libMyLibraryBasedOnExternalLibrary.so),当然它不会永远在x86无库编译。

我们的想法是产生虚拟库86直接直接在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 NDK and Google Play filtering