1

我有构建armeabi-v7aarm64-v8a. 这是build.gradle

apply plugin: 'com.android.library'

allprojects {
    repositories {
        jcenter()
        google()
    }
}

android {
    compileSdkVersion 28
    defaultConfig {
        minSdkVersion 21
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        externalNativeBuild {
            cmake {
                // Linker flags and Visibility options keeps the size of the library small
                cppFlags "-std=c++11"
                arguments "-DANDROID_STL=gnustl_static",
                          "-DANDROID_CPP_FEATURES=rtti exceptions",
                          "-DANDROID_TOOLCHAIN=gcc"
            }
        }
    }

    buildTypes {
        release {
            ndk {
                abiFilters 'armeabi-v7a', 'arm64-v8a'
            }
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            externalNativeBuild {
                cmake {
                    cppFlags "-Wl,--exclude-libs=ALL -Wl,--gc-sections -fvisibility=hidden -fvisibility-inlines-hidden -ffunction-sections"
                }
            }
        }
        debug {
            ndk {
                abiFilters 'armeabi-v7a', 'arm64-v8a'
            }
        }
    }
    externalNativeBuild {
        cmake {
            path 'CMakeLists.txt'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
}

我正在使用minSdkVersion = 21来支持 arm64。我想更改minSdkVersion基于abiFiltersie,v7 使用 16,arm64 使用 21。

4

2 回答 2

2

您无需执行所选答案中提到的任何操作。只需设置minSdkVersion 16,64 位 ABI 就会自动使用minSdkVersion 21,因为这是 64 位可用的最低 API。

于 2019-06-05T19:43:43.843 回答
1

有关该属性的工作原理,请参阅以下官方文档minSdkVersion的引用:

  1. 如果存在 ABI 的平台版本等于minSdkVersion,则 CMake 使用该版本。除此以外,
  2. 如果存在低于minSdkVersionABI 的平台版本,CMake 将使用这些平台版本中的最高版本。这是一个合理的选择,因为缺少平台版本通常意味着自上一个可用版本以来本机平台 API 没有任何更改。
  3. 否则,CMake 将使用高于minSdkVersion.

它曾经在可能回答您的另一个问题时提到过:Android Studio CMake/Ninja Not Used for Building an NDK project

我正在使用 minSdkVersion = 21 来支持 arm64。我想根据 abiFilters 更改 minSdkVersion,即,对 v7 使用 16,对 arm64 使用 21。

我的理解是,您正在尝试支持没有 64 位本机二进制文件的较旧(api 级别低于 21)的 32 位设备。我想说“ productFlavor”是正确的方向。例如,您可以使用如下所示的 gradle 配置来实现您的期望:


android {
   ...

    flavorDimensions "api", "mode"

    productFlavors {

        minApi16 {
            dimension "api"
            minSdkVersion 16
            versionCode android.defaultConfig.versionCode
            versionNameSuffix "-minApi16"
            ndk {
                abiFilters 'armeabi-v7a'
            }
        }

        minApi21 {
            dimension "api"
            minSdkVersion 21
            versionCode android.defaultConfig.versionCode
            versionNameSuffix "-minApi21"
            ndk {
                abiFilters 'arm64-v8a'
            }
        }

    }
   ...
}

minSdkVersion 16并将帮助您选择最minSdkVersion 21合适的 NDK 版本。


编辑#1

如何minSdkVersion为不同的android ABI选择不同的?

minSdkVersion是告诉您的应用可以安装的最低 Android 版本的属性。对于单个 APK,这是一个无条件的特征。所以:

  • 如果你想让一个 APK支持从 api 16 开始的所有设备,那么你必须将你的设置minSdkVersion为 16。
  • 如果您想让一个 APK同时支持 32 位设备和 64 位设备,您必须提供一整套32 位和 64 位的所有共享库。

否则,您必须提供按 ABI 和minSdkVersion.

于 2019-06-03T01:08:19.690 回答