将Jetpack Compose添加到一个构建变体



我有一个支持API 19及更高版本的项目。我想实现jetpack组成的项目,但我想保持以下API 21的支持。为此,我创建了两种风格:"minapi21"one_answers"minapi19"。我希望minApi21支持撰写,而minApi19与旧代码工作。

这是构建。gradle文件:

android {
.
.
.
buildTypes {
debug {
}
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
.
.
.
flavorDimensions "api"
productFlavors{
minApi21 {
dimension "api"
minSdkVersion 21
versionCode 2000 + android.defaultConfig.versionCode
}
minApi19 {
dimension "api"
minSdkVersion 19
versionCode 1000 + android.defaultConfig.versionCode
versionNameSuffix ".19"
}
}
.
.
.
if (getGradle().getStartParameter().getTaskRequests()
.toString().contains("MinApi21")){
buildFeatures {
compose = true
}
composeOptions {
kotlinCompilerVersion = "1.5.31"
kotlinCompilerExtensionVersion = "1.1.0-alpha05"
}
}
}

下面是依赖项:

dependencies{
.
.
.
minApi21Implementation 'androidx.activity:activity-compose:1.3.1'
// Integration with activities
minApi21Implementation "androidx.constraintlayout:constraintlayout-compose:1.0.0-beta02"
minApi21Implementation "androidx.compose.runtime:runtime:1.1.0-alpha05"
// Compose Material Design
minApi21Implementation 'androidx.compose.material:material:1.0.2'
// Animations
minApi21Implementation "androidx.navigation:navigation-compose:2.4.0-alpha09"
minApi21Implementation 'androidx.compose.animation:animation:1.0.2'
// Tooling support (Previews, etc.)
minApi21Implementation "com.github.skydoves:landscapist-fresco:1.3.6"
minApi21Implementation "androidx.compose.ui:ui-tooling:1.0.2"
// Integration with ViewModels
minApi21Implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.4.0-beta01'
minApi21Implementation "com.google.accompanist:accompanist-permissions:0.18.0"
minApi21Implementation "androidx.compose.ui:ui:1.0.2"
minApi21Implementation "androidx.compose.ui:ui-tooling-preview:1.0.2"
minApi21Implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.1'
androidTestMinApi21Implementation 'androidx.compose.ui:ui-test-junit4:1.0.2'
androidTestMinApi21Implementation "androidx.test.espresso:espresso-core:$espressoVersion"
androidTestMinApi21Implementation "androidx.test.espresso:espresso-contrib:$espressoVersion"
androidTestMinApi21Implementation "androidx.compose.ui:ui-test-junit4:1.0.2"
}

有了这个build.gradle文件,minApi19和minApi21调试版本都构建得很好,但是当我创建签名包时,我得到了错误消息:

Task :app:compileMinApi19ReleaseKotlin FAILED
androidx.compose.compiler.plugins.kotlin.IncompatibleComposeRuntimeVersionException: The Compose Compiler requires the Compose Runtime to be on the class path, but none could be found. The compose compiler plugin you are using (version 1.1.0-alpha05) expects a minimum runtime version of 1.0.0.
at androidx.compose.compiler.plugins.kotlin.VersionChecker.noRuntimeOnClasspathError(VersionChecker.kt:112)
at androidx.compose.compiler.plugins.kotlin.VersionChecker.check(VersionChecker.kt:89)
at androidx.compose.compiler.plugins.kotlin.ComposeIrGenerationExtension.generate(ComposeIrGenerationExtension.kt:61)
at org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory.convertToIr$lambda-1(JvmIrCodegenFactory.kt:126)
at org.jetbrains.kotlin.psi2ir.Psi2IrTranslator.generateModuleFragment(Psi2IrTranslator.kt:89)
at org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory.convertToIr(JvmIrCodegenFactory.kt:146)
at org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory.convertToIr$default(JvmIrCodegenFactory.kt:64)
at org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory.generateModule(JvmIrCodegenFactory.kt:59)
at org.jetbrains.kotlin.codegen.KotlinCodegenFacade.compileCorrectFiles(KotlinCodegenFacade.java:35)
at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.generate(KotlinToJVMBytecodeCompiler.kt:321)
at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules$cli(KotlinToJVMBytecodeCompiler.kt:113)
at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules$cli$default(KotlinToJVMBytecodeCompiler.kt:56)
at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:169)
at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:52)
at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:92)
at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:44)
at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:98)
at org.jetbrains.kotlin.incremental.IncrementalJvmCompilerRunner.runCompiler(IncrementalJvmCompilerRunner.kt:412)
at org.jetbrains.kotlin.incremental.IncrementalJvmCompilerRunner.runCompiler(IncrementalJvmCompilerRunner.kt:112)
at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compileIncrementally(IncrementalCompilerRunner.kt:358)
at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compileIncrementally$default(IncrementalCompilerRunner.kt:300)
at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compileImpl$rebuild(IncrementalCompilerRunner.kt:119)
at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compileImpl(IncrementalCompilerRunner.kt:170)
at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compile(IncrementalCompilerRunner.kt:81)
at org.jetbrains.kotlin.daemon.CompileServiceImplBase.execIncrementalCompiler(CompileServiceImpl.kt:607)
at org.jetbrains.kotlin.daemon.CompileServiceImplBase.access$execIncrementalCompiler(CompileServiceImpl.kt:96)
at org.jetbrains.kotlin.daemon.CompileServiceImpl.compile(CompileServiceImpl.kt:1658)

我尝试在flavor中声明compileOptions和buildFeatures,得到相同的错误。

我如何解决这个问题,为什么它只在发布版本失败?

我们也在一个开源项目上玩Jetpack Compose,遇到了同样的问题,实际上只对运行时部分做了这样的事情,

if (gradle.startParameter.taskNames.any { "minApi21" in it || "MinApi21" in it }) {
implementation("androidx.compose.runtime:runtime:$composeVersion")
}

(它是在Kotlin DSL而不是Groovy中,所以你必须自己做转换)

这里是我完成的部分,https://github.com/persian-calendar/DroidPersianCalendar/blob/2af5eb3/PersianCalendar/build.gradle.kts#L200

我知道这不是理想的,但它对我们来说已经足够好了,直到compose本身变得足够有用,所以放弃Android 4的compose带来的好处是值得的,这使得它的转换实际上是值得的,但这个hack的解决方案使得签名构建的分离风格的撰写实际上工作。

最新更新