Eşleştirme Kuralları

İki çift uyumluluk matrisi ve bildiriminin, çerçevenin ve satıcı uygulamasının birbiriyle çalışabileceğini doğrulamak için uzlaştırılması amaçlanmaktadır. Bu doğrulama, çerçeve uyumluluk matrisi ile cihaz bildirimi arasındaki ve ayrıca çerçeve bildirimi ile cihaz uyumluluk matrisi arasındaki eşleşme durumunda başarılı olur.

Bu doğrulama, oluşturma 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 verilmektedir.

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

Bir cihaz bildirimini çerçeve uyumluluk matrisiyle eşleştirmek için manifest.target-level tarafından belirtilen Gönderi 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 eşleşme olmaz.

Çerçeve uyumluluk matrisi libvintf ile istendiğinde bu eşleşme her zaman başarılı olur çünkü libvintf cihaz bildirimini açar, Gönderi FCM Sürümünü alır ve bu Gönderi FCM Sürümündeki çerçeve uyumluluk matrisini döndürür (artı daha yüksek FCM'deki uyumluluk matrislerinden bazı isteğe bağlı HAL'ler) Sürümler).

HAL maçları

HAL-eşleşme kuralı, bir bildirim dosyasındaki hal öğelerinin ilgili uyumluluk matrisinin sahibi tarafından desteklendiği düşünülen sürümlerini tanımlar.

HIDL ve yerel HAL'ler

HIDL ve yerel HAL'ler için eşleşme kuralları aşağıdaki gibidir.

  • Birden çok <hal> öğesi tek bir AND ilişkisiyle değerlendirilir.
  • <hal> öğeleri, gerekli değil olarak işaretlemek için <hal optional="true"> içerebilir.
  • Aynı <hal> içindeki birden fazla <version> öğesi OR ilişkisine sahiptir. İki veya daha fazla belirtilmişse sürümlerden yalnızca birinin uygulanması gerekir. (Aşağıdaki DRM örneğine bakın.)
  • Aynı <hal> içindeki birden fazla <instance> ve <regex-instance> öğesi, <hal> gerekli olduğunda tek bir AND ilişkisiyle değerlendirilir. (bkz. Aşağıdaki DRM örneği.)

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

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

Matris Eşleşen Manifest
2.5 2.5-2.∞. Uyumluluk matrisinde 2.5 , 2.5-5 kısaltmasıdır.
2.5-7 2.5-2.∞. Aşağıdakileri belirtir:
  • 2.5, gereken minimum sürümdür; bu, HAL 2.0-2.4'ü sağlayan bir bildirimin uyumlu olmadığı anlamına gelir.
  • 2.7, talep edilebilecek maksimum sürümdür; bu, uyumluluk matrisinin (çerçeve veya cihaz) sahibinin 2.7'den sonraki sürümleri talep etmeyeceği anlamına gelir. Eşleşen manifestin sahibi, 2.7 istendiğinde yine de 2.10 sürümünü (örnek olarak) sunabilir. Uyumluluk matrisi sahibi yalnızca istenen hizmetin API sürüm 2.7 ile uyumlu olduğunu bilir.
  • -7 yalnızca bilgilendirme amaçlıdır ve OTA güncelleme sürecini etkilemez.
Böylece manifest dosyasında 2.10 sürümünde HAL bulunan bir cihaz, uyumluluk matrisinde 2.5-7 belirten bir çerçeveyle uyumlu kalır.

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

Çerçeve uyumluluk matrisi, DRM HAL için aşağıdaki sürüm bilgilerini belirtir:

<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>

Satıcının aşağıdaki örneklerden BİRİNİ uygulaması gerekir; herhangi biri

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

AND ayrıca şu örneklerin tümünü 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'ler

