Arayüz karma oluşturma

Bu dokümanda, yanlışlıkla arayüz değişikliklerini önlemek ve arayüz değişikliklerinin ayrıntılı bir şekilde incelenmesini sağlamak için kullanılan bir mekanizma olan HIDL arayüz karma oluşturma işlemi açıklanmaktadır. HIDL arayüzleri sürümlere sahip olduğundan bu mekanizma gereklidir. Yani bir arayüz yayınlandıktan sonra, uygulama ikili arayüzü (ABI) korunacak şekilde (ör. yorum düzeltmesi) değiştirilmemelidir.

Düzen

Her paket kök dizini (ör. android.hardware ile hardware/interfaces eşleme veya vendor.foo ile vendor/foo/hardware/interfaces eşleme), yayınlanan tüm HIDL arayüz dosyalarını listeleyen bir current.txt dosyası içermelidir.

# current.txt files support comments starting with a '#' character
# this file, for instance, would be vendor/foo/hardware/interfaces/current.txt

# Each line has a SHA-256 hash followed by the name of an interface.
# They have been shortened in this doc for brevity but they are
# 64 characters in length in an actual current.txt file.
d4ed2f0e...995f9ec4 vendor.awesome.foo@1.0::IFoo # comments can also go here

# types.hal files are also noted in current.txt files
c84da9f5...f8ea2648 vendor.awesome.foo@1.0::types

# Multiple hashes can be in the file for the same interface. This can be used
# to note how ABI sustaining changes were made to the interface.
# For instance, here is another hash for IFoo:

# Fixes type where "FooCallback" was misspelled in comment on "FooStruct"
822998d7...74d63b8c vendor.awesome.foo@1.0::IFoo

Not: Google, hangi karma oluşturma işlemlerinin nereden geldiğini takip etmenize yardımcı olmak için HIDL current.txt dosyalarını farklı bölümlere ayırır: İlk bölüm Android 8'de yayınlandı; sonraki bölüm Android 8 MR1'de yayınlandı olacaktır. current.txt dosyanızda benzer bir düzen kullanmanızı önemle tavsiye ederiz.

hidl-gen ile karma oluşturma

current.txt dosyasına manuel olarak veya hidl-gen'ü kullanarak karma oluşturma işlemi ekleyebilirsiniz. Aşağıdaki kod snippet'inde, current.txt dosyasını yönetmek için hidl-gen ile kullanabileceğiniz komutlara örnekler verilmiştir (karma oluşturma işlemleri kısaltılmıştır):

hidl-gen -L hash -r vendor.awesome:vendor/awesome/hardware/interfaces -r android.hardware:hardware/interfaces -r android.hidl:system/libhidl/transport vendor.awesome.nfc@1.0::types
9626fd18...f9d298a6 vendor.awesome.nfc@1.0::types
hidl-gen -L hash -r vendor.awesome:vendor/awesome/hardware/interfaces -r android.hardware:hardware/interfaces -r android.hidl:system/libhidl/transport vendor.awesome.nfc@1.0::INfc
07ac2dc9...11e3cf57 vendor.awesome.nfc@1.0::INfc
hidl-gen -L hash -r vendor.awesome:vendor/awesome/hardware/interfaces -r android.hardware:hardware/interfaces -r android.hidl:system/libhidl/transport vendor.awesome.nfc@1.0
9626fd18...f9d298a6 vendor.awesome.nfc@1.0::types
07ac2dc9...11e3cf57 vendor.awesome.nfc@1.0::INfc
f2fe5442...72655de6 vendor.awesome.nfc@1.0::INfcClientCallback
hidl-gen -L hash -r vendor.awesome:vendor/awesome/hardware/interfaces -r android.hardware:hardware/interfaces -r android.hidl:system/libhidl/transport vendor.awesome.nfc@1.0 >> vendor/awesome/hardware/interfaces/current.txt

Uyarı: Daha önce yayınlanmış bir arayüzün karmasını değiştirmeyin. Bu tür bir arayüzü değiştirirken current.txt dosyasının sonuna yeni bir karma oluşturma kodu ekleyin. Ayrıntılar için ABI kararlılığı başlıklı makaleyi inceleyin.

hidl-gen tarafından oluşturulan her arayüz tanımı kitaplığı, IBase::getHashChain çağrılarak alınabilen karma oluşturma işlemleri içerir. hidl-gen bir arayüz derlediğinde, HAL'ın değiştirilip değiştirilmediğini görmek için HAL paketinin kök dizininde bulunan current.txt dosyasını kontrol eder:

  • HAL için karma oluşturma bulunamazsa arayüz yayınlanmamış (geliştirme aşamasında) olarak kabul edilir ve derleme işlemi devam eder.
  • Bulunan karma oluşturma işlemleri mevcut arayüzle karşılaştırılır:
    • Arayüz karmasıyla eşleşirse derleme devam eder.
    • Arayüz bir karma oluşturma ile eşleşmezse daha önce yayınlanmış bir arayüzün değiştirildiği anlamına geldiği için derleme durdurulur.
      • ABI'yi koruyan bir değişiklik için (ABI kararlılığı bölümüne bakın) derlemenin devam edebilmesi için current.txt dosyasının değiştirilmesi gerekir.
      • Diğer tüm değişiklikler, arayüzün küçük veya büyük bir sürüm yükseltmesinde yapılmalıdır.

ABI kararlılığı

ABI, ikili bağlantıları/çağrı kuralları vb. içerir. ABI veya API değişirse arayüz artık resmi arayüzlerle derlenmiş genel bir system.img ile çalışmaz.

Arayüzlerin sürümlendirildiğinden ve ABI'nin kararlı olduğundan emin olmak birkaç nedenden dolayı çok önemlidir:

  • Uygulamanızın Tedarikçi Testi Paketi'ni (VTS) geçebilmesini sağlar. Bu sayede yalnızca çerçeveyle OTA yapabilme yolunda ilerleyebilirsiniz.
  • OEM olarak, kullanımı kolay ve uyumlu bir Kart Destek Paketi (BSP) sunmanıza olanak tanır.
  • Hangi arayüzlerin yayınlanabileceğini takip etmenize yardımcı olur. current.txt, bir paket kökünde sağlanan tüm arayüzlerin geçmişini ve durumunu görmenizi sağlayan bir arayüz dizininin haritası olarak düşünülebilir.

current.txt'te zaten girişi olan bir arayüz için yeni bir karma eklerken yalnızca ABI kararlılığını koruyan arayüzleri temsil eden karmaları eklediğinizden emin olun. Aşağıdaki türde değişiklikleri inceleyin:

Değişikliklere izin verilir
  • Yorumları değiştirme (bir yöntemin anlamını değiştirmediği sürece)
  • Parametrenin adını değiştirme.
  • Döndürülen parametrenin adını değiştirme.
  • Ek açıklamaları değiştirme
Değişikliklere izin verilmiyor
  • Bağımsız değişkenleri, yöntemleri vb. yeniden sıralama
  • Bir arayüzü yeniden adlandırma veya yeni bir pakete taşıma.
  • Paketi yeniden adlandırma.
  • Arayüzün herhangi bir yerine yöntem/yapı alanı/vb. ekleme.
  • C++ vtable'ını bozacak her şey.
  • vb.