通過簽名可以確保數據來源的可靠性和數據的不可篡改性
對 Apk 進行簽名,也就是在 Apk 中寫入壹個指紋,寫入指紋後,Apk 中有任何修改,都會導致這個指紋無效,Android 系統在安裝 Apk 進行簽名校驗時就會不通過,進而無法安裝該 Apk
如上圖:
通常的簽名驗簽過程中,接收方收到消息後,會先向 CA 機構驗證證書的合法性,再進行簽名校驗。但 Apk 的證書通常由開發者自己制作,沒有向 CA 機構申請,Android 系統在安裝 Apk 時也並沒有校驗證書本身的合法性,只是從證書中提取公鑰和加密算法,因此,如果對第三方 Apk 重新簽名,也能安裝到沒有安裝過這個 Apk 的系統中
keystore 文件包含私鑰、公鑰和數字證書,分為很多種,Android 使用的是 Java 標準 keystore 格式 JKS(Java Key Storage)
Android App Bundle:用於通過 Google Play 發布的應用,需要升級到AS 3.2 以上版本才支持App Bundle 格式;
APK:用於創建可部署到設備上的簽名 APK
點擊 Finish 就會生成簽名文件與簽名後的 Apk
當我們需要升級 Apk 版本的時候,需要再次對 Apk 文件進行簽名,可以通過配置 build.gradle 讓其自動生成簽名後的 Apk
如果妳的項目是開源的,需要把妳的簽名信息寫在 local.properties 中,然後在 .gitignore 配置文件中加入 local.properties ,這樣 local.properties 就不會提交到開源項目中,簽名信息也就不會被人獲取
local.properties:
app/build.gradle:
有時候我們的 apk 中某些功能需要系統簽名,例如靜默安裝。測試系統簽名的 apk,需要 root 權限,而帶 Google APIs 的模擬器不能 root,因此要註意不能選擇帶 Google APIs 的模擬器
下面執行的操作都是在 Linux 中,如果 apk 是 window 中生成的,需要拷貝到 linux 操作,再將生成的系統簽名過得 apk 再拷貝到 window,比較麻煩,可以考慮後面的自動系統簽名,還是需要在 linux 操作壹次,不過之後就可以只在 window 操作了
這兩個文件在目錄 aosp/build/target/product/security 下,如下圖
在目錄 aosp/prebuilts/sdk/tools/lib 下,如下圖
將前面獲取的 platform.pk8 、 platform.x509.pem 和 signapk.jar 文件放到需要簽名的 apk 同壹個目錄,執行以下命令
如果出現上面的錯誤:Failed to load any of the given libraries: [conscrypt_openjdk_jni-linux-x86_64, conscrypt_openjdk_jni-linux-x86_64-fedora, conscrypt_openjdk_jni]
解決方法:
到目錄 aosp/prebuilts/sdk/tools/linux/lib64 下,復制 libconscrypt_openjdk_jni.so 文件到需要簽名 apk 的同壹個目錄,並將命令改為
自動進行系統簽名的原理是:先生成壹個 system.jks 文件,使用 keytool-importkeypair 對 system.jks 文件進行系統簽名,再 build.gradle 和 local.properties 進行配置,直接使用帶有系統簽名的 system.jks 對 apk 進行簽名,這樣編譯生成的apk文件就自帶系統簽名了
按照前面的方法,生成壹個 system.jks 文件,此時是在 window 系統中操作的
進入 keytool-importkeypair 目錄,將 system.jks、platform.pk8、platform.x509.pem 文件拷貝進來,拷貝之後的目錄結構為
使用 linux 中修改過的帶有系統簽名的 system.jks 文件將 window 中最開始生成的 system.jks 覆蓋掉,再像前面的自動簽名部分壹樣,修改 build.gradle 和 local.properties 的配置,之後生成的 apk 就是系統簽名過的了
測試方法是,在 AndroidManifest.xml 中添加 android:sharedUserId="android.uid.system" 後安裝到 非 Google APIs 的模擬器上 , Google APIs 的模擬器不能 root,無法安裝
會發現只有使用 system.jks 文件簽名後才能安裝,否則安裝失敗,會報以下的錯誤: