Android 13 支援 APK 簽署配置 v3.1,這是現有 APK 簽署配置 v3 的改良版本。v3.1 配置解決了 APK 簽署配置 v3 的部分已知問題,與輪換相關。具體來說,v3.1 簽署配置支援 SDK 版本指定,因此輪換作業可以指定平台後續版本。
v3.1 簽署配置使用的區塊 ID 在 Android 12 以下版本無法辨識。因此,平台會套用下列簽署者行為:
- 搭載 Android 13 以上版本的裝置會使用 v3.1 區塊中的輪換簽署者。
- 搭載舊版 Android 的裝置會忽略輪換簽署者,改為使用 v3 區塊中的原始簽署者。
如果應用程式尚未輪換簽署金鑰,則不需要採取任何額外行動。這些應用程式選擇輪換時,系統預設會套用 v3.1 簽署配置。
v3.1 簽署區塊
v3.1 簽署區塊的內容與 v3 簽署區塊相同,但由於區塊 ID 不同,只有搭載 Android 13 以上版本的裝置才能辨識這些簽章。這樣一來,應用程式就能安全地輪換簽署金鑰,不必擔心多目標 APK,因為原始簽署者可用於簽署 v3 簽署區塊中的 APK,輪換簽署者則可用於簽署 v3.1 簽署區塊中的 APK。此外,平台也能在驗證 v3.1 簽章時,重複使用 v3 簽章區塊的所有現有驗證碼。
根據預設,只要簽署設定中提供輪替金鑰和沿襲,apksig 程式庫就會使用 v3.1 簽署區塊。如果應用程式的 minSdkVersion 低於 Android 12,且使用輪替金鑰,則必須指定原始簽署金鑰,以便在 v3 簽署區塊中簽署 APK。這與目前的行為類似,如果 APK 指定的版本早於 Android 9,就必須使用原始簽署者。
如要支援從特定 SDK 版本開始的目標金鑰輪替,apksig 程式庫會公開新的 API,可供設定輪替的最低 SDK 版本。如果指定的輪替支援最低版本低於 Android 12,系統會使用原始的 v3 區塊。只有在輪替時,且輪替的最低 SDK 版本設為 Android 12 以上時,才會使用 v3.1 簽署區塊。v3 簽署區塊具有輪替屬性,可保護最低 SDK 版本不遭移除。
| APK 包含歷程 | rotation-min-sdk-version 的值 | v3 簽署區塊 | v3.1 簽署區塊 |
|---|---|---|---|
| 否 | 預設值或任何值 (以下以 x 表示) | 由原始簽署者簽署,指定 Android 9 以上版本 | 無 |
| 是 | 預設 | 由原始簽署者簽署,適用於 Android 9 到 12L | 使用輪替簽署者簽署,指定 Android 12 以上版本 |
| 是 | x < 33 (Android 13) | 使用輪替簽署者簽署,指定 Android 9 以上版本 | 無 |
| 是 | x >= 33 (Android 13) | 以原始簽署者簽署,指定 Android 9 - (x-1) | 使用輪替簽署者簽署,指定 x+ |
旋轉相關問題
平台已解決下列與螢幕旋轉相關的問題:
Android 12 修正項目
- 只有在要求權限的應用程式與其他應用程式的簽署歷程或目前簽署者相符時,平台才會授予簽章權限。如果兩個應用程式遵循簽署金鑰最佳做法,並輪流使用不同的簽署金鑰,平台就不會授予簽章權限。
- 如果簽署歷程中的前一個金鑰具備復原功能,平台 APK 復原功能就能復原剛輪替簽署金鑰的 APK,但這項功能會讓輪替失去意義,因為這樣一來,新的套件更新就能以先前的簽署金鑰簽署,並復原輪替的金鑰。
- 如果 APK 僅使用輪替金鑰簽署,之後更新時使用原始金鑰和輪替金鑰簽署 APK,則在搭載 Android 11 以下版本的裝置上,沿襲的簽署金鑰只會顯示輪替金鑰。
Android 11 修正項目
PackageManager#checkSignatures未正確更新,無法檢查兩個套件的原始簽署金鑰。這導致使用輪替簽署金鑰的應用程式無法進行插樁,因為插樁 APK 使用的是原始簽署金鑰。sharedUserId底下的套件會共用簽署沿襲。 每當在sharedUiserId中安裝或更新簽署歷程更新的應用程式時,該應用程式的歷程就會取代sharedUserId的共用歷程 (也就是說,如果應用程式的簽署歷程為 A -> B,且應用程式在sharedUserId中更新,歷程為 B -> C,則sharedUserId歷程會取代為 B -> C)。同樣地,除非簽署沿襲有所變更,否則無法更新沿襲中先前簽署者的功能。
第 4 版整合
v4 簽署配置會使用提供給 apksigner 的簽署設定;如果提供多個簽署設定以進行輪替,則會使用最新輪替的簽署設定。在推出 v3.1 之前,v3 只包含這個最新的輪替簽署設定,因此 v4 可以直接使用這個設定;這樣一來,v4 簽署配置就能支援輪替,因為它在 SigningInfo 中使用了輪替簽署金鑰。雖然 v4 SigningInfo 不包含完整的簽署沿革,但可以從 v3 簽署區塊中提取沿革,讓平台存取任何簽章查詢的沿革。如果使用 v3.1,以提供的 rotation-min-sdk-version 為目標進行輪換,一般 v3 設定會同時包含原始簽署設定和最新的輪換簽署設定。我們已建立 v4 簽章機制擴充功能,其中包含 v3.1 區塊中每個簽章設定的額外簽章資訊區塊。
驗證
如要測試 v3.1 的實作情形,請在 PkgInstallSignatureVerificationTest.java 中執行 CTS 測試。cts/hostsidetests/appsecurity/src/android/appsecurity/cts/
如要進一步瞭解測試,請參閱第 3 版的「驗證」一節。