Tedarikçi firma APEX

Alt düzey Android OS modüllerini paketlemek ve yüklemek için APEX dosya biçimini kullanabilirsiniz. Yerel hizmetler ve kitaplıklar, HAL uygulamaları, donanım yazılımı, yapılandırma dosyaları gibi bileşenlerin bağımsız olarak derlenmesine ve yüklenmesine olanak tanır.

Tedarikçi APEX'leri, derleme sistemi tarafından /vendor bölümüne otomatik olarak yüklenir ve diğer bölümlerdeki APEX'ler gibi apexd tarafından çalışma zamanında etkinleştirilir.

Kullanım örnekleri

Tedarikçi firma görüntülerinin modülerleştirilmesi

APEX'ler, tedarikçi firma resimlerinde özellik uygulamalarının doğal bir şekilde gruplandırılmasını ve modülerleştirilmesini sağlar.

Tedarikçi firma görüntüleri, bağımsız olarak oluşturulmuş tedarikçi firma görüntülerinin bir birleşimi olarak oluşturulduğunda cihaz üreticileri, APEX'leri kullanarak belirli uygulamaları kolayca ilgili tedarikçi tarafından yürütülmesini sağlamaktır. Üreticiler, sağlanan APEX'lerden hiçbiri ihtiyaçlarına uymuyorsa veya yepyeni özel donanımlara sahiplerse yeni bir tedarikçi APEX'i bile oluşturabilirler.

Örneğin, bir OEM cihazını AOSP kablosuz bağlantı ile oluşturmayı tercih edebilir uygulama APEX, SoC Bluetooth uygulaması APEX ve özel bir OEM telefon uygulaması APEX'i temel alır.

Tedarikçi APEX'leri olmadan, tedarikçi bileşenleri arasında çok fazla bağımlılık içeren bir uygulamanın dikkatli bir şekilde koordine edilmesi ve izlenmesi gerekir. Tüm bileşenler (yapılandırma dosyaları ve ek kitaplıklar dahil), özellik içi iletişimin herhangi bir noktasında net bir şekilde tanımlanmış arayüzlere sahip APEX'lere sarmalanarak farklı bileşenler birbirinin yerine kullanılabilir hale gelir.

Geliştirici iterasyonu

Tedarikçi APEX'ler, geliştiricilerin daha hızlı iterasyonlar yapmasına yardımcı olur. Bunu yaparken de Kablosuz HAL gibi bir özellik uygulamasının tamamını bir tedarikçinin içinde AAPEX (APEX) Geliştiriciler daha sonra test etmek için tedarikçi APEX'i oluşturup yeniden oluşturmayı tercih edebilirsiniz.

Bu sayede, programı kullanan geliştiriciler için geliştirici yineleme döngüsü basitleşip Çoğunlukla tek bir özellik alanında çalışıyor ve sadece bu özelliği ilerletmek istiyor. alanı.

Bir özellik alanının APEX'te doğal bir şekilde gruplanması da süreci basitleştirir test etmek için kullanabileceğiniz bir yöntemdir. Örneğin, bir APEX'i yeniden yüklediğinizde APEX'in içerdiği tüm paketlenmiş kitaplıklar veya yapılandırma dosyaları otomatik olarak güncellenir.

Bir özellik alanını APEX olarak birleştirmek, aşağıdaki durumlarda hata ayıklama veya geri alma işlemini de kötü cihaz davranışı gözlemlenir. Örneğin, yeni bir derlemede telefon işlevi düzgün çalışmıyorsa geliştiriciler, cihaza eski bir telefon işlevi APEX'i yüklemeyi (tam derlemeyi yüklemeye gerek kalmadan) deneyip düzgün çalışma durumunun geri dönüp dönmediğini görebilir.

Örnek iş akışı:

# Build the entire device and flash. OR, obtain an already-flashed device.
source build/envsetup.sh && lunch oem_device-userdebug
m
fastboot flashall -w

# Test the device.
... testing ...

# Check previous behavior using a vendor APEX from one week ago, downloaded from
# your continuous integration build.
... download command ...
adb install <path to downloaded APEX>
adb reboot
... testing ...

# Edit and rebuild just the APEX to change and test behavior.
... edit APEX source contents ...
m <apex module name>
adb install out/<path to built APEX>
adb reboot
... testing ...

Örnekler

Temel Bilgiler

Cihaz gereksinimleri, dosya biçimi ayrıntıları ve yükleme adımları dahil olmak üzere genel APEX bilgileri için ana APEX Dosya Biçimi sayfasına bakın.

Android.bp ürününde vendor: true özelliğinin ayarlanması, APEX modülünün gerekir.

apex {
  ..
  vendor: true,
  ..
}

İkili dosyalar ve paylaşılan kitaplıklar

APEX, APEX yüküne dahil olmayan geçişli bağımlılıkları kararlı arayüzlere sahip.

Tedarikçi firma APEX bağımlılıkları için kararlı yerel arayüzler arasında cc_library ve stubs ve LLNDK kitaplıkları. Bu bağımlılıklar ve bağımlılıklar APEX manifest dosyasına kaydedilir. Manifest, linkerconfig tarafından işlenir. Böylece, harici yerel bağımlılıklar çalışma zamanında kullanılabilir.

Aşağıdaki snippet'te APEX, hem ikili programı (my_service) hem de kararlı olmayan bağımlılıklar (*.so dosya).

apex {
  ..
  vendor: true,
  binaries: ["my_service"],
  ..
}

Aşağıdaki snippet'te APEX, paylaşılan kitaplığı my_standalone_libve yukarıda açıklandığı gibi kararlı olmayan tüm bağımlılıklarını içerir.

apex {
  ..
  vendor: true,
  native_shared_libs: ["my_standalone_lib"],
  ..
}

APEX'i küçültme

APEX, kararlı olmayan bağımlılıkları paketlediği için daha büyük olabilir. Önerilerimiz: bunu yapabilirsiniz. libc++.so ve libbase.so gibi yaygın kitaplıklar, HAL ikili dosyalarına statik olarak bağlanabilir. İstikrarlı bir sonuç sağlamak için bağımlılık yapma arayüzü de başka bir seçenek olabilir. Bağımlılık APEX'te paketlenmez.

HAL uygulamaları

HAL uygulamasını tanımlamak için ilgili ikili programları ve kitaplıkları sağlayın aşağıdaki örneklere benzer şekilde tedarikçi firma APEX'inde mevcuttur:

HAL uygulamasını tam olarak kapsamak için APEX, ilgili VINTF parçaları ve başlatma komut dosyaları.

VINTF parçaları

VINTF parçaları, APEX'in etc/vintf kadarı.

VINTF parçalarını APEX'e yerleştirmek için prebuilts özelliğini kullanın.

apex {
  ..
  vendor: true,
  prebuilts: ["fragment.xml"],
  ..
}

prebuilt_etc {
  name: "fragment.xml",
  src: "fragment.xml",
  sub_dir: "vintf",
}

Sorgu API'leri

VINTF parçaları APEX'e eklendiğinde HAL arayüzlerinin ve APEX adlarının eşlemelerini almak için libbinder_ndk API'lerini kullanın.

  • AServiceManager_isUpdatableViaApex("com.android.foo.IFoo/default") : true HAL örneği APEX'te tanımlanmışsa
  • AServiceManager_getUpdatableApexName("com.android.foo.IFoo/default", ...) : HAL örneğini tanımlayan APEX adını alır.
  • AServiceManager_openDeclaredPassthroughHal("mapper", "instance", ...) : bunu, bir geçiş HAL'si açmak için kullanın.

Başlatma komut dosyaları

APEX'ler başlangıç komut dosyalarını iki şekilde içerebilir: (A) APEX'ler APEX yükü veya (B) /vendor/etc içindeki normal bir başlatma komut dosyası. Her ikisini de aynı APEX için ayarlayabilirsiniz.

APEX'te ilklendirme komut dosyası:

prebuilt_etc {
  name: "myinit.rc",
  src: "myinit.rc"
}

apex {
  ..
  vendor: true,
  prebuilts: ["myinit.rc"],
  ..
}

Tedarikçi firma APEX'lerindeki başlangıç komut dosyaları service tanım içerebilir ve on <property or event> yönergeleri.

service tanımının aynı APEX'teki bir ikili dosyaya işaret ettiğinden emin olun. Örneğin, com.android.foo APEX, foo-service adlı bir hizmet tanımlayabilir.

on foo-service /apex/com.android.foo/bin/foo
  ...

on yönergelerini kullanırken dikkatli olun. APEX'lerdeki başlangıç komut dosyaları APEX'ler etkinleştirildikten sonra ayrıştırılır ve çalıştırılır. kullanılamaz. İşlemleri mümkün olduğunca erken tetiklemek için apex.all.ready=true kullanın. Bootstrap APEX'leri on init kullanabilir ancak on early-init kullanamaz.

Donanım Yazılımı

Örnek:

prebuilt_firmware modül türünü kullanarak tedarikçi firma APEX'e donanım yazılımını aşağıdaki gibi yerleştirin: anlatacağım.

prebuilt_firmware {
  name: "my.bin",
  src: "path_to_prebuilt_firmware",
  vendor: true,
}

apex {
  ..
  vendor: true,
  prebuilts: ["my.bin"],  // installed inside APEX as /etc/firmware/my.bin
  ..
}

prebuilt_firmware modülü, APEX'in <apex name>/etc/firmware dizinine yüklenir. ueventd, donanım yazılımı modüllerini bulmak için /apex/*/etc/firmware dizinlerini tarar.

APEX'in file_contexts, bu dosyaların çalışma zamanında ueventd tarafından erişilebilmesini sağlamak için tüm donanım yazılımı yükü girişlerini uygun şekilde etiketlemelidir. Genellikle vendor_file etiketi yeterlidir. Örnek:

(/.*)? u:object_r:vendor_file:s0

Çekirdek modülleri

Çekirdek modüllerini bir tedarikçi APEX'e aşağıdaki gibi önceden oluşturulmuş modüller olarak yerleştirin.

prebuilt_etc {
  name: "my.ko",
  src: "my.ko",
  vendor: true,
  sub_dir: "modules"
}

apex {
  ..
  vendor: true,
  prebuilts: ["my.ko"],  // installed inside APEX as /etc/modules/my.ko
  ..
}

APEX'in file_contexts, tüm çekirdek modülü yükü girişlerini doğru şekilde etiketlemelidir. Örnek:

/etc/modules(/.*)? u:object_r:vendor_kernel_modules:s0

Çekirdek modülleri açıkça yüklenmelidir. Tedarikçi firma bölümündeki aşağıdaki örnek ilk ayarlama komut dosyası, insmod üzerinden yüklemeyi gösterir:

my_init.rc:

on early-boot
  insmod /apex/myapex/etc/modules/my.ko
  ..

Çalışma zamanında kaynak yer paylaşımları

Örnek:

Tedarikçi firma APEX'e çalışma zamanı kaynak yer paylaşımları yerleştirme rros özelliğini kullanabilirsiniz.

runtime_resource_overlay {
    name: "my_rro",
    soc_specific: true,
}


apex {
  ..
  vendor: true,
  rros: ["my_rro"],  // installed inside APEX as /overlay/my_rro.apk
  ..
}

Diğer yapılandırma dosyaları

Tedarikçi firma APEX'leri genellikle satıcıda bulunan diğer yapılandırma dosyalarını destekler bölümü de dahil edilir ve daha fazlası eklenmektedir.

Örnekler:

Tedarikçi APEX'lerini önyükleme

keymint gibi bazı HAL hizmetleri, APEX'ler kullanıma sunulmadan önce kullanılabilir etkinleştirildi. Bu HAL'ler genellikle init komut dosyasında hizmet tanımlarında early_hal değerini ayarlar. Diğer bir örnek ise genellikle başlatılan animation sınıfıdır. post-fs-data etkinliğinden önce. Bu tür erken bir HAL hizmeti tedarikçi APEX'te paketlendiğinde, daha erken etkinleştirilebilmesi için APEX manifest dosyasında apex'i "vendorBootstrap": true yapın. APEX önyüklemelerinin yalnızca /data/apex yerine /vendor/apex gibi önceden oluşturulmuş konumlardan etkinleştirilebileceğini unutmayın.

