Я пытаюсь выполнить разделение abi в моем градиенте с помощью следующего кода
splits {
abi {
enable true
reset()
include 'x86', 'armeabi-v7a'/*, 'arm64-v8a', 'x86_64'*/
universalApk true
}
}
def abiVersionCodes = ['armeabi-v7a': 1, 'x86': 2, /*'arm64-v8a': 2,'x86_64': 4*/]
android.applicationVariants.all { variant ->
// assign different version code for each output
variant.outputs.each { output ->
def filter = output.getFilter(OutputFile.ABI)
if (filter != null) {
output.versionCodeOverride = abiVersionCodes.get(output.getFilter(OutputFile.ABI)) * 1000000 + android.defaultConfig.versionCode
}
}
}
Он производит выходные данные с правильным названием, и когда я использую анализатор apk в каталоге lib, armeabi-v7a apk будет содержать только so в каталоге lib / armeabi-v7a, а также для x86 apk. Однако armeabi-v7a также содержит папку armeabi и x86 с папкой META-INF, содержащей только файл MANIFEST.MF, нет.
При загрузке этих нескольких пакетов в консоль разработчика каждый разделенный apk указан в разделе
Различия в деталях apk: родных платформ нет (+ 3 общих)
и универсальный apk имеет
Родные платформы arm64-v8a, x86_64 (+ 3 общих) Ошибка на консоли для arm и универсального apk
"Полностью затененный APK ПРОБЛЕМА Этот APK не будет предоставляться пользователям, потому что он полностью затенен одним или несколькими APK с кодами более поздних версий. РЕШЕНИЕ Удалите этот APK из своего выпуска или проверьте таргетинг и коды версий APK, которые вы включаете в этом выпуске ".
Когда я добавляю под варианты упаковки
packagingOptions {
exclude '**/x86/**'
}
тогда результирующие apks, разделенные и универсальные, не будут поддерживать x86. Однако я не вижу способа указать PackageOptions для каждого варианта приложения, так что это не работоспособное решение, и это явно не правильный способ делать что-то, даже если бы это было так. Проблема, похоже, заключается в том, что apk считается поддерживающим x86 только потому, что у него есть каталог x86, даже если он в основном пуст, и это заставляет оба разделенных apks рекламировать, что они поддерживают одни и те же архитектуры, когда они этого не делают.
Любопытно, что универсальный apk говорит, что он поддерживает arm64-v8a, armeabi, armeabi-v7a, x86, x86_64, что НЕ то, что я ожидал бы после вызова reset () и включения 'x86', 'armeabi-v7a' в блоке abi . Чтобы предотвратить включение 64-битных арок, мне нужно добавить в defaultConfig
ndk {
abiFilters "armeabi-v7a", "x86"
}
но он по-прежнему включает пустую папку armeabi.
Как правильно разделить abi, чтобы консоль разработчика видела только то, что на самом деле поддерживает apk? Правильный ли подход - удаление пустых каталогов? Есть ли причина, по которой создается пустой каталог, который я могу отследить?