2014-03-07 163 views
49

題目中的問題。一個類似的問題被問到here,唯一的解決方法是將項目發佈到本地Maven存儲庫。如何跨多個項目共享單個圖書館來源

這個問題在Android Studio 0.5中修復了嗎?在其release note中有一條聲明,內容爲「支持模塊內容根目錄之外的源文件夾」。這是否意味着我們最終可以從項目文件夾之外導入庫?

我試過File-> Import Project ..但它不起作用。

編輯2:(爲0.8 +),請參閱最新的解決方案公認的答案

編輯:

我的項目目錄結構只有一個模塊main它看起來像這樣

MyApp 
    main 
     build.gradle 
     src 
    build.gradle 
    settings.gradle 

庫項目目錄只有一個名爲lib的模塊(它們全部是自動生成的創建一個新的庫項目)

MyLibrary 
    lib 
     build.gradle 
     src 
    build.gradle 
    settings.gradle 

下面的行加入到MyApp/settings.gradle

include ':main', '..:MyLibrary' 

以下加入到MyApp/main/build.gradle

dependencies { 
    compile project(':..:MyLibrary') 
} 

結果是以下錯誤:

FAILURE: Build failed with an exception. 

* What went wrong: 
A problem occurred configuring project ':main'. 
> Configuration with name 'default' not found. 

作爲一個方面說明,庫項目MyLibrary本身可以編譯沒有錯誤。問題似乎是settings.gradle無法識別庫項目結構。

回答

75

(如版本2.1+):

下面是我走上共享項目目錄之外的庫源的步驟。我的代碼不是簡單的Java庫,而是編譯爲Android模塊,但該庫模塊不包含在主項目中。只要沒有代碼重複,我只需要爲所有項目維護一組庫代碼就可以了。

1)File-> new Project。給你的圖書館項目命名(這裏我使用LibraryProject)。繼續剩下的步驟來創建一個正常的項目(因爲這是一個庫,我選擇了「添加沒有活動」)

2)默認情況下,Android studio在項目文件夾內創建名爲「app」的模塊。爲了防止名稱與實際應用程序模塊發生衝突,請將模塊重命名爲其他名稱(右鍵單擊左側面板中的「應用程序」模塊 - >重構 - >重命名)。

3)在build.gradle你的庫模塊文件夾裏面,頂線

apply plugin: 'com.android.application' 

改變

apply plugin: 'com.android.library' 

,然後刪除在 「defaultConfig」 了 「的applicationID」 行。另外,由於這是一個庫,所以從Manifest.xml中刪除xlmns:...名稱空間和<application ..>正文。 這就是圖書館的一部分。現在,創建/修改您的主應用程序:

4)如果是新項目,請先創建新項目File-> new Project-> ApplicationName。

5)打開settings.gradle(應該只有在每一個項目一個這樣的文件),幷包括以下行(注意庫模塊中丟失的前導分號):

include ':app', '..:LibraryProject:yourLibraryModule' 

6)然後去文件 - >項目結構。

7)在「Dependencies」標籤下點擊右側綠色的「+」按鈕。選擇「模塊依賴」。選擇你的圖書館模塊,然後點擊確定。

您現在應該可以在應用程序中使用庫類。


其它方法 如果由於某種原因,仍存在上述方法的問題,你可以嘗試以下內容(here建議):

1)重複步驟1到4以上。默認情況下,主要和外部(庫)項目是這個樣子:

/MainProject 
    + build.gradle 
    + settings.gradle 
    + app/ 
     + build.gradle 
     + src/ 

    /LibraryProject 
    + build.gradle 
    + settings.gradle 
    + app/ 
     + build.gradle 
     + src/ 

2)像往常一樣,重構模塊名稱(在Android Studio中右鍵單擊模塊 - > refactor->重命名)的東西少混亂如

/MainProject 
    + build.gradle 
    + settings.gradle 
    + MainModule/ 
     + build.gradle 
     + src/ 

    /LibraryProject 
    + build.gradle 
    + settings.gradle 
    + LibraryModule/ 
     + build.gradle 
     + src/ 

3)修改settings.gradleMainProject

include ':LibraryModule', ':app' 
project(':LibraryModule').projectDir = new File(settingsDir, '../LibraryProject/LibraryModule') 

同步的項目,你就大功告成了。在Proguard的


說明目前你不應該使用外部庫項目/模塊的ProGuard。相反,你替換(在圖書館的build.gradle)以下(原來的答案here

buildTypes { 
    release { 
     minifyEnabled true 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt' 
    } 
    debug { 
     minifyEnabled false 
    } 
} 

下列要求:

buildTypes { 
    release { 
     consumerProguardFiles 'proguard-project.txt' 
    } 
} 

其中proguard-project.txt是包含您的庫項目ProGuard的規則文件。

+1

您能否提供一個檔案,包含您的主要圖書館和項目的骨架?或者你可以解釋如何使庫項目目錄結構?當我創建一個圖書館項目時,AS創建了更深的結構。我試圖像創建目錄一樣創建目錄,但AS報告了有關分解目錄中錯誤「錯誤路徑名」的錯誤。我在過去的2個小時裏嘗試了很多變體,但沒有成功。 :( –

+1

@ScottBarta。我在Android Studio 0.6.1上,即使按照Scott Barta和Neoh的小心指示,我仍然無法工作。我堅持使用「Error:Configuration with name'default '找不到',即使在根據Neoh的規範重新排列MyLibrary的文件結構(並在MyLibrary的build.gradle中將「MyLibary」指定爲「apply plugin:'android-library'」),最後我認爲這個問題最好由Android Studio開發人員(Scott Barta,你似乎是這樣的開發人員)繼續他們的好工作,以便它變成一個簡單的事情。 –

+0

請參閱我的答案編輯 – Neoh

9

是的,它現在在0.5.0。沒有一個友好的用戶界面(導入項目不是你想要的,因爲這會創建一個全新的項目;導入模塊仍然存在問題;請參閱https://code.google.com/p/android/issues/detail?id=62122),但是你可以設置你的構建文件使其工作。

比方說,你有一個看起來像這樣的目錄結構:

MyApp 
    appmodule 
     build.gradle 
      src 
       main 
        java 
    build.gradle 
    settings.gradle 
MyPlainJavaLibrary 
    build.gradle 
    src 
     java 

注意MyPlainJavaLibrary不是在文件系統中MyApp的目錄下。

設置您settings.gradle文件像這樣:

include ':appmodule', '..:MyPlainJavaLibrary' 

,包括在的build.gradle依賴於它這樣的(不要忘了領導冒號):

dependencies { 
    ... 
    compile project(':..:MyPlainJavaLibrary') 
} 

這適用於我。在我的項目查看器中,我現在將MyApp和MyPlainJavaLibrary視爲視圖中的兩個根級模塊目錄,並且可以使語句在模塊邊界等工作。

請注意,在此默認設置下,此共享模塊將只有一個構建輸出文件夾,該文件夾將在使用它的所有項目中共享。這可能是也可能不是你想要的。如果您希望爲每個使用共享模塊的項目設置不同的輸出目錄,則可以使用sourceSet中的輸出目錄做一些魔術;如果你需要這方面的幫助,我建議你自己嘗試一下,如果你遇到困難,就會發佈一個關於你的工作細節的問題。

每個項目只能有一個settings.gradle文件,所以這不會佔用整個其他多模塊Gradle項目並一舉引入所有模塊;你需要單獨帶入。但是,它應該滿足在多個項目中使用模塊的用例。

+4

我假設的依賴加入到模塊'build.gradle'不是項目的根'build.gradle'。我得到了以下錯誤:'出現問題配置項目「:main'.''>配置名稱爲‘默認’不found.' – Neoh

+0

@Neoh我有同樣的錯誤,請使用**編制項目(解決它: MyPlainJavaLibrary')** – omermuhammed

+0

@omermuhammed這似乎只當您將項目文件夾中的'MyPlainJavaLibrary'工作。我的問題是詢問如何在項目文件夾外包含一個庫源代碼。 – Neoh

1

我想做我的Android Wear的項目,那就是你有mobilewear模塊類似的東西。在Android Studio 1.5.1中,您可以執行File-> New-> Module並選擇Android Library作爲模塊。這將處理上述許多設置,並將您的圖書館放入您現有的Android Wear項目的之內。

+0

工作就像一個魅力!我所需要完成的工作肯定比接受的答案更容易 –

1

要充分利用Android Studio,我會建議最初創建一個普通的android項目。然後,在項目中,添加一個模塊「android library」類型,和(可選)「java library」(如果你要使用,可能是常見的Android應用程序和服務器端代碼的代碼)。

利用這種機制,你不需要操縱和修改的gradle產出和清單文件。