2014-10-07 94 views
29

我有一個帶有4個子模塊的基於gradle的Android項目 - 兩個庫和兩個應用程序。我試圖通過將一些共享代碼/配置移動到最高級別的build.gradle文件來簡化每個子模塊的build.gradle文件,並使用subprojects {}使該代碼可用於每個子模塊。從gradle構建Android項目時無法找到用於參數的方法android()

的文件系統結構如下所示:

Root 
|- App1/ 
|- App2/ 
|- Lib1/ 
|- Lib2/ 
|- build.gradle 
|- settings.gradle 

的問題是,如果我添加一個android {}部分子項目的Gradle,然後任務失敗。例如,這是我的頂層的build.gradle文件:

subprojects { project -> 
    android { 
    buildToolsVersion "20.0.0" 
    } 
} 

運行gradle這個回報是:

出了什麼問題: 的問題發生評估根項目「機器人」。 在根項目'android'上找不到方法android()參數[build_7dngpra6ldok366maq0on77r7e $ _run_closure3_closure5 @ 43d95624]。

我搜索了類似的帖子,有些人建議增加線路apply plugin: 'android'每個子項目,以揭露失蹤android()方法搖籃抱怨。但是,該解決方案對我不起作用,因爲它會將該行有效地添加到庫項目中,而該項目需要apply plugin: 'android-library'

當您在同一個項目中擁有應用程序和庫時,有沒有辦法在subprojects {}之內使用android {}

回答

31

這實際上是對android-gradle插件構造方式的一個限制,在the android tools website處有一個解決方法。

如果您有很多Android模塊,您可能希望避免在所有模塊中手動設置相同的值。因爲你可能混合了android和android-library項目,所以你不能通過子項目閉包應用這些插件。

提出的解決方案是:

...在根項目的build.gradle:

ext { 
    compileSdkVersion = 19 
    buildToolsVersion = "19.0.1" 
} 
在所有的Android模塊

android { 
    compileSdkVersion rootProject.ext.compileSdkVersion 
    buildToolsVersion rootProject.ext.buildToolsVersion 
} 

.. 。

我想到的是,我注意到,這對老版本的gradle無效(我試着用1.10並得到一個錯誤)。在Gradle 2.1中,這似乎可以正常工作。

+1

我在gradle中做了這個修改,但我得到的 – AdiAtAnd 2016-10-07 01:31:22

+0

仍然適用於我,確保你編輯了正確的build.gradle文件(有2個,檢查文件夾) – vaskort 2016-11-13 22:04:12

2

user4118620的答案有一個小問題...至少在Gradle 2.10上使用它時。 爲了讓android模塊可以看到關鍵字。我們需要把EXT下的子項目範圍

在根gradle這個文件,你需要添加以下

subprojects { 
    ext{ 
    <android_compile_sdk_key> = <sdk_value> 
    <android_build_key> = <build_value> 
    } 
} 

在每個子模塊的,你那麼只需按照他提到過去哪

android { 
    compileSdkVersion <android_compile_sdk_key> 
    buildToolsVersion <android_build_key> 
} 

您可以找到有關gradle這個multibuild的文檔以下鏈接

https://docs.gradle.org/current/userguide/multi_project_builds.html#sub:adding_specific_behavior

相關問題