Android 11'den sonraki tüm Android sürümleri (Android 11 hariç), VINTF'deki AIDL HAL sürümlerini destekler. AIDL HAL'lere ilişkin eşleşme kuralları, ana sürümlerin bulunmaması ve HAL örneği başına tam olarak bir sürümün bulunması (sürüm belirtilmemişse 1 ) dışında HIDL ve yerel HAL'lerinkine benzer.

  • Birden çok <hal> öğesi tek bir AND ilişkisiyle değerlendirilir.
  • <hal> öğeleri, gerekli değil olarak işaretlemek için <hal optional="true"> içerebilir.
  • Aynı <hal> içindeki birden fazla <instance> ve <regex-instance> öğesi, <hal> gerekli olduğunda tek bir AND ilişkisiyle değerlendirilir. (bkz. Aşağıdaki vibratör örneği.)

Ö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 kısaltmasıdır.
5-7 5-∞. Aşağıdakileri belirtir:
  • 5, gereken minimum sürümdür; bu, HAL 1-4'ü sağlayan bir bildirimin uyumlu olmadığı anlamına gelir.
  • 7, talep edilebilecek maksimum sürümdür; bu, uyumluluk matrisinin (çerçeve veya cihaz) sahibinin 7'den sonraki sürümleri talep etmeyeceği anlamına gelir. Eşleşen bildirimin sahibi, 7 istendiğinde yine de 10 sürümünü (örnek olarak) sunabilir . Uyumluluk matrisi sahibi yalnızca istenen hizmetin API sürüm 7 ile uyumlu olduğunu bilir.
  • -7 yalnızca bilgilendirme amaçlıdır ve OTA güncelleme sürecini etkilemez.
Böylece manifest dosyasında sürüm 10'da HAL bulunan bir cihaz, uyumluluk matrisinde 5-7 belirten bir çerçeveyle uyumlu kalır.

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

Çerçeve uyumluluk matrisi, vibratör ve kamera HAL'leri için aşağıdaki sürüm bilgilerini belirtir:

<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>

Bir satıcının bu örneklerin tümünü uygulaması gerekir:

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ü, aygıttaki Linux çekirdeğinin çerçeve gereksinimlerini açıklar. Bu bilginin, cihazın VINTF nesnesi tarafından rapor edilen çekirdek hakkındaki bilgilerle eşleştirilmesi amaçlanmaktadır.

Çekirdek dallarını eşleştir

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

VTS testleri, aşağıdakilerden biri doğruysa, aygıtın /vendor/etc/vintf/manifest.xml biçimindeki aygıt bildiriminde çekirdek FCM sürümünü açıkça belirtmesini zorunlu kılar:

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

VTS testleri, çekirdek FCM sürümü belirtildiyse çekirdek FCM sürümünün, cihaz bildirimindeki hedef FCM sürümünden büyük veya ona eşit olmasını zorunlu kılar.

Örnek: Çekirdek dalını belirleyin

Cihaz hedef FCM sürüm 4'e (Android 10'da yayınlandı) sahipse ancak çekirdeği 4.19-r dalından çalıştırıyorsa cihaz bildiriminde aşağıdakiler belirtilmelidir:

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

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

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

Cihaz Genel Çekirdek Görüntüsünü (GKI) kullanıyorsa ve /proc/version adresinden çekirdek yayın dizesi aşağıdaki gibiyse:

5.4.42-android12-0-00544-ged21d463f856

