无法更改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'