【问题标题】:Cannot change dependencies of configuration (after enabling instant run)无法更改配置的依赖关系(启用即时运行后)
【发布时间】:2016-02-25 23:56:19
【问题描述】:

我刚刚在我的 android studio 项目中启用了instant run。 (关注instructions here

我的项目包含 git 子模块,不知何故这些不再编译。

这是我得到的错误:

错误:(8, 0) 无法更改配置的依赖关系 ':libraries:my_library:classpath' 解决后。

知道那里可能有什么问题吗?

顶级 build.gradle:

buildscript {
repositories {
    mavenCentral()
    jcenter()
    maven { url 'https://maven.fabric.io/public' }
}

dependencies {
    classpath 'com.android.tools.build:gradle:2.0.0-alpha1'
    classpath 'com.novoda:bintray-release:0.2.7'
    classpath 'io.fabric.tools:gradle:1.+'
}}

模块 build.gradle:

apply plugin: 'android'
apply plugin: 'io.fabric'

android {

    defaultConfig {
       versionCode 4850
       versionName '4850'
       compileSdkVersion 23
       buildToolsVersion '23.0.1'
    }

    packagingOptions {
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/MANIFEST.MF'
        exclude 'META-INF/NOTICE'
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }

    useLibrary 'org.apache.http.legacy'
}

repositories {
    mavenCentral()
    jcenter()
}


dependencies {
    [skip]
    compile project(':libraries:my_library:sdk')
}

库构建.gradle

apply plugin: 'com.android.library'

android {
    compileSdkVersion 23
    buildToolsVersion '23.0.2'

    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 23
    }

    lintOptions {
        abortOnError false
    }
}

repositories {
    mavenCentral()
}

dependencies {
    compile fileTree(include: '*.jar', dir: 'libs')
    compile 'com.android.support:support-v4:23.1.0'
    compile 'com.android.support:appcompat-v7:23.1.0'

    testCompile 'junit:junit:4.12'

}

【问题讨论】:

  • 你能把你的build.gradle文件包括进来吗?
  • 尝试移除织物,看看是否是造成混乱的原因,对所有模块也使用相同的 buildToolsVersion
  • @HiI'mFrogatto 完全是……这就是我刚才在回答中提到的。
  • @passsy 上面发布的 gradle 文件是否完全符合您的情况?从下面的一些 cmets 看来,虽然您有相同的错误消息,但您的项目结构(具有两个顶级 build.gradle 文件)与上面的问题不同。您可以根据您的具体情况更新此问题,但实际上,您应该在一个全新的问题中发布您的代码。

标签: android android-studio gradle android-gradle-plugin


【解决方案1】:

我遇到了同样的问题。我通过删除子模块顶级build.gradle 文件中的classpath 解决了这个问题。

dependencies { 
     // classpath 'com.android.tools.build:gradle:1.0.0'
}

我不确定这是否是最好的做法,但它对我有用。

【讨论】:

  • 这也对我有用。但这并不理想,因为我们不应该更改子模块的 build.gradle。
【解决方案2】:

类路径'com.android.tools.build:gradle:2.0.0-alpha1'

试着改成

 classpath 'com.android.tools.build:gradle:2.0.0-alpha6'

alpha1 从今天开始似乎已经过时(?)并且不再编译。 此外,您必须将您的 gradle 升级到最新的 2.10 才能使用 alpha6

【讨论】:

  • 2.0.0-alpha6 和 gradle 2.10 存在同样的问题
【解决方案3】:

根据即时运行的官方文档。

幕后发生的事情是我们更新了您项目的 build.Gradle 文件以使用最新版本的 Android Gradle 插件,这是 Instant Run 运行所必需的。我们还将您的 Gradle 包装器版本更新到 2.8,并尝试将您所有模块中的构建工具版本更新到最新 (23.0.2)。 Instant Run 不需要这样做,但它将使用新的更快版本的 dex,这有助于即时运行和完整构建更快一些。

Application\build.gradle 的片段如下所示:

buildscript {
   repositories {
       jcenter()
   }

   dependencies {
       classpath 'com.android.tools.build:gradle:2.0.0-alpha1'
   }
}

使用 Instant Run 的已知问题

通过反射使用 Instant Run

反射可以显示意想不到的东西,例如:

  • 课程全部公开
  • 许多其他事情也被公开了

性能分析的限制

我们建议在分析您的调试应用程序时暂时禁用 Instant Run。

使用 Instant Run 时对性能的影响非常小,而在重写方法时影响稍大。

应用方法的增加

Instant Run 添加了一些方法——140 加上三倍于应用程序中的类数量及其本地依赖项。如果应用程序之前刚刚低于 dex 限制,启用 Instant Run 可能会使您的应用程序超过 dex 限制。了解如何通过优化多 dex 开发构建来解决此问题。

其他已知问题

  • 当 IDE 失去与应用程序的连接时,可能会出现间歇性问题,这将触发完全重建。
  • 第三方 Gradle 插件兼容性尚未经过测试,尤其是那些尚未更新以使用新的转换 API 的插件。
  • 此版本中的数据绑定当前已损坏(可恢复的功能)。

因此,如果您遇到此问题,则可以关闭即时运行

转到设置→构建、执行、部署→即时运行并取消选中启用即时运行...。

更好地理解即时运行 go here

【讨论】:

  • 这与即时运行无关。更多的是无法更新到com.android.tools.build:gradle:2.0.0-alpha6,因为子模块包含一个完整的项目,其中包含顶级build.gradle 和多个模块(lib 和示例)。包含带有 compile project(':otherproject:lib') 的 lib 失败,因为新的 gradle build 插件读取了 otherproject 的顶级 build.gradle。类路径将设置并导致错误“无法更改配置的依赖项...”-> 无法构建。禁用即时运行并不能解决问题
  • @passsy 在关闭即时运行后尝试重建您的完整项目。
【解决方案4】:

将您的依赖项从顶级构建 gradle 中移除。实际上,您正在使用顶级 gradle 创建一个类路径,然后尝试用您的其他 build.gradle 覆盖它

发件人:

buildscript {
repositories {
    mavenCentral()
    jcenter()
    maven { url 'https://maven.fabric.io/public' }
}

dependencies {
    classpath 'com.android.tools.build:gradle:2.0.0-alpha6'
    classpath 'com.novoda:bintray-release:0.2.7'
    classpath 'io.fabric.tools:gradle:1.+'
}}

致:请注意,我没有添加注释行,Android-Studio 会自动执行此操作

buildscript {
    repositories {
        jcenter()
    }   
    dependencies {
        classpath 'com.android.tools.build:gradle:2.0.0-alpha6'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

您应该能够将任何需要的 Maven 存储库添加到您的单独应用程序 gradle 中,因为它们应该是特定的,并且 jcenter 将涵盖其中的许多,正如 @AndroidMechanic@Hi I'm Frogatto 在以前的答案中一直试图说的那样和厘米。 看看这里阅读Bintray - JCenter

另一件事是,我不明白您为什么将项目中的库构建 gradle 作为项目的一部分进行管理。您应该使用 app build.gradle 从您的项目中引用您的库。您将库 gradle 视为应用程序 gradle。

dependencies {
    compile fileTree(include: '*.jar', dir: 'libs')
    compile 'com.android.support:support-v4:23.1.0'
    compile 'com.android.support:appcompat-v7:23.1.0'

    testCompile 'junit:junit:4.12'

}

进行这些更改,然后查看有哪些重复项,您可以从那里进行管理。

另外,我建议在进行更改时手动将项目与 gradle 文件同步。我不会依赖即时的任何东西,重要的是要逐步进行更改并评估正在发生的事情,特别是当它无法编译时。这只是我的意见,也是在 android 中编程的一种方式。

如果即时运行对特定项目造成严重破坏,我会为该项目禁用它。它默认启用,我对此没有任何问题。构建混乱可能是您的项目开始时不清楚 gradles 的结果。

还有:

在 gradle 包装器属性中,classpath 'com.android.tools.build:gradle:2.0.0-alpha6' 需要 2.10 级:

distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip

查看此处了解最新更新 Android Tools Project Site

或者您可以安装以前版本的 Android Studio 并使用您项目的以前工作版本。

如果你有多个 git 文件,我建议你删除多余的,只保留你用于版本控制的那些。

【讨论】:

  • 这并没有解决原始发布者或 passsy 提出的问题。问题是他们试图在不同的 android 项目下包含一个带有 root 和 lib 模块的整个 android 项目。这会产生两个“根级别”的 build.gradle 文件。我承认这是一种组织项目的愚蠢方式,但在升级到 alpha6 之前它显然对他们有用。因此问题。所有关于 repos 和依赖关系的东西都是很好的建议,但与手头的问题无关。
  • 此外,buildscript 部分中的依赖项是完全可以接受的,只是通常不适用。在这种情况下,依赖项显然是 buildscript 本身的 gradle 库(例如 bintray 版本),而不是 android 代码依赖项。因此它们被正确放置在 buildscript 部分,而不是问题中的应用依赖项,
  • @ReGe 正确分析了为什么这个答案不能解决这个问题。该结构可能是“错误的”,但它已在许多项目中使用。即使使用“错误”的结构,我也应该能够在不触发父文件夹的 build.gradle 的情况下包含一个包含模块的文件夹。
【解决方案5】:

您可以尝试两件事

将您的插件更改为“android”

使用新的 gradle 工具,您需要为模块 gradle 文件以及库 gradle 文件指定正确的插件。如果你仔细看,你的库 gradle 文件是正确的:'

apply plugin: 'com.android.library'

更改您的模块 gradle 插件:

apply plugin: "android" -> apply plugin: 'com.android.application'

org.apache 类现已被弃用

这也可能是您的应用程序不再编译的一个可能原因。删除这个:

useLibrary 'org.apache.http.legacy'

Deprecated List

【讨论】:

    【解决方案6】:

    我遇到了同样的问题。我将它与@RaGe 的(working) sample project 进行了比较,发现了细微的差别。

    子项目文件夹必须以大写字母开头。

    这是我对@RaGes 示例所做的更改,以打破它并让它再次工作。

    破碎的结构:

    android-multi-project-sample
        + .gralde
        + .idea
        + app
        + build
        + gradle
        + myApplication2
        - .gitignore
        - android-multi-project-sample.iml
        - build.gradle
        - gradle.properties
        - gradlew
        - gradlew.bat
        - local.properties
        - settings.gradle
    

    导致以下错误:

    Error:(8, 0) Cannot change dependencies of configuration ':myApplication2:classpath' after it has been resolved.

    工作结构(带有大写子项目)

    android-multi-project-sample
        + .gralde
        + .idea
        + app
        + build
        + gradle
        + MyApplication2     // upper case!!!!!!
        - .gitignore
        - android-multi-project-sample.iml
        - build.gradle
        - gradle.properties
        - gradlew
        - gradlew.bat
        - local.properties
        - settings.gradle
    

    还必须更改顶级settings.gradle

    + include ':app', ':MyApplication2:mylibrary'
    - include ':app', ':myApplication2:mylibrary'
    

    app/build.gradle 必须改变这一点

    + compile project(':MyApplication2:mylibrary')
    - compile project(':myApplication2:mylibrary')
    

    一切都会编译

    小心! Git 默认不区分大小写。使用

    git mv -f myApplication2 temp
    git mv -f temp MyApplication2
    

    重命名文件夹。

    【讨论】:

    • 哇!很棒的收获!谢谢你。如果由我决定,我会在赏金到期之前将赏金奖励给你。现在至少我们可以尝试研究为什么会发生这种情况。我猜这是一个android插件错误。
    • 我不得不问,是什么让你改变了项目名称的大小写?
    • 谢谢!效果很好。我不敢相信我因为一个小写字母而浪费了两天时间。
    • 同样显然,也只允许一级子目录:MyApplication2:mylibrary 可以工作,但:Subdirectory:MyApplication2:mylibrary 不行。您可以使用github.com/martinbonnin/TestInstantRun 进行复制。最好能解释一下为什么我们有这些限制,但我会将这个问题标记为已回答。感谢大家的帮助。
    • 呃,请用谁的答案?
    【解决方案7】:

    gradle 读取并执行包含模块的所有文件夹中的所有build.gradle 文件。如错误所示,它还尝试执行:libraries:my_library的根构建脚本。

    您必须更改您的 settings.gradle 并通过设置其“projectDir”来包含库项目:

    include ':app'
    
    // Give your library project any module name, i.e. ':sdk'
    include ':sdk'
    // Then set the project path of the library module
    project(':sdk').projectDir = new File('libraries/my_library/sdk')
    

    有了这个settings.gradle,你可以引用库项目作为gradle依赖:

    compile project(':sdk')
    

    【讨论】:

    • 这应该是公认的答案。改变项目结构不是解决办法
    【解决方案8】:

    库项目的 build.gradle 似乎会导致配置错误(因为一些晦涩的原因)。对我来说,将库项目(这是一个 git 子模块)添加到 settings.gradle 而不是仅添加库的项目模块就足够了。

    而不是: include ':libraries:my_library:sdk'

    尝试同时包含库子项目和子项目的模块: include ':libraries:my_library' include ':libraries:my_library:sdk'

    【讨论】:

      猜你喜欢
      • 2017-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 2017-04-10
      • 2016-05-25
      • 2019-06-16
      • 2022-11-18
      相关资源
      最近更新 更多