Dinamik Sistem Güncellemeleri (DSU), mevcut sistem görüntüsünü bozma riski olmadan kullanıcıların internetten indirip deneyebilecekleri bir Android sistem görüntüsü oluşturmanıza olanak tanır. Bu belgede DSU'nun nasıl destekleneceği açıklanmaktadır.
Çekirdek gereksinimleri
Çekirdek gereksinimleri için bkz . Dinamik Bölümlerin Uygulanması .
Ayrıca DSU, Android sistem görüntüsünü doğrulamak için cihaz eşleyici-verity (dm-verity) çekirdek özelliğine güvenir. Bu nedenle aşağıdaki çekirdek yapılandırmalarını etkinleştirmelisiniz:
-
CONFIG_DM_VERITY=y
-
CONFIG_DM_VERITY_FEC=y
Bölüm gereksinimleri
Android 11'den başlayarak DSU, /data
bölümünün F2FS veya ext4 dosya sistemini kullanmasını gerektirir. F2FS daha iyi performans sağlar ve önerilir, ancak farkın önemsiz olması gerekir.
Pixel cihazda dinamik sistem güncellemesinin ne kadar sürdüğüne dair bazı örnekleri burada bulabilirsiniz:
- F2FS'yi kullanma:
- 109s, 8G kullanıcısı, 867M sistemi, dosya sistemi türü: F2FS: şifreleme=aes-256-xts:aes-256-cts
- 104s, 8G kullanıcısı, 867M sistemi, dosya sistemi türü: F2FS: şifreleme=ice
- Ext4'ü kullanma:
- 135s, 8G kullanıcısı, 867M sistemi, dosya sistemi türü: ext4: şifreleme=aes-256-xts:aes-256-cts
Platformunuzda çok daha uzun sürüyorsa, bağlama bayrağının "senkronizasyon" yazmayı sağlayan herhangi bir bayrak içerip içermediğini kontrol etmek isteyebilirsiniz veya daha iyi performans elde etmek için açıkça bir "async" bayrağı belirtebilirsiniz.
Yüklenen görüntülerle ilgili verileri depolamak için metadata
bölümü (16 MB veya daha büyük) gereklidir. İlk aşama montajı sırasında monte edilmelidir.
userdata
bölümü F2FS veya ext4 dosya sistemini kullanmalıdır. F2FS kullanırken, Android ortak çekirdeğinde bulunan F2FS ile ilgili tüm yamaları ekleyin.
DSU, çekirdek/ortak 4.9 ile geliştirilmiş ve test edilmiştir. Bu özellik için çekirdek 4.9 ve üzeri kullanılması tavsiye edilir.
Satıcı HAL davranışı
Dokumacı HAL
Dokumacı HAL, kullanıcı anahtarlarının saklanması için sabit sayıda yuva sağlar. DSU iki ekstra anahtar yuvası kullanır. Bir OEM'in dokumacı HAL'si varsa, genel sistem görüntüsü (GSI) ve ana bilgisayar görüntüsü için yeterli yuvaya sahip olması gerekir.
Kapı Bekçisi HAL
Gatekeeper HAL'nin büyük USER_ID
değerlerini desteklemesi gerekir çünkü GSI, UID'leri HAL'ye +1000000 oranında kaydırır.
Önyüklemeyi doğrula
Doğrulanmış önyüklemeyi devre dışı bırakmadan Geliştirici GSI Görüntülerinin KİLİTLİ durumda başlatılmasını desteklemek istiyorsanız, device/<device_name>/device.mk
dosyasına aşağıdaki satırı ekleyerek Geliştirici GSI anahtarlarını ekleyin:
$(call inherit-product, $(SRC_TARGET_DIR)/product/developer_gsi_keys.mk)
Geri alma koruması
DSU kullanırken indirilen Android sistem görüntüsünün cihazdaki mevcut sistem görüntüsünden daha yeni olması gerekir. Bu, her iki sistem görüntüsünün Android Doğrulanmış Önyükleme (AVB) AVB özellik tanımlayıcısındaki güvenlik yaması düzeylerini karşılaştırarak yapılır: Prop: com.android.build.system.security_patch -> '2019-04-05'
.
AVB kullanmayan cihazlar için, geçerli sistem görüntüsünün güvenlik yaması düzeyini çekirdek cmdline'ına veya önyükleyici ile bootconfig'e yerleştirin: androidboot.system.security_patch=2019-04-05
.
Donanım Gereksinimleri
Bir DSU örneğini başlattığınızda iki geçici dosya ayrılır:
-
GSI.img
(1~1,5 G) depolamak için mantıksal bir bölüm - GSI'yi çalıştırmak için sanal alan olarak 8 GB boş
/data
bölümü
Bir DSU örneğini başlatmadan önce en az 10 GB boş alan ayırmanızı öneririz. DSU ayrıca bir SD karttan tahsisi de destekler. Bir SD kart mevcut olduğunda, tahsis için en yüksek önceliğe sahiptir. SD kart desteği, yeterli dahili depolamaya sahip olmayan, düşük güçlü cihazlar için kritik öneme sahiptir. Bir SD kart mevcut olduğunda, bunun benimsenmediğinden emin olun. DSU, benimsenen SD kartları desteklemez.
Kullanılabilir ön uçlar
DSU'yu adb
, bir OEM uygulaması veya tek tıklamayla DSU yükleyiciyi (Android 11 veya sonraki sürümlerde) kullanarak başlatabilirsiniz.
Adb kullanarak DSU'yu başlatın
DSU'yu adb kullanarak başlatmak için şu komutları girin:
$ simg2img out/target/product/.../system.img system.raw
$ gzip -c system.raw > system.raw.gz
$ adb push system.raw.gz /storage/emulated/0/Download
$ adb shell am start-activity \
-n com.android.dynsystem/com.android.dynsystem.VerificationActivity \
-a android.os.image.action.START_INSTALL \
-d file:///storage/emulated/0/Download/system.raw.gz \
--el KEY_SYSTEM_SIZE $(du -b system.raw|cut -f1) \
--el KEY_USERDATA_SIZE 8589934592
Bir uygulama kullanarak DSU'yu başlatın
DSU'ya ana giriş noktası android.os.image.DynamicSystemClient.java
API'sidir:
public class DynamicSystemClient {
...
...
/**
* Start installing DynamicSystem from URL with default userdata size.
*
* @param systemUrl A network URL or a file URL to system image.
* @param systemSize size of system image.
*/
public void start(String systemUrl, long systemSize) {
start(systemUrl, systemSize, DEFAULT_USERDATA_SIZE);
}
Bu uygulamayı cihaza paketlemeniz/önceden yüklemeniz gerekir. DynamicSystemClient
bir sistem API'si olduğundan, uygulamayı normal SDK API ile oluşturamazsınız ve Google Play'de yayınlayamazsınız. Bu uygulamanın amacı:
- Satıcı tanımlı bir şemayla bir resim listesi ve karşılık gelen URL'yi getirin.
- Listedeki görselleri cihazla eşleştirin ve kullanıcının seçmesi için uyumlu görselleri gösterin.
DynamicSystemClient.start
şu şekilde çağırın:DynamicSystemClient aot = new DynamicSystemClient(...) aot.start( ...URL of the selected image..., ...uncompressed size of the selected image...);
URL, aşağıdaki komutlarla oluşturabileceğiniz gzip'li, seyrek olmayan bir sistem görüntü dosyasına işaret eder:
$ simg2img ${OUT}/system.img ${OUT}/system.raw
$ gzip ${OUT}/system.raw
$ ls ${OUT}/system.raw.gz
Dosya adı şu formatta olmalıdır:
<android version>.<lunch name>.<user defined title>.raw.gz
Örnekler:
-
o.aosp_taimen-userdebug.2018dev.raw.gz
-
p.aosp_taimen-userdebug.2018dev.raw.gz
Tek tıklamayla DSU yükleyici
Android 11, geliştirici ayarlarında bir ön uç olan tek tıklamayla DSU yükleyicisini sunar.
Şekil 1. DSU yükleyicisini başlatma
Geliştirici DSU Yükleyici düğmesini tıklattığında, web'den önceden yapılandırılmış bir DSU JSON tanımlayıcısını getirir ve uygulanabilir tüm görüntüleri kayan menüde görüntüler. DSU kurulumunu başlatmak için bir görüntü seçtiğinizde ilerleme bildirim çubuğunda gösterilir.
Şekil 2. DSU görüntüsü yükleme ilerlemesi
Varsayılan olarak DSU yükleyicisi, GSI görüntülerini içeren bir JSON tanımlayıcısını yükler. Aşağıdaki bölümlerde OEM imzalı DSU paketlerinin nasıl oluşturulacağı ve bunların DSU yükleyicisinden nasıl yükleneceği gösterilmektedir.
Özellik bayrağı
DSU özelliği, settings_dynamic_android
özellik bayrağının altındadır. DSU'yu kullanmadan önce ilgili özellik bayrağının etkinleştirildiğinden emin olun.
Şekil 3. Özellik bayrağının etkinleştirilmesi
Özellik bayrağı kullanıcı arayüzü, kullanıcı yapısını çalıştıran bir cihazda kullanılamayabilir. Bu durumda bunun yerine adb
komutunu kullanın:
$ adb shell setprop persist.sys.fflag.override.settings_dynamic_system 1
GCE'deki satıcı ana bilgisayar sistemi görüntüleri (isteğe bağlı)
Sistem görüntüleri için olası depolama konumlarından biri Google Compute Engine (GCE) paketidir. Sürüm yöneticisi, yayımlanan sistem görüntüsünü eklemek/silmek/değiştirmek için GCP depolama konsolunu kullanır.
Resimler burada gösterildiği gibi genel erişime açık olmalıdır:
Şekil 4. GCE'de kamu erişimi
Bir öğeyi herkese açık hale getirme prosedürü Google Cloud belgelerinde mevcuttur.
ZIP dosyasında çok bölümlü DSU
Android 11'den itibaren DSU'nun birden fazla bölümü olabilir. Örneğin, system.img
ek olarak bir product.img
içerebilir. Aygıt önyüklendiğinde, ilk aşama init
, yüklü DSU bölümlerini algılar ve yüklü DSU etkinleştirildiğinde aygıttaki bölümü geçici olarak değiştirir. DSU paketi, cihazda karşılık gelen bir bölüme sahip olmayan bir bölüm içerebilir.
Şekil 5. Birden fazla bölüm içeren DSU işlemi
OEM imzalı DSU
Cihazda çalışan tüm görsellerin cihaz üreticisi tarafından yetkilendirildiğinden emin olmak için DSU paketindeki tüm görsellerin imzalanması gerekir. Örneğin, aşağıdaki gibi iki bölüm görüntüsü içeren bir DSU paketinin olduğunu varsayalım:
dsu.zip {
- system.img
- product.img
}
Hem system.img
hem de product.img
ZIP dosyasına yerleştirilmeden önce OEM anahtarı tarafından imzalanması gerekir. Yaygın uygulama, gizli anahtarın paketi imzalamak için, genel anahtarın ise onu doğrulamak için kullanıldığı RSA gibi asimetrik bir algoritma kullanmaktır. İlk aşamadaki ramdisk, /avb/*.avbpubkey
gibi ayrıştırma ortak anahtarını içermelidir. Cihaz zaten AVB'yi benimsemişse mevcut imzalama prosedürü yeterli olacaktır. Aşağıdaki bölümlerde imzalama süreci gösterilmekte ve DSU paketindeki görüntüleri doğrulamak için kullanılan AVB ortak anahtarının yerleşimi vurgulanmaktadır.
DSU JSON tanımlayıcısı
DSU JSON tanımlayıcısı DSU paketlerini açıklar. İki temel öğeyi destekler. İlk olarak, include
ilkel ek JSON tanımlayıcılarını içerir veya DSU yükleyicisini yeni bir konuma yönlendirir. Örneğin:
{
"include": ["https://.../gsi-release/gsi-src.json"]
}
İkinci olarak, yayımlanan DSU paketlerini tanımlamak için ilkel image
kullanılır. İlkel görüntünün içinde birkaç özellik vardır:
name
vedetails
nitelikleri, kullanıcının seçmesi için iletişim kutusunda gösterilen dizelerdir.Sonraki bölümde açıklanan uyumluluk kontrolleri için
cpu_api
,vndk
veos_version
nitelikleri kullanılır.İsteğe bağlı
pubkey
özelliği, DSU paketini imzalamak için kullanılan gizli anahtarla eşleşen genel anahtarı açıklar. Belirtildiğinde DSU hizmeti, cihazın DSU paketini doğrulamak için kullanılan anahtara sahip olup olmadığını kontrol edebilir. Bu, tanınmayan bir DSU paketinin kurulmasını (örneğin, OEM-A tarafından imzalanmış bir DSU'nun OEM-B tarafından üretilen bir cihaza kurulmasını) önler.İsteğe bağlı
tos
özelliği, ilgili DSU paketinin hizmet şartlarını açıklayan bir metin dosyasına işaret eder. Bir geliştirici, belirtilen hizmet koşulları özniteliğine sahip bir DSU paketi seçtiğinde, Şekil 6'da gösterilen iletişim kutusu açılır ve geliştiriciden DSU paketini yüklemeden önce hizmet koşullarını kabul etmesi istenir.Şekil 6. Hizmet şartları iletişim kutusu
Referans olması açısından aşağıda GSI için bir DSU JSON tanımlayıcısı verilmiştir:
{
"images":[
{
"name":"GSI+GMS x86",
"os_version":"10",
"cpu_abi": "x86",
"details":"exp-QP1A.190711.020.C4-5928301",
"vndk":[
27,
28,
29
],
"pubkey":"",
"tos": "https://dl.google.com/developers/android/gsi/gsi-tos.txt",
"uri":"https://.../gsi/gsi_gms_x86-exp-QP1A.190711.020.C4-5928301.zip"
},
{
"name":"GSI+GMS ARM64",
"os_version":"10",
"cpu_abi": "arm64-v8a",
"details":"exp-QP1A.190711.020.C4-5928301",
"vndk":[
27,
28,
29
],
"pubkey":"",
"tos": "https://dl.google.com/developers/android/gsi/gsi-tos.txt",
"uri":"https://.../gsi/gsi_gms_arm64-exp-QP1A.190711.020.C4-5928301.zip"
},
{
"name":"GSI ARM64",
"os_version":"10",
"cpu_abi": "arm64-v8a",
"details":"exp-QP1A.190711.020.C4-5928301",
"vndk":[
27,
28,
29
],
"pubkey":"",
"uri":"https://.../gsi/aosp_arm64-exp-QP1A.190711.020.C4-5928301.zip"
},
{
"name":"GSI x86_64",
"os_version":"10",
"cpu_abi": "x86_64",
"details":"exp-QP1A.190711.020.C4-5928301",
"vndk":[
27,
28,
29
],
"pubkey":"",
"uri":"https://.../gsi/aosp_x86_64-exp-QP1A.190711.020.C4-5928301.zip"
}
]
}
Uyumluluk yönetimi
Bir DSU paketi ile yerel aygıt arasındaki uyumluluğu belirtmek için çeşitli özellikler kullanılır:
cpu_api
, cihaz mimarisini tanımlayan bir dizedir. Bu özellik zorunludur vero.product.cpu.abi
sistem özelliğiyle karşılaştırılır. Değerleri tam olarak eşleşmelidir.os_version
, Android sürümünü belirten isteğe bağlı bir tamsayıdır. Örneğin, Android 10 içinos_version
10
ve Android 11 içinos_version
11
. Bu öznitelik belirtildiğindero.system.build.version.release
sistem özelliğine eşit veya ondan büyük olmalıdır. Bu kontrol, şu anda desteklenmeyen bir Android 11 satıcı cihazında Android 10 GSI görüntüsünün önyüklenmesini önlemek için kullanılır. Android 10 cihazında Android 11 GSI görüntüsünün başlatılmasına izin verilir.vndk
, DSU paketinde bulunan tüm VNDK'leri belirten isteğe bağlı bir dizidir. Belirtildiğinde DSU yükleyicisi,ro.vndk.version
sistem özelliğinden çıkarılan numaranın dahil edilip edilmediğini kontrol eder.
Güvenlik için DSU anahtarlarını iptal edin
DSU görüntülerini imzalamak için kullanılan RSA anahtar çiftinin güvenliğinin ihlal edildiği son derece nadir bir durumda, güvenliği ihlal edilmiş anahtarı kaldırmak için ramdisk mümkün olan en kısa sürede güncellenmelidir. Önyükleme bölümünü güncellemenin yanı sıra, bir HTTPS URL'sindeki DSU anahtar iptal listesini (anahtar kara listesi) kullanarak güvenliği ihlal edilmiş anahtarları engelleyebilirsiniz.
DSU anahtar iptal listesi, iptal edilen AVB ortak anahtarlarının bir listesini içerir. DSU kurulumu sırasında DSU görüntülerinin içindeki genel anahtarlar iptal listesiyle doğrulanır. Görüntülerin iptal edilmiş bir ortak anahtar içerdiği tespit edilirse DSU yükleme işlemi durdurulur.
Anahtar iptal listesi URL'si, güvenliğin gücünü sağlamak için bir HTTPS URL'si olmalı ve bir kaynak dizesinde belirtilmelidir:
frameworks/base/packages/DynamicSystemInstallationService/res/values/strings.xml@key_revocation_list_url
Dizenin değeri, Google tarafından yayımlanan GSI anahtarları için bir iptal listesi olan https://dl.google.com/developers/android/gsi/gsi-keyblacklist.json
şeklindedir. Bu kaynak dizisi yerleştirilebilir ve özelleştirilebilir, böylece DSU özelliğini benimseyen OEM'ler kendi anahtar kara listelerini sağlayabilir ve koruyabilirler. Bu, OEM'in, aygıtın ramdisk görüntüsünü güncellemeden belirli genel anahtarları engellemesine yönelik bir yol sağlar.
İptal listesinin formatı şöyledir:
{
"entries":[
{
"public_key":"bf14e439d1acf231095c4109f94f00fc473148e6",
"status":"REVOKED",
"reason":"Key revocation test key"
},
{
"public_key":"d199b2f29f3dc224cca778a7544ea89470cbef46",
"status":"REVOKED",
"reason":"Key revocation test key"
}
]
}
-
public_key
iptal edilen anahtarın AVB pubkey'i oluşturma bölümünde açıklanan formattaki SHA-1 özetidir. -
status
anahtarın iptal durumunu gösterir. Şu anda desteklenen tek değerREVOKED
. -
reason
, iptal nedenini açıklayan isteğe bağlı bir dizedir.
DSU prosedürleri
Bu bölümde çeşitli DSU yapılandırma prosedürlerinin nasıl gerçekleştirileceği açıklanmaktadır.
Yeni bir anahtar çifti oluştur
.pem
formatında (örneğin, 2048 bit boyutunda) bir RSA özel/genel anahtar çifti oluşturmak için openssl
komutunu kullanın:
$ openssl genrsa -out oem_cert_pri.pem 2048
$ openssl rsa -in oem_cert_pri.pem -pubout -out oem_cert_pub.pem
Özel anahtara erişilemeyebilir ve yalnızca donanım güvenlik modülünde (HSM) tutulur. Bu durumda anahtar oluşturulduktan sonra x509 ortak anahtar sertifikası mevcut olabilir. AVB ortak anahtarını x509 sertifikasından oluşturmaya yönelik talimatlar için Eşleştirme ortak anahtarını ramdisk'e ekleme bölümüne bakın.
Bir x509 sertifikasını PEM formatına dönüştürmek için:
$ openssl x509 -pubkey -noout -in oem_cert_pub.x509.pem > oem_cert_pub.pem
Sertifika zaten bir PEM dosyasıysa bu adımı atlayın.
Eşleştirme pubkey'ini ramdisk'e ekleyin
İmzalı DSU paketini doğrulamak için oem_cert.avbpubkey
/avb/*.avbpubkey
altına yerleştirilmesi gerekir. Öncelikle PEM formatındaki genel anahtarı AVB genel anahtar formatına dönüştürün:
$ avbtool extract_public_key --key oem_cert_pub.pem --output oem_cert.avbpubkey
Daha sonra aşağıdaki adımlarla genel anahtarı birinci aşama ramdisk’e ekleyin.
avbpubkey
dosyasını kopyalamak için önceden oluşturulmuş bir modül ekleyin. Örneğin, aşağıdaki gibi içeriğe sahipdevice/<company>/<board>/oem_cert.avbpubkey
vedevice/<company>/<board>/avb/Android.mk
ekleyin:include $(CLEAR_VARS) LOCAL_MODULE := oem_cert.avbpubkey LOCAL_MODULE_CLASS := ETC LOCAL_SRC_FILES := $(LOCAL_MODULE) ifeq ($(BOARD_USES_RECOVERY_AS_BOOT),true) LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/first_stage_ramdisk/avb else LOCAL_MODULE_PATH := $(TARGET_RAMDISK_OUT)/avb endif include $(BUILD_PREBUILT)
Droidcore hedefinin eklenen
oem_cert.avbpubkey
bağlı olmasını sağlayın:droidcore: oem_cert.avbpubkey
JSON tanımlayıcısında AVB pubkey özelliğini oluşturun
oem_cert.avbpubkey
, AVB ortak anahtar ikili biçimindedir. JSON tanımlayıcısına koymadan önce okunabilir hale getirmek için SHA-1'i kullanın:
$ sha1sum oem_cert.avbpubkey | cut -f1 -d ' '
3e62f2be9d9d813ef5........866ac72a51fd20
Bu, JSON tanımlayıcısının pubkey
özelliğinin içeriği olacaktır.
"images":[
{
...
"pubkey":"3e62f2be9d9d813ef5........866ac72a51fd20",
...
},
Bir DSU paketi imzalayın
Bir DSU paketini imzalamak için şu yöntemlerden birini kullanın:
Yöntem 1: Bir DSU paketi oluşturmak için orijinal AVB imzalama işlemi tarafından oluşturulan yapıyı yeniden kullanın. Alternatif bir yaklaşım, önceden imzalanmış görüntüleri yayın paketinden çıkarmak ve çıkarılan görüntüleri doğrudan ZIP dosyası oluşturmak için kullanmaktır.
Yöntem 2: Özel anahtar mevcutsa DSU bölümlerini imzalamak için aşağıdaki komutları kullanın. Bir DSU paketindeki (ZIP dosyası) her
img
ayrı olarak imzalanır:$ key_len=$(openssl rsa -in oem_cert_pri.pem -text | grep Private-Key | sed -e 's/.*(\(.*\) bit.*/\1/') $ for partition in system product; do avbtool add_hashtree_footer \ --image ${OUT}/${partition}.img \ --partition_name ${partition} \ --algorithm SHA256_RSA${key_len} \ --key oem_cert_pri.pem done
avbtool
kullanarak add_hashtree_footer
ekleme hakkında daha fazla bilgi için bkz . avbtool'u kullanma .
DSU paketini yerel olarak doğrulayın
Tüm yerel görüntülerin aşağıdaki komutlarla eşleşen genel anahtara göre doğrulanması önerilir:
for partition in system product; do
avbtool verify_image --image ${OUT}/${partition}.img --key oem_cert_pub.pem
done
Beklenen çıktı şuna benzer:
Verifying image dsu/system.img using key at oem_cert_pub.pem
vbmeta: Successfully verified footer and SHA256_RSA2048 vbmeta struct in dsu/system.img
: Successfully verified sha1 hashtree of dsu/system.img for image of 898494464 bytes
Verifying image dsu/product.img using key at oem_cert_pub.pem
vbmeta: Successfully verified footer and SHA256_RSA2048 vbmeta struct in dsu/product.img
: Successfully verified sha1 hashtree of dsu/product.img for image of 905830400 bytes
DSU paketi yapın
Aşağıdaki örnek, system.img
product.img
içeren bir DSU paketi oluşturur:
dsu.zip {
- system.img
- product.img
}
Her iki görüntü de imzalandıktan sonra ZIP dosyasını oluşturmak için aşağıdaki komutu kullanın:
$ mkdir -p dsu
$ cp ${OUT}/system.img dsu
$ cp ${OUT}/product.img dsu
$ cd dsu && zip ../dsu.zip *.img && cd -
Tek tıklamayla DSU'yu özelleştirin
Varsayılan olarak DSU yükleyicisi, https://...google.com/.../gsi-src.json
olan GSI görüntülerinin meta verilerine işaret eder.
OEM'ler, kendi JSON tanımlayıcılarına işaret eden persist.sys.fflag.override.settings_dynamic_system.list
özelliğini tanımlayarak listenin üzerine yazabilir. Örneğin, bir OEM, GSI'yi içeren JSON meta verilerinin yanı sıra aşağıdaki gibi OEM'e özel görseller sağlayabilir:
{
"include": ["https://dl.google.com/.../gsi-src.JSON"]
"images":[
{
"name":"OEM image",
"os_version":"10",
"cpu_abi": "arm64-v8a",
"details":"...",
"vndk":[
27,
28,
29
],
"spl":"...",
"pubkey":"",
"uri":"https://.../....zip"
},
}
Bir OEM'in yayınlanan DSU meta verilerini Şekil 7'de gösterildiği gibi zincirleme yapması mümkündür.
Şekil 7. Yayınlanan DSU meta verilerinin zincirlenmesi