標籤: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應用具體解釋