使用Ant打包Android應用詳解——Ant使用解析

來源:互聯網
上載者:User

標籤:ant打包   android   apk   

  上篇《使用Ant打包Android應用詳解》描述了使用Ant打包的流程,但很多步驟並沒有說明如此做的原因,本篇將從Ant方面來理解,下一篇從APK產生的流程來說明。

  APK包的產生是一系列操作的結果,而Ant則是將這一系列操作流程化,提供出定製化的介面,以及可配置的參數供修改,而這些都是通過指定的構建檔案來實現。我們就從Ant的打包流程來理解Ant的一些基本用法。當在命令列中執行ant,預設會去解析目前的目錄的build.xml作為構建檔案。下面是個刪除部分注視的版本:

<project name="工程名" default="help"> <!-- The local.properties file is created and updated by the 'android' tool. It contains the path to the SDK. It should *NOT* be checked into Version Control Systems. --> <property file="local.properties" /> <property file="ant.properties" /> <!-- Import per project custom build rules if present at the root of the project. This is the place to put custom intermediary targets such as: -pre-build -pre-compile -post-compile (This is typically used for code obfuscation. Compiled code location: ${out.classes.absolute.dir} If this is not done in place, override ${out.dex.input.absolute.dir}) -post-package -post-build -pre-clean --> <import file="custom_rules.xml" optional="true" /> <!-- Import the actual build file. <import file="${sdk.dir}/tools/ant/build.xml" />
再跟進到你的SDK目錄的tools/ant/build.xml,查看Ant打包的完整過程。
    1.首先理解幾個概念,project、target、task。簡單來說,你的一個構建工程(project),劃分了很多階段或者子目標(target),而每個階段目標的實現,你要提供具體的操作,比如檔案複製,源碼編譯,這些封裝好的操作就是task(可以理解為為你提供的庫函數)。具體看,每個構建檔案都有頂層為project的標籤,作為標識,而target就是你所要執行的操作序列,target裡面可以有很多的task。那麼怎麼確定操作序列執行的順序呢?其中project的default指的是預設執行的target,也就是當你在命令列只輸入ant不帶任何參數時,執行的target。而當你指定了target後,如在命令列中輸入ant help,會從你的構建檔案中找到target help執行。當我們輸入ant release時,對應的target如下:
<target name="release" depends="-set-release-mode, -release-obfuscation-check, -package, -post-package, -release-prompt-for-password, -release-nosign, -release-sign, -post-build" description="Builds the application in release mode."> </target>
target的name和description顧名思義,而depends則是該target執行前,需要執行或者說依賴的target,而且是依據從左至右的順序依次執行。繼續跟進-package它的定義:<target name="-package" depends="-dex, -package-resources">,分別是dex檔案的產生和資源打包,裡面又定義了很多具體的target。整個過程中就有或者說預留了一些空的target,比如-pre-build -pre-compile -post-package -post-build,是每個打包編譯步驟之前後結束,通過在custom_rules.xml中重寫這些target,達到定製化的要求
  2.解決了執行序列的問題,那麼如何進行參數配置呢?
(1)首先在工程下的build.xml中property,可以理解為定義了部分變數或者引入了property 檔案,看其部分屬性:
name:property的名稱,在target或者其它地方可以通過${name}的形式引用
value:具體的值或路徑
file:需要載入的property檔案,檔案中的內容以key=value中出現,如local.properties中定義的sdk.dir=android的sdk路徑
refid:引用已經定義的path資訊
自己工程的build.xml中property定義的local.properties引入了android sdk/ndk,ant.properties引入了簽名時需要的資訊;這裡有個關鍵的特性是,一旦定義了property,其值是不能改變的,而且會保留最先定義的值;也就是這個特性,方便了在編譯過程中的一些定製化操作。如上篇中調用隱藏api,將自己的framework.jar加入到project.target.class.path中
(2)import標籤,屬性file:要引入的構建檔案,optional:值為true時,即使import的檔案不存在,也不停止編譯。那麼custom_rules.xml是可有可無,而${sdk.dir}/tools/ant/build.xml是定義了真正的編譯步驟的檔案必須存在
   3.一些用到的其它標籤
(1)定義檔案目錄path,從ant手冊中的例子看:

<path id="base.path">      <pathelement path="${classpath}"/>      <fileset dir="lib">        <include name="**/*.jar"/>      </fileset>      <pathelement location="classes"/> </path>
一個可以在其它地方通過refid引用的path,裡麵包括了具體path路徑pathelement和通過include或exclude來篩選檔案的fileset
(2)copy task

<copy todir="${source.absolute.dir}">     <fileset dir="其它源碼目錄">        <include name="**/*.java" />        <include name="**/*.aidl" />    </fileset> </copy>
odir:目標目錄,來源目錄在fileset上定義,規則是包括所有.java檔案和所有aidl檔案;簡單的如拷貝單個檔案
<copy file="myfile.txt" tofile="mycopy.txt"/>
拷貝一個檔案到某個目錄
<copy file="myfile.txt" todir="../some/other/dir"/>
這些資訊都可以通過查詢ant參考手冊https://ant.apache.org/manual/來瞭解,不一一敘述


通過上述描述應該可以理解並跟進整個ant打包android應用的流程,根據自己的需要進行定製化操作



著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

使用Ant打包Android應用詳解——Ant使用解析

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.