【问题标题】:What issue could I have in Gradle managed device setup?我在 Gradle 托管设备设置中会遇到什么问题?
【发布时间】:2021-09-13 09:02:19
【问题描述】:

引入了 Gradle 管理设备的新功能(例如,请参见此处:https://developer.android.com/studio/preview/features?hl=fr

设置似乎很简单,只需将几行复制到模块级别的build.gradle 文件中,一切都会正常。

遗憾的是,我并非如此,我努力寻求一些建议。代码是红色的,脚本没有成功。查看我的build.gradle.kts 文件:

带下划线的 ManagedVirtualDevice 显示以下错误:

我的 Android Studio 版本是 Android Studio Bumblebee | 2021.1.1 金丝雀 11 构建号#AI-211.7628.21.2111.7676841,构建于 2021 年 8 月 26 日

同步 Gradle 显示:

org.gradle.internal.exceptions.LocationAwareException: Build file '/*****/app/build.gradle.kts' line: 112
Script compilation errors:

  Line 112:             pixel2api29 (com.android.build.api.dsl.ManagedVirtualDevice) {
                        ^ Unresolved reference: pixel2api29

  Line 112:             pixel2api29 (com.android.build.api.dsl.ManagedVirtualDevice) {
                                                               ^ Classifier 'ManagedVirtualDevice' does not have a companion object, and thus must be initialized here

  Line 114:                 device = "Pixel 2"
                            ^ Unresolved reference: device

  Line 115:                 apiLevel = 29
                            ^ Unresolved reference: apiLevel

  Line 117:                 systemImageSource = "google"
                            ^ Unresolved reference: systemImageSource

  Line 118:                 abi = "x86"
                            ^ Unresolved reference: abi

6 errors
    at org.gradle.kotlin.dsl.execution.Interpreter$ProgramHost$compileSecondStageOf$cacheDir$1.invoke(Interpreter.kt:666)
    at org.gradle.kotlin.dsl.execution.Interpreter$ProgramHost$compileSecondStageOf$cacheDir$1.invoke(Interpreter.kt:387)
    at org.gradle.kotlin.dsl.provider.CompileKotlinScript.execute(KotlinScriptEvaluator.kt:375)
    at org.gradle.internal.execution.steps.ExecuteStep.executeInternal(ExecuteStep.java:89)
    at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:40)
    at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:53)
    at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:50)
    at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200)
    at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195)
    at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
    ... 

哪个

【问题讨论】:

  • Google 如此大力推广 Kotlin 可能令人沮丧,但他们所有示例中的 Gradle 脚本仍然仅使用 Groovy 编写
  • @Rafsanjani 是的,好点子!当您有 kts 脚本时,就会发生这个确切的问题(因为代码在 Groovy 中)

标签: android gradle build.gradle


【解决方案1】:

刚刚遇到同样的问题 - 您需要实例化一个 ManagedVirtualDevice 对象并对其进行配置,然后再将其添加到您的设备列表中:

import com.android.build.gradle.internal.dsl.ManagedVirtualDevice

testOptions {
    devices {
        add(
            ManagedVirtualDevice("pixel2api30").apply {
                device = "Pixel 2"
                apiLevel = 30
                systemImageSource = "aosp-atd"
                abi = "x86"
            }
        )
    }
}

请注意,导入与 Google 文档所说的略有不同 - 在他们的示例中,它们传递的是接口,而不是实现。

【讨论】:

  • 在名为 internal 的包中使用类对我来说似乎不是一个好主意
  • @SWdV 可以避免这种情况,请参阅my answer
【解决方案2】:

适当的等价物是使用 NamedDomainObjectContainer 的方法:

import com.android.build.api.dsl.ManagedVirtualDevice
android {
    testOptions {
        devices {
            // create it now (if it doesn't exist yet) and configure it (exactly as in Groovy):
            maybeCreate<ManagedVirtualDevice>("pixel2api29") { ... }

            // or

            // create it now and configure it:
            create<ManagedVirtualDevice>("pixel2api29") { ... }

            // or

            // create it later and configure it:
            register<ManagedVirtualDevice>("pixel2api29") { ... }

            // or

            // if it already exists (created elsewhere), configure it:
            "pixel2api29"(ManagedVirtualDevice::class) { ... }

或使用by,以防您需要引用设备(例如组):

devices {
    val pixel2api29 by creating(ManagedVirtualDevice::class) { ... }
    // or
    val pixel2api29 by registering(ManagedVirtualDevice::class) { ... }
    deviceGroups {
        "phoneAndTablet" {
            targetDevices.add(pixel2api29)
        }
    }
}

org.gradle.kotlin.dsl.NamedDomainObjectContainerScope in
gradle-kotlin-dsl-7.4.jar!/org/gradle/kotlin/dsl/NamedDomainObjectContainerExtensionsKt.class

【讨论】:

    猜你喜欢
    • 2015-06-14
    • 1970-01-01
    • 2023-03-09
    • 2013-12-19
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2023-01-29
    • 2021-08-10
    相关资源
    最近更新 更多