Как выбрать разные minSdkVersion для разных Android ABI? - PullRequest
1 голос
/ 31 мая 2019

У меня есть приложение для Android, которое создает armeabi-v7a и arm64-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 на основе abiFilters, т.е. использовать 16 для v7 и 21 для arm64.

Ответы [ 2 ]

1 голос
/ 05 июня 2019

Вам не нужно делать ничего, упомянутого в выбранном ответе.Просто установите minSdkVersion 16, и 64-битные ABI будут автоматически использовать minSdkVersion 21, потому что это самый низкий доступный API для 64-битных.

0 голосов
/ 03 июня 2019

Как работает свойство minSdkVersion, смотрите цитаты из официальной документации :

  1. Если существует версия платформы для ABI, равная minSdkVersion, CMake использует эту версию. В противном случае
  2. если существуют версии платформы ниже minSdkVersion для ABI, CMake использует самую высокую из этих версий платформы. Это разумный выбор, потому что отсутствующая версия платформы обычно означает, что не было никаких изменений в API нативной платформы с предыдущей доступной версии.
  3. В противном случае, CMake использует следующую доступную версию платформы выше minSdkVersion.

И это когда-либо упоминалось в ответе на другой ваш вопрос: Android Studio CMake / Ninja не используется для создания проекта NDK .

Я использую minSdkVersion = 21 для поддержки arm64. Я хотел бы изменить minSdkVersion на основе abiFilters, т.е. использовать 16 для v7 и 21 для arm64.

Насколько я понимаю, вы пытаетесь поддерживать более старые (уровень API ниже 21) 32-разрядные устройства без 64-разрядных собственных двоичных файлов. Я хотел бы сказать, что «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 для разных андроидов ABI?

minSdkVersion - это свойство, указывающее минимальную версию Android, на которую может быть установлено ваше приложение. Для одного APK это безусловная характеристика. Итак:

  • Если вы хотите, чтобы имел один единственный APK для поддержки всех устройств, начиная с API 16, тогда вам нужно установить minSdkVersion на 16.
  • Если вы хотите, чтобы имел один APK для поддержки как 32-битных, так и 64-битных устройств, вы должны предоставить полный набор ALL общих библиотек для обеих 32 и 64-битный

Или же вы должны предоставить различные APK, разделенные по ABI и minSdkVersion.

...