我目前正在使用不使用NDK的OpenCV(OpenCV4Android)库(没有C或C ++代码)。但是,armeabi,armeabi-v7a,mips和x86都有.so文件。如果我在项目中包含所有这些,则应用程序大小为30mb,而如果我只包含1,则应用程序大小仅为9mb。如果我尝试在没有包含该设备的架构的.so文件的设备上运行应用程序,它会崩溃,而如果我有它包含的.so文件,有用。
因此,我想将多个APK发布到不同的设备架构以减少文件大小。从我所见,这只能在Application.mk文件中完成,但我的库没有。是否有其他方法可以针对不同的Android架构?
答案 0 :(得分:17)
我目前正在使用不使用NDK的OpenCV(OpenCV4Android)库(没有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结合使用,以及the abi
split:
android {
...
splits {
abi {
enable true
reset()
include 'x86', 'armeabi-v7a', 'mips'
universalApk true
}
}
}
abi
闭包中的splits
闭包:
选择在每个CPU架构中使用不同的APK文件
设置您想要的架构白名单
还请求包含所有体系结构的“通用APK”,用于不支持按体系结构分隔APK的分发渠道
您的构建结果将是CPU体系结构的单独APK,以及通用的。
答案 1 :(得分:10)
应用程序的每个apk都应具有android:versionCode
指定的唯一版本代码。某些x86设备可以运行ARMv7二进制文件。因此,为了避免在x86设备中下载/使用ARMv7 apk(以及其他架构的类似场景),您应该订购版本代码。例如,订购版本代码,以便x86 APK的版本代码高于ARMv7。有关此link的版本控制的更多信息。
用于为您选择的每个体系结构创建唯一版本编码apks的build.gradle
示例由github处的ph0b共享。复制下面的内容。
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
}
}
建议:Android多个apk支持documentation建议不要使用多个apks ,如果apk大小小于50mb。
您通常应该使用多个APK来支持不同的设备 仅当您的APK太大(大于50MB)到期时才进行配置 到不同设备所需的替代资源 配置。使用单个APK来支持不同的配置 始终是最佳实践,因为它为应用程序提供了途径 为用户更新简单明了(也让您的生活更简单 避免开发和发布复杂性。)
答案 2 :(得分:3)
我不建议使用此模式来构建您的内部版本号。 ARCH - BUILD,因为如果有一天你想回到一个APK,你将不得不增加你的版本代码。相反,你可以遵循这种模式: BUILD - ARCH
android.defaultConfig.versionCode * 100 + project.ext.versionCodes.get(output.getFilter(com.android.build.OutputFile.ABI), 0)
对于构建74的例子,构建号将是:
7402 - armeabi-v7a
7408 - x86