在Android

时间:2018-06-15 03:34:43

标签: android cmake android-ndk arm64 abi

我正在使用CMake在我当前的Android项目中使用JNI。为了保持我的apk大小,我想只支持arm64-v8a。我发现有两种方法可以做到:

(1)在Cmake

中设置选项
defaultConfig {
    applicationId "com.example.something.here"
    minSdkVersion 23
    targetSdkVersion 27
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    externalNativeBuild {
        cmake {
            cppFlags "-frtti -fexceptions"
            abiFilters "arm64-v8a"
        }
    }
}

(2)在ndk

中设置选项
defaultConfig {
    applicationId "com.example.something.here"
    minSdkVersion 23
    targetSdkVersion 27
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    externalNativeBuild {
        cmake {
            cppFlags "-frtti -fexceptions"
        }
    }
    ndk {
        abiFilters "arm64-v8a"
    }
}

他们都创建了工作APK。但我对三件事感到好奇。

  1. 我只使用CMake作为JNI。为什么设置ndk块(选项2)有效?
  2. apks的大小不同。选项1生成15.0 MB,而选项2生成12.3 MB。那是为什么?
  3. 两个选项生成的apks之间是否存在速度或性能差异?

1 个答案:

答案 0 :(得分:1)

  

我只使用CMake for JNI。为什么在ndk块中设置(选项2)有效?

ndkexternalNativeBuild { ndkBuild不同。

  

apks的大小不同。选项1生成15.0 MB,而选项2生成12.3 MB。那是为什么?

  • ndk { abiFilters指定哪些ABI应该为您的APK构建并打包。
  • externalNativeBuild { **** { abiFilters仅指定Gradle应为哪些ABI构建(因此,如果您出于某种原因需要,可能会为您实际不包含在APK中的ABI构建)。

很难说为什么会出现规模差异,因为我们并没有坐在您的开发机器上。但有一个合理的解释是,您的项目目录中有另一个ABI的现有库。然后,当您移除ndk { abiFilters时,您告诉gradle,将旧版本的资料库打包到您的APK中也可以,从而增加了APK的大小。

  

这两个选项生成的apks之间是否有任何速度或性能差异?

如果你的意思是运行时速度差异,那么我看不到。构建时间和安装时间可能会有所不同,具体取决于您构建的数量以及打包到APK中的数量。