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

时间:2019-05-31 18:29:39

标签: android android-ndk android-gradle android-min-sdk

我有一个可构建armeabi-v7a和arm64-v8a的Android应用。这是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。我想根据abiFilters更改minSdkVersion,即对于v7使用16,对于arm64使用21。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

有关minSdkVersion属性的工作方式,请参见以下official documentation中的引号:

  
      
  1. 如果ABI的平台版本等于minSdkVersion,则CMake将使用该版本。   否则,
  2.   
  3. 如果ABI的平台版本低于minSdkVersion,则CMake将使用这些平台中的最高版本。这是一个合理的选择,因为缺少平台版本通常意味着自从先前的可用版本以来,本机平台API一直没有更改。
  4.   
  5. 否则,CMake将使用高于minSdkVersion的下一个可用平台版本。
  6.   

它曾经提到过,可能会回答您的另一个问题: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 16minSdkVersion 21将帮助您选择最合适的NDK版本。


编辑#1

  

如何为不同的Android ABI选择不同的minSdkVersion

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

  • 如果您要拥有一个APK 以支持从api 16开始的所有设备,则必须将minSdkVersion设置为16。
  • 如果您要拥有一个APK 以同时支持32位设备和64位设备,则必须提供完整的 ALL 共享库集无论是32位还是64位。

否则,您必须提供按ABI和minSdkVersion划分的不同APK。