這是【Android 教程系列第 28 篇】,如果覺得有用的話,歡迎關注專欄,
為了增加 Apk 的安全性,防止反編譯,我們會對開發的 Apk 做簽名處理,如果要上架應用商店,部分還會要求 Apk 必須加固后才能上架,
而對 Apk 簽名,本篇博客提供兩種工具,下面是文章正文,
作業系統:macOS BigSur 11.4 M1,java 版本: 1.8.0_211 ,
注:給 Apk 簽名前需要生成密鑰 keystore ,如果你不會,可以參考這兩篇博客
- 如何使用 Android Studio 生成 keystore 簽名檔案
- 如何使用 Keytool 工具生成 keystore 簽名檔案
文章目錄
- 一:jarsigner 和 apksigner 兩種簽名工具的介紹
- 二:簡單了解 v1 簽名和 v2 簽名的區別
- 三:對 Apk 簽名
- 方式一:jarsigner
- 方式二:apksigner
- 四:檢查 Apk 是否已簽名 v1、v2、v3、v4
一:jarsigner 和 apksigner 兩種簽名工具的介紹
jarsigner
jarsigner 是 JDK 提供的針對 jar 包簽名的工具,如果你本地已經安裝了 Java 環境,會自帶 jarsigner ,
比如我的 jarsigner 工具的位置在
/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/bin/jarsigner
效果圖如下

apksigner
apksigner 是 Google 官方提供的針對 Android Apk 簽名和驗證的專用工具,位于 Android SDK / build-tools / SDK 版本 / apksigner ,
以我本地的 Android SDK 30.0.2 版本為例, apksigner 工具的位置在
/Users/suxing/Library/Android/sdk/build-tools/30.0.2/apksigner ,
效果圖如下

如果你用的是 Android Studio 或者 IDEA ,安裝這兩個編輯器時會自動下載 Android SDK ,所以 apksigner 工具也不需要另外安裝,
不過,無論是 apk 包 還是 jar 包,其本質都是 zip 格式的壓縮包,如果只針對 v1 簽名的話,兩者的簽名程序其實差不多,
apksigner 工具默認同時使用 v1 和 v2 簽名,以兼容 Android 7 以下的系統版本,
二:簡單了解 v1 簽名和 v2 簽名的區別
注:該段描述主要參考鏈接地址為 點擊此處,如有描述不當之處,歡迎指正,
v1 簽名
在 Android 7.0 (即 Android N,Android Api 24) 以下的版本,只能使用舊簽名方案,也就是 v1 簽名,
v1 簽名使用 JDK 的 jarsigner 工具,對 zip 壓縮包的每個檔案進行驗證,簽名后仍可對壓縮包進行修改、移動、重新壓縮檔案,
v2 簽名
自 Android 7.0 開始,Google 新增了 v2 簽名方案,
v2 簽名使用 Google 自帶的 apksigner 工具,對 zip 壓縮包的整個檔案進行驗證,簽名后不能修改壓縮包,包括 zipalgin ,
如果你對 v2 簽名的 apk 解壓,沒有發現簽名檔案,重新壓縮后 v2 簽名失效,這說明 v2 簽名是對整個 Apk 進行簽名驗證,
v2 簽名相對 v1 簽名的優點
- 因為不能修改壓縮包,所以 v2 簽名會更安全,
- v2 簽名是對整個 Apk 進行簽名驗證,不需要解壓驗證,所以簽名驗證的時間會更短,
三:對 Apk 簽名
我在 Downloads 檔案夾下新建了一個未簽名的 Apk 和一個密鑰庫 keysotre,如下圖所示

先用 keytool -printcert -jarfile 命令查看該 Apk 是否簽名,如下圖所示

當前 Apk 顯示未簽名,下面分別介紹如何用 jarsigner 和 apksigner 對 APK 簽名,
方式一:jarsigner
jarsigner 只支持 v1 簽名,先來看下使用命令,下面命令中涉及到路徑的都是檔案的絕對路徑,
jarsigner -verbose -keystore 證書簽名檔案路徑 -signedjar 簽名后新Apk路徑.apk 要簽名的Apk路徑.apk 證書簽名別名
在終端輸入命令后按回車,然后根據提示輸入密鑰庫的密碼后開始簽名,如下圖所示

因為 jarsigner 是對每一個檔案進行簽名,簽名程序中輸出的資訊比較多,這里我直接截圖到最后,如下圖所示

在 Downloads 檔案夾下新生成了一個 signed.apk 檔案,

我們對 signed.apk 這個檔案用 keytool -printcert -jarfile 命令查看該 Apk 是否簽名,

可以看到已經成功簽名,使用 jarsigner 對 Apk 簽名,會新生成一個 Apk 檔案,老的未簽名的 Apk 檔案不會受其影響,這點和 apksigner 的 v2 簽名是不一樣的,
方式二:apksigner
apksigner 默認同時支持 v1 和 v2 簽名,先來看下使用命令,下面命令中涉及到路徑的都是檔案的絕對路徑,
apksigner sign --ks 證書簽名檔案路徑 --ks-key-alias 證書簽名別名 要簽名的apk路徑.apk
在終端輸入命令后按回車,然后根據提示輸入密鑰庫的密碼后開始簽名,如下圖所示

輸入密鑰庫的密碼后,直接就輸出完畢了,什么情況?這就完成了?
是的,因為 apksigner 是對整個 Apk 包進行驗證簽名,所以沒有其它的輸出資訊,
回到 Downloads 檔案夾后,如下圖所示

會發現多了一個后輟名為 .idsig 的,這個可以不用處理,直接刪掉也沒問題,
除了這個外,你會發現并沒有新生成一個 Apk 檔案,這是因為 apksigner 是直接對未簽名的 Apk 包進行簽名,我們用 keytool -printcert -jarfile 命令查看 allensu.apk 是否簽名,如下圖所示

可以看到,最原始的未簽名的 allensu.apk 也已簽名,
四:檢查 Apk 是否已簽名 v1、v2、v3、v4
在終端輸入如下命令即可
apksigner verify -verbose -print-certs 要檢查的Apk路徑.apk
如下圖所示

可以看到,allensu.apk 已簽名了 v1、v2 和 v3,關于 v4 簽名可以暫時不用考慮,
至此,關于 Android 分別使用 jarsigner 和 apksigner 對 APK 簽名(v1、v2 簽名)的教程便介紹到這里,
你的問題得到解決了嗎?歡迎在評論區留言,
贈人玫瑰,手有余香,如果覺得文章不錯,希望可以給個一鍵三連,感謝,
技術是一點一點積累的,大神也不是一天就可以達到的,原地不動就是退步,所以每天進步一點點,
結束語
最后,附上一句格言:"好學若饑,謙卑若愚",望共勉,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/403949.html
標籤:其他
