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