Daha sonra VINTF nesnesi çekirdek sürümünden Android sürümünü alır ve bunu çekirdek FCM sürümünü belirlemek için kullanır. Bu örnekte android12 , çekirdek FCM sürüm 6 (Android 12'de yayınlandı) anlamına gelir.

Çekirdek yayın dizesinin nasıl ayrıştırıldığına ilişkin ayrıntılar için bkz. GKI sürüm oluşturma .

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

Bir matris, her biri şu formatı kullanan farklı bir version özelliğine sahip birden fazla <kernel> bölümü içerebilir:

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

VINTF nesnesi, FCM'nin yalnızca, cihaz çekirdeğiyle aynı ${ver} ve ${major_rev} değerlerine sahip FCM sürümüyle eşleşen <kernel> bölümünü dikkate alır (ör. version="${ver}.${major_rev}.${matrix_minor_rev}") ; diğer bölümler dikkate alınmaz. Ek olarak, çekirdekten gelen küçük revizyonun uyumluluk matrisinden bir değer olması gerekir ( ${kernel_minor_rev} >= ${matrix_minor_rev} ;). Hiçbir <kernel> bölümü bu gereksinimleri karşılamıyorsa, bu eşleşmeyen bir durumdur.

Örnek: Eşleştirme için gereksinimleri seçin

/system/etc/vintf dosyasındaki FCM'lerin aşağıdaki gereksinimleri bildirdiği aşağıdaki varsayımsal durumu düşünün (üstbilgi ve altbilgi etiketleri çıkarılmıştır):

<!-- 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 gereksinimlerini seçer:

Hedef FCM sürümü Çekirdek FCM sürümü Çekirdek sürümü Uyuşuyor
3 (P) belirtilmemiş 4.4.106 Eşleşme yok (küçük sürüm uyuşmazlığı)
3 (P) belirtilmemiş 4.4.107 4.4-p
3 (P) belirtilmemiş 4.19.42 4.19-q (aşağıdaki nota bakın)
3 (P) belirtilmemiş 5.4.41 5.4-r (aşağıdaki nota bakın)
3 (P) 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) belirtilmemiş 4.4.107 Eşleşme yok ( 4.4-q çekirdek dalı yok)
4 (S) belirtilmemiş 4.9.165 4.9-q
4 (S) belirtilmemiş 5.4.41 5.4-r (aşağıdaki nota bakın)
4 (S) 4 (S) 4.9.165 4.9-q
4 (S) 4 (S) 5.4.41 Eşleşme yok ( 5.4-q çekirdek dalı yok)
4 (S) 5 (R) 4.14.105 4.14-r
4 (S) 5 (R) 5.4.41 5.4-r
5 (R) belirtilmemiş herhangi VTS başarısız oluyor (Hedef FCM sürüm 5 için çekirdek FCM sürümünü belirtmeniz gerekir)
5 (R) 4 (S) herhangi VTS başarısız oluyor (çekirdek FCM sürümü < hedef FCM sürümü)
5 (R) 5 (R) 4.14.180 4.14-r

Çekirdek yapılandırmalarını eşleştirin

<kernel> bölümü eşleşirse, config öğelerini /proc/config.gz ile eşleştirmeye çalışarak süreç devam eder. Uyumluluk matrisindeki her bir yapılandırma öğesi için, yapılandırmanın mevcut olup olmadığını görmek üzere /proc/config.gz dosyasına bakar. Eşleşen <kernel> bölümü için uyumluluk matrisinde bir yapılandırma öğesi n olarak ayarlandığında, /proc/config.gz dosyasında bulunmaması gerekir. Son olarak, uyumluluk matrisinde olmayan bir yapılandırma öğesi /proc/config.gz dosyasında bulunabilir veya bulunmayabilir.

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

  • <value type="string">bar</value> "bar" ile eşleşir. Uyumluluk matrisinde tırnak işaretleri çıkarılmıştır ancak /proc/config.gz dosyasında mevcuttur.
  • <value type="int">4096</value> 4096 veya 0x1000 veya 0X1000 ile eşleşir.
  • <value type="int">0x1000</value> 4096 veya 0x1000 veya 0X1000 ile eşleşir.
  • <value type="int">0X1000</value> 4096 veya 0x1000 veya 0X1000 ile eşleşir.
  • <value type="tristate">y</value> y ile eşleşir.
  • <value type="tristate">m</value> m ile eşleşir.
  • <value type="tristate">n</value> yapılandırma öğesinin /proc/config.gz dosyasında BULUNMAMASI gerektiği anlamına gelir.
  • <value type="range">1-0x3</value> 1 , 2 veya 3 ile veya onaltılık eşdeğeriyle eşleşir.

Örnek: Başarılı çekirdek eşleşmesi

FCM sürüm 1'e sahip bir çerçeve uyumluluk matrisi aşağıdaki çekirdek bilgilerine sahiptir:

