Эквивалент versionCodeOverride для DSL Gradle Kotlin
android.applicationVariants.all { variant ->
variant.outputs.each { output ->
int newVersionCode = android.defaultConfig.versionCode * 10 + abiVersionCodes.get(output.getFilter(com.android.build.OutputFile.ABI), 0)
output.versionCodeOverride = newVersionCode
}
}
Я пытаюсь преобразовать этот код Gradle Groovy DSL в новый Gradle Kotlin DSL. Я хочу, чтобы код работал точно так же, как раньше, когда разделенный вариант APK следовал моему шаблону versionCode
Вот что я пытался написать в Kotlin DSL:
applicationVariants.all(object : Action<ApplicationVariant> {
override fun execute(variant: ApplicationVariant) {
variant.outputs.forEach {output ->
val newVersionCode = defaultConfig.versionCode ?: 0 * 10 + abiVersionCodes[output.filters.first { it.identifier == com.android.build.OutputFile.ABI }]
output.versionCodeOverride = newVersionCode
}
}
})
Но он говорит: "Неразрешенная ссылка: versionCodeOverride"
Как правильно сделать это с Kotlin DSL?
1 ответ
Решение
output
на самом деле имеет ApkVariantOutputImpl
тип, который имеет setVersionCodeOverride(int versionCodeOverride)
метод. Так что вы просто можете разыграть output
чтобы этот тип явно использовать этот метод в Kotlin:
(output as ApkVariantOutputImpl).versionCodeOverride = ...
Кроме того, чтобы получить abi
версия, вы должны использовать этот код:
val abi = output.filters.find { it.filterType == OutputFile.ABI }?.identifier
а также abi
будет x86
, armeabi-v7a
, так далее.
В конце концов, ваш код должен выглядеть примерно так:
android.applicationVariants.all {
outputs.forEach { output ->
val newVersionCode = defaultConfig.versionCode ?: 0 * 10 + abiVersionCodes[output.filters.find { it.filterType == OutputFile.ABI }?.identifier]
(output as ApkVariantOutputImpl).versionCodeOverride = newVersionCode
}
}