Dinamik Sistem Güncellemeleri (DSU), kullanıcıların mevcut sistem görüntüsünü bozma riski olmadan internetten indirip deneyebileceği bir Android sistem görüntüsü oluşturmanıza olanak tanır. Bu dokümanda 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 çekirdeği etkinleştirmeniz gerekir yapılandırmalar:
CONFIG_DM_VERITY=y
CONFIG_DM_VERITY_FEC=y
Bölüm gereksinimleri
Android 11'den itibaren DSU, /data
kullanılmasını gerektirir
bölümü için F2FS veya ext4 dosya sistemini kullanın. F2FS daha iyi performans ve
önerilir ancak aradaki fark önemsiz olacaktır.
Pixel ile dinamik sistem güncellemesinin ne kadar süreceğine dair bazı örnekleri burada bulabilirsiniz cihaz:
- F2FS'yi kullanarak:
- 109 saniye, 8 GB kullanıcı, 867 MB sistem, dosya sistemi türü: F2FS: encryption=aes-256-xts:aes-256-cts
- 104 sn., 8G kullanıcısı, 867M sistemi, dosya sistemi türü: F2FS: şifreleme=buz
- ext4 kullanıyorsanız:
- 135 saniye, 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 montaj düzeneğinin uygun olup olmadığını kontrol etmek isteyebilirsiniz. flag, "sync" yazma işlemini yapan herhangi bir işareti içerir veya bir “eş zamansız” açıkça işaretleyin.
Yüklenen resimlerle ilgili verileri depolamak için metadata
bölümü (16 MB veya daha büyük) gerekir. İlk aşama montajına monte edilmelidir.
userdata
bölümü, F2FS veya ext4 dosya sistemini kullanmalıdır. F2FS kullanırken Android ortak çekirdeğinde bulunan tüm F2FS ile ilgili yamaları ekleyin.
DSU, çekirdek/yaygın 4.9 ile geliştirilmiş ve test edilmiştir. Optimum kampanya performansı için deneyebilirsiniz.
Tedarikçi firma HAL davranışı
Weaver HAL
Weaver HAL, kullanıcı anahtarlarını depolamak için sabit sayıda yuva sağlar. DSU kullanıldığında, iki ek anahtar yuvası kullanılır. Bir OEM'nin dokumacı HAL'si varsa, OEM'in genel bir sistem görüntüsü (GSI) ve ana makine görüntüsü için yeterli alan.
Kapı görevlisi HAL'si
GSI, HAL'deki UID'leri +1000000 ile ofsetlediğinden Gatekeeper HAL'in büyük USER_ID
değerlerini desteklemesi gerekir.
Başlatmayı doğrula
Doğrulanmış başlatmayı devre dışı bırakmadan geliştirici GSI resimlerinin KİLİTLENEN 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ılırken indirilen Android sistem resmi, cihazdaki mevcut sistem resminden daha yeni olmalıdır. Bu işlem, her iki sistem görüntüsünün Android Doğrulanmış Başlatma (AVB) AVB mülk tanımlayıcısı bölümündeki güvenlik yaması düzeyleri karşılaştırılarak yapılır: Prop: com.android.build.system.security_patch ->
'2019-04-05'
.
AVB kullanmayan cihazlar için mevcut sistemin güvenlik yaması düzeyini ekleyin
görüntüsünü bootloader'la çekirdek cmdline veya bootconfig öğesine ekleyin:
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 korumalı alan olarak 8 GB boş
/data
bölümü
DSU'yu başlatmadan önce en az 10 GB boş alan ayırmanızı öneririz kullanır. DSU, SD karttan ayırmayı da destekler. SD kart ayırma için en yüksek önceliğe sahiptir. SD kart desteği: Bu durum, yeterli dahili depolama alanına sahip olmayabilecek düşük güçlü cihazlar için kritik öneme sahiptir. Mevcut bir SD kart varsa bu kartın kullanılmadığından emin olun. DSU, devralınan SD kartları desteklemez.
Kullanılabilen ön uçlar
DSU'yu adb
, OEM uygulaması veya tek tıklamayla DSU yükleyiciyi (Android 11 veya sonraki sürümlerde) kullanarak başlatabilirsiniz.
DSU'yu adb kullanarak 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
DSU'yu bir uygulama kullanarak başlatma
DSU'ya ana giriş noktası android.os.image.DynamicSystemClient.java
API'dir:
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 paket halinde eklemeniz/önceden yüklemeniz gerekir. Çünkü
DynamicSystemClient
bir sistem API'sidir; uygulamayı normal
ve Google Play'de yayınlayamazsınız. Bu uygulamanın amacı:
- Bir resim listesi ve tedarikçi firma tarafından tanımlanan şemaya sahip karşılık gelen URL'yi getirin.
- Listedeki resimleri cihazla eşleştirin ve kullanıcının seçmesi için uyumlu resimleri gösterin.
DynamicSystemClient.start
kodunu şu şekilde çağırın:DynamicSystemClient aot = new DynamicSystemClient(...) aot.start( ...URL of the selected image..., ...uncompressed size of the selected image...);
URL, sıkıştırılmış, seyrek olmayan bir sistem görüntü dosyasını işaret eder. Bu dosyayı aşağıdaki komutlarla oluşturabilirsiniz:
$ simg2img ${OUT}/system.img ${OUT}/system.raw
$ gzip ${OUT}/system.raw
$ ls ${OUT}/system.raw.gz
Dosya adı şu biçime uymalı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ükleyiciyi kullanıma sunar.
Şekil 1. DSU yükleyiciyi başlatma
Geliştirici DSU Yükleyici düğmesini tıkladığında, önceden yapılandırılmış bir DSU JSON tanımlayıcısını içerir ve geçerli tüm resimleri kayan menü. DSU yüklemesini başlatmak için bir görüntü seçin ve işlemin ilerleme durumunu bildirim çubuğunda görünür.
Şekil 2. DSU görüntü yükleme ilerleme durumu
Varsayılan olarak DSU yükleyici, GSI görüntülerini içeren bir JSON tanımlayıcısı yükler. Aşağıdaki bölümlerde, OEM imzalı DSU paketlerinin nasıl oluşturulacağını ve bunları DSU yükleyicisinden alabilirsiniz.
Ö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.
Şekil 3. Özellik işaretini etkinleştirme
Özellik bayrağı 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 firma, GCE'de sistem görüntülerini barındırır (isteğe bağlı)
Sistem görüntülerinin depolanabileceği konumlardan biri Google Compute Engine (GCE) paketidir. Sürüm yöneticisi, yayınlanan sistem görüntüsünü eklemek/silmek/değiştirmek için GCP depolama konsolunu kullanır.
Görüntüler, burada gösterildiği gibi herkese açık olmalıdır:
4.Şekil GCE'de herkese açık erişim
Bir öğeyi herkese açık hale getirme işlemini Google Cloud dokümanlarında bulabilirsiniz.
ZIP dosyasında çok bölümlü DSU
Android 11'den itibaren DSU'da birden fazla
bölüm. Örneğin, şunlara ek olarak bir product.img
içerebilir:
system.img
. Cihaz açıldığında ilk aşama init
, yüklü DSU bölümünü algılar ve yüklü DSU etkinleştirildiğinde cihaz üzerindeki 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.
5. Şekil. Birden fazla bölüm içeren DSU işlemi
OEM imzalı DSU
Cihazda çalışan tüm resimlerin cihaz tarafından yetkilendirildiğinden emin olmak bir DSU paketindeki tüm resimler imzalanmalıdır. Ö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
, kullanılmadan önce OEM anahtarıyla imzalanmalıdır
daha sonra ZIP dosyasına yerleştirilir. Genel uygulama, paketi imzalamak için gizli anahtarın, doğrulamak için de ortak anahtarın kullanıldığı bir asimetrik algoritma (ör. RSA) kullanmaktır. İlk aşama ramdisk, eşleştirmeyi içermelidir
ortak anahtar, örneğin, /avb/*.avbpubkey
. Cihaz zaten AVB'yi benimsemişse mevcut imzalama prosedürü yeterlidir. Aşağıdaki bölümlerde,
imzalamak için kullanılan AVB yayıncı anahtarının yerleşimini
DSU paketindeki görüntüleri doğrular.
DSU JSON tanımlayıcısı
DSU JSON tanımlayıcısı, DSU paketlerini tanımlar. İki ilkel türünü destekler.
İlk olarak, include
ilkel türü ek JSON tanımlayıcıları içerir veya DSU yükleyiciyi yeni bir konuma yönlendirir. Örnek:
{
"include": ["https://.../gsi-release/gsi-src.json"]
}
İkinci olarak, yayınlanan DSU paketlerini açıklamak için image
temel öğesi kullanılır. İç mekan
birkaç özellik vardır:
name
vedetails
özellikleri, kullanıcının seçmesi için iletişim kutusu.cpu_api
,vndk
veos_version
özellikleri, sonraki bölümde açıklanan uyumluluk kontrolleri için kullanılır.İsteğe bağlı
pubkey
özelliği, kamuoyunu tanımlar anahtarı ile eşlenen gizli anahtarla eşlenir. 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 paketi (ör. OEM A tarafından imzalanan bir DSU'nun OEM B tarafından üretilen bir cihaza yüklenmesi) yüklenmez.İsteğe bağlı
tos
özelliği, ilgili DSU paketinin hizmet şartlarını açıklayan bir metin dosyasını işaret eder. Bir geliştirici hizmet şartları özelliğinin belirtildiği bir DSU paketi seçtiğinde, Şekil 6'da gösterilen iletişim kutusu açılarak geliştiriciden şartları kabul etmesi istenir gerekir.Şekil 6. Hizmet Şartları iletişim kutusu
Referans olarak, GSI'nın DSU JSON tanımlayıcısını burada bulabilirsiniz:
{
"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
DSU paketleri arasındaki uyumluluğu belirtmek için çeşitli özellikler kullanılır ve yerel cihaz:
cpu_api
, cihaz mimarisini açıklayan bir dizedir. Bu özellik zorunludur vero.product.cpu.abi
sistem mülküyle 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 tam sayıdır. Örneğin, örneğin, Android 10 içinos_version
değeri10
, Android 11 içinos_version
,11
. Bu özellik belirtildiğindero.system.build.version.release
sistem özelliğine eşit veya bu özellikten büyük olmalıdır. Bu kontrol, Android 11 tedarikçi cihazında Android 10 GSI görüntüsünün başlatılmasını (şu anda desteklenmez) ö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. Bu özellik belirtildiğinde DSU yükleyici,ro.vndk.version
sistem mülkünden ayıklanan sayını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ği ihlal edilmişse ramdisk, güvenliği ihlal edilmiş anahtar. Önyükleme bölümünü güncellemenin yanı sıra, HTTPS URL'sinden bir DSU anahtar iptal listesi (anahtar kara listesi) kullanarak güvenliği ihlal edilmiş anahtarları 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 doğrulanır iptal listesiyle karşılaştırabilirsiniz. Görüntülerin iptal edilmiş bir herkese açık anahtar içerdiği tespit edilirse DSU yükleme işlemi durdurulur.
Güvenliği sağlamak amacıyla anahtar iptal listesinin URL'si bir HTTPS URL'si olmalıdır. değerini alır ve bir kaynak dizesinde belirtilir:
frameworks/base/packages/DynamicSystemInstallationService/res/values/strings.xml@key_revocation_list_url
Dizinin değeri https://dl.google.com/developers/android/gsi/gsi-keyblacklist.json
'dir. Bu değer, Google tarafından yayınlanan GSI anahtarları için iptal listesidir. Bu kaynak dizesi, DSU özelliğini kullanan OEM'lerin kendi anahtar kara listelerini sağlayıp koruyabilmesi için yer paylaşımına tabi tutulabilir ve özelleştirilebilir. Bu sayede OEM, cihazın ramdisk imajını güncellemeden belirli ortak anahtarları engelleyebilir.
İptal listesinin biçimi şu şekildedir:
{
"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 açıklanan biçimde SHA-1 özetidir. AVB yayıncı anahtarı oluşturma bölümüne bakın.status
, anahtarın iptal durumunu gösterir. Şu an için desteklenen değer:REVOKED
.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ştur
.pem
biçiminde (ör. 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 bir donanım güvenlik modülünde (HSM) saklanabilir. Bu durumda, anahtar oluşturulduktan sonra x509 ortak anahtar sertifikası kullanılabilir. x509 sertifikasından AVB ortak anahtarını oluşturma talimatları için Eşleme ortak anahtarını ramdisk'e ekleme bölümüne bakın.
Bir 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 yayıncı anahtarını RAM'e ekle
Şunu doğrulamak için oem_cert.avbpubkey
, /avb/*.avbpubkey
altına yerleştirilmelidir:
bir DSU paketi hazırladı. Öncelikle PEM biçimindeki ortak anahtarı AVB herkese açık değerine dönüştürün
anahtar biçimi:
$ avbtool extract_public_key --key oem_cert_pub.pem --output oem_cert.avbpubkey
Ardından, aşağıdaki adımları uygulayarak ortak anahtarı ilk aşama ramdisk'e ekleyin.
avbpubkey
öğesini kopyalamak için önceden oluşturulmuş bir modül ekleyin. Örneğin, şu tür içeriklerledevice/<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)
Dridcore hedefini, eklenen
oem_cert.avbpubkey
öğesine bağlı hale getirin:droidcore: oem_cert.avbpubkey
JSON açıklayıcıda AVB pubkey özelliğini oluşturun
oem_cert.avbpubkey
, AVB ortak anahtar ikili biçimindedir. SHA-1 kullanarak
şunu okunabilir hale getirin:
$ sha1sum oem_cert.avbpubkey | cut -f1 -d ' '
3e62f2be9d9d813ef5........866ac72a51fd20
Bu, JSON tanımlayıcının pubkey
özelliğinin içeriği olacaktır.
"images":[
{
...
"pubkey":"3e62f2be9d9d813ef5........866ac72a51fd20",
...
},
DSU paketi imzalayın
DSU paketini imzalamak için aşağıdaki yöntemlerden birini kullanın:
1. Yöntem: Orijinal AVB imzalama işlemi tarafından oluşturulan yapıyı şu amaçlarla yeniden kullanın: DSU paketi oluşturabilirsiniz. Alternatif bir yaklaşım, önceden imzalanmış yayın paketindeki görüntüleri alıp ayıklanan görüntüleri kullanarak ZIP dosyasını dosyası oluşturabilirsiniz.
2. Yöntem: Gizli anahtarı kullanılabilir. DSU paketindeki (ZIP dosyası) her
img
ayrı ayrı:$ 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ğrulama
Tüm yerel resimleri, aşağıdaki komutlarla eşleme herkese açık anahtarına göre doğrulamanız önerilir:
for partition in system product; do
avbtool verify_image --image ${OUT}/${partition}.img --key oem_cert_pub.pem
done
Beklenen çıkış aşağıdaki gibi 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, bir system.img
ve bir 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ı 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ükleyicisi, varsayılan olarak,
https://...google.com/.../gsi-src.json
OEM'ler, persist.sys.fflag.override.settings_dynamic_system.list
tanımlayarak listenin üzerine yazabilir
özelliğini kullanabilirsiniz. Örneğin, bir OEM, GSI'nin yanı sıra OEM'ye ait resimleri içeren aşağıdaki gibi 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, Şekil 7'de gösterildiği gibi, yayınlanmış DSU meta verilerini zincir halinde bağlayabilir.
Şekil 7. Yayınlanan DSU meta verilerini zincirleme