APEX dosyası biçimi

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.

APEX dosyası biçimi

Ş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.

  1. APEX dosyası bir paket yükleyici uygulaması, ADB veya başka bir program aracılığıyla indirilir. kaynak.
  2. 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.
  3. APEX yöneticisi APEX dosyasını doğrular.
  4. 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.
  5. Yükleme isteğinde bulunan kullanıcı, başarılı paketin ardından bir yayın alır doğrulama.
  6. Yüklemeye devam etmek için sistemin yeniden başlatılması gerekir.
  7. 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:

    1. APEX dosyasını doğrular.
    2. APEX dosyasından geri döngü cihazı oluşturur.
    3. Geri döngü cihazının üstünde bir cihaz eşleyici blok cihazı oluşturur.
    4. 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 AYARLANMAMALIDIR
  • loop.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 pair
openssl genrsa -out foo.pem 4096

# extract the public key from the key pair
avbtool extract_public_key --key foo.pem --output foo.avbpubkey

# in Android.bp
apex_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ır build/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.
ziyaret edin.
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:

  1. Cihaz şu anda /system/apex altında bir APEX'i (OEM veya ODM) önceden yükler gönderildi.
  2. APEX'teki dosyalara /apex/<apex_name>/ yolu üzerinden erişilebilir.
  3. /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:

  1. 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
    
  2. 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.

Diyagram, sıkıştırılmış APEX dosyasının biçimini gösteriyor

Ş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ır
  • AndroidManifest.xml: yalnızca depolanır
  • apex_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.

  1. /system/apex/com.android.foo.capex içindeki original_apex dosyası sıkıştırılmış /data/apex/decompressed/com.android.foo@37.apex.
  2. restorecon /data/apex/decompressed/com.android.foo@37.apex, şu amaçla gerçekleştirilir: doğru SELinux etiketine sahip olduğundan emin olun.
  3. 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.
  4. /data/apex/decompressed/com.android.foo@37.apex dosyası /data/apex/active/com.android.foo@37.apex dizini.
  5. 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çin apexd 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.