2012-01-10 246 views
3

我有一個主構建文件,用於構建一系列Android項目。這些Android項目中的每一個都引用了相同的Android庫項目(我將其稱爲CoreLibrary)。以下是我的subant任務。通過主ANT構建文件構建多個Android項目

<target name="build" description="Builds (only) all applications"> 
    <subant> 
     <target name="debug" /> 
     <fileset refid="all-applications" /> 
    </subant> 
</target> 

問題:有什麼我可以做,以防止被重新修建在我subant任務的所有應用程序集中每個Android項目CoreLibrary?這會顯着加快我的構建時間,所以我希望我能做些什麼。

+0

現在,我不這麼認爲。下一個主要工具版本可能支持將庫項目作爲JAR進行分發。在這種情況下,您可以讓Ant腳本構建庫項目,並讓其他項目直接引用JAR,而不是庫項目。至少在理論上。 – CommonsWare 2012-01-11 00:15:27

+0

謝謝。我曾希望新的構建過程可以防止重複建立圖書館在某種程度上可以幫助您。換句話說,我知道如果我有Lib A和Lib B引用Lib C,那麼當構建一個引用Lib A和B的項目時,Lib C將只會建立一次。我希望如果我能夠找到一種方法來利用這個問題。 – 2012-01-11 16:11:55

+0

@CommonsWare我更新了一個你可能想看的答案。據我可以告訴它應該工作正常,但我不知道什麼時候'nodeps'目標被添加到SDK。 – 2012-04-19 17:22:52

回答

6

其實我最近想出瞭解決這個問題的方法。基本思想是,我的ANT文件找到所有庫項目,首先構建它們,然後使用nodeps目標構建剩餘的項目。這有效地防止了CoreLibrary不斷重新編譯的情況。如果我寫的居然發現庫相關訂單,所以我可以建立一個與nodeps目標庫任務

<?xml version="1.0" encoding="UTF-8"?> 
<project name="MasterBuild"> 

<!-- A property for the name of the file that contains 'android.library=true' (which is how we find library projects) --> 
<property name="library.setting.file.name" value="project.properties" /> 

<filelist id="normal-projects" dir="."> 
    <!-- You want to add your own projects here --> 
    <file name="./MyProject/build.xml" /> 
    <file name="./MyProject2/build.xml" /> 
    <file name="./MyProject3/build.xml" /> 
</filelist> 

<fileset id="all-libraries-properties" dir="."> 
    <include name="*/${library.setting.file.name}" /> 
    <contains casesensitive="true" text="android.library=true" /> 
</fileset> 

<pathconvert property="all-libraries" refid="all-libraries-properties"> 
    <globmapper from="*${library.setting.file.name}" to="*build.xml" /> 
</pathconvert>  

<target name="-set-debug-mode"> 
    <property name="build.target" value="debug" /> 
    <property name="install.target" value="installd" /> 
</target> 

<target name="-set-release-mode"> 
    <property name="build.target" value="release" /> 
    <property name="install.target" value="installr" /> 
</target> 

<target name="-build-dependencies" unless="built.dependencies"> 
    <property name="built.dependencies" value="true" /> 
    <subant buildpath="${all-libraries}" target="${build.target}" inheritall="false" /> 
</target> 

<target name="-build-normal-projects" depends="-build-dependencies"> 
    <subant inheritall="false"> 
     <target name="nodeps" /> 
     <target name="${build.target}" /> 
     <resources refid="normal-projects" /> 
    </subant> 
</target> 

<target name="-install-normal-projects"> 
    <subant inheritall="false"> 
     <target name="${install.target}" /> 
     <resources refid="normal-projects" /> 
    </subant> 
</target> 

<target name="debug" depends="-set-debug-mode, -build-normal-projects" description="Builds (only) a debug-key signed application" /> 
<target name="release" depends="-set-release-mode, -build-normal-projects" description="Builds (only) a release-key signed application" /> 

<target name="installd" depends="-set-debug-mode, -install-normal-projects" description="Installs (only) a debug-key signed application" /> 
<target name="installr" depends="-set-release-mode, -install-normal-projects" description="Installs (only) a release-key signed application" /> 

</project> 

注意該解決方案可以改善。此外,可能有一種方法可以自動檢測「正常項目」,但我還沒有需要。最後,我從我正常的ANT文件中展開了很多東西,以便將它帶入此處,希望我沒有錯過任何東西。但是,這個概念是存在的。

0

如果您的庫項目是僅限於java的資源(無資源),則可以將其分發爲jar文件,而不是使用ivy + ivy ant任務來管理depgendencies,以解決構建文件的不足之處。但他們仍然會從類構建到dex文件。

1

如果您使用Android Maven插件,您可以單獨構建所有相應的部件或將它們作爲模塊一起構建,並將核心庫用作JAR或apklib(如果它們具有資源等)。 Maven的內置依賴機制將負責整合不同的庫。

看看例如RoboGuice或ActionBarSherlock及其示例應用程序,以瞭解其工作原理。

此外,如果您使用存儲庫管理器並在那裏部署這些庫,那麼您的所有團隊成員都可以從那裏獲取庫,並且他們可以例如由CI服務器構建。

+0

你知道這個插件實際上在幕後做了什麼嗎?目前,我們的團隊不使用Maven,但我會想象他們正在做類似於我的回答所做的事情。 – 2012-04-25 13:15:24

+0

是的,我知道。我是核心撰稿人,作者和主持人。它使用dependency mgt從存儲庫中引入工件...並可以部署到它們。它擁有一流的支持,可以將項目組合在一起,還有更多。看看谷歌代碼上的網站。按照Xavier的說法,Android SDK將在未來的版本中得到一些東西。 – 2012-04-25 16:23:10

+0

我明白了。 Maven是否使用完全自定義的構建系統來一起編譯所有內容?換句話說,它只是使用原始可執行工具並構建一切(而不是ANT/eclipse)?如果是這樣,那可能會有問題,因爲我確實需要以自定義方式構建某些項目。無論如何,當我有機會的時候,我會看到你的插件可以做什麼。 – 2012-04-25 18:40:15