Tedarikçi firma APEX

APEX dosya biçimini kullanarak alt düzey Android OS modülleri yüklemek. Bağımsız yapılar oluşturmaya ve yerel hizmetler ve kitaplıklar, HAL gibi bileşenlerin kurulumu uygulamalar, donanım yazılımı, yapılandırma dosyaları vs.

Tedarikçi firma APEX'leri derleme sistemi tarafından /vendor içinde otomatik olarak yüklenir diğer APEX'lerde olduğu gibi, bu bölümlendirme ve çalışma zamanında apexd tarafından etkinleştirilir her bölüm için geçerlidir.

Kullanım örnekleri

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

APEX'ler, özelliklerin doğal bir şekilde gruplandırılmasını ve modüler hâle getirilmesini kolaylaştırır uygulamaları hakkında bilgi edindiniz.

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, mobil uygulamanın sağlanan APEX’lerden hiçbiri ihtiyaçlarını karşılamıyorsa veya yepyeni özel donanımlar.

Ö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'ler olmadığında, tedarikçiler arasında çok sayıda bağımlılığın olduğu Tedarikçi firma bileşenleri dikkatli bir koordinasyon ve takip gerektirir. Tümünü sarmalayarak bileşenleri (yapılandırma dosyaları ve ek kitaplıklar dahil) herhangi bir noktada açıkça tanımlanmış arayüzler olan, farklı bileşenler birbirinin yerine kullanılabilir hale gelir.

Geliştirici yinelemesi

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 bir özellik alanında çalışıyor ve sadece bu özellik üzerinde iterasyon yapmak 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 paketlenmiş tüm kitaplık veya yapılandırma dosyaları otomatik olarak güncellenir dahil olacak.

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, telefon işlevleri kötü çalışıyorsa isterse geliştiriciler eski bir telefon kullanmayı deneyebilir APEX'in bir cihaza uygulanması (tam derleme yüklemek zorunda kalmadan) ve geri dönüp dönmediğini kontrol eder.

Ö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

Genel APEX için ana APEX Dosya Biçimi sayfasına bakın bilgileri de (cihaz gereksinimleri, dosya biçimi ayrıntıları ve adımlarına göz atın.

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

apex {
  ..
  vendor: true,
  ..
}

İkili programlar 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, ndk_library veya llndk_library. Bu bağımlılıklar ve bağımlılıklar APEX manifest dosyasına kaydedilir. Manifest dosyası: linkerconfig tarafından işlenir ve harici yerel bağımlılıklar kullanılabilir.

/system bölümündeki APEX'lerden farklı olarak, tedarikçi APEX'leri genellikle belirli VNDK sürümü. VNDK kitaplıkları, Böylece VNDK kitaplıklarını kararlı olarak işleyip tedarikçinin boyutunu küçültebiliriz. APEX'leri, use_vndk_as_stable kullanarak APEX'lerden hariç tutarak

Aşağıdaki snippet'te APEX, hem ikili programı (my_service) hem de kararlı olmayan bağımlılıklarını (*.so dosya) içerir. VNDK kitaplıklarını içermez, my_service, libbase gibi VNDK kitaplıklarıyla geliştirildiğinde bile gerçekleşebilir. Bunun yerine my_service çalışma zamanı,libbase bahsedeceğim.

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

Aşağıdaki snippet'te APEX, paylaşılan kitaplığı içerir my_standalone_libve istikrarsız bağımlılıkları (yukarıda açıklandığı gibi)

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

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",
}

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 iki aynı APEX için geçerlidir.

APEX'te başlat komut dosyası:

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

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

APEX'lerdeki başlangıç komut dosyalarının yalnızca service tanımı olabilir. Başlatma komut dosyaları Tedarikçi APEX'lerinde on <property> yönergesi de olabilir.

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.

Donanım Yazılımı

Örnek:

Donanım yazılımını prebuilt_firmware modül türüyle tedarikçi firma APEX'e 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
  ..
}

<apex name>/etc/firmware içinde prebuilt_firmware modül yüklü APEX dizininden çıkarabilirsiniz. ueventd, /apex/*/etc/firmware dizini tarar. bulun.

APEX'in file_contexts özelliği, tüm donanım yazılımı yük girişlerini etiketlemelidir. bu dosyalara çalışma zamanında ueventd tarafından erişilebilmesini sağlamak üzere doğru bir şekilde; 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 öğesi, çekirdek modülü yük girişlerini etiketlemelidir. gerekir. Örnek:

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

Çekirdek modülleri açık şekilde yüklenmelidir. Aşağıdaki örnek başlangıç komut dosyası "insmod" aracılığıyla yükleme, satıcı bölümünde gösterilir:

my_init.rc:

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

Çalışma zamanı 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:

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 işlem sırasında hangi sürümün etkinleştirileceğini başlatma işlemini tekrarlamanız gerekir. Geliştiricilere yönelik belirli kullanım alanlarında adb install kullanarak APEX'in yeni bir kopyasını yüklemekten daha kolaydır.

Kullanım alanı örnekleri:

  • Kablosuz HAL tedarikçi firması APEX'in 3 sürümünü yükleme: QA ekipleri manuel olarak veya otomatik test yapılmasını, ardından başka bir sürümde yeniden başlatmayı ve Testleri yeniden çalıştırıp nihai sonuçları karşılaştırın.
  • Kamera HAL tedarikçi firması APEX'in mevcut ve deneysel: Test kullanıcıları deneme sürümünü kolayca değiştirebilmeleri için ek bir dosya indirip yükleyerek.

apexd, başlatma sırasında belirli bir biçimi kullanarak sysprops'u arar. doğru APEX sürümünü etkinleştirin.

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

  • Önyükleme yapılandırması
    • BoardConfig.mk içindeki varsayılan değeri ayarlamak için kullanılır.
    • androidboot.vendor.apex.<apex name>
  • Kalıcı sysprop
    • Önceden 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, APEX'in dosya adı olmalıdır. etkinleştirildi.

// 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, aynı zamanda BoardConfig.mk:

# 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, yanıp söndükten sonra bootconfig'in güncellenmesini destekliyorsa (fastboot oem komutları aracılığıyla gibi) çoklu yüklü uygulamanın bootconfig özelliğini değiştirin APEX, başlatma sırasında etkinleştirilen sürümü de değiştirir.

Cuttlefish'e dayalı sanal referans cihazlar için bootconfig özelliğini ayarlamak için --extra_bootconfig_args komutunu kullanabilirsiniz doğrudan başlatılabilir. Örnek:

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