1. 程式人生 > >使用Ant打包Android應用具體解釋

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

owin 即使 data- height val lai evel 右鍵 null

  計劃寫個完整的使用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 crunch

BUILD FAILED
sdk/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.properties
2.加入代碼混淆 在工程的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.html 2.ant參考手冊https://ant.apache.org/manual/ 3.ant打包apk具體的過程可閱讀sdk/tools/ant/build.xml文件

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