編輯:關於Android編程
熱修復從2015年開始,逐漸的被推廣開來,現在已經是比較熱門的技術。
當Android發布的Apk中,因為有個bug,導致程序一直崩潰。如果此時發布版本,時間間隔太短,則會導致用戶的使用繁瑣,導致用戶的流逝。而熱修復達到的目的便是在不發布版本的情況下,動態修改其中包含bug的類,實現替換,達到修復bug 的目的。
現在市面上有一些開源的熱修復,例如androidFix等等。對於這些開源框架不做解釋,網上也有類似的文章。在這裡,我們從0開始,自己編寫腳本與代碼實現熱修復。
在使用熱修復之前,需要一些必備的基礎,這些知識是最終結果的鋪墊。網上也有一些例子等,但只是一知半解,按照一些例子去最終實現,需要踩很多的坑。別問我為什麼知道,我一路踩過來的。。。
本系列文章將分為三篇博客:
Android熱修復三部曲之基本的Ant打包腳本 Android熱修復三部曲之MultiDex分包架構的實現 Android熱修復三部曲之動態加載dex該篇博客將給予Eclipse進行設計實現
Ant是一個將軟件編譯、測試、部署等步驟聯系在一起加以自動化的一個工具。而對於Android來說,我們的項目最終打包成Apk,就是通過Ant進行構建的。不過,平常這些工作Eclipse已經幫我們實現了。
在安裝的SDK的tools/ant目錄下,有默認實現的build.xml文件,如果有興趣的可以去進行研究,不過代碼比較多。
對於Android 中,Ant 最重要的便是編寫
build.xml文件,該文件確定執行的具體流程,當然,平常我們之所以沒有是因為上面提到的缺省的
build.xml文件。
既然
build.xml確定了編譯流程,那麼對於一個我們編寫好的工程,是怎麼最後成我們的apk文件,這個流程我們需要先明確。
Android 打包流程
Android 打包流程主要分為以下幾個步驟
1.初始化配置
該配置主要包括刪除之前的臨時文件,生成臨時文件的目錄等等。
2.編譯生成 R.java文件
Android 中R文件是最重要的java 文件,他溝通了資源文件與java 代碼之間的相互調用。
使用SDK中提供的aapt.exe工具,對工程中的資源文件進行編譯,生成R文件,aapt.exe位於SDK 目錄/build-tools\22.0.1目錄下。在這裡可能會有疑問,
Eclipse中,我們的工程已經自動生成了R文件。但是,這只是
Eclipse展示的效果,而實際的工程目錄中,並沒有R.java 文件的生成。
在這裡有一個坑,便是依賴工程的存在。如果我們的工程依賴了別的工程,例如最常見的
appcompat_v7,那麼生成R.java 時,勢必要進行相互的聯系,在生成R.java文件時,需要注意。
3.編譯工程中的 java 代碼
java 基礎好的知道,在平常運行中,都會講.java文件編譯為.class 文件,而此步的目的便是將src目錄下的.java文件以及R.java 文件,編譯成.class文件.
此時注意的是:如果有依賴工程,則依賴工程中的java代碼也需要編譯。
使用javac 命令
4.對.class 文件進行編譯生成.dex文件
如果反編譯過apk,會發現裡面存在著一個classes.dex文件,該文件便是我們java代碼的最終存在形式,此步驟的目的便是將上一步.class 文件整體編譯為.dex文件。
使用dx.bat 命令。
5.壓縮資源文件
對圖片,布局等res文件夾下的資源文件進行壓縮,如果反編譯apk,會發現總有一個.arsc文件,那邊是資源文件。
此時注意的是需要將依賴工程的資源也需要一起壓縮。
使用命令 aapt.exe。
6.打出未簽名的包
將如上產生的.arsc資源文件與.dex文件一起打包,生成apk文件,此時apk未簽名。
在這裡,我遇到一個大坑,我以為此時生成的未簽名的apk已經能夠運行了,但是,運行之後提示解析包出錯。實際上,他和Eclipse中生成的未簽名包不一樣。
apk為什麼要簽名,我們了解的最多的,一個憑證。安裝是會檢驗是否是正版。但其實,他還有另一層作用,對apk中的文件進行簽名,保證資源的不可修改,如果修改之後,需要重新簽名。如果沒有該步,則會導致解析失敗。
通過這可以看出,實際上
Eclipse生成的無簽名的apk應該也是有簽名的,不過不是我們指定的簽名而已。(我猜的。。。)
使用命令 apkBuilder ,當然此命令在高版本已刪除。我們可以通過另一種方式實現。
7.對Apk進行簽名的
這個應該不用多說了,網上也有很多的簽名工具。這裡通過
jarsigner.exe進行簽名,該命令是jdk所提供的命令。
Ant腳本基礎知識
在Ant腳本中有兩個關鍵標簽
:跟節點,作為整個工程的基礎。 :一個又一個流程。類似上面所說的步驟。
首先,在工程的根目錄下:建立build.xml,該目錄與清單文件統計,同時添加節點。
name:此構建腳本的工程名。隨便起。 default: 默認執行那個
在這裡他的實際執行順序為:
先通過project的default屬性找到a. 發現a的執行依賴b,所以找到b 最終,執行b之後執行a。
編寫Ant 自定義打包流程
該流程將按照如上的步驟進行講解。最後會貼出所有代碼。該工程打包時,依賴appcompat_v7庫。
1.初始化配置
Init
:該節點的作用表示聲明一個別名。類似於變量名。 : 打印提示信息。類似printf()。 : 刪除文件或文件目錄及其下的所有文件。 : 創建文件目錄
該步驟,刪除之前編譯時生成的gen目錄(存放R.java)和bin目錄(臨時文件目錄)。並創建新的目錄。同時創建bin\classes目錄,用以存放後面步驟生成的.class文件。
2.編譯生成 R.java文件
gen project R.java
gen appcompat R.java
在執行命令時:按照順許分別代表的意思:
-m:使生成的包的目錄存放在-J參數指定的目錄 -J:指定生成的.java 存放的目錄. -M:指定清單文件的路徑,之所以需要清單文件的目的是為了獲取到包名。 -S:res存放的目錄。 -I:某個版本平台的android.jar的路徑 --auto-add-overlay:覆蓋資源,必須加上。
可以看到,分別對工程和依賴庫進行編譯。因為工程依賴了v7庫,兩者中資源有調用,所以在添加res存放的目錄時,必須都添加。
3.編譯工程中的 java 代碼
上一步中,在bin目錄中生成了R.java 文件。此步便是生成.class 文件保存到bin/classes目錄中。
Compiling java source code...
挑幾個重點說:
destdir:生成的.class的存放目錄,保存在當前工程目錄下bin/classes 目錄下。
需要對依賴庫和當前工程分別編譯,生成.class文件。
中包含了編譯時需要的一些jar包,因為jar包後面可以直接打入.dex中,所以在此時作為一個輔助編譯的作用。
對於當前工程,編譯時也需要依賴appcompat_v7中的jar包,因為使用到了裡面的類。
4.對.class 文件進行編譯生成.dex文件
build dex
將bin/classes,工程的jar,依賴庫的jar統一打到bin/classes.dex中。
5.壓縮資源文件
build-res-and-assets
將工程和依賴庫中的res,assets文件統一壓縮到bin/resources.arsc中。
6.打出未簽名的包
package unsign
打成的包是未簽名的包。他和最終的apk的唯一區別,通過解壓會發現未簽名的包中沒有META-INF文件,該文件主要負責解析,以及文件的完整性等。
7.對Apk進行簽名的
Sign apk
完整的Ant 編譯腳本代碼
Init
gen project R.java
gen appcompat R.java
Compiling java source code...
build dex
build-res-and-assets
package unsign
Sign apk
最近在Github上看到了daimajia寫的一個開源組件NumberProgressBar覺得非常好,故而在其基礎上進行了一些延伸與擴展,編寫了一個NumberCirc
1.當數據: 2.集成數據: DOS命令: java -jar QuickIntegrater.jar (輸入自己的項目名稱和包名) 把聲成的代碼復制進自
今天因為工作需要,把以前編寫的一個GPS測試程序拿出來重新修改了一下。這個程序說起來有些歷史了,是我11年編寫的,那時候學了Android開發沒多久,算是一個實驗性的作品
Gesture在 ViewGroup中使用GestureDetector類可以讓我們快速的處理手勢事件,如點擊,滑動等。 使用GestureDetector分三步: 1.