Sistem özellikleri

Çerçeve, tedarikçi APEX'lerini desteklemek için okuduğu sistem özellikleri şunlardır:

  • input_device.config_file.apex=<apex name>: Ayarlandığında, giriş yapılandırma dosyaları (*.idc, *.kl ve *.kcm) APEX'in /etc/usr dizininde aranır.
  • ro.vulkan.apex=<apex name> - ayarlandığında Vulkan sürücüsü şuradan yüklenir: bulunacaktır. Vulkan sürücüsü eski HAL'ler tarafından kullanıldığı için APEX'i Bootstrap APEX yapın ve bu bağlayıcı ad alanını görünür olarak yapılandırın.

setprop komutunu kullanarak init komut dosyalarındaki sistem özelliklerini ayarlayın.

Ekstra geliştirme özellikleri

Açılışta APEX seçimi

Örnek:

Geliştiriciler aynı zamanda APEX adını ve anahtarını bulun, ardından her başlatma işlemini tekrarlamanız gerekir. Bu, belirli geliştirici kullanım alanları için adb install kullanarak APEX'in yeni bir kopyasını yüklemekten daha basit olabilir.

Kullanım alanı örnekleri:

  • Kablosuz HAL tedarikçi APEX'in 3 sürümünü yükleyin: KG ekipleri, bir sürümü kullanarak manuel veya otomatik test çalıştırabilir, ardından başka bir sürüme yeniden başlayıp testleri yeniden çalıştırabilir ve nihai sonuçları karşılaştırabilir.
  • Kamera HAL tedarikçi APEX'in 2 sürümünü yükleyin: Mevcut ve deneysel: Dogfooders, ek bir dosya indirip yüklemeden deneysel sürümü kullanabilir. Böylece kolayca geri dönebilirler.

apexd, doğru APEX sürümünü etkinleştirmek için önyükleme sırasında belirli bir biçimi izleyen sysprops'leri arar.

Mülk anahtarı için beklenen biçimler:

  • Bootconfig
    • BoardConfig.mk içindeki varsayılan değeri ayarlamak için kullanılır.
    • androidboot.vendor.apex.<apex name>
  • Kalıcı sysprop
    • Zaten başlatılmış bir cihazda ayarlanan varsayılan değeri değiştirmek için kullanılır.
    • Varsa bootconfig değerini geçersiz kılar.
    • persist.vendor.apex.<apex name>

Özelliğin değeri, etkinleştirilmesi gereken APEX dosyasının adıdır.

// Default version.
apex {
  name: "com.oem.camera.hal.my_apex_default",
  vendor: true,
  ..
}

// Non-default version.
apex {
  name: "com.oem.camera.hal.my_apex_experimental",
  vendor: true,
  ..
}

Varsayılan sürüm, BoardConfig.mk'te bootconfig kullanılarak da yapılandırılmalıdır:

# Example for APEX "com.oem.camera.hal" with the default above:
BOARD_BOOTCONFIG += \
    androidboot.vendor.apex.com.oem.camera.hal=com.oem.camera.hal.my_apex_default

Cihaz başlatıldıktan sonra kalıcı sysprop:

$ adb root;
$ adb shell setprop \
    persist.vendor.apex.com.oem.camera.hal \
    com.oem.camera.hal.my_apex_experimental;
$ adb reboot;

Cihaz, önyükleme işleminin ardından bootconfig'in güncellenmesini destekliyorsa (fastboot oem komutları aracılığıyla gibi) çoklu yüklenen APEX için bootconfig özelliği değiştirildiğinde, önyüklemede etkinleştirilen sürüm de değişir.

Mürekkepbalığı tabanlı sanal referans cihazlarda, bootconfig mülkünü doğrudan başlatma sırasında ayarlamak için --extra_bootconfig_args komutunu kullanabilirsiniz. Örnek:

launch_cvd --noresume \
  --extra_bootconfig_args "androidboot.vendor.apex.com.oem.camera.hal:=com.oem.camera.hal.my_apex_experimental";