Android 11, APK imza şeması v4 ile akış uyumlu bir imzalama şemasını destekler. V4 imzası, APK'nın tüm baytları için hesaplanan Merkle karma ağacını temel alır. fs-verity karma ağacının yapısını tam olarak izler (örneğin, tuz ve son blok için sıfır dolgu). Android 11, imzayı ayrı bir dosyada saklar. <apk name>.apk.idsig
v4 imzaları, tamamlayıcı bir v2 veya v3 imzası gerektirir.
Dosya biçimi
Tüm sayısal alanlar küçük endian olarak ayarlanır. Tüm alanlar tam olarak sizeof()
kadar bayt kaplar. Implicit dolgu veya hizalama eklenmez.
Aşağıda, tanımları basitleştirmeye yardımcı olacak bir yardımcı yapı bulunmaktadır.
template <class SizeT> struct sized_bytes { SizeT size; byte bytes[size]; };
Ana dosya içeriği:
struct V4Signature { int32 version; // only version 2 is supported as of now sized_bytes<int32> hashing_info; sized_bytes<int32> signing_info; sized_bytes<int32> merkle_tree; // optional };
hashing_info
, karma ağacı oluşturmak için kullanılan parametreler ve kök karmasıdır:
struct hashing_info.bytes { int32 hash_algorithm; // only 1 == SHA256 supported int8 log2_blocksize; // only 12 (block size 4096) supported now sized_bytes<int32> salt; // used exactly as in fs-verity, 32 bytes max sized_bytes<int32> raw_root_hash; // salted digest of the first Merkle tree page };
signing_info
aşağıdaki yapıdır:
struct signing_info.bytes { sized_bytes<int32> apk_digest; // used to match with the corresponding APK sized_bytes<int32> x509_certificate; // ASN.1 DER form sized_bytes<int32> additional_data; // a free-form binary data blob sized_bytes<int32> public_key; // ASN.1 DER, must match the x509_certificate int32 signature_algorithm_id; // see the APK v2 doc for the list sized_bytes<int32> signature; };
apk_digest
, APK'nın v3 imza bloğundan veya mevcut değilse v2 bloğundan alınır (apk_digest bölümüne bakın)
signature
kodu oluşturmak ve doğrulamak için aşağıdaki verilerin ikili blob olarak serileştirilmesi ve imzalama / doğrulama algoritmasına imzalı veri olarak aktarılması gerekir:
struct V4DataForSigning { int32 size; int64 file_size; // the size of the file that's been hashed. hashing_info.hash_algorithm; hashing_info.log2_blocksize; hashing_info.salt; hashing_info.raw_root_hash; signing_info.apk_digest; signing_info.x509_certificate; signing_info.additional_data; };
merkle_tree
, fs-verity dokümanlarında açıklandığı şekilde hesaplanan APK'nın tüm Merkle ağacıdır.
Üreticiler ve tüketiciler
apksigner
Android SDK aracı artık varsayılan parametrelerle çalıştırılırsa v4 imza dosyasını oluşturur. v4 imzalama, diğer imzalama şemalarıyla aynı şekilde devre dışı bırakılabilir. Ayrıca, v4 imzasının geçerli olup olmadığını da doğrulayabilir.
adb
, adb install --incremental
komutu çalıştırıldığında .apk.idsig dosyasının .apk dosyasının yanında olmasını bekler
Ayrıca varsayılan olarak artımlı yüklemeyi denemek için .idsig dosyasını kullanır ve dosya eksikse veya geçersizse normal yüklemeye geçer.
Bir yükleme oturumu oluşturulduğunda, PackageInstaller
içindeki yeni akış yükleme API'si, oturuma dosya eklerken ayıklanmış v4 imzasını ayrı bir bağımsız değişken olarak kabul eder.
Bu noktada signing_info
, incfs'ye bütün bir blob olarak iletilir. Incfs, blob'dan kök karmasını çıkarır.
Yükleme oturumu sabitlenirken PackageManagerService, incfs'den signing_info
blob'unu almak için bir ioctl yapar, onu ayrıştırır ve imzayı doğrular.
Artımlı Veri Yükleyici bileşeninin, imzanın Merkle ağacı bölümünü veri yükleyici yerel API'si üzerinden aktarması beklenir.
package
hizmet kabuğu komutu install-incremental
, eklenen her dosya için parametre olarak base64 olarak kodlanmış, sarmalanmış v4 imza dosyasını kabul eder. İlgili Merkle ağacının komutun stdin
alanına gönderilmesi gerekir.
apk_digest
apk_digest
, aşağıdaki sırayla kullanılabilen ilk içerik özetidir:
- V3, 1 MB blok, SHA2-512 (CONTENT_DIGEST_CHUNKED_SHA512),
- V3, 4 KB blok, SHA2-256 (CONTENT_DIGEST_VERITY_CHUNKED_SHA256),
- V3, 1 MB blok, SHA2-256 (CONTENT_DIGEST_CHUNKED_SHA256),
- V2, SHA2-512,
- V2, SHA2-256.
APK İmza Şeması v3'te uzunluk ön ekiyle başlayan uzunluk ön ekiyle başlayan imza dizisi bölümüne bakın.

Doğrulama ve test
Özellik birimi testlerini ve CTS'yi kullanarak uygulamayı doğrulayın.
CtsIncrementalInstallHostTestCases
- /android/cts/hostsidetests/incrementalinstall
İmza biçimini test etme
İmza biçimini test etmek için bir geliştirme ortamı oluşturun ve aşağıdaki manuel testleri çalıştırın:
$ atest PackageManagerShellCommandTest
PackageManagerShellCommandIncrementalTest
İmza biçimini Android SDK'sı (ADB ve apksigner) ile test etme
İmza biçimini Android SDK ile test etmek için bir geliştirme ortamı oluşturun ve IncFS uygulamasını tamamladığınızdan emin olun. Ardından derlemeyi hedef fiziksel bir cihaza veya emülatöre yükleyin. Mevcut bir APK oluşturmanız veya edinmeniz ve ardından bir hata ayıklama imzalama anahtarı oluşturmanız gerekir. Son olarak, build-tools klasöründen APK'yı v4 imza biçimiyle imzalayın ve yükleyin.
İmza
$ ./apksigner sign --ks debug.keystore game.apk
Yükle
$ ./adb install game.apk
Bu testleri nerede bulabilirim?
/android/cts/tests/tests/content/src/android/content/pm/cts/PackageManagerShellCommandIncrementalTest.java