<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 önce çekirdek dalı eşleştirilir. Çekirdek dalı, aygıt bildiriminde manifest.kernel.target-level dosyasında belirtilir; eğer belirtilmemişse varsayılan olarak manifest.level olur. Aygıttaki çekirdek dalı şunu gösteriyorsa:

  • 1'dir, bir sonraki adıma geçer ve çekirdek sürümünü kontrol eder.
  • 2, matrisle eşleşme yok. VINTF nesneleri bunun yerine çekirdek gereksinimlerini FCM sürüm 2'deki matristen okur.

Daha sonra çekirdek sürümü eşleştirilir. uname() içindeki bir cihaz şunu bildirirse:

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

Uygun <kernel> bölümü seçildikten sonra, n dışında bir değere sahip her <config> öğesi için, karşılık gelen girişin /proc/config.gz dosyasında bulunmasını bekleriz; n değerine sahip her <config> öğesi için karşılık gelen girişin /proc/config.gz dosyasında bulunmamasını bekleriz. <value> içeriğinin, eşittir işaretinden sonraki (tırnak işaretleri dahil), yeni satır karakterine veya # karakterine kadar, baştaki ve sondaki boşluklar kısaltılmış olarak metinle tam olarak eşleşmesini bekliyoruz.

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

# 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ı aşağıdaki eşleşmeleri gerektirir:

  • <sepolicy-version> her ana sürüm için kapalı bir alt sürüm aralığını tanımlar. Cihaz tarafından bildirilen sepolicy sürümünün, çerçeveyle uyumlu olabilmesi için bu aralıklardan birinde olması gerekir. Maç kuralları HAL versiyonlarına benzer; sepolicy sürümünün aralık için minimum sürüme eşit veya daha yüksek olması bir eşleşmedir. Maksimum sürüm tamamen bilgilendirme amaçlıdır.
  • <kernel-sepolicy-version> yani politikadb sürümü. Cihaz tarafından bildirilen security_policyvers() değerinden daha az olmalıdır.

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

Çerçeve uyumluluk matrisi aşağıdaki sepolitik bilgileri 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 ona eşit olmalıdır. Aksi halde eşleşme olmaz. Örneğin:
    • Bir cihaz 29 değerini döndürürse bu bir eşleşme değildir.
    • Bir cihaz 31 değerini döndürürse bu bir eşleşmedir.
  • SE Politikası sürümü 25.0-∞ veya 26.0-∞'dan biri olmalıdır. Aksi halde bu bir eşleşme değildir. (" 26.0 "dan sonraki " -3 " tamamen bilgilendirme amaçlıdır.)

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

AVB sürümü, MAJOR.MINOR (örn. 1.0, 2.1) biçiminde bir MAJOR sürümü ve MINOR sürümünü içerir. Ayrıntılar için Sürüm Oluşturma ve Uyumluluk bölümüne bakın. AVB sürümü aşağıdaki sistem özelliklerine sahiptir:

  • ro.boot.vbmeta.avb_version , önyükleyicideki libavb sürümüdür
  • ro.boot.avb_version , Android işletim sistemindeki libavb sürümüdür ( init/fs_mgr )

Sistem özelliği yalnızca karşılık gelen libavb AVB meta verilerini doğrulamak için kullanıldığında görünür (ve Tamam değerini döndürür). Bir doğrulama hatası meydana gelmişse (veya hiç doğrulama meydana gelmemişse) mevcut değildir.

Uyumluluk eşleşmesi aşağıdakileri karşılaştırı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 işletim sistemi, her biri aygıtları yükseltmek ve aygıtları başlatmak için farklı bir MAJOR sürümüne sahip olan libavb kitaplıklarının iki kopyasını içerebilir. Bu durumda, aynı imzasız sistem görüntüsü paylaşılabilir ancak son imzalı sistem görüntüleri farklıdır (farklı avb.vbmeta-version ile):

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


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

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

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

<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ün eşleştirilmesi

Android 9 veya daha düşük bir sürümle başlatılan cihazlar için, Android 10'a güncelleme yapılırken çerçeve uyumluluk matrisindeki AVB sürümü gereksinimleri, cihazdaki mevcut AVB sürümüyle eşleştirilir. AVB sürümü, OTA sırasında büyük bir sürüm yükseltmesine sahipse (örneğin, 0,0'dan 1,0'a), OTA'daki VINTF uyumluluğu kontrolü, OTA'dan sonraki uyumluluğu yansıtmaz.

Sorunu hafifletmek için bir OEM, kontrolü geçmek üzere OTA paketine ( compatibility.zip ) sahte bir AVB sürümü yerleştirebilir. Böyle yaparak:

  1. Android 9 kaynak ağacına aşağıdaki CL'leri özenle seçin:
  2. Cihaz için BOARD_OTA_FRAMEWORK_VBMETA_VERSION_OVERRIDE tanımını yapın. Değeri, OTA'dan önceki AVB sürümüne, yani cihazın başlatıldığı andaki 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 dosyalara otomatik olarak compatibility-matrix.avb.vbmeta-version olarak yerleştirir:

  • Cihazda /system/compatibility_matrix.xml (Android 9'da kullanılmaz)
  • OTA paketindeki compatibility.zip dosyasındaki 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 dosyasındaki yeni değer kullanılır.

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

Cihaz uyumluluk matrisi, gerekli VNDK sürümünü compatibility-matrix.vendor-ndk.version dosyasında bildirir. Cihaz uyumluluk matrisinde <vendor-ndk> etiketi yoksa herhangi bir gereksinim uygulanmaz ve bu nedenle her zaman bir eşleşme olarak kabul edilir.

Cihaz uyumluluk matrisinde bir <vendor-ndk> etiketi varsa, çerçeve bildirimindeki çerçeve tarafından sağlanan VNDK satıcı anlık görüntüleri kümesinden eşleşen bir <version> içeren bir <vendor-ndk> girişi aranır. Böyle bir giriş yoksa eşleşme yoktur.

Böyle bir giriş mevcutsa, cihaz uyumluluk matrisinde sıralanan kitaplıklar kümesi, çerçeve bildiriminde belirtilen kitaplıklar kümesinin bir alt kümesi olmalıdır; aksi halde giriş eşleşme olarak değerlendirilmez.

  • Özel bir durum olarak, aygıt uyumluluk matrisinde hiçbir kitaplık numaralandırılmamışsa, boş küme herhangi bir kümenin alt kümesi olduğundan giriş her zaman bir 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 gereksinimi belirtiyorsa:

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

Çerçeve bildiriminde yalnızca sürüm 27'ye 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>

Örnek A bir eşleşmedir çünkü VNDK sürüm 27, çerçeve bildiriminde yer alır ve {libjpeg.so, libbase.so, libfoo.so} ⊇ {libjpeg.so, libbase.so} .

<!-- 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>

Örnek B bir eşleşme değil. VNDK sürüm 27 çerçeve bildiriminde yer alsa da libjpeg.so bu anlık görüntüdeki çerçeve tarafından desteklenmiyor. VNDK sürüm 26 dikkate alınmaz.

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

Cihaz uyumluluk matrisi, compatibility-matrix.system-sdk.version dosyasında gerekli Sistem SDK sürümü kümesini bildirir. Yalnızca kümenin, çerçeve bildirimindeki manifest.system-sdk.version dosyasında bildirildiği gibi, sağlanan Sistem SDK sürümlerinin bir alt kümesi olması durumunda bir eşleşme vardır.

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

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

Cihaz uyumluluk matrisi Sistem SDK'sında aşağıdaki gereksinimi belirtiyorsa:

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

Daha sonra çerçevenin eşleşmesi için Sistem SDK'sı sürüm 26 ve 27'yi sağlaması gerekir.

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

Örnek A bir eşleşmedir.

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

Örnek B bir eşleşmedir.

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

Örnek C bir eşleşme değil çünkü Sistem SDK'sı sürüm 27 sağlanmadı.