如何定位不同的Android架构?

时间:2015-01-22 23:04:55

标签: java android android-ndk apk

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

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

3 个答案:

答案 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