我有一个可构建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。
答案 0 :(得分:1)
您无需执行所选答案中提到的任何操作。只需设置minSdkVersion 16
,64位ABI将自动使用minSdkVersion 21
,因为这是64位可用的最低API。
答案 1 :(得分:0)
有关minSdkVersion
属性的工作方式,请参见以下official documentation中的引号:
- 如果ABI的平台版本等于
minSdkVersion
,则CMake将使用该版本。 否则,- 如果ABI的平台版本低于
minSdkVersion
,则CMake将使用这些平台中的最高版本。这是一个合理的选择,因为缺少平台版本通常意味着自从先前的可用版本以来,本机平台API一直没有更改。- 否则,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
如何为不同的Android ABI选择不同的
minSdkVersion
?
minSdkVersion
是一个属性,用于告知您的应用可以安装的最低Android版本。对于单个APK,这是无条件的特征。因此:
minSdkVersion
设置为16。否则,您必须提供按ABI和minSdkVersion
划分的不同APK。