无法更改configuration的依赖关系(启用即时运行后)

我只是启用instant run在我的android studio项目。 ( 按照这里的说明 )

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

这是我得到的错误:

错误:(8,0)解决之后,无法更改configuration“: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') } 

库build.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' } 

我有同样的问题。 我通过@RaGe将它与(工作)示例项目进行了比较,发现了它们之间的细微差别。

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

以下是我在@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 

重命名文件夹。

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

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

 include ':app' // Give your library project any module name, ie ':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') 

我有同样的问题。 我通过删除子模块顶级build.gradle文件中的classpath来解决此问题。

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

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

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

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

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

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

使用即时运行的已知问题

使用reflection即时运行

反思可能会出现意想不到的事情,例如:

  • 课程全部公开
  • 许多其他的东西也被公之于众

性能分析的限制

我们build议在分析debugging应用程序时临时禁用Instant Run。

使用“即时运行”时性能影响非常小,方法被覆盖时影响稍大。

App方法的增加

即时运行增加了一些方法-140加上你的应用程序中的类数和它的本地依赖关系的三倍。 如果应用程序之前刚刚低于dex限制,启用“即时运行”可能会将您的应用程序超出dex限制。 通过优化Multi dex开发版本了解如何解决这个问题。

其他已知问题

  • 在IDE失去与应用程序的连接的情况下,可能会发生间歇性问题,从而导致完全重build。
  • 第三方Gradle插件兼容性尚未经过testing,特别是那些尚未更新的使用新的转换API的。
  • 数据绑定目前在这个版本中被破解(能够被恢复)。

所以如果你面临这个问题,那么你可以closures你即时运行

请转到设置→构build,执行,部署→即时运行,然后取消选中启用即时运行…。

更好的了解即时运行在这里

把你的依赖从你的顶层构buildgradle中取出。 因为你正在用你的顶层gradle创build一个classpath,然后试图用你的其他build.gradles来覆盖它

从:

 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仓库添加到您的独立应用程序阶段,因为它们应该是特定的,并且jcenter将涵盖许多这些,如@AndroidMechanic和@Hi我是Frogatto在之前的答案中一直试图说的注释。 看看这里阅读Bintray – JCenter

另一件事是,我不明白你为什么要pipe理你的图书馆在你的项目中build立gradle作为你的项目的一部分。 你应该使用应用程序的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' } 

做出这些改变,然后看看有什么重复,你可以从那里pipe理。

另外,我build议在进行更改时手动将项目与Gradle文件同步。 我不会立即依靠任何东西,重要的是要更改步骤明智的和盘点发生了什么,特别是当它不会编译。 这是我的意见只有一种方式在Android编程。

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

也:

在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工具项目网站

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

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

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

尝试改变它

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

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

两件事你可以尝试

改变你的插件“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' 

请参阅弃用列表 。

库项目的build.gradle似乎导致configuration错误(由于一些模糊的原因)。 对于我来说,将库项目(这是一个git子模块)添加到settings.gradle而不是只添加库的项目模块就足够了。

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

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