Dinamik Sistem Güncellemesi

Dinamik sistem güncellemeleri (DSU), kullanıcıların internetten indirip mevcut sistem görüntüsüne zarar verme riski olmadan deneyebileceği 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 Dinamik Bölümleri Uygulama başlıklı makaleyi inceleyin.

Ayrıca, DSU, Android sistem görüntüsünü doğrulamak için device-mapper-verity (dm-verity) çekirdek özelliğini kullanır. Bu nedenle, aşağıdaki çekirdek yapılandırmalarını etkinleştirmeniz gerekir:

  • CONFIG_DM_VERITY=y
  • CONFIG_DM_VERITY_FEC=y

Bölüm şartları

Android 11'den itibaren 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 önemsiz olmalıdır.

Pixel cihazlarda dinamik sistem güncellemelerinin ne kadar sürdüğüne dair bazı örnekler:

  • F2FS'yi kullanma:
    • 109 sn, 8 GB kullanıcı, 867 MB sistem, dosya sistemi türü: F2FS: encryption=aes-256-xts:aes-256-cts
    • 104s, 8G user, 867M system, file system type: F2FS: encryption=ice
  • ext4 kullanma:
    • 135 sn, 8 GB kullanıcı, 867 MB sistem, dosya sistemi türü: ext4: encryption=aes-256-xts:aes-256-cts

Platformunuzda bu işlem çok daha uzun sürüyorsa bağlama işaretinin "senkronize etme" yazma işlemi yapan bir işaret içerip içermediğini kontrol edebilir veya daha iyi performans elde etmek için "async" işaretini açıkça belirtebilirsiniz.

Yüklü resimlerle ilgili verileri depolamak için metadata bölümü (16 MB veya daha büyük) gerekir. İ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, kernel/common 4.9 ile geliştirilip test edilmiştir. Bu özellik için 4.9 ve üzeri çekirdek sürümlerinin kullanılması önerilir.

Tedarikçi HAL davranışı

Weaver HAL

Weaver HAL, kullanıcı anahtarlarını depolamak için sabit sayıda yuva sağlar. DSU, iki ek anahtar yuvası kullanır. Bir OEM'nin weaver HAL'si varsa genel sistem görüntüsü (GSI) ve ana makine görüntüsü için yeterli sayıda yuvaya sahip olması gerekir.

Gatekeeper HAL

GSI, UID'leri HAL'ye +1000000 olarak kaydırdığı için Gatekeeper HAL'nin büyük USER_ID değerlerini desteklemesi gerekir.

Doğrulanmış başlatma

Doğrulanmış başlatmayı devre dışı bırakmadan Geliştirici GSI görüntülerini KİLİTLİ durumda başlatmayı desteklemek istiyorsanız device/<device_name>/device.mk dosyasına aşağıdaki satırı ekleyerek Geliştirici GSI anahtarlarını dahil edin:

$(call inherit-product, $(SRC_TARGET_DIR)/product/developer_gsi_keys.mk)

Geri alma koruması

DSU kullanılırken indirilen Android sistem görüntüsü, cihazdaki mevcut sistem görüntüsünden daha yeni olmalıdır. Bu işlem, her iki sistem görüntüsünün Android Verified Boot (AVB) AVB özellik tanımlayıcısındaki güvenlik yaması seviyeleri karşılaştırılarak yapılır: Prop: com.android.build.system.security_patch -> '2019-04-05'.

AVB kullanmayan cihazlarda, önyükleyici ile birlikte mevcut sistem görüntüsünün güvenlik yaması seviyesini çekirdek cmdline veya 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 GB) depolamak için mantıksal bir bölüm
  • GSI'yi çalıştırmak için korumalı alan olarak 8 GB'lık boş bir /data bölümü

DSU örneği başlatmadan önce en az 10 GB boş alan ayırmanızı öneririz. DSU, SD karttan ayırmayı da destekler. SD kart takılıyken, ayırma işlemi için en yüksek önceliğe sahiptir. SD kart desteği, yeterli dahili depolama alanı olmayan düşük güçlü cihazlar için çok önemlidir. SD kart varsa 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 ya da sonraki sürümlerde) kullanarak başlatabilirsiniz.

adb'yi kullanarak DSU'yu başlatma

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 uygulamayı kullanarak DSU'yu başlatma

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ı cihazda paketlemeniz/önceden yüklemeniz gerekir. DynamicSystemClient bir sistem API'si olduğundan uygulamayı normal SDK API'si ile oluşturamaz ve Google Play'de yayınlayamazsınız. Bu uygulamanın amacı:

  1. Tedarikçi tarafından tanımlanan bir şemayla resim listesini ve ilgili URL'yi getirin.
  2. Listede yer alan resimleri cihazla eşleştirin ve kullanıcının seçebileceği uyumlu resimleri gösterin.
  3. DynamicSystemClient.start işlevini ş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 ile sıkıştırılmış, seyrek olmayan bir sistem görüntüsü dosyasına yönlendirir:

$ simg2img ${OUT}/system.img ${OUT}/system.raw
$ gzip ${OUT}/system.raw
$ ls ${OUT}/system.raw.gz

Dosya adı şu biçimde 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'de, geliştirici ayarlarında ön uç olarak kullanılan tek tıklamayla DSU yükleyici özelliği sunuluyor.

DSU yükleyicisini başlatma

1. şekil. DSU yükleyicisini başlatma

Geliştirici DSU Yükleyici düğmesini tıkladığında, web'den önceden yapılandırılmış bir DSU JSON tanımlayıcısı getirilir ve geçerli tüm resimler kayan menüde gösterilir. DSU yüklemesini başlatmak için bir resim seçin. İlerleme durumu bildirim çubuğunda gösterilir.

DSU görüntüsü yükleme ilerleme durumu

Şekil 2. DSU görüntüsü yükleme ilerleme durumu

DSU yükleyici, varsayılan olarak GSI görüntülerini içeren bir JSON tanımlayıcı yükler. Aşağıdaki bölümlerde, OEM imzalı DSU paketlerinin nasıl oluşturulacağı ve DSU yükleyiciden nasıl yükleneceği gösterilmektedir.

Özellik bayrağı

DSU özelliği, settings_dynamic_android özellik bayrağı altındadır. DSU'yu kullanmadan önce ilgili özellik işaretinin etkinleştirildiğinden emin olun.

Özellik bayrağını etkinleştirme

3.Şekil Özellik bayrağını etkinleştirme

Özellik işareti kullanıcı arayüzü, kullanıcı derlemesi ç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

Tedarikçi, GCE'de sistem görüntülerini barındırır (isteğe bağlı)

Sistem görüntüleri için olası depolama konumlarından biri Google Compute Engine (GCE) paketidir. Yayın yöneticisi, yayınlanan sistem görüntüsünü eklemek/silmek/değiştirmek için GCP depolama konsolunu kullanır.

Resimler, burada gösterildiği gibi herkese açık olmalıdır:

GCE&#39;de herkese açık erişim

Şekil 4. GCE'de herkese açık erişim

Bir öğeyi herkese açık hale getirme prosedürü Google Cloud belgelerinde açıklanmaktadır.

ZIP dosyasında çok bölümlü DSU

Android 11'den itibaren DSU'da birden fazla bölüm olabilir. Örneğin, system.img öğesine ek olarak product.img öğesini içerebilir. Cihaz başlatıldığında birinci aşama init, yüklü DSU bölümlerini algılar ve yüklü DSU etkinleştirildiğinde cihazdaki bölümü geçici olarak değiştirir. DSU paketi, cihazda karşılığı olmayan bir bölüm içerebilir.

Birden fazla bölüm içeren DSU işlemi

5.şekil Birden fazla bölüm içeren DSU işlemi

OEM imzalı DSU

Cihazda çalışan tüm resimlerin cihaz üreticisi tarafından yetkilendirildiğinden emin olmak için DSU paketindeki tüm resimlerin imzalanması gerekir. Örneğin, aşağıdaki gibi iki bölüm resmi içeren bir DSU paketi 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ıyla imzalanmalıdır. Genel uygulama, paketi imzalamak için gizli anahtarın, doğrulamak için ise ortak anahtarın kullanıldığı RSA gibi asimetrik bir algoritma kullanmaktır. İlk aşama ramdisk'i eşleme genel anahtarını (ör. /avb/*.avbpubkey) içermelidir. Cihazda AVB zaten kullanılıyorsa 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 pubkey'in yerleşimi vurgulanmaktadır.

DSU JSON tanımlayıcısı

DSU JSON tanımlayıcısı, DSU paketlerini tanımlar. İki temel öğeyi destekler. İlk olarak, include öğesi ek JSON tanımlayıcıları içerir veya DSU yükleyiciyi yeni bir konuma yönlendirir. Örneğin:

{
    "include": ["https://.../gsi-release/gsi-src.json"]
}

İkincisi, yayınlanan DSU paketlerini tanımlamak için image öğesi kullanılır. Resim öğesinde çeşitli özellikler bulunur:

  • name ve details özellikleri, kullanıcının seçmesi için iletişim kutusunda gösterilen dizelerdir.

  • cpu_api, vndk ve os_version özellikleri, sonraki bölümde açıklanan uyumluluk kontrolleri için kullanılır.

  • İsteğe bağlı pubkey özelliği, DSU paketini imzalamak için kullanılan gizli anahtarla eşleşen ortak anahtarı açıklar. Belirtildiğinde DSU hizmeti, cihazda DSU paketini doğrulamak için kullanılan anahtarın olup olmadığını kontrol edebilir. Bu sayede, tanınmayan bir DSU paketinin yüklenmesi önlenir. Örneğin, OEM-A tarafından imzalanmış bir DSU'nun OEM-B tarafından üretilmiş bir cihaza yüklenmesi engellenir.

  • İ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, hizmet şartları özelliği belirtilmiş 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 şartlarını kabul etmesi istenir.

    Hizmet şartları iletişim kutusu

    6.şekil Hizmet şartları iletişim kutusu

Referans olması için GSI'ye yönelik bir DSU JSON tanımlayıcısı aşağıda 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 cihaz arasındaki uyumluluğu belirtmek için çeşitli özellikler kullanılır:

  • cpu_api, cihaz mimarisini açıklayan bir dizedir. Bu özellik zorunludur ve ro.product.cpu.abi sistem özelliğiyle karşılaştırılır. Değerleri tam olarak eşleşmelidir.

  • os_version, bir Android sürümünü belirten isteğe bağlı bir tam sayıdır. Örneğin, Android 10'da os_version, 10, Android 11'de ise os_version, 11 olur. Bu özellik belirtildiğinde ro.system.build.version.release sistem özelliğine eşit veya bu özellikten 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 başlatılmasını önlemek için kullanılır. Android 10 cihazda Android 11 GSI görüntüsünün başlatılmasına izin verilir.

  • vndk, DSU paketine dahil edilen tüm VNDK'ları belirten isteğe bağlı bir dizidir. Belirtildiğinde DSU yükleyici, ro.vndk.version sistem özelliğinden çıkarılan sayının dahil edilip edilmediğini kontrol eder.

Güvenlik için DSU anahtarlarını iptal etme

DSU görüntülerini imzalamak için kullanılan RSA anahtar çiftinin güvenliğinin ihlal edildiği son derece nadir durumlarda, 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, HTTPS URL'sinden DSU anahtar iptal listesi (anahtar kara listesi) kullanarak güvenliği ihlal edilmiş anahtarları da engelleyebilirsiniz.

DSU anahtarı iptal listesi, iptal edilen AVB ortak anahtarlarının listesini içerir. DSU yüklemesi sırasında, DSU görüntülerinin içindeki ortak anahtarlar iptal listesiyle doğrulanır. Resimlerde iptal edilmiş bir genel anahtar bulunduğu tespit edilirse DSU yükleme işlemi durdurulur.

Güvenlik gücünü sağlamak için anahtar iptal listesi URL'si bir HTTPS URL'si olmalı ve kaynak dizesinde belirtilmelidir:

frameworks/base/packages/DynamicSystemInstallationService/res/values/strings.xml@key_revocation_list_url

Dizenin değeri, Google tarafından yayınlanan GSI anahtarları için iptal listesi olan https://dl.google.com/developers/android/gsi/gsi-keyblacklist.json'dır. Bu kaynak dizesi, DSU özelliğini benimseyen OEM'lerin kendi anahtar kara listelerini sağlayıp sürdürebilmesi için yerleştirilebilir ve özelleştirilebilir. Bu, OEM'lerin cihazın ramdisk görüntüsünü güncellemeden belirli ortak anahtarları engellemesine olanak tanır.

İptal listesinin biçimi şöyledir:

{
   "entries":[
      {
         "public_key":"bf14e439d1acf231095c4109f94f00fc473148e6",
         "status":"REVOKED",
         "reason":"Key revocation test key"
      },
      {
         "public_key":"d199b2f29f3dc224cca778a7544ea89470cbef46",
         "status":"REVOKED",
         "reason":"Key revocation test key"
      }
   ]
}
  • public_key, AVB ortak anahtarını oluşturma bölümünde açıklanan biçimde, iptal edilen anahtarın SHA-1 özetidir.
  • status, anahtarın iptal durumunu gösterir. Şu anda yalnızca REVOKED değeri desteklenmektedir.
  • reason, iptal nedenini açıklayan isteğe bağlı bir dizedir.

DSU prosedürleri

Bu bölümde, çeşitli DSU yapılandırma işlemlerinin nasıl yapılacağı açıklanmaktadır.

Yeni bir anahtar çifti oluşturma

openssl biçiminde (örneğin, 2048 bit boyutunda) RSA özel/genel anahtar çifti oluşturmak için .pem 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) saklanır. Bu durumda, anahtar oluşturulduktan sonra x509 ortak anahtar sertifikası kullanılabilir. x509 sertifikasından AVB ortak anahtarı oluşturma talimatları için Eşleştirme ortak anahtarını ramdisk'e ekleme bölümüne bakın.

x509 sertifikasını PEM biçimine 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şleme için kullanılan genel anahtarı ramdisk'e ekleyin.

İmzalı DSU paketinin doğrulanması için oem_cert.avbpubkey, /avb/*.avbpubkey altına yerleştirilmelidir. Öncelikle, PEM biçimindeki ortak anahtarı AVB ortak anahtar biçimine dönüştürün:

$ avbtool extract_public_key --key oem_cert_pub.pem --output oem_cert.avbpubkey

Ardından, aşağıdaki adımları uygulayarak genel anahtarı ilk aşama ramdisk'e ekleyin.

  1. avbpubkey öğesini kopyalamak için önceden oluşturulmuş bir modül ekleyin. Örneğin, device/<company>/<board>/oem_cert.avbpubkey ve device/<company>/<board>/avb/Android.mk öğelerini aşağıdaki gibi içeriklerle 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)
    
  2. Droidcore hedefini eklenen oem_cert.avbpubkey öğesine bağımlı hale getirin:

    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ıya yerleştirmeden ö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 olur.

   "images":[
      {
         ...
         "pubkey":"3e62f2be9d9d813ef5........866ac72a51fd20",
         ...
      },

DSU paketini imzalama

DSU paketini imzalamak için aşağıdaki yöntemlerden birini kullanın:

  • 1. yöntem: DSU paketi oluşturmak için orijinal AVB imzalama süreciyle oluşturulan yapıyı yeniden kullanın. Alternatif bir yaklaşım olarak, halihazırda imzalanmış resimleri yayın paketinden çıkarıp doğrudan ZIP dosyası oluşturmak için kullanabilirsiniz.

  • 2. yöntem: Özel anahtar varsa DSU bölümlerini imzalamak için aşağıdaki komutları kullanın. DSU paketindeki (ZIP dosyası) her img ayrı ayrı 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
    

add_hashtree_footer kullanarak add_hashtree_footer ekleme hakkında daha fazla bilgi için avbtool'u kullanma başlıklı makaleyi inceleyin.avbtool

DSU paketini yerel olarak doğrulama

Tüm yerel resimlerin, aşağıdaki komutlarla eşleştirme ortak anahtarına 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 çıkış şu şekilde görünür:

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 oluşturma

Aşağıdaki örnekte, system.img ve product.img içeren bir DSU paketi oluşturulmaktadır:

dsu.zip {
    - system.img
    - product.img
}

Her iki resim 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ştirme

DSU yükleyici, varsayılan olarak 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 listeyi geçersiz kılabilir. Örneğin, bir OEM, GSI'nin yanı sıra OEM'ye özel resimleri içeren JSON meta verileri 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, yayınlanan DSU meta verilerini Şekil 7'de gösterildiği gibi zincirleyebilir.

Yayınlanan DSU meta verilerini zincirleme

Şekil 7. Yayınlanan DSU meta verilerini zincirleme