使用Ant打包Android應用具體解釋

來源:互聯網
上載者:User

標籤:message   odi   代碼   clu   pat   end   命令   android   混淆   

  計劃寫個完整的使用Ant打包Android應用的系列文章。三篇文章。首篇具體介紹採用Ant打包Android應用的流程。列出部分定製問題及其解決方案,第二篇介紹我理解的Ant打包的思路與主要的概念和使用,最後一篇描寫敘述apk包的產生過程。    實現的環境:    作業系統:ubuntu 64bit 14.04    Android SDK Build Tools:22.0.1    Android SDK Tools:24.3.3    Ant:1.9.4    ProGuard:5.2.1    JDK:1.7一、簡單應用出包流程  這裡的出包流程包含編譯、代碼混淆、apk簽名。

對於簡單的Android應用。簡單的幾步操作就能完畢:

1.產生Ant編譯須要的build.xml    在SDK檔案夾的tools下,調用android update project產生,詳細命令的使用方法能夠查看參考1。比如:切換到你的工程檔案夾    android update project --name 自己起的工程名 -p .    -p參數後面的點是表示當前檔案夾    在project檔案夾下就會產生Ant編譯須要的build.xml,直接執行ant debug。就可以完畢編譯,並在bin檔案夾下產生debug版本號碼的apk包。須要注意的幾個問題是:(1)自己主動產生的build.xml產生了幾個跟Android相關的target呢:能夠通過直接輸入ant來查看help說明(2)遇到BUILD FAILED怎樣解決:能夠查看BUILD FAILED上面的log看運行到什麼地方,還有看提示在build.xml的哪一行出現故障。這裡的build.xml是指在sdk/tools/ant下的,比如:
[aapt] invalid resource directory name: project檔案夾/bin/res crunchBUILD FAILEDsdk/tools/ant/build.xml:649: The following error occurred while executing this line:build.xml:694:null returned: 1
一般看到res crunch,應該就是你在eclipse中project自己主動編譯的檔案與ant組建檔案衝突。僅僅要關掉eclipse的自己主動編譯。clean下project又一次跑ant就可以。

  (3)能夠留心看下project.properties和local.properties2.加入代碼混淆在工程的project.properties檔案裡有凝視說明怎樣開啟代碼混淆#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt去除#號就可以,同一時候能夠在proguard-project.txt添加你須要特殊處理的配置
改動後,再運行ant release,你會在輸出中看到
-obfuscate:[mkdir] Created dir:project檔案夾/bin/proguard[jar] Building jar: project檔案夾/bin/proguard/original.jar[proguard] ProGuard, version 5.2.1...

能夠看到我用的proguard版本號碼。可是用ant debug是沒有proguard,由於僅僅有release版本號碼才須要混淆,具體原因興許文章會具體講述。混淆後的mapping檔案在bin檔案夾下。    注意的問題:project的AndroidManifest.xml中假設配置了android:debuggable=true,那麼即使ant release也不會混淆代碼3.簽名    首先給apk簽名須要keystore。詳細的產生此處不細講,簡單的說在eclipse中選則project,右鍵android tools -> export android application 中有產生選項    其次是在project檔案夾下建立ant.properties檔案,裡面配置你的簽名資訊比如:key.store=kestore檔案的路徑
key.store.password=密碼
key.alias.password=密碼
key.alias=別名此時再運行ant release,在bin檔案夾下可產生“project名-release.apk”。你終於要的release版本號碼的apk
到此,簡單androidproject的的ant編譯打包完畢,很方便。


二、加入定製化    1.增加so庫    Android應用的Ant編譯預設是不會編譯jniproject的,它僅僅會處理libs中的庫檔案。

假設你的libs中剛好有編譯好的so,那打包好的apk似乎能正常執行。在配置好的jniproject,僅僅要執行ndk的ndk-build就可以完畢so的編譯。因此,僅僅要在build.xml同檔案夾中加入custom_rules.xml檔案,內容例如以下:

<?xml version="1.0" encoding="UTF-8"?><project name="工程名" default="help"><target name="-pre-compile">    <echo >ndk build.............................</echo>    <exec executable="${ndk.dir}/ndk-build" >    </exec></target></project>
在同檔案夾下的local.properties中添加一行。指定你的ndk檔案夾ndk.dir=ndk路徑再次運行ant release,查看你的so庫是否已產生

    假設你的jniproject是作為庫project存在,方法是一樣的。

主project依賴你的庫project,在庫project中也產生build.xml,然後依照上面的方法操作就可以。

    2.調用隱藏api,增加android.jar    不少project是基於Android原生代碼改動而來。或者就是想調用系統隱藏的部分api,就會用到別人編譯好的android.jar,或者framework.jar等其他什麼名字的庫檔案,並且會要求載入的順序在你選擇的android編譯版本號碼之前。

在eclipse的Java Build Path->Libraries中調整其載入順序,那麼ant編譯怎麼改動呢?還是利用前面編寫的custom_rules.xml,內容例如以下:

<?xml version="1.0" encoding="UTF-8"?><project name="hooktest" default="help"><property name="project.target.android.jar" value="${sdk.dir}/platforms/${target}/android.jar" /><target name="-pre-compile">    <echo >set project target class path.............................</echo>    <path id="project.target.class.path">    <pathelement location="framework.jar"/>    <pathelement location="${project.target.android.jar}"/>    </path>    <property name="my.project.target.class.path" refid="project.target.class.path" />    <echo message="project.target.class.path:${my.project.target.class.path}" /></target></project>
3.一個project中多原始碼檔案夾    假設一個project中設定了多個原始碼檔案夾,不太合適的方法就是先拷貝其他的原始碼檔案夾到預設的src下,在編譯完畢後再刪除。事實上順便看看檔案拷貝和刪除,在多原始碼檔案夾的project中也建立custom_rules.xml,主要內容例如以下:
<target name="-pre-build">    <echo >copy file.............................</echo>    <copy todir="${source.absolute.dir}">     <fileset dir="其他原始碼檔案夾">        <include name="**/*.java" />        <include name="**/*.aidl" />    </fileset>    </copy></target><target name="src-clean" >    <echo >delete file.............................</echo>    <delete dir="${source.absolute.dir}/拷貝的原始碼檔案夾" /></target><target name="-post-build" depends="src-clean"></target><target name="-pre-clean" depends="src-clean"></target>
上述代碼在運行ant clean時也會運行刪除拷貝的原始碼操作。而在編譯前先拷貝原始碼。包含aidl檔案。之後在打包完畢後刪除拷貝的原始碼檔案夾。


   一個project中的原始碼盡量就弄在一個檔案夾裡吧。

其他問題還有如庫project間的資源引用,假設直接使用預設的R檔案是沒有問題的,可是要是在eclipse中利用build Java Build Path->project加入了子project,而且還用了當中的R檔案來應用資源,那麼ant打包就還得再繼續折騰


結尾:    這裡僅給出了使用Ant打包Android應用的基本過程和可能問題的解決方案,至於ant的使用和打包原理既能夠看參考文章。也能夠看興許的補充文章。


參考:1.android命令具體說明http://developer.android.com/tools/help/android.html2.ant參考手冊https://ant.apache.org/manual/3.ant打包apk具體的過程可閱讀sdk/tools/ant/build.xml檔案

使用Ant打包Android應用具體解釋

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.