Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何针对不同的Android架构? 我目前使用的OpenCV(OpenCV4Android)库不使用NDK(没有C或C++代码)。但是,armeabi、armeabi-v7a、mips和x86都有.so文件。如果我在项目中包括所有这些,应用程序大小是30mb,而如果我只包括1个,应用程序大小只有9mb。如果我尝试在没有包含该设备架构的.so文件的设备上运行应用程序,它会崩溃,而如果我包含了.so文件,它会工作_Java_Android_Android Ndk_Apk - Fatal编程技术网

Java 如何针对不同的Android架构? 我目前使用的OpenCV(OpenCV4Android)库不使用NDK(没有C或C++代码)。但是,armeabi、armeabi-v7a、mips和x86都有.so文件。如果我在项目中包括所有这些,应用程序大小是30mb,而如果我只包括1个,应用程序大小只有9mb。如果我尝试在没有包含该设备架构的.so文件的设备上运行应用程序,它会崩溃,而如果我包含了.so文件,它会工作

Java 如何针对不同的Android架构? 我目前使用的OpenCV(OpenCV4Android)库不使用NDK(没有C或C++代码)。但是,armeabi、armeabi-v7a、mips和x86都有.so文件。如果我在项目中包括所有这些,应用程序大小是30mb,而如果我只包括1个,应用程序大小只有9mb。如果我尝试在没有包含该设备架构的.so文件的设备上运行应用程序,它会崩溃,而如果我包含了.so文件,它会工作,java,android,android-ndk,apk,Java,Android,Android Ndk,Apk,因此,我希望将多个APK发布到不同的设备架构,以减少文件大小。据我所见,这只能在Application.mk文件中完成,但我的库中没有。有没有其他方法可以针对不同的Android架构 我目前使用的OpenCV(OpenCV4Android)库不使用NDK(没有C或C++代码)。但是,armeabi、armeabi-v7a、mips和x86都有.so文件 正如immibis所说,如果存在.so文件,那么它就是在使用NDK 如果我尝试在没有包含该设备架构的.so文件的设备上运行应用程序,它会崩溃,而

因此,我希望将多个APK发布到不同的设备架构,以减少文件大小。据我所见,这只能在Application.mk文件中完成,但我的库中没有。有没有其他方法可以针对不同的Android架构

我目前使用的OpenCV(OpenCV4Android)库不使用NDK(没有C或C++代码)。但是,armeabi、armeabi-v7a、mips和x86都有.so文件

正如immibis所说,如果存在
.so
文件,那么它就是在使用NDK

如果我尝试在没有包含该设备架构的.so文件的设备上运行应用程序,它会崩溃,而如果我包含了.so文件,它会工作

这取决于设备。许多x86设备都有
libhoudini
,它可以运行ARM NDK二进制文件,尽管速度比运行本机x86二进制文件慢。类似地,
armeabi-v7
设备可以运行
armeabi
NDK二进制文件,尽管速度可能较慢,特别是在使用浮点处理的情况下

因此,我希望将多个APK发布到不同的设备架构,以减少文件大小。据我所见,这只能在Application.mk文件中完成,但我的库中没有

Application.mk
文件只控制编译的内容,而不控制分发的内容

有没有其他方法可以针对不同的Android架构

使用Gradle for Android,可能与Android Studio结合使用,并且:

中的
abi
闭包将拆分
闭包:

  • 选择每个CPU体系结构具有不同的APK文件

  • 设置所需体系结构的白名单

  • 还请求包含所有体系结构的“通用APK”,用于不支持按体系结构划分的单独APK的分销渠道


构建的结果将是按CPU体系结构划分的单独APK,再加上通用APK

应用程序的每个apk都应该具有由
android:versionCode
指定的唯一版本代码。一些x86设备可以运行ARMv7二进制文件。因此,为了避免在x86设备(以及其他架构的类似场景)中下载/使用ARMv7 apk,您应该订购版本代码。例如,订购版本代码,以便x86 APK的版本代码高于ARMv7。更多关于版本控制的信息

ph0b在上共享了一个
build.gradle
示例,用于为您选择的每个体系结构创建唯一的版本编码APK。复制下面相同的内容

splits {
        abi {
            enable true
            reset()
            include 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a' //select ABIs to build APKs for
            universalApk true //generate an additional APK that contains all the ABIs
        }
    }

    // map for the version code
    project.ext.versionCodes = ['armeabi': 1, 'armeabi-v7a': 2, 'arm64-v8a': 3, 'mips': 5, 'mips64': 6, 'x86': 8, 'x86_64': 9]

    android.applicationVariants.all { variant ->
        // assign different version code for each output
        variant.outputs.each { output ->
            output.versionCodeOverride =
                    project.ext.versionCodes.get(output.abiFilter, 0) * 1000000 + android.defaultConfig.versionCode
        }
    }
建议:如果apk大小小于50mb,Android多apk支持建议不要使用多apk

通常应使用多个APK来支持不同的设备 仅当您的APK太大(大于50MB)时进行配置 不同设备所需的替代资源 配置。使用单个APK支持不同的配置 始终是最佳实践,因为它为应用程序提供了路径 为用户提供简单明了的更新(同时也让您的生活更简单 通过避免开发和发布复杂性)


我不建议使用此模式来生成您的内部版本号。 ARCH-BUILD,因为如果有一天你想回到一个APK,你必须大量增加你的版本代码。相反,您可以遵循以下模式: 建筑拱门

android.defaultConfig.versionCode * 100 + project.ext.versionCodes.get(output.getFilter(com.android.build.OutputFile.ABI), 0)
例如,对于构建74,构建编号为: 7402-armeabi-v7a
7408-x86

如果有.so文件,则使用NDK。是否可以在安装时(或之后?)指示必须安装单独的APK?然后你可以将你的应用分成五个,一个核心APK和四个特定于架构的APK,在安装核心应用后,它将检测arch并安装必要的额外APK。我相信如果他们使用相同的包名,他们可以作为一个单元一起工作,但我从未尝试过这样的事情。如果我偏离了基准,请道歉。@immibis我假设so文件来自预编译库(OpenCV4Android),并且在这个应用程序项目中,开发人员没有使用NDK来构建so文件。这是个好消息,因此,如果我使用这种方法,我是否能够为一个应用程序将多个APK部署到应用商店,以针对多个体系结构?…对每个APK使用单个“包含”,例如包含“armeabi-v7a”?@AggieDev:您可以在
包含
语句中列出您想要的体系结构,并跳过您不想要的体系结构(例如,
mips
,可能)。每个架构您将获得一个APK。就Play Store上的分发而言,我的理解是,它支持每个架构单独的APK,尽管我没有亲自尝试过。正如Kiran所说,您必须为每个架构提供不同的版本代码,并以“高级模式”将您的APK上载到开发人员控制台。这里有一个要点可以帮助您正确处理gradle中的版本代码:文档将建议的大小从50mb更新为100mb。“只有当APK太大(大于100mb)时,您才应该使用多个APK来支持不同的设备配置”
无法获取的未知属性“abiFilter”
android.defaultConfig.versionCode * 100 + project.ext.versionCodes.get(output.getFilter(com.android.build.OutputFile.ABI), 0)