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_lib
ve 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ışsaAServiceManager_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:
- Özellik beyanı XML'leri
- Sensörler, sensör HAL tedarikçisi APEX'te önceden oluşturulmuş XML'ler olarak özellik gösterir.
- Giriş yapılandırma dosyaları
- Yalnızca yapılandırma olan bir tedarikçi APEX'inde önceden oluşturulmuş dokunmatik ekran yapılandırmaları
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";