【问题标题】:How to choose different minSdkVersion for different android ABI?如何为不同的android ABI选择不同的minSdkVersion?
【发布时间】:2019-05-31 18:29:38
【问题描述】:

我有构建armeabi-v7aarm64-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。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 调试了很久才发现不一定是这样。它适用于您在此处描述的最新 NDK 23,但是当使用 NDK 16 编译我的 cpp 文件时,已编译的 64 位变体未包含在 apk 中。不过,使用构建变体和具有不同 minsdk (21) 的方法效果很好。我希望我可以为某人节省一些浪费的时间来解决这个问题:)
    【解决方案2】:

    有关minSdkVersion 属性的工作原理,请参阅下面来自official documentation 的引用:

    1. 如果存在等于minSdkVersion 的 ABI 平台版本,CMake 将使用该版本。 否则,
    2. 如果 ABI 存在低于minSdkVersion 的平台版本,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 16minSdkVersion 21 将帮助您选择最合适的 NDK 版本。


    编辑#1

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

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

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

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

    【讨论】:

    • 感谢您的回答。 minApi16 在构建时如何对应 armeabi-v7a(与 minApi21 w.r.t arm64-v8a 相同)?
    • 您可以在 minApi16 风格中添加 abiFilters 使其只有 armeabi-v7a 和 minApi21 相同,请参阅我在答案中的更新。
    • 你不需要这样做。只需设置minSdkVersion 16,它会自动将 21 用于 arm64,因为这是第一个可用版本。
    猜你喜欢
    • 2019-11-17
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多