Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.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
在Android中选择特定ABI的两种不同方式_Android_Cmake_Android Ndk_Arm64_Abi - Fatal编程技术网

在Android中选择特定ABI的两种不同方式

在Android中选择特定ABI的两种不同方式,android,cmake,android-ndk,arm64,abi,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" test

我正在使用
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"
        }
    }
}
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"
    }
}
(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"
            abiFilters "arm64-v8a"
        }
    }
}
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。但我对三件事很好奇

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

    ndk
    externalNativeBuild{ndkBuild
    不同

    APK的大小不同。选项1生成了15.0 MB,而选项2生成了12.3 MB。这是为什么

    • ndk{abiFilters
      指定应该为APK构建并打包到APK中的ABIs gradle
    • externalNativeBuild{****{abiFilters
      只指定应该为哪个ABIs gradle进行构建(因此,如果出于某种原因需要,您可以为实际不包含在APK中的ABIs进行构建)
    很难说为什么会有大小差异,因为我们不是坐在您的开发机器旁。但一个合理的解释是,您的项目目录中有另一个ABI的现有库。然后当您删除
    ndk时{abiFilters
    您告诉gradle也可以将旧库打包到APK中,从而增加APK的大小

    两个选项生成的APK之间是否存在速度或性能差异

    如果你指的是运行时速度的差异,那么我看不到任何差异。构建时间和安装时间可能会有差异,这取决于你构建了多少,以及你在APK中打包了多少