在AndroidStudio中,我們可以很方便的對apk進行打包與簽名,也可以選擇V1或V2簽名;然而,有些時候(比如反編譯重新打包、apk加固後...),我們卻需要在AS以外進行簽名。
在Android7.0引入了jdk7才支援的V2簽名,這一簽名不需要對所有檔案進行摘要計算、且增加了APK 簽名分塊並且該分塊有特定格式,所以,使用V2簽名後,apk的安裝速度與完整性保障都有不錯的提升;然而,由於需要相容舊版本,V1簽名不能完全去掉。
V1簽名(jarsigner方式)
由於安全漏洞問題,最近對app進行了一些改善,其中包括使用了第三方進行加固;加固後,必須對apk進行重新簽名,於是使用了以下方式:
// apksigner -verbose -keystore (簽名地址) -signedjar (簽名後的apk地址) (待簽名apk地址) (別名)
jarsigner -verbose -keystore D:\itlao5.keystore -signedjar D:\itlao5_signed.apk D:\itlao5.apk itlao5
複製程式碼
很快,簽名就完成了。然而,把簽名後的apk提交到安全平臺進行掃描,出現了一項新的漏洞,提示沒有使用V2簽名。
V2簽名(apksigner方式)
原來,jarsigner只是對apk進行了V1簽名;前面說到在Android7.0引入了V2簽名,因此,當進入sdk\25.0.0及後續版本,會發現一個apksigner.bat執行指令碼。 我們可以通過apksigner進行V2簽名,當然,apksigner預設是同時支援V1與V2的,於是:
// apksigner sign --ks (簽名地址) --ks-key-alias (別名) --out (簽名後的apk地址) (待簽名apk地址)
apksigner sign --ks D:\itlao5.keystore --ks-key-alias itlao5 --out D:\itlao5_signed.apk D:\itlao5.apk
複製程式碼
簽名驗證
至此,相容V1、V2的apk簽名已完成,我們可以使用以下指令驗證是否簽名成功:
apksigner verify -v --print-certs (apk地址)
複製程式碼
原文:簡書ThinkinLiu 部落格: IT老五
ps:記錄這兩條簽名語句是防止以後忘記,至於apksigner的其他詳情,度娘收藏了很多,這裡就不寫了。