Android Pony EXpress (APEX) container biçimi, Android'de kullanıma sunulmuştur. 10 Alt düzey sistemin yükleme akışında kullanılır. modüllerinde yer alır. Bu biçim, uyumlu olmayan sistem bileşenlerinin güncellenmesini kolaylaştırır modeline geçelim. Bazı örnek bileşenler yereldir hizmetler ve kitaplıklar, donanım soyutlama katmanları (HALs), çalışma zamanı (ART) ve sınıf kitaplıkları.
"APEX" terimi aynı zamanda bir APEX dosyasına da işaret edebilir.
Arka plan
Android, standart uygulamaya uyan modüllerin güncellemelerini desteklese de model (örneğin, hizmetler, etkinlikler) aracılığıyla Google Play Store uygulaması), alt düzey işletim sistemi bileşenleri için benzer bir model kullanarak aşağıdaki dezavantajlara sahiptir:
- APK tabanlı modüller, başlatma sırasının başlarında kullanılamaz. Paket uygulamalarla ilgili bilgilerin toplandığı merkezdir ve yalnızca sonraki aşamalarda hazır hale gelir ve Sauce & Spoon tablete geçiş projesinin çok kolaylaşır.
- APK biçimi (özellikle manifest), Android uygulamaları ve sistem modüllerin her zaman uygun olmayabilir.
Tasarım
Bu bölümde, APEX dosya biçiminin üst düzey tasarımı ve APEX dosyalarını yöneten bir hizmet olan APEX yöneticisidir.
APEX için bu tasarımın neden seçildiğiyle ilgili daha fazla bilgi için APEX geliştirilirken dikkate alınan alternatifler.
APEX biçimi
Bu, APEX dosyasının biçimidir.
Şekil 1. APEX dosyası biçimi
En üst düzeyde, APEX dosyası, dosyaların içinde depolandığı ve Sıkıştırılmamış ve 4 KB'lık sınırlarda yer alır.
Bir APEX dosyasındaki dört dosya şunlardır:
apex_manifest.json
AndroidManifest.xml
apex_payload.img
apex_pubkey
apex_manifest.json
dosyası, paketin adını ve sürümünü içerir. Bu sürüm
APEX dosyası tanımlamanız gerekir. Bu bir
ApexManifest
JSON biçiminde protokol arabelleği.
AndroidManifest.xml
dosyası, APEX dosyasının APK ile alakalı araçları kullanmasını sağlar ve
ve paket yükleyici uygulamaları (ör. ADB, PackageManager) ve paket yükleyici uygulamaları
Play Store) ekleyebilirsiniz. Örneğin, APEX dosyası aapt
gibi mevcut bir aracı kullanabilir
dosyadaki temel meta verileri inceleyin. Dosya, paket adını ve
sürüm bilgileri. Bu bilgiler ayrıca,
apex_manifest.json
apex_manifest.json
, AndroidManifest.xml
yerine yeni kod ve
farklı veri yönetimi sistemleri mevcuttur. AndroidManifest.xml
, ek bilgiler içerebilir
mevcut uygulama yayınlama araçları tarafından kullanılabilecek hedefleme bilgileri.
apex_payload.img
, dm-verity destekli bir ext4 dosya sistemi görüntüsüdür. Resim
bir geri döngü cihazı aracılığıyla çalışma zamanında eklenir. Daha ayrıntılı belirtmek gerekirse,
meta veri bloku, libavb
kitaplığı kullanılarak oluşturulur. Dosya sistemi yükü
ayrıştırılmaz (çünkü resmin yerine eklenebilmesi gerekir). Normal dosyalar
apex_payload.img
dosyasının içinde yer alır.
apex_pubkey
, dosya sistemi görüntüsünü imzalamak için kullanılan ortak anahtardır. Çalışma zamanında,
Bu anahtar, indirilen APEX'in aynı varlıkla imzalanmasını sağlar.
dahili bölümlendirmelerde aynı APEX'i imzalar.
APEX adlandırma kuralları
Platform geliştikçe yeni APEX'ler arasındaki adlandırma çakışmalarını önlemek için lütfen şu adlandırma kurallarını kullanın:
com.android.*
- AOSP APEX'ler için ayrılmıştır. Herhangi bir şirkete veya cihaza özgü değildir.
com.<companyname>.*
- Bir şirket için ayrılmış. Bundan birden fazla cihaz tarafından kullanılıyor olabilir şirketidir.
com.<companyname>.<devicename>.*
- Belirli bir cihaza (veya cihaz alt kümesine) özel APEX'ler için ayrılır.
APEX yöneticisi
APEX yöneticisi (veya apexd
) aşağıdakilerden sorumlu bağımsız bir yerel süreçtir:
doğrulama, yükleme ve kaldırma işlemlerini içerir. Bu süreç başlatılır ve
başlatma işleminin başlarında hazır olur. APEX dosyaları normalde Google’da
/system/apex
altındaki cihaz. APEX yöneticisi varsayılan olarak bu
paketlerini kullanabilirsiniz.
Bir APEX'in güncelleme sırasında PackageManager sınıfı ve aşağıdaki gibidir.
- APEX dosyası bir paket yükleyici uygulaması, ADB veya başka bir program aracılığıyla indirilir. kaynak.
- Paket yöneticisi yükleme işlemini başlatır. farklı olduğunu fark edince dosya bir APEX ise paket yöneticisi kontrolü APEX'e aktarırsa üstlenirsiniz.
- APEX yöneticisi APEX dosyasını doğrular.
- APEX dosyası doğrulanırsa APEX yöneticisinin dahili veritabanının APEX dosyasının bir sonraki başlatmada etkinleştirileceğini yansıtacak şekilde güncellenir.
- Yükleme isteğinde bulunan kullanıcı, başarılı paketin ardından bir yayın alır doğrulama.
- Yüklemeye devam etmek için sistemin yeniden başlatılması gerekir.
Bir sonraki başlatmada APEX yöneticisi başlar, dahili veritabanını okur ve listelenen her APEX dosyası için aşağıdakiler geçerlidir:
- APEX dosyasını doğrular.
- APEX dosyasından geri döngü cihazı oluşturur.
- Geri döngü cihazının üstünde bir cihaz eşleyici blok cihazı oluşturur.
- Cihaz eşleyici blok cihazını benzersiz bir yola (örneğin,
/apex/name@ver
) bilgileri gösterilir.
Dahili veritabanında listelenen tüm APEX dosyaları eklendiğinde, APEX yöneticisi, diğer sistem bileşenlerinin sorgulanması için bir bağlayıcı hizmeti sağlar yüklü APEX dosyalarıyla ilgili bilgileri içerir. Örneğin diğer sistem bileşenleri, cihazda yüklü APEX dosyalarının listesini veya belirli bir APEX'in eklendiği tam yol. Böylece, dosyalara erişebilirsiniz.
APEX dosyaları APK dosyalarıdır
APEX dosyaları, imzalanmış zip arşivleri oldukları için geçerli APK dosyalarıdır (
APK imza şeması) içeren bir AndroidManifest.xml
dosyası yükleyin. Bu, APEX'in
paket yükleyici uygulaması gibi APK dosyalarının altyapısını kullanmalarını sağlar,
imzalama yardımcı programını ve paket yöneticisini kullanır.
Bir APEX dosyasındaki AndroidManifest.xml
dosyası minimum düzeydedir ve şunlardan oluşur:
paket name
, versionCode
ve isteğe bağlı targetSdkVersion
, minSdkVersion
,
ve ayrıntılı hedefleme için maxSdkVersion
. Bu bilgiler sayesinde APEX,
paket yükleyici uygulamaları ve paket yükleyici uygulamaları gibi mevcut kanallar üzerinden sunulacak dosyalar
ADB'dir.
Desteklenen dosya türleri
APEX biçimi şu dosya türlerini destekler:
- Yerel paylaşılan kitaplıklar
- Yerel yürütülebilir dosyalar
- JAR dosyaları
- Veri dosyaları
- Yapılandırma dosyaları
Bu, APEX'in tüm bu dosya türlerini güncelleyebileceği anlamına gelmez. Dosya olup olmadığı türünün güncellenebileceği platforma ve platformun tanımlarının ne kadar istikrarlı olduğuna arayüzleri aynı olmalıdır.
İmzalama seçenekleri
APEX dosyaları iki şekilde imzalanır. Birincisi, apex_payload.img
(özellikle,
apex_payload.img
öğesine eklenen vbmeta tanımlayıcı) dosyasının bir anahtarla imzalanmış olması gerekir.
Ardından, APEX'in tamamı
APK imza şeması v3. İki farklı anahtar kullanılıyor
bahsedeceğiz.
Cihaz tarafında, oturum açma işlemi için kullanılan özel anahtara karşılık gelen bir ortak anahtar vbmeta açıklayıcının yüklü olması gerekir. APEX yöneticisi ortak anahtarı şu amaçlarla kullanır: Yüklenmesi istenen APEX'leri doğrulamalıdır. Her APEX hem derleme zamanında hem de çalışma zamanında zorunlu kılınır.
Yerleşik bölümlerde APEX
APEX dosyaları, /system
gibi yerleşik bölümlerde bulunabilir. İlgili içeriği oluşturmak için kullanılan
bölüm zaten dm-verity'nin üzerinde olduğundan APEX dosyaları doğrudan eklenir
devre dışı bırakılır.
Yerleşik bölümde bir APEX varsa APEX şu şekilde güncellenebilir:
aynı paket adına ve daha yüksek veya daha yüksek bir APEX paketi sağlama
. Yeni APEX, /data
içinde depolanır ve APK'lara benzer şekilde
yeni yüklenen sürüm, yerleşik sürümde zaten mevcut olan sürümü sınırlandırır
bölüm. Ancak APK'ların aksine, APEX'in yeni yüklenen sürümü yalnızca
yeniden başlatma işleminden sonra etkinleştirilir.
Çekirdek gereksinimleri
Bir Android cihazda APEX ana hat modüllerini desteklemek için aşağıdaki Linux işletim sistemi: çekirdek özellikleri gereklidir: geri döngü sürücüsü ve dm-verity. Geri dönüş sürücüsü, dosya sistemi görüntüsünü bir APEX modülüne ekler ve dm-verity, APEX modülünde çıkarmanız gerekir.
Geri döngü sürücüsünün ve dm-verity'nin performansı, kalite iyi sistem performansı elde etmek anlamına gelir.
Desteklenen çekirdek sürümleri
APEX ana hat modülleri, çekirdek sürümü 4.4 veya daha yüksek. Android 10 veya sonraki sürümlerin yüklü olduğu yeni cihazlar APEX modüllerini desteklemek için çekirdek sürümü 4.9 veya üzerini kullanmalıdır.
Zorunlu çekirdek yamaları
APEX modüllerini desteklemek için gerekli çekirdek yamaları, Android Ortak ağacı. Yamaların APEX'i desteklemesi için en son sürümü kullanın kullanıma sunuyoruz.
Kernel 4.4 sürümü
Bu sürüm yalnızca Android 9'dan
Android 10 yüklüyse ve APEX modüllerini desteklemek istiyorsanız. To almak için
gerekli yamalarda, android-4.4
dalından aşağı birleştirme
önerilir. Gerekli yamaların listesi aşağıda verilmiştir
4.4 çekirdek sürümü için kullanılır.
- UPSTREAM: döngü: Mantıksal blok boyutunu değiştirmek için ioctl ekleyin (4,4)
- GERİ BAĞLANTI: blok/döngü: hw_sectors değerini ayarlayın (4,4)
- UPSTREAM: döngü: Uyumlu ioctl'e LOOP_SET_BLOCK_SIZE ekleyin (4,4)
- ANDROID: mnt: Next_descendent'ı düzelt (4,4)
- ANDROID: mnt: remount, kölelerin kölelerine yayılmalıdır (4,4)
- ANDROID: mnt: Yeniden ekleme işlemini doğru şekilde yapın (4,4)
- "ANDROID: dm sürüm: Minimum önceden getirme boyutu ekle" işlemini geri döndürün (4,4)
- UPSTREAM: döngü: ofset veya block_size değiştirilirse önbellekleri bırakın (4,4)
Kernel sürümleri 4.9/4.14/4.19
4.9/4.14/4.19 çekirdek sürümleri için gerekli yamaları almak üzere
android-common
dalı.
Gerekli çekirdek yapılandırma seçenekleri
Aşağıdaki listede, Google Etiket Yöneticisi'ni kullanarak Android 10'da kullanıma sunulan APEX modülleri. Yıldız işaretli (*) öğeler Android 9 ve önceki sürümlerdeki mevcut gereksinimlerdir.
(*) CONFIG_AIO=Y # AIO support (for direct I/O on loop devices)
CONFIG_BLK_DEV_LOOP=Y # for loop device support
CONFIG_BLK_DEV_LOOP_MIN_COUNT=16 # pre-create 16 loop devices
(*) CONFIG_CRYPTO_SHA1=Y # SHA1 hash for DM-verity
(*) CONFIG_CRYPTO_SHA256=Y # SHA256 hash for DM-verity
CONFIG_DM_VERITY=Y # DM-verity support
Çekirdek komut satırı parametresi gereksinimleri
APEX'i desteklemek için çekirdek komut satırı parametrelerinin aşağıdaki koşulları karşıladığından emin olun koşullar:
loop.max_loop
AYARLANMAMALIDIRloop.max_part
, en fazla 8 olmalıdır
APEX oluşturma
Bu bölümde, Android derleme sistemi kullanılarak APEX'in nasıl oluşturulacağı açıklanmaktadır.
Aşağıda, apex.test
adlı bir APEX için Android.bp
örneği verilmiştir.
apex {
name: "apex.test",
manifest: "apex_manifest.json",
file_contexts: "file_contexts",
// libc.so and libcutils.so are included in the apex
native_shared_libs: ["libc", "libcutils"],
binaries: ["vold"],
java_libs: ["core-all"],
prebuilts: ["my_prebuilt"],
compile_multilib: "both",
key: "apex.test.key",
certificate: "platform",
}
apex_manifest.json
örneği:
{
"name": "com.android.example.apex",
"version": 1
}
file_contexts
örneği:
(/.*)? u:object_r:system_file:s0
/sub(/.*)? u:object_r:sub_file:s0
/sub/file3 u:object_r:file3_file:s0
APEX'teki dosya türleri ve konumları
Dosya türü | APEX'teki konum |
---|---|
Paylaşılan kitaplıklar | /lib ve /lib64 (/lib/arm
x86'da çevrilmiş kol) |
Yürütülebilir dosyalar | /bin |
Java kitaplıkları | /javalib |
Önceden oluşturulmuş | /etc |
Geçişli bağımlılıklar
APEX dosyaları, yerel paylaşılan kitaplıkların geçişli bağımlılıklarını otomatik olarak içerir
veya yürütülebilir dosyalar. Örneğin, libFoo
, libBar
öğesine bağlıysa iki kitaplık
native_shared_libs
özelliğinde yalnızca libFoo
listelendiğinde dahil edilir.
Birden fazla ABI'yi yönetme
Hem birincil hem de ikincil için native_shared_libs
özelliğini yükleyin
cihazın uygulama ikili arayüzleri (ABI'ler) APEX cihazları hedefliyorsa
(yalnızca 32 bit veya yalnızca 64 bit), yalnızca
yüklü olması gerekir.
binaries
özelliğini yalnızca cihazın birincil ABI'si için şu şekilde yükleyin:
aşağıda açıklanmıştır:
- Cihaz yalnızca 32 bitse ikili programın yalnızca 32 bit varyantı yüklendi.
- Cihaz yalnızca 64 bitse ikili programın yalnızca 64 bit varyantı yüklendi.
Yerel kitaplıkların ve ikili programların ABI'leri üzerinde daha ayrıntılı kontrol eklemek için
her bir
multilib.[first|lib32|lib64|prefer32|both].[native_shared_libs|binaries]
.
özellikler.
first
: Cihazın birincil ABI'si ile eşleşir. Bu, her zaman daha iyidir.lib32
: Destekleniyorsa cihazın 32 bit ABI'siyle eşleşir.lib64
: Cihazın 64 bit ABI'si ile eşleşir ve desteklenir.prefer32
: Destekleniyorsa cihazın 32 bit ABI'siyle eşleşir. Öğe 32 bit ABI desteklenmez; 64 bit ABI ile eşleşir.both
: Her iki ABI ile eşleşir. Bu,native_shared_libraries
java
, libraries
ve prebuilts
özellikleri ABI'den bağımsızdır.
Bu örnek, 32/64'ü destekleyen ve 32'yi tercih etmeyen bir cihaz içindir:
apex {
// other properties are omitted
native_shared_libs: ["libFoo"], // installed for 32 and 64
binaries: ["exec1"], // installed for 64, but not for 32
multilib: {
first: {
native_shared_libs: ["libBar"], // installed for 64, but not for 32
binaries: ["exec2"], // same as binaries without multilib.first
},
both: {
native_shared_libs: ["libBaz"], // same as native_shared_libs without multilib
binaries: ["exec3"], // installed for 32 and 64
},
prefer32: {
native_shared_libs: ["libX"], // installed for 32, but not for 64
},
lib64: {
native_shared_libs: ["libY"], // installed for 64, but not for 32
},
},
}
vbmeta imza
Her APEX'i farklı anahtarlarla imzalayın. Yeni bir anahtar gerektiğinde
özel-özel anahtar çifti arasında geçiş yapmak ve bir apex_key
modülü oluşturmak. key
özelliğini kullanarak
APEX'i imzalamanız gerekir. Ortak anahtar otomatik olarak
avb_pubkey
adlı APEX.
# create an rsa key pairopenssl genrsa -out foo.pem 4096
# extract the public key from the key pairavbtool extract_public_key --key foo.pem --output foo.avbpubkey
# in Android.bpapex_key { name: "apex.test.key", public_key: "foo.avbpubkey", private_key: "foo.pem", }
Yukarıdaki örnekte ortak anahtarın adı (foo
),
tuşuna basın. APEX'i imzalamak için kullanılan anahtarın kimliği APEX'te yazılır. Çalışma zamanında,
apexd
, cihazdaki aynı kimliğe sahip bir ortak anahtar kullanarak APEX'i doğrular.
APEX imzalama
APEX'leri, APK'ları imzaladığınız şekilde imzalayın. APEX'leri iki kez imzalayın; bir kez
mini dosya sistemini (apex_payload.img
dosya) ve tüm dosya için bir kez.
Bir APEX'i dosya düzeyinde imzalamak için, certificate
özelliğini
şu üç yöntemi kullanabilirsiniz:
- Ayarlanmadı: Herhangi bir değer ayarlanmazsa APEX,
Yer:
PRODUCT_DEFAULT_DEV_CERTIFICATE
. Herhangi bir işaret ayarlanmazsa yol varsayılan olarak ayarlanırbuild/target/product/security/testkey
numaralı telefona. <name>
: APEX, aynı addaki<name>
sertifikasıyla imzalanmıştır.PRODUCT_DEFAULT_DEV_CERTIFICATE
olarak dizin.:<name>
: APEX,<name>
adlı Shortg modülü. Sertifika modülü şu şekilde tanımlanabilir: anlatacağım.
android_app_certificate {
name: "my_key_name",
certificate: "dir/cert",
// this will use dir/cert.x509.pem (the cert) and dir/cert.pk8 (the private key)
}
APEX yükleme
APEX yüklemek için ADB kullanın.
adb install apex_file_name
adb reboot
supportsRebootlessUpdate
, apex_manifest.json
içinde true
olarak ayarlanırsa ve
şu anda yüklü olan APEX kullanılmıyor (örneğin, içerdiği tüm hizmetler
durdurulduysa),
--force-non-staged
işareti.
adb install --force-non-staged apex_file_name
APEX kullanma
Yeniden başlatma işleminden sonra APEX, /apex/<apex_name>@<version>
noktasına eklenir
dizin. Aynı APEX'in birden çok sürümü aynı anda eklenebilir.
Ekleme yolları arasında en son sürüme karşılık gelen
bağlamaya /apex/<apex_name>
noktasından monte edildi.
İstemciler, bağlama eklenen yolu APEX'ten dosya okumak veya yürütmek için kullanabilir.
APEX'ler genellikle aşağıdaki şekilde kullanılır:
- Cihaz şu anda
/system/apex
altında bir APEX'i (OEM veya ODM) önceden yükler gönderildi. - APEX'teki dosyalara
/apex/<apex_name>/
yolu üzerinden erişilebilir. /data/apex
hizmetine APEX'in güncellenmiş sürümü yüklendiğinde yol yeniden başlatma işleminden sonra yeni APEX'e işaret eder.
APEX ile hizmet güncelleme
APEX kullanarak bir hizmeti güncellemek için:
Sistem bölümünde hizmeti güncellenebilir olarak işaretleyin. Seçeneği ekleyin Hizmet tanımına
updatable
./system/etc/init/myservice.rc: service myservice /system/bin/myservice class core user system ... updatable
Güncellenen hizmet için yeni bir
.rc
dosyası oluşturun.override
seçeneğini kullanın mevcut hizmeti yeniden tanımlamak/apex/my.apex/etc/init.rc: service myservice /apex/my.apex/bin/myservice class core user system ... override
Hizmet tanımları yalnızca bir APEX'in .rc
dosyasında tanımlanabilir. Eylem
tetikleyiciler APEX'lerde desteklenmez.
Güncellenebilir olarak işaretlenmiş bir hizmet, APEX'ler etkinleştirilmeden önce başlarsa APEX'lerin etkinleştirilmesi tamamlanana kadar ertelenir.
Sistemi APEX güncellemelerini destekleyecek şekilde yapılandırma
APEX dosya güncellemelerini desteklemek için aşağıdaki sistem özelliğini true
olarak ayarlayın.
<device.mk>:
PRODUCT_PROPERTY_OVERRIDES += ro.apex.updatable=true
BoardConfig.mk:
TARGET_FLATTEN_APEX := false
veya sadece
<device.mk>:
$(call inherit-product, $(SRC_TARGET_DIR)/product/updatable_apex.mk)
Düzleştirilmiş APEX
Eski cihazlarda, bazen eski sürümdeki güncellemeleri almak mümkün olmayabilir veya
APEX'i tam olarak destekleyecek şekilde değiştirir. Örneğin, çekirdek
CONFIG_BLK_DEV_LOOP=Y
olmadan içe aktarın. Bu, dosya sistemini
bir APEX'in içindeki resim.
Birleştirilmiş APEX, aşağıdaki özelliklere sahip cihazlarda etkinleştirilebilen, özel olarak oluşturulmuş bir APEX'tir:
çekirdeği vardır. Birleştirilmiş APEX'teki dosyalar doğrudan bir dizine yüklenir
yerleşik bölümün altında bulabilirsiniz. Örneğin, birleştirilmiş APEX'te lib/libFoo.so
my.apex
, /system/apex/my.apex/lib/libFoo.so
hedefine yüklendi.
Düzleştirilmiş bir APEX etkinleştirildiğinde döngü cihazı dahil edilmez. Tüm
/system/apex/my.apex
dizini doğrudan /apex/name@ver
öğesine bağlı.
Birleştirilmiş APEX'ler, güncellenmiş sürümler indirilerek güncellenemez indirilen APEX'ler düzeltilemediği için ağdaki APEX'lerin sayısı. Birleştirilmiş APEX'ler yalnızca normal bir OTA ile güncellenebilir.
Düzleştirilmiş APEX varsayılan yapılandırmadır. Bu, ekibinizin APEX'ler, cihazınızı açıkça yapılandırmadığınız sürece varsayılan olarak birleştirilir (yukarıda açıklandığı gibi) APEX güncellemelerini desteklemek üzere birleştirilmemiş APEX'ler oluşturmak için.
Düzleştirilmiş ve birleştirilmemiş APEX'leri bir cihazda birlikte kullanmak DEĞİLDİR
desteklenir. Bir cihazdaki APEX'lerin tümü düzleştirilmemiş veya hepsi birleştirilmiş olmalıdır.
Bu, özellikle de müşteri tabanınız için önceden imzalanmış APEX
özel projeler arasında yer alıyor. Önceden imzalı olmayan (yani
kaynak) birleştirilmemiş veya uygun anahtarlarla imzalanmalıdır. İlgili içeriği oluşturmak için kullanılan
cihaz, şurada açıklandığı gibi updatable_apex.mk
kaynağından devralmalıdır:
APEX ile bir hizmeti güncelleme.
Sıkıştırılmış APEX'ler
Android 12 ve sonraki sürümlerde APEX sıkıştırma özelliği kullanılabilir. Güncellenebilir APEX paketlerinin depolama üzerindeki etkisini azaltır. APEX yüklü olsa da önceden yüklenmiş sürümü artık kullanılmasa da aynı miktarda alanı kaplar. Dolu olan bu alan hâlâ kullanılamıyor.
APEX sıkıştırması, yüksek oranda sıkıştırılmış bir küme kullanarak bu depolama alanının etkisini en aza indirir.
salt okunur bölümlerdeki (/system
bölümü gibi) APEX dosyaları. Android
12 ve sonraki sürümlerde DEFLATE zip sıkıştırma algoritması kullanılır.
Sıkıştırma işlemiyle aşağıdakiler için optimizasyon yapılmaz:
Başlatma sırasında çok erken eklenmesi gereken önyükleme APEX'leri tıklayın.
Güncellenemeyen APEX'ler. Sıkıştırma yalnızca APEX'in güncellenmiş bir sürümü yüklüyse faydalıdır
/data
bölümünde görebilirsiniz. Güncellenebilir APEX'lerin tam listesini şurada bulabilirsiniz: Modüler Sistem Bileşenleri sayfasını ziyaret edin.Dinamik paylaşılan kitaplık APEX'leri.
apexd
, her zaman bu tür APEX'leri (önceden yüklenmiş ve yükseltilmiş) sıkıştırmak,
Sıkıştırılmış APEX dosyası biçimi
Bu, sıkıştırılmış APEX dosyasının biçimidir.
Şekil 2. Sıkıştırılmış APEX dosyası biçimi
Üst düzeyde, sıkıştırılmış APEX dosyası orijinal dosyayı içeren bir zip dosyasıdır. ve diğer dosyaları içeren, sıkıştırma seviyesi 9 olan Şişmiş apex dosyası sıkıştırılmadan depolanır.
Dört dosya bir APEX dosyası oluşturur:
original_apex
: 9 sıkıştırma seviyesiyle azaltıldı Bu, orijinal APEX dosyasıdır.apex_manifest.pb
: yalnızca depolanırAndroidManifest.xml
: yalnızca depolanırapex_pubkey
: yalnızca depolanır
apex_manifest.pb
, AndroidManifest.xml
ve apex_pubkey
dosyaları
ilgili dosyalarının original_apex
klasörüne kopyalanmasını sağlayabilir.
Sıkıştırılmış APEX oluşturma
Sıkıştırılmış APEX, şu adreste bulunan apex_compression_tool.py
aracı kullanılarak oluşturulabilir:
system/apex/tools
Derleme sisteminde APEX sıkıştırmasıyla ilgili çeşitli parametreler mevcuttur.
Android.bp
ürününde APEX dosyasının sıkıştırılabilir olup olmadığı
compressible
özelliği:
apex {
name: "apex.test",
manifest: "apex_manifest.json",
file_contexts: "file_contexts",
compressible: true,
}
PRODUCT_COMPRESSED_APEX
ürün işareti, bir sistem görüntüsünün derlenip oluşturulmayacağını kontrol eder
kaynak kodu, sıkıştırılmış APEX dosyaları içermelidir.
Yerel deneme için
OVERRIDE_PRODUCT_COMPRESSED_APEX=
- true
.
Derleme sistemi tarafından oluşturulan sıkıştırılmış APEX dosyaları .capex
uzantısına sahiptir.
Uzantı, sıkıştırılmış ve sıkıştırılmamış hesapları birbirinden ayırt etmeyi kolaylaştırır
APEX dosyasının farklı sürümleri olabilir.
Desteklenen sıkıştırma algoritmaları
Android 12 yalnızca deflate zip sıkıştırmayı destekler.
Başlatma sırasında sıkıştırılmış bir APEX dosyasını etkinleştirme
Sıkıştırılmış bir APEX etkinleştirilmeden önce, içindeki original_apex
dosyası
/data/apex/decompressed
dizinine sıkıştırılmış. Bunun sonucunda
sıkıştırılmış APEX dosyası, /data/apex/active
dizinine sabitlenmiştir.
Yukarıda açıklanan sürecin bir örneği olarak aşağıdaki örneği düşünün.
/system/apex/com.android.foo.capex
öğesini, sıkıştırılmış bir APEX olarak
versionCode 37 ile etkinleştirilmesi gerekir.
/system/apex/com.android.foo.capex
içindekioriginal_apex
dosyası sıkıştırılmış/data/apex/decompressed/com.android.foo@37.apex
.restorecon /data/apex/decompressed/com.android.foo@37.apex
, şu amaçla gerçekleştirilir: doğru SELinux etiketine sahip olduğundan emin olun.- Doğrulama kontrollerinin gerçekleştirildiği yer
Geçerliliğini kontrol etmek için
/data/apex/decompressed/com.android.foo@37.apex
:apexd
, paket halinde sunulan ortak anahtarı kontrol eder Eşit olduğunu doğrulamak için/data/apex/decompressed/com.android.foo@37.apex
/system/apex/com.android.foo.capex
içinde paketlenene. /data/apex/decompressed/com.android.foo@37.apex
dosyası/data/apex/active/com.android.foo@37.apex
dizini.- Sıkıştırılmamış APEX dosyaları için normal etkinleştirme mantığı şurada gerçekleştirilir:
/data/apex/active/com.android.foo@37.apex
OTA ile etkileşim
Sıkıştırılmış APEX dosyalarının OTA yayını ve uygulaması üzerinde etkileri vardır. Başlangıç OTA güncellemesi, daha yüksek sürüm seviyesine sahip sıkıştırılmış bir APEX dosyası içerebilir bir cihazda etkin olan alana göre belirli bir miktarda boş alan OTA güncellemesi uygulamak için cihaz yeniden başlatılmadan önce
apexd
, OTA sistemini desteklemek için şu iki bağlayıcı API'yi kullanıma sunar:
calculateSizeForCompressedApex
- sıkıştırmayı açmak için gereken boyutu hesaplar OTA paketindeki APEX dosyaları. Bu, cihazın aşağıdaki koşulları karşılayan indirilmeden önce yeterli alan olacaktır.reserveSpaceForCompressedApex
- ileride kullanılmak üzere diskte yer ayırır OTA paketi içindeki sıkıştırılmış APEX dosyalarının sıkıştırılmış sürümünü açmak içinapexd
tarafından.
A/B OTA güncellemesi yapıldığında apexd
,
arka planı oluşturmayı öğreneceksiniz. Sıkıştırmayı açma başarısız olursa
apexd
, başlatma sırasında OTA'yı uygulayan sıkıştırma açma işlemini gerçekleştirir
güncelleyin.
APEX geliştirilirken dikkate alınan alternatifler
AOSP'nin APEX dosyasını tasarlarken dikkate aldığı bazı seçenekler şunlardır: ve neden dahil edildiği ya da hariç tutulduğu gibi bilgileri içerir.
Normal paket yönetimi sistemleri
Linux dağıtımlarında dpkg
ve rpm
gibi paket yönetim sistemleri bulunur
ve güçlü, olgun ve sağlam. Ancak:
sonrasında paketleri koruyamaması nedeniyle APEX için
teşekkür ederiz. Doğrulama yalnızca paketler yüklenirken gerçekleştirilir.
Saldırganlar, yüklü paketlerin bütünlüğünü fark etmeden bozulabilir. Bu
Android için, tüm sistem bileşenlerinin salt okunur olarak depolandığı regresyon
bütünlüğü her G/Ç için dm-verity ile korunan dosya sistemlerine sahiptir. Herhangi biri
sistem bileşenlerinde değişiklik yapılması yasaklanmalı veya bu şekilde
güvenlik ihlali oluşursa cihazın başlatmayı reddedebilir.
bütünlük için dm-crypt
Bir APEX kapsayıcısındaki dosyalar yerleşik bölümlerdendir (örneğin,
/system
bölümü) tarafından sağlanan, gizlilikle korunan,
bu dosyalar, bölümler eklendikten sonra bile yasaklanır. Sağlamak için
aynı güvenlik düzeyine sahip olduğundan APEX'teki tüm dosyalar
bir karma ağacı ve vbmeta tanımlayıcıyla eşlenen sistem görüntüsü. Yok:
dm-verity; /data
bölümündeki bir APEX,
Onaylandıktan ve yüklendikten sonra yapılan değişikliklerdir.
Hatta /data
bölümü,
dm-crypt. Bu, kurcalamaya karşı bir miktar koruma sağlasa da,
gizliliktir. Bir saldırgan,
/data
bölümü, daha fazla koruma olamaz ve bu da tekrar
/system
bölümünde yer alan her sistem bileşenine kıyasla regresyon.
Bir APEX dosyasındaki karma ağacı, dm-verity ile birlikte aşağıdaki gibidir:
içerik koruması seviyesi.
/system konumundan /apex konumuna yönlendirme yolları
APEX olarak paketlenen sistem bileşeni dosyalarına aşağıdaki gibi yeni yollar üzerinden erişilebilir:
/apex/<name>/lib/libfoo.so
Dosyalar /system
kapsamında olduğunda
bölümünde, /system/lib/libfoo.so
gibi yollardan erişilebildi. CEVAP
istemcisinin (diğer APEX dosyaları veya platform) kullandığı yeni
yollar. Yol değişikliği nedeniyle mevcut kodu güncellemeniz gerekebilir.
Yol değişikliğinden kaçınmanın bir yolu, dosya içeriklerini
APEX dosyasını /system
bölümüne yerleştirdikten sonra, Android ekibi bu işlemi tamamlamak için
dosyaları /system
bölümündeki dosyalarda birleştirebilirsiniz. Çünkü bu,
üzerine yerleştirilen dosyaların sayısı (muhtemelen birbiri ardına yığılmış)
arttı.
Diğer bir seçenek de open
, stat
ve
readlink
, böylece /system
ile başlayan yollar
/apex
altındaki karşılık gelen yollar. Android ekibi bu seçeneği sildi
çünkü yolları kabul eden tüm işlevleri değiştirmek mümkün değildir.
Örneğin, bazı uygulamalar, işlevleri uygulayan Bionic'i statik olarak bağlar.
Bu tür durumlarda bu uygulamalar yönlendirilmez.