2014-02-28 143 views
7

我有一個Android庫項目FooLibFooLib引用類似Android Context的東西,但不需要任何資源文件(在res/中的東西),所以我目前將其打包爲一個JAR,以供我的應用程序使用。Android庫JAR依賴於Android庫AAR嗎?

我現在想使FooLib取決於BarLib,但BarLib確實利用資源,所以我不能打包BarLib作爲一個JAR。相反,它被打包成AAR。我有可能有FooLib依賴於BarLib,但繼續打包FooLib作爲JAR?或者,在FooLib有一個AAR依賴項迫使我使它成爲AAR嗎?

+1

JAR如何「依賴」任何東西?它只是一個類的容器。 –

+0

嗯是的,也許我應該措詞它 - 「可以打包成JAR的Android庫項目是否依賴於另一個使用資源的Android庫項目(因此打包爲AAR)並仍然打包爲JAR?「我懷疑答案是否定的,但我只想確認。 – Matthew

回答

5

如果您有一個包含JAR文件和AAR文件作爲依賴關係的項目(請參閱下面的註釋),那麼您可以將Android特定的JAR作爲依賴於Android API中的類的依賴項,儘管JAR文件無法包含您已知的Android資源。僅僅因爲它依賴於Android類並不意味着它需要被打包爲AAR。

在這裏我正在談論什麼可能是一個單模塊項目,其中包括一些JAR和AAR依賴項。一個JAR文件只是一個類文件(也許非Android資源和其他文件)的集合,並且沒有依賴關係,所以沒有什麼可以打破的。當開始構建時,構建器會將所有東西捆綁在一起並打包,而不檢查JAR是否對其他類具有無法解析的依賴關係 - 您將在運行時發現類加載器異常。

如果您在IDE中的多模塊項目中討論庫模塊,那麼這是另一回事。如果您有一個模塊A可以編譯爲純JAR(它在構建文件中使用apply plugin: 'java'語句),那麼它不依賴於編譯爲AAR的Android模塊(apply plugin: 'android-library')。這可能永遠不會被修復,或者至少不會在可預見的未來:這是因爲Android模塊有一個更復雜的源文件夾概念,並且Gradle中的Java插件無法理解Android的源代碼集。

反之亦然 - Android模塊可以依賴普通的Java模塊。

由於侷限在搖籃建設者尚未解決,您不能訪問本地奧爾斯在你在你的構建文件的JAR同樣的方式(通過經compile files(...)語句引用它們);你必須欺騙Gradle認爲他們在某種Maven倉庫中(也許把它們放在一個實際的 Maven倉庫中,它可以是本地的)。如果需要,請參閱Adding local .aar files to my gradle build以獲得解決方法。

+0

是的,我是我們假設模塊A和模塊B都是Android模塊(它們的build.gradle文件中都有'apply plugin:'android-library''語句),似乎我仍然可以使用http://stackoverflow.com/a/19484146/128948如果模塊A不需要資源,將模塊A打包爲JAR,如果模塊B確實需要資源並將其打包爲AAR,那麼我可以讓模塊A依賴於模塊B並仍然將模塊A封裝爲JAR? – Matthew

+0

看起來應該可以工作。android-library plugi ns可以互相依賴,而且Jake Wharton的腳本看起來應該能讓它將JAR輸出從模塊中取出。我相信隨着這些變化,模塊將生成兩個輸出,包括AAR和JAR。 –

+0

這個問題......因爲例如appcompat-v7在同一個maven子文件夾中提供了.aar和.jar ......當我指定依賴時,gradle總是選擇.aar文件,當然還有gradle java插件不知道它是什麼...有沒有辦法在.aar上選擇.jar,即使POM指定包.aar? –

1

因爲AAR format不像jar文件那樣直接包含類,所以它對於非Android項目沒有用處。因此,將FooLib製作成AAR會更好。

另一種解決方案是從BarLib中提取jar庫並依賴它。

+0

我不想在非Android項目中使用FooLib,但我想將FooLib作爲JAR來最大化兼容性,因爲如果它是AAR,我將無法在我的基於Ant的Android應用中使用它。要回答最初的問題,你是否說「不,Android庫JAR不能依賴於Android庫AAR?」 – Matthew