Ant
Apache Ant,是一個將軟件編譯、測試、部署等步驟聯系在一起加以自動化的一個工具,大多用于Java環境中的軟件開發。
Ant的使用
首先需要從官網下載apache ant,地址為:http://ant.apache.org/bindownload.cgi。如果下載不了,本人在百度網盤也分享了一個版本https://pan.baidu.com/s/1BjOj7OFSx1KMxWDGI9kYkQ,提取碼 :ndxy
-
其次配置環境變量,如下圖
微信截圖_20181204163003.png -
找到path并添加ant.bat路徑,如下圖
微信截圖_20181204163140.png
Ant的部分命令
ant release
編譯一個release版本的項目
ant debug
編譯一個debug版本的項目
ant installd
安裝一個已經compiled過的debug包
ant installr
安裝一個已經compiled過的release包
ant installt
安裝一個已經compiled過的測試包,同時安裝被測試應用的.apk文件
ant <build_target> install
編譯并安裝一個程序包
ant clean
清理一個項目, 或者如果你使用了ant all clean, 則所有相關項目都會被清理。
參考文獻
https://www.cnblogs.com/lxs-android/archive/2013/01/15/2861822.html
apk 反編譯
反編譯Java代碼
首先我們需要這兩個工具:dex2jar 和 jd-gui,在本人百度網盤分享的https://pan.baidu.com/s/1LFFg6GevuiDaiKkfXQqmGg 下載,提取碼: cb7x
-
將APK文件改后綴為zip然后用解壓縮軟件打開,取出里面的classes.dex文件,如下圖
微信截圖_20181204171539.png -
將從apk文件中得到的classes.dex文件放入dex2jar工具的目錄中,如下圖
微信截圖_20181204172216.png -
**在命令行中進入dex2jar工具的目錄,cmd 切到改路徑下執行cmd命令 d2j-dex2jar.bat classes.dex,且在dex2jar工具的目錄中會發現多了一個文件classes-dex2jar.jar **
微信截圖_20181204172938.png -
用jd-gui工具(jd-gui.exe)查看剛剛生成的jar文件,如下圖
微信截圖_20181204173210.png
反編譯和重新編譯apk包
下載 apktool.bat 和 apktool.jar ,下載地址:https://ibotpeaches.github.io/Apktool/install/
把下載的apktool.bat 和 apktool.jar放到統一目錄下,cmd執行到該目錄下,如下圖
執行命令:apktool d xx.apk(apk的文件路徑),結果如圖所示文件夾,說明運行成功。其中d是decode的意思,表示我們要對xx.apk這個文件進行解碼。
-f 如果目標文件夾已存在,則強制刪除現有文件夾(默認如果目標文件夾已存在,則解碼失敗)。
-o 指定解碼目標文件夾的名稱(默認使用APK文件的名字來命名目標文件夾)。
-s 不反編譯dex文件,也就是說classes.dex文件會被保留(默認會將dex文件解碼成smali文件)。
-r 不反編譯資源文件,也就是說resources.arsc文件會被保留(默認會將resources.arsc解碼成具體的資源文件)。
執行命令:apktool b apk-file(上一步反編譯生成的文件夾),生成多出的build 和 dist文件夾,并在dist文件夾下找到生成的apk,如下圖所示表示運行成功
補充##
反編譯
apktool.bat d -o <output_dir> test.apk
其中<output_dir>就是上面反編譯輸出的目錄,test.apk是需要反編譯的apk
重新編譯
apktool.bat b -o <output.apk> <input_dir>
其中<input_dir>就是上面反編譯輸出的目錄路徑名稱,<ouput.apk>是編譯的輸出結果apk路徑名稱,默認為dist/<name>.apk
APK簽名
其實重打包后的APK是沒有簽名的,需要進行簽名,簽名后才能夠在Android終端上進行安裝。
每個發布的應用都有自己的一個唯一合法的ID,這個就是應用自身的簽名,簽名可以保證你軟件升級的一致性,使用相同簽名的應用可以實現覆蓋安裝,而不一致的簽名將無法共享使用數據,也即是無法覆蓋安裝,這樣可以防止別人篡改,盜用開發者的應用,造成對開發者利益的損害。那么如何為自己的應用進行簽名呢?
APK簽名之兩步走:
創建一個key
使用key對apk簽名
創建一個key
創建key,需要用到java的keytool.exe工具(該工具位于java環境的安裝目錄下的jdk1.8.0_91\jre\bin,不同jdk版本可能略有差異),使用產生的key對apk簽名用到的是jarsigner.exe (位于安裝目錄下的jdk1.8.0_91\bin),如果你正確安裝了java環境,并配置了正確的環境變量,那么你可以直接打開運行命令窗口輸入命令:
keytool -genkey -alias xx.keystore -keyalg RSA -validity 40000 -keystore xx.keystore
如下圖
說明:
-genkey 產生密鑰
-alias xx.keystore key的別名 xx.keystore
-keyalg RSA 使用RSA算法對簽名加密
-validity 40000 證書有效期限4000天
-keystore xx.keystore 生成key的存放路徑,你可以生成到指定路徑(例如:D:\xx.keystore 在D盤根目錄生成key文件,文件名為xx.keystore,如果不指定絕對路徑將在當前cmd所在目錄生成key文件)
注:我這里alias和keystore命名相同,其實完全可以不同的。如果已有key直接使用即可,不需重新生成
使用key對apk簽名
-
cmd 切到apktool目錄下,把需要簽名的apk和秘鑰key同時放到該目錄下,如下圖
微信截圖_20181205113640.png
-
執行簽名命令:
jarsigner -verbose -keystore xx.keystore -signedjar <output_sign>.apk <input_unsign>.apk <keystore>
或者
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore xx.keystore -storepass 簽名密碼 <input_unsign>.apk <keystore>
如下圖說明執行成功
微信截圖_20181205114411.png說明:
-verbose 輸出簽名的詳細信息
-keystore xx.keystore 使用key的絕對路徑,就是在第一步中生成的key
-signedjar <output_sign>.apk <input_unsign>.apkk <keystore> 正式簽名,三個參數中依次為簽名后產生的文件<output_sign>.apk,要簽名的文件<input_unsign>.apk和密鑰庫alias
3.命令驗證apk簽名是否成功: jarsigner -verify -verbose -certs xx.apk
檢查apk 包簽名
-
將APK文件改后綴為zip然后用解壓縮軟件打開,打開里面的META-INF文件夾,如下圖
微信截圖_20181205114906.png
-
執行cmd 命令:keytool -printcert -file [apk路徑]\META-INF\xx.RSA,如下圖查看詳細信息
微信截圖_20181205113119.png
zipalign(壓縮對齊)優化
簽名之后的APK文件現在已經可以安裝到手機上了,不過在此之前Android還極度建議我們對簽名后的APK文件進行一次對齊操作,因為這樣可以使得我們的程序在Android系統中運行得更快。對齊操作使用的是zipalign工具,該工具存放于<\Android SDK>/build-tools/<\version>目錄下,將這個目錄配置到系統環境變量當中就可以在任何位置執行此命令了。
-
執行命令
zipalign -v 4 <input_sign>.apk <output_aligned>.apk
, 如下圖微信截圖_20181205133842.png -
對齊操作完成,在相同目錄下會生成對齊后的APK文件。如下圖
微信截圖_20181205134053.png
說明:
<input_sign>.apk 對齊前的apk路徑,<output_aligned>.apk 對齊后apk輸出路徑