Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 熱修復三部曲之基本的Ant打包腳本

Android 熱修復三部曲之基本的Ant打包腳本

編輯:關於Android編程

熱修復從2015年開始,逐漸的被推廣開來,現在已經是比較熱門的技術。

當Android發布的Apk中,因為有個bug,導致程序一直崩潰。如果此時發布版本,時間間隔太短,則會導致用戶的使用繁瑣,導致用戶的流逝。而熱修復達到的目的便是在不發布版本的情況下,動態修改其中包含bug的類,實現替換,達到修復bug 的目的。

現在市面上有一些開源的熱修復,例如androidFix等等。對於這些開源框架不做解釋,網上也有類似的文章。在這裡,我們從0開始,自己編寫腳本與代碼實現熱修復。

在使用熱修復之前,需要一些必備的基礎,這些知識是最終結果的鋪墊。網上也有一些例子等,但只是一知半解,按照一些例子去最終實現,需要踩很多的坑。別問我為什麼知道,我一路踩過來的。。。

本系列文章將分為三篇博客:

Android熱修復三部曲之基本的Ant打包腳本 Android熱修復三部曲之MultiDex分包架構的實現 Android熱修復三部曲之動態加載dex

該篇博客將給予Eclipse進行設計實現

什麼是Ant

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
        
        
            
            
            
             
            
             
            
            
            
             
        
    

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved