2013-03-02 132 views
16

我正在嘗試使用Gradle和Android Gradle plugin構建Android項目。我想依賴外部(maven)存儲庫中的庫項目,例如ActionBarSherlock。Gradle外部Android庫項目

這根據official site似乎是可能的:

Using a library is done one of the following way:

Multi-project setup. Read here: http://www.gradle.org/docs/current/userguide/multi_project_builds.html

Dependencies through a repo such as maven or ivy.

我的build.gradle的當前內容:

buildscript { 
    repositories { 
     mavenCentral() 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:0.2' 
    } 
} 
apply plugin: 'android' 

repositories { 
    mavenCentral() 
} 

dependencies { 
    compile 'com.actionbarsherlock:library:4.2.0' 
} 

android { 
    target = 'android-16' 
    sourceSets { 
     main { 
      manifest { 
       srcFile 'AndroidManifest.xml' 
      } 
      java { 
       srcDir 'src' 
      } 
      res { 
       srcDir 'res' 
      } 
      assets { 
       srcDir 'assets' 
      } 
      resources { 
       srcDir 'src' 
      } 
     } 
    } 
} 

我使用的搖籃1.2。當我嘗試建立與gradle assemble,我得到以下錯誤:

Error: duplicate files during packaging of APK /[path to project]/build/apk/[project name]-debug-unaligned.apk 
    Path in archive: AndroidManifest.xml 
    Origin 1: /[path to project]/build/libs/[apk name]-debug.ap_ 
    Origin 2: /[home directory]/.gradle/caches/artifacts-14/filestore/com.actionbarsherlock/actionbarsherlock/4.2.0/apklib/dd63451a922558005d8c10be1085b488ed731d19/actionbarsherlock-4.2.0.apklib 
:packageDebug FAILED 

好像它試圖從兩個庫項目和我的項目包括AndroidManifest.xml中。如果我刪除sourceSets中的manifest規範,我仍然會得到相同的錯誤。

該網站提到使用apply plugin: 'android-library'爲圖書館項目;我猜這只是在構建實際庫(使用多項目設置)時才這樣做的,因爲這樣做不會生成APK。

如何獲得外部Android庫項目依賴性的工作?

回答

20

雖然可以通過Maven或Ivy存儲庫獲得依賴關係,但這些不會打包到標準Jar存檔中。有一種專門爲此構建系統設計的新格式。類型是'aar'

當前在Maven Central上可用的Android庫是使用Maven插件創建的,該插件使用不同的存檔格式('apklib'),因此它們不兼容。

如果你看看com.actionbarsherlock:actionbacksherlock(這是該庫的新位置),你會看到它的格式是apklib。 http://search.maven.org/#artifactdetails%7Ccom.actionbarsherlock%7Cactionbarsherlock%7C4.2.0%7Capklib

查看源代碼,我們檢查'aar'的包裝,並恢復爲將所有其他處理爲'jar',這在這裏顯然是一個問題。我們應該檢測apklib並提供更好的錯誤消息。

+0

是新AAR格式編譯分佈狀jar或其他原始的zip文件,如apklib? – yorkw 2013-03-13 03:31:40

+0

使用插件的0.3版本,似乎構建一個Android庫項目會生成一個AAR(帶有編譯類和資源的存檔)。除非它更廣泛,否則有一種方法可以讓Android Gradle插件與Maven Central(等)上的現有apklib打包庫一起使用?編輯:考慮到網站上的當前消息,這將特別有用:「圖書館的二進制包裝仍在經歷變化,不要將圖書館上傳到maven central(或其他類似的回購)。」 – antonyt 2013-03-13 03:56:35

+17

aar與apklib類似,它是一個包含jar +其他文件的zip文件。支持apklib並不是真的計劃,但我可以研究它。 – 2013-03-13 04:51:51

-1

您正在使用舊版本的Android gradle插件。
在最新版本0.3中,這方面有很多改進。

我會建議你升級到這個插件的0.3版本。請注意,您必須使用更新版本的gradle(1.3或1.4)。

有關如何使用此插件external libraries的更多信息。

14

您現在可以將ActionBarSherlock集成爲aar。

只是在你的build.gradle文件添加到您的依賴定義:

dependencies { 
    compile 'com.android.support:support-v4:18.0.+' 
    compile 'com.actionbarsherlock:actionbarsherlock:[email protected]' 

傑克沃頓商學院發表example project演示瞭如何用搖籃使用ActionBarSherlock

+0

一直試圖找出這一點!謝謝 – 2013-08-22 21:56:29