Eşleşme kuralları

İki uyumluluk matrisi ve manifest çiftinin, çerçeve ile tedarikçi uygulamasının birlikte çalışabileceğini doğrulamak için uyumlulaştırılacağı varsayılır. Bu doğrulama, çerçeve uyumluluk matrisi ile cihaz manifesti arasında ve çerçeve manifesti ile cihaz uyumluluğu matrisi arasında eşleşme olduğunda başarılı olur.

Bu doğrulama, derleme sırasında, OTA güncelleme paketi oluşturma sırasında, önyükleme sırasında ve VTS uyumluluk testlerinde yapılır.

Aşağıdaki bölümlerde, çeşitli bileşenler tarafından kullanılan eşleştirme kuralları ayrıntılı olarak açıklanmaktadır.

Çerçeve uyumluluk matrisi sürüm eşleşmeleri

Bir cihaz manifestinin bir çerçeve uyumluluk matrisiyle eşleşmesi için manifest.target-level tarafından belirtilen kargo FCM sürümünün compatibility-matrix.level tarafından belirtilen FCM sürümüne tam olarak eşit olması gerekir. Aksi takdirde hiçbir eşleşme yoktur.

Çerçeve uyumluluk matrisi libvintf ile istendiğinde bu eşleşme her zaman başarılı olur. Bunun nedeni, libvintf'ün cihaz manifestini açması, gönderim FCM sürümünü alması ve bu gönderim FCM sürümündeki çerçeve uyumluluk matrisini (veya daha yüksek FCM sürümlerindeki uyumluluk matrislerinden bazı isteğe bağlı HAL'leri) döndürmesidir.

HAL eşleşmeleri

HAL-eşleşme kuralı, bir manifest dosyasında ilgili uyumluluk matrisinin sahibi tarafından desteklendikleri kabul edilen hal öğelerinin sürümlerini tanımlar.

HIDL ve yerel HAL'ler

HIDL ve yerel HAL'ler için eşleşme kuralları aşağıda verilmiştir.

  • Birden fazla <hal> öğesi tek bir VE ilişkisiyle değerlendirilir.
  • <hal> öğelerinde gerekli değil olarak işaretlemek için <hal optional="true"> bulunabilir.
  • Aynı <hal> içindeki birden fazla <version> öğesi VEYA ilişkisine sahiptir. İki veya daha fazla sürüm belirtilirse sürümlerden yalnızca birinin uygulanması gerekir. (Aşağıdaki DRM örneğine bakın.)
  • Aynı <hal> içinde birden fazla <instance> ve <regex-instance> öğesi varsa <hal> gerekli olduğunda bu öğeler tek bir VE ilişkisiyle değerlendirilir. (<ahref="#drm">Aşağıdaki DRM örneğine</ahref="#drm"> bakın.)

Örnek: Bir modül için başarılı HAL eşleşmesi

2.5 sürümündeki bir HAL için eşleşme kuralı şu şekildedir:

Matris Eşleşen Manifest
2.5 2,5-2,∞. Uyumluluk matrisinde 2.5, 2.5-5 ifadesinin kısaltmasıdır.
2.5-7 2,5-2.∞. Aşağıdakileri gösterir:
  • Gerekli minimum sürüm 2.5'tir. Yani HAL 2.0-2.4 sağlayan bir manifest uyumlu değildir.
  • İstenen maksimum sürüm 2.7'dir. Yani uyumluluk matrisinin (çerçeve veya cihaz) sahibi 2.7'den sonraki sürümleri istemez. Eşleşen manifestin sahibi, 2.7 sürümü istendiğinde 2.10 sürümünü (örnek olarak) yayınlamaya devam edebilir. Uyumluluk matrisi sahibi, istenen hizmetin yalnızca API sürüm 2.7 ile uyumlu olduğunu bilir.
  • -7 yalnızca bilgi amaçlıdır ve OTA güncelleme sürecini etkilemez.
Bu nedenle, manifest dosyasında 2.10 sürümüne sahip bir HAL'e sahip bir cihaz, uyumluluk matrisinde 2.5-7 belirten bir çerçeveyle uyumlu olmaya devam eder.

Örnek: DRM modülü için başarılı HAL eşleşmesi

Çerçeve uyumluluk matrisinde, DRM HAL için aşağıdaki sürüm bilgileri belirtilmiştir:

<hal>
    <name>android.hardware.drm
    <version>1.0</version>
    <version>3.1-2</version>
    <interface>
        <name>IDrmFactory</name>
        <instance>default</instance>
        <instance>specific</instance>
    </interface>
</hal>
<hal>
    <name>android.hardware.drm
    <version>2.0</version>
    <interface>
        <name>ICryptoFactory</name>
        <instance>default</instance>
        <regex-instance>[a-z]+/[0-9]+</regex-instance>
    </interface>
</hal>

Tedarikçi firma aşağıdaki örneklerden BİRİNİ uygulamalıdır:

android.hardware.drm@1.x::IDrmFactory/default          // where x >= 0
android.hardware.drm@1.x::IDrmFactory/specific         // where x >= 0
VEYA
android.hardware.drm@3.y::IDrmFactory/default          // where y >= 1
android.hardware.drm@3.y::IDrmFactory/specific         // where y >= 1

VE şu örneklerin tümünü de uygulamalıdır:

android.hardware.drm@2.z::ICryptoFactory/default       // where z >= 0
android.hardware.drm@2.z::ICryptoFactory/${INSTANCE}
            // where z >= 0 and ${INSTANCE} matches [a-z]+/[0-9]+
            // e.g. legacy/0

AIDL HAL'leri

Android 11'den sonraki tüm Android sürümleri (Android 11 hariç) VINTF'de AIDL HAL sürümlerini destekler. AIDL HAL'ler için eşleşme kuralları, HIDL ve yerel HAL'lerinkine benzer. Ancak ana sürümlerin olmaması ve HAL örneği başına tam olarak bir sürüm vardır (sürüm belirtilmemişse 1).

  • Birden fazla <hal> öğesi tek bir VE ilişkisiyle değerlendirilir.
  • <hal> öğeleri, gerekli değil olarak işaretlemek için <hal optional="true"> özelliğine sahip olabilir.
  • Aynı <hal> içinde birden fazla <instance> ve <regex-instance> öğesi varsa <hal> gerekli olduğunda bu öğeler tek bir VE ilişkisiyle değerlendirilir. (<ahref="#vibrator">Titreşimli vibratör örneğine</ahref="#vibrator"> bakın.)

Örnek: Bir modül için başarılı HAL eşleşmesi

Sürüm 5'teki bir HAL için eşleşme kuralı aşağıdaki gibidir:

Matris Eşleşen Manifest
5 5-∞. Uyumluluk matrisinde 5, 5-5 ifadesinin kısaltmasıdır.
5-7 5-∞. Aşağıdakileri gösterir:
  • 5, gerekli minimum sürümdür. Yani HAL 1-4 sağlayan bir manifest uyumlu değildir.
  • 7, istenebilecek maksimum sürümdür. Yani uyumluluk matrisinin (çerçeve veya cihaz) sahibi, 7'den sonraki sürümler için istekte bulunmaz. Eşleşen manifestin sahibi, 7 istek aldığında 10 sürümünü (örnek olarak) sunmaya devam edebilir. Uyumluluk matrisi sahibi yalnızca istenen hizmetin API sürüm 7 ile uyumlu olduğunu bilir.
  • -7 yalnızca bilgi amaçlıdır ve OTA güncelleme sürecini etkilemez.
Bu nedenle, manifest dosyasında 10 sürümüne sahip bir HAL'e sahip bir cihaz, uyumluluk matrisinde 5-7 belirten bir çerçeveyle uyumlu olmaya devam eder.

Örnek: Birden çok modül için başarılı HAL eşleşmesi

Çerçeve uyumluluk matrisinde, titreşim ve kamera HAL'leri için aşağıdaki sürüm bilgileri belirtilmiştir:

<hal>
    <name>android.hardware.vibrator
    <version>1-2</version>
    <interface>
        <name>IVibrator</name>
        <instance>default</instance>
        <instance>specific</instance>
    </interface>
</hal>
<hal>
    <name>android.hardware.camera
    <version>5</version>
    <interface>
        <name>ICamera</name>
        <instance>default</instance>
        <regex-instance>[a-z]+/[0-9]+</regex-instance>
    </interface>
</hal>

Tedarikçi firma, aşağıdaki örneklerin tümünü uygulamalıdır:

android.hardware.vibrator.IVibrator/default     // version >= 1
android.hardware.vibrator.IVibrator/specific    // version >= 1
android.hardware.camera.ICamera/default         // version >= 5
android.hardware.camera.ICamera/${INSTANCE}
            // with version >= 5, where ${INSTANCE} matches [a-z]+/[0-9]+
            // e.g. legacy/0

Çekirdek eşleşmeleri

Çerçeve uyumluluk matrisinin <kernel> bölümünde, çerçevenin cihazdaki Linux çekirdeğiyle ilgili koşulları açıklanır. Bu bilgilerin, cihazın VINTF nesnesi tarafından bildirilen çekirdek hakkındaki bilgilerle eşleştirilmesi amaçlanır.

Çekirdek dallarını eşleme

Her çekirdek dalı soneki (örneğin, 5.4-r), benzersiz bir çekirdek FCM sürümüyle (ör. 5) eşlenir. Eşleme, sürüm harfleri (ör. R) ile FCM sürümleri (ör. 5) arasındaki eşlemeyle aynıdır.

VTS testleri, aşağıdakilerden biri doğruysa cihazın çekirdek FCM sürümünü cihaz manifest dosyasında (/vendor/etc/vintf/manifest.xml) açıkça belirtmesini zorunlu kılar:

  • Çekirdek FCM sürümü, hedef FCM sürümünden farklı. Örneğin, yukarıda belirtilen cihazın hedef FCM sürüm 4 ve çekirdek FCM sürümü 5'tir (çekirdek dalı son eki r).
  • Çekirdek FCM sürümü, 5'ten büyük veya 5'e eşit (çekirdek dalı soneki r).

VTS testleri, çekirdek FCM sürümü belirtilmişse çekirdek FCM sürümünün cihaz manifest'indeki hedef FCM sürümünden büyük veya eşit olmasını zorunlu kılar.

Örnek: Çekirdek dalını belirleme

Cihazda hedef FCM sürüm 4 (Android 10'da kullanıma sunulmuştur) varsa ancak çekirdeği 4.19-r dalından çalıştırıyorsa cihaz manifesti şunları belirtmelidir:

<manifest version="2.0" type="device" target-level="4">
   <kernel target-level="5" />
</manifest>

VINTF nesnesi, çekirdek uyumluluğunu, FCM sürüm 5'te belirtilen 4.19-r çekirdek kolundaki gereksinimlere göre kontrol eder. Bu gereksinimler Android kaynak ağacındaki kernel/configs/r/android-4.19 temel alınarak oluşturulmuştur.

Örnek: GKI için çekirdek dalını belirleme

Cihaz, Genel Kernel Görüntüsü (GKI) kullanıyorsa ve /proc/version öğesindeki çekirdek sürüm dizesi aşağıdaki gibiyse:

5.4.42-android12-0-00544-ged21d463f856

Ardından VINTF nesnesi, Android sürümünü çekirdek sürümünden alır ve çekirdek FCM sürümünü belirlemek için kullanır. Bu örnekte android12, çekirdek FCM sürüm 6'yı (Android 12'de kullanıma sunulmuştur) ifade eder.

Çekirdek sürüm dizesinin nasıl ayrıştırıldığıyla ilgili ayrıntılar için GKI sürümlendirme başlıklı makaleyi inceleyin.

Çekirdek sürümlerini eşleştirin

Bir matris, her biri farklı bir version özelliğine sahip birden fazla <kernel> bölümü içerebilir. Bu bölümler şu biçimi kullanır:

${ver}.${major_rev}.${kernel_minor_rev}

VINTF nesnesi, yalnızca cihaz çekirdeğiyle aynı ${ver} ve ${major_rev} ile eşleşen FCM sürümüne sahip FCM'deki <kernel> bölümünü dikkate alır (ör. version="${ver}.${major_rev}.${matrix_minor_rev}"); diğer bölümler yoksayılır. Ayrıca, çekirdekteki küçük düzeltme, uyumluluk matrisinden (${kernel_minor_rev} >= ${matrix_minor_rev}) bir değer olmalıdır. Hiçbir <kernel> bölümü bu koşulları karşılamıyorsa eşleşme yoktur.

Örnek: Eşleştirme için koşulları seçme

/system/etc/vintf bölgesindeki FCM'lerin aşağıdaki koşulları bildirdiği (başlık ve altbilgi etiketleri atlanır) aşağıdaki varsayımsal durumu düşünün:

<!-- compatibility_matrix.3.xml -->
<kernel version="4.4.107" level="3"/>
<!-- See kernel/configs/p/android-4.4/ for 4.4-p requirements -->
<kernel version="4.9.84" level="3"/>
<!-- See kernel/configs/p/android-4.9/ for 4.9-p requirements -->
<kernel version="4.14.42" level="3"/>
<!-- See kernel/configs/p/android-4.14/ for 4.14-p requirements -->

<!-- compatibility_matrix.4.xml -->
<kernel version="4.9.165" level="4"/>
<!-- See kernel/configs/q/android-4.9/ for 4.9-q requirements -->
<kernel version="4.14.105" level="4"/>
<!-- See kernel/configs/q/android-4.14/ for 4.14-q requirements -->
<kernel version="4.19.42" level="4"/>
<!-- See kernel/configs/q/android-4.19/ for 4.19-q requirements -->

<!-- compatibility_matrix.5.xml -->
<kernel version="4.14.180" level="5"/>
<!-- See kernel/configs/r/android-4.14/ for 4.14-r requirements -->
<kernel version="4.19.123" level="5"/>
<!-- See kernel/configs/r/android-4.19/ for 4.19-r requirements -->
<kernel version="5.4.41" level="5"/>
<!-- See kernel/configs/r/android-5.4/ for 5.4-r requirements -->

Hedef FCM sürümü, çekirdek FCM sürümü ve çekirdek sürümü birlikte FCM'lerden çekirdek şartlarını seçer:

Hedef FCM sürümüKernel FCM sürümüÇekirdek sürümüŞununla eşleştir:
3 (K)belirtilmedi4.4.106 Eşleşme yok (küçük sürüm uyuşmazlığı)
3 (K)belirtilmedi4.4.107 4.4-p
3 (P)belirtilmedi4.19.42 4.19-q (aşağıdaki nota bakın)
3 (P)belirtilmedi5.4.41 5.4-r (aşağıdaki nota bakın)
3 (K)3 (P) 4.4.107 4.4-p
3 (P)3 (P) 4.19.42 Eşleşme yok (4.19-p çekirdek dalı yok)
3 (P)4 (S) 4.19.42 4.19-q
4 (S)belirtilmedi4.4.107 Eşleşme yok (4.4-q çekirdek dalı yok)
4 (S)belirtilmedi4.9.165 4.9-q
4 (Ç)belirtilmedi5.4.41 5.4-r (aşağıdaki nota bakın)
4 (S)4 (S) 4.9.165 4.9-q
4 (S)4 (Ç) 5.4.41 Eşleşme yok (5.4-q çekirdek dalı yok)
4 (S)5 (Sağ) 4.14.1054.14-r
4 (S)5 (Sağ) 5.4.41 5.4-r
5 (Sağ)belirtilmediherhangi VTS başarısız (Hedef FCM sürümü 5 için çekirdek FCM sürümü belirtilmelidir)
5 (R)4 (S) herhangi VTS başarısız (çekirdek FCM sürümü < hedef FCM sürümü)
5 (R)5 (R) 4.14.1804.14-r

Çekirdek yapılandırmalarını eşleme

<kernel> bölümü eşleşirse işlem, config öğelerini /proc/config.gz ile eşleştirmeye çalışarak devam eder. Uyumluluk matrisindeki her yapılandırma öğesi için yapılandırma mevcut olup olmadığını görmek üzere /proc/config.gz değerini arar. Eşleşen <kernel> bölümü için uyumluluk matrisinde n olarak ayarlanan bir yapılandırma öğesi, /proc/config.gz öğesinde bulunmamalıdır. Son olarak, uyumluluk matrisinde bulunmayan bir yapılandırma öğesi /proc/config.gz'te bulunabilir veya bulunmayabilir.

Örnek: Çekirdek yapılandırmalarını eşleştirme

  • <value type="string">bar</value> eşleşme meydana geldi"bar". Tırnak işaretleri, uyumluluk matrisinde atlanır ancak /proc/config.gz içinde bulunur.
  • <value type="int">4096</value>, 4096 veya 0x1000 ya da 0X1000 ile eşleşir.
  • <value type="int">0x1000</value>, 4096 veya 0x1000 ya da 0X1000 ile eşleşir.
  • <value type="int">0X1000</value>, 4096 veya 0x1000 ya da 0X1000 ile eşleşiyor.
  • <value type="tristate">y</value> eşleşme meydana geldiy.
  • <value type="tristate">m</value> eşleşme meydana geldim.
  • <value type="tristate">n</value>, yapılandırma öğesinin /proc/config.gz içinde BULUNMAMASI gerektiği anlamına gelir.
  • <value type="range">1-0x3</value>, 1, 2 veya 3 ile eşleşir ya da onaltılık eşdeğeridir.

Örnek: Çekirdek eşleşmesi başarılı

FCM 1. sürümüne sahip bir çerçeve uyumluluk matrisinde aşağıdaki çekirdek bilgileri bulunur:

<kernel version="4.14.42">
   <config>
      <key>CONFIG_TRI</key>
      <value type="tristate">y</value>
   </config>
   <config>
      <key>CONFIG_NOEXIST</key>
      <value type="tristate">n</value>
   </config>
   <config>
      <key>CONFIG_DEC</key>
      <value type="int">4096</value>
   </config>
   <config>
      <key>CONFIG_HEX</key>
      <value type="int">0XDEAD</value>
   </config>
   <config>
      <key>CONFIG_STR</key>
      <value type="string">str</value>
   </config>
   <config>
      <key>CONFIG_EMPTY</key>
      <value type="string"></value>
   </config>
</kernel>

İlk olarak çekirdek dalı eşleştirilir. Çekirdek dalı, manifest.kernel.target-level içindeki cihaz manifestinde belirtilir. Bu değer, belirtilmezse varsayılan olarak manifest.level olur. Cihaz manifest'indeki çekirdek dalı:

  • ise bir sonraki adıma geçip çekirdek sürümünü kontrol eder.
  • 2 ise matrisle eşleşmez. VINTF nesneleri, bunun yerine FCM sürüm 2'de matristeki çekirdek koşullarını okur.

Ardından, çekirdek sürümü eşleştirilir. uname() alanındaki bir cihaz aşağıdakileri bildirirse:

  • 4.9.84 (<kernel version="4.9.x"> içeren ayrı bir çekirdek bölümü olmadığı sürece matrisle eşleşme olmaz. Burada x <= 84)
  • 4.14.41 (matrisle eşleşme yok, version'ten küçük)
  • 4.14.42 (matrisle eşleşme)
  • 4.14.43 (matrisle eşleştirme)
  • 4.1.22 (x <= 22 burada <kernel version="4.1.x"> ile ayrı bir çekirdek bölümü olmadığı sürece matrisle eşleşmez)

Uygun <kernel> bölümü seçildikten sonra, n dışında bir değere sahip her <config> öğesi için ilgili girişin /proc/config.gz'da bulunmasını bekleriz. n değerine sahip her <config> öğesi için ise ilgili girişin /proc/config.gz'da bulunmamasını bekleriz. <value> içeriğinin, eşit işaretinden sonraki metinle (tırnak işaretleri dahil) yeni satır karakterine veya #'a kadar tam olarak eşleşmesi, başlangıç ve bitiş boşluklarının ise kısaltılması gerekir.

Aşağıdaki çekirdek yapılandırması başarılı bir eşlemeye örnektir:

# comments don't matter
CONFIG_TRI=y
# CONFIG_NOEXIST shouldn't exist
CONFIG_DEC = 4096 # trailing comments and whitespaces are fine
CONFIG_HEX=57005  # 0XDEAD == 57005
CONFIG_STR="str"
CONFIG_EMPTY=""   # empty string must have quotes
CONFIG_EXTRA="extra config items are fine too"

Aşağıdaki çekirdek yapılandırması, başarısız bir eşleşme örneğidir:

CONFIG_TRI="y"   # mismatch: quotes
CONFIG_NOEXIST=y # mismatch: CONFIG_NOEXIST exists
CONFIG_HEX=0x0   # mismatch; value doesn't match
CONFIG_DEC=""    # mismatch; type mismatch (expect int)
CONFIG_EMPTY=1   # mismatch; expects ""
# mismatch: CONFIG_STR is missing

SE politikası eşleşiyor

SE politikası için aşağıdaki eşleşmeler gereklidir:

  • <sepolicy-version>, her ana sürüm için kapalı bir küçük sürüm aralığı tanımlar. Cihaz tarafından bildirilen sepolicy sürümünün, çerçeveyle uyumlu olması için bu aralıklardan birinde olması gerekir. Eşleşme kuralları, HAL sürümlerine benzer. sepolicy sürümü, aralığın minimum sürümünden yüksek veya minimum sürüme eşitse eşleşme kuralları bu şekildedir. Maksimum sürüm tamamen bilgilendirme amaçlıdır.
  • <kernel-sepolicy-version> (ör. policydb sürümü). Cihaz tarafından bildirilen security_policyvers() değerinden az olmalıdır.

Örnek: Başarılı SE politikası eşleşmesi

Çerçeve uyumluluk matrisi aşağıdaki sepolicy bilgilerini belirtir:

<sepolicy>
    <kernel-sepolicy-version>30</kernel-sepolicy-version>
    <sepolicy-version>25.0</sepolicy-version>
    <sepolicy-version>26.0-3</sepolicy-version>
</sepolicy>

Cihazda:

  • security_policyvers() tarafından döndürülen değer 30'dan büyük veya 30'a eşit olmalıdır. Aksi takdirde eşleşme olmaz. Örneğin:
    • Bir cihaz 29 döndürüyorsa eşleşme yoktur.
    • Bir cihaz 31 döndürüyorsa eşleşme vardır.
  • SE Politikası sürümü 25.0-∞ veya 26.0-∞ arasında olmalıdır. Aksi takdirde eşleşme olmaz. ("26.0"den sonra gelen "-3" tamamen bilgilendirme amaçlıdır.)

AVB sürümü eşleşmeleri

AVB sürümü, ANASÜRÜM.ALTSÜRÜM biçiminde bir ANASÜRÜM sürümü ve ALTSÜRÜM sürümü içerir (ör. 1.0, 2.1). Ayrıntılar için Sürümlendirme ve Uyumluluk başlıklı makaleyi inceleyin. AVB sürümünde aşağıdaki sistem özellikleri bulunur:

  • ro.boot.vbmeta.avb_version, bootloader'daki libavb sürümüdür
  • ro.boot.avb_version, Android OS'teki (init/fs_mgr) libavb sürümüdür

Sistem özelliği yalnızca AVB meta verilerini doğrulamak için ilgili libavb kullanıldığında (ve OK döndürüldüğünde) görünür. Doğrulama hatası oluştuysa (veya hiç doğrulama yapılmadıysa) bu değer yoktur.

Uyumluluk eşleşmesinde aşağıdakiler karşılaştırılır:

  • Çerçeve uyumluluk matrisinden avb.vbmeta-version ile sysprop ro.boot.vbmeta.avb_version;
    • ro.boot.vbmeta.avb_version.MAJOR == avb.vbmeta-version.MAJOR
    • ro.boot.vbmeta.avb_version.MINOR >= avb.vbmeta-version.MINOR
  • Çerçeve uyumluluk matrisinden avb.vbmeta-version ile sysprop ro.boot.avb_version.
    • ro.boot.avb_version.MAJOR == avb.vbmeta-version.MAJOR
    • ro.boot.avb_version.MINOR >= avb.vbmeta-version.MINOR

Önyükleyici veya Android OS, libavbkütüphanelerinin iki kopyasını içerebilir. Bu kopyaların her biri, yükseltme cihazları ve lansman cihazları için farklı bir BÜYÜK sürüme sahiptir. Bu durumda, aynı imzasız sistem görüntüsü paylaşılabilir ancak nihai imzalı sistem görüntüleri farklıdır (farklı avb.vbmeta-version ile):

Şekil 1. AVB sürümü eşleşiyor (/sistem P, diğer tüm bölümler O'dur).



Şekil 2. AVB sürümü eşleşmeleri (tüm bölümler P).

Örnek: Başarılı AVB sürümü eşleşmesi

Çerçeve uyumluluk matrisinde aşağıdaki AVB bilgileri belirtilir:

<avb>
    <vbmeta-version>2.1</vbmeta-version>
</avb>

Cihazda:

ro.boot.avb_version              == 1.0 &&
ro.boot.vbmeta.avb_version       == 2.1  mismatch 
ro.boot.avb_version              == 2.1 &&
ro.boot.vbmeta.avb_version       == 3.0  mismatch 
ro.boot.avb_version              == 2.1 &&
ro.boot.vbmeta.avb_version       == 2.3  match 
ro.boot.avb_version              == 2.3 &&
ro.boot.vbmeta.avb_version       == 2.1  match 

OTA sırasında AVB sürümünü eşleştirme

Android 9 veya daha eski sürümlerle kullanıma sunulan cihazlar Android 10'a güncellenirken çerçeve uyumluluk matrisindeki AVB sürüm koşulları, cihazdaki mevcut AVB sürümüyle eşleştirilir. OTA sırasında AVB sürümünde büyük bir sürüm yükseltmesi varsa (ör. 0,0'dan 1,0'a) OTA'daki uyumluluk için VINTF kontrolü, OTA'dan sonraki uyumluluğu yansıtmaz.

OEM'ler, sorunu azaltmak için OTA paketine (compatibility.zip) sahte bir AVB sürümü yerleştirerek kontrolü geçebilir. Bunu yapmak için:

  1. Android 9 kaynak ağacına aşağıdaki CL'leri seçin:
  2. Cihaz için BOARD_OTA_FRAMEWORK_VBMETA_VERSION_OVERRIDE değerini tanımlayın. Değeri, OTA'dan önceki AVB sürümüne, yani cihazın kullanıma sunulduğundaki AVB sürümüne eşit olmalıdır.
  3. OTA paketini yeniden oluşturun.

Bu değişiklikler, BOARD_OTA_FRAMEWORK_VBMETA_VERSION_OVERRIDE'ü aşağıdaki dosyalarda otomatik olarak compatibility-matrix.avb.vbmeta-version olarak yerleştirir:

  • /system/compatibility_matrix.xml (Android 9'da kullanılmaz)
  • OTA paketinde compatibility.zip'te system_matrix.xml

Bu değişiklikler, /system/etc/vintf/compatibility_matrix.xml dahil olmak üzere diğer çerçeve uyumluluk matrislerini etkilemez. OTA'dan sonra uyumluluk kontrolleri için /system/etc/vintf/compatibility_matrix.xml içindeki yeni değer kullanılır.

VNDK sürümü eşleşiyor

Cihaz uyumluluk matrisinde, compatibility-matrix.vendor-ndk.version içinde gerekli VNDK sürümü belirtilir. Cihaz uyumluluk matrisinde <vendor-ndk> etiketi yoksa herhangi bir koşul uygulanmaz ve bu nedenle her zaman eşleşme olarak kabul edilir.

Cihaz uyumluluk matrisinde <vendor-ndk> etiketi varsa çerçeve manifestinde çerçeve tarafından sağlanan VNDK tedarikçisi anlık görüntüleri grubundan eşleşen bir <version> içeren <vendor-ndk> girişi aranacaktır. Böyle bir giriş yoksa eşleşme olmaz.

Böyle bir giriş varsa cihaz uyumluluk matrisinde belirtilen kitaplık grubu, çerçeve manifestinde belirtilen kitaplık grubunun alt kümesi olmalıdır. Aksi takdirde giriş eşleşme olarak kabul edilmez.

  • Özel bir durum olarak, cihaz uyumluluk matrisinde kitaplık listelenmemişse boş küme herhangi bir kümenin alt kümesi olduğundan giriş her zaman eşleşme olarak kabul edilir.

Örnek: Başarılı VNDK sürümü eşleşmesi

Cihaz uyumluluk matrisi, VNDK'da aşağıdaki şartı belirtiyorsa:

<!-- Example Device Compatibility Matrix -->
<vendor-ndk>
    <version>27</version>
    <library>libjpeg.so</library>
    <library>libbase.so</library>
</vendor-ndk>

Çerçeve manifestinde yalnızca 27 numaralı sürüme sahip giriş dikkate alınır.

<!-- Framework Manifest Example A -->
<vendor-ndk>
    <version>27</version>
    <library>libjpeg.so</library>
    <library>libbase.so</library>
    <library>libfoo.so</library>
</vendor-ndk>

VNDK sürüm 27, çerçeve manifest'inde ve {libjpeg.so, libbase.so, libfoo.so} ⊇ {libjpeg.so, libbase.so} öğesinde olduğu için A örneği eşleşmedir.

<!-- Framework Manifest Example B -->
<vendor-ndk>
    <version>26</version>
    <library>libjpeg.so</library>
    <library>libbase.so</library>
</vendor-ndk>
<vendor-ndk>
    <version>27</version>
    <library>libbase.so</library>
</vendor-ndk>

B örneği eşleşme değildir. VNDK 27 sürümü çerçeve manifestinde olsa bile libjpeg.so, bu anlık görüntüdeki çerçeve tarafından desteklenmez. VNDK sürüm 26 yoksayılır.

Sistem SDK sürümü eşleşmeleri

Cihaz uyumluluk matrisi, compatibility-matrix.system-sdk.version içinde gerekli bir dizi sistem SDK sürümü tanımlar. Eşleşme yalnızca, çerçeve manifestinde manifest.system-sdk.version içinde belirtildiği gibi sağlanan sistem SDK sürümlerinin alt kümesiyse gerçekleşir.

  • Özel bir durum olarak, cihaz uyumluluk matrisinde hiçbir Sistem SDK'sı sürümü belirtilmemişse boş küme herhangi bir grubun alt kümesi olduğundan her zaman bir eşleşme olarak kabul edilir.

Örnek: Sistem SDK sürümü eşleşmesi başarılı

Cihaz uyumluluk matrisinde, System SDK'sı için aşağıdaki şart belirtiliyorsa:

<!-- Example Device Compatibility Matrix -->
<system-sdk>
    <version>26</version>
    <version>27</version>
</system-sdk>

Ardından, çerçevenin eşleşmesi için Sistem SDK'sı 26 ve 27 sürümünü sağlaması gerekir.

<!-- Framework Manifest Example A -->
<system-sdk>
    <version>26</version>
    <version>27</version>
</system-sdk>

A örneği eşleşmedir.

<!-- Framework Manifest Example B -->
<system-sdk>
    <version>26</version>
    <version>27</version>
    <version>28</version>
</system-sdk>

Örnek B eşleşmedir.

<!-- Framework Manifest Example C -->
<system-sdk>
    <version>26</version>
</system-sdk>

Sistem SDK'sı 27 sürümü sağlanmadığı için C örneği eşleşmez.