APK'yı önbelleğe alma

Bu dokümanda, hızlı yükleme için APK önbelleğe alma çözümünün tasarımı açıklanmaktadır A/B bölümlerini destekleyen bir cihazda önceden yüklenmiş uygulamaların sayısı.

OEM'ler, önceden yüklemeler ve popüler uygulamaları, çoğunlukla Android'de depolanan APK önbelleğine A/B bölümlemeli yeni cihazlarda boş B bölümünü etkilemeden veri alanlarında kullanılan bir belgedir. Cihazda bir APK önbelleğine sahip olarak, yeni veya fabrika ayarlarına sıfırlanmış cihazlar, herhangi bir işlem gerekmeden, APK dosyalarını Google Play'den indirmeniz gerekiyor.

Kullanım örnekleri

  • Daha hızlı kurulum için önceden yüklenmiş uygulamaları B bölümünde depolayın
  • Daha hızlı geri yükleme için popüler uygulamaları B bölümünde depolayın

Ön koşullar

Bu özelliğin kullanılabilmesi için cihazın:

  • Android 8.1 (O MR1) sürümü yüklendi
  • A/B bölümü uygulandı

Önceden yüklenmiş içerik yalnızca ilk başlatma sırasında kopyalanabilir. Bunun nedeni, A/B sistem güncellemelerini destekleyen cihazlarda, B bölümü gerçekte bunun yerine mağaza demo kaynakları gibi içeriği önceden yüklenmiş halde, OAT dosyaları ve APK önbelleği. Kaynaklar /data dosyasına kopyalandıktan sonra bölüm (bu ilk başlatmada gerçekleşir), B bölümü kablosuz (OTA) güncellemeleri inceleyebilirsiniz.

Bu nedenle, APK önbelleği OTA üzerinden güncellenemez; yalnızca önceden yüklenebilir sahip olacaksınız. Fabrika ayarlarına sıfırlama işlemi yalnızca /veri bölümünü etkiler. B sistemi OTA görüntüsü indirilene kadar bölüm, önceden yüklenmiş içeriğe sahip olmaya devam eder. Fabrika ayarlarına sıfırladıktan sonra, sistem ilk başlatma işlemini tekrar yapar. Bu, APK'nın OTA görüntüsü B bölümüne indirilirse önbelleğe alma kullanılamaz ve cihaz fabrika ayarlarına sıfırlanır.

Uygulama

1. Yaklaşım: İçerik açık sistem_diğer bölüm

Avantajı: Önceden yüklenmiş içerik, fabrika ayarlarına sıfırladıktan sonra kaybolmaz. , yeniden başlatma sonrasında B bölümünden kopyalanır.

Dezavantajı: B bölümünde alan gerektirir. Fabrika ayarlarına sıfırladıktan sonra başlat önceden yüklenmiş içeriğin kopyalanması için ek zaman gerektirir.

Önceden yüklemelerin ilk başlatma sırasında kopyalanabilmesi için sistem, bir komut dosyası çağırır /system/bin/preloads_copy.sh içinde. Komut dosyası tek bir bağımsız değişken (system_b için salt okunur ekleme noktasının yolu) bölüm):

Bu özelliği uygulamak için cihaza özel bu değişiklikleri yapın. Burada Marlin'den bir örnek:

  1. Kopyalama işlemini yapan komut dosyasını device-common.mk hedefine ekleyin dosyasını (bu örnekte device/google/marlin/device-common.mk) aşağıdaki gibi görürsünüz:
    # Script that copies preloads directory from system_other to data partition
    PRODUCT_COPY_FILES += \
        device/google/marlin/preloads_copy.sh:system/bin/preloads_copy.sh
    
    Örnek komut dosyası kaynağını şu adreste bulabilirsiniz: device/google/marlin/preloads_copy.sh
  2. init.common.rc dosyasını oluşturması için dosyayı düzenleyin. gerekli /data/preloads dizini ve alt dizinleridir:
    mkdir /data/preloads 0775 system system
    mkdir /data/preloads/media 0775 system system
    mkdir /data/preloads/demo 0775 system system
    
    Örnek init dosya kaynağını şu adreste bulabilirsiniz: device/google/marlin/init.common.rc
  3. preloads_copy.te dosyasında yeni bir SELinux alanı tanımlayın:
    type preloads_copy, domain, coredomain;
    type preloads_copy_exec, exec_type, vendor_file_type, file_type;
    
    init_daemon_domain(preloads_copy)
    
    allow preloads_copy shell_exec:file rx_file_perms;
    allow preloads_copy toolbox_exec:file rx_file_perms;
    allow preloads_copy preloads_data_file:dir create_dir_perms;
    allow preloads_copy preloads_data_file:file create_file_perms;
    allow preloads_copy preloads_media_file:dir create_dir_perms;
    allow preloads_copy preloads_media_file:file create_file_perms;
    
    # Allow to copy from /postinstall
    allow preloads_copy system_file:dir r_dir_perms;
    
    Şu adreste bir SELinux alan adı dosyası bulabilirsiniz: /device/google/marlin/+/main/sepolicy/preloads_copy.te
  4. Alanı yeni bir /sepolicy/file_contexts sisteminde kaydedin dosya:
    /system/bin/preloads_copy\.sh     u:object_r:preloads_copy_exec:s0
    
    Örnek bir SELinux bağlam dosyasını şu adreste bulabilirsiniz: device/google/marlin/sepolicy/preloads_copy.te
  5. Derleme sırasında, önceden yüklenmiş içeriğe sahip dizin system_other bölümü:
    # Copy contents of preloads directory to system_other partition
    PRODUCT_COPY_FILES += \
        $(call find-copy-subdir-files,*,vendor/google_devices/marlin/preloads,system_other/preloads)
    
    Bu, APK önbelleğinin kopyalanmasına izin veren bir Makefile değişikliğine örnektir tedarikçinin Git deposundaki kaynakları (bizimde provider/google_devices/marlin/preloads) olarak sistem_other bölümündeki konuma bu dosya daha sonra gerekir. Bu komut dosyası, system_other görüntüsünü hazırlamak için derleme zamanında çalışır. Bekleme süresi provider/google_devices/marlin/preloads adresinde kullanılabilir olacak şekilde önceden yüklenmiş içerik. OEM gerçek depo adını/yolunu seçebilirsiniz.
  6. APK önbelleği /data/preloads/file_cache konumunda bulunmaktadır ve şu düzeni kullanın:
    /data/preloads/file_cache/
        app.package.name.1/
              file1
              fileN
        app.package.name.N/
    
    Bu, cihazlardaki son dizin yapısıdır. OEM'ler özgürce seçilebilir son dosya yapısı, aynı dizindeki tüm uygulama yaklaşımlarını gerekir.

2. Yaklaşım: Kullanıcı verilerindeki içerik fabrikada yanıp sönen resim

Bu alternatif yaklaşımda, önceden yüklenmiş içeriğin /data bölümündeki /data/preloads dizini.

Avantajı: Kullanıma hazır, cihaz kurulumu gerekmez özelleştirmeleri de yapabilirsiniz. İçerik zaten /data bölümü.

Dezavantajı: Fabrika ayarlarına sıfırlandıktan sonra önceden yüklenmiş içerik kaybolur. Bu sırada bazı kişiler için kabul edilebilir olabilir ancak kalite kontrol denetimleri yaptıktan sonra cihazları sıfırlamaktır.

Yeni bir @SystemApi yöntemi (getPreloadsFileCache()) android.content.Context. Mutlak bir yol döndürür: önceden yüklenmiş önbellekteki uygulamaya özgü dizin

Yeni bir yöntem (IPackageManager.deletePreloadsFileCache) eklendi Bu komut, tüm boş alan için yeniden yükleme dizininin silinmesini sağlar. Yöntem sadece SYSTEM_UID'ye sahip uygulamalar (ör. sistem sunucusu veya Ayarlar) tarafından çağrılacaktır.

Uygulama hazırlama

Yalnızca ayrıcalıklı uygulamalar, önceden yükleme önbellek dizinine erişebilir. Bunun için erişim, uygulamalar /system/priv-app dizinine yüklenmelidir.

Doğrulama

  • İlk başlatma işleminden sonra, cihazın /data/preloads/file_cache dizini.
  • file_cache/ dizinindeki içerik şu durumlarda silinmelidir: cihazın depolama alanı azaldı.

Örnek ApkCacheTest kullanın. APK önbelleği testi için uygulama.

  1. Kök dizinden bu komutu çalıştırarak uygulamayı oluşturun:
    make ApkCacheTest
    
    .
  2. Uygulamayı ayrıcalıklı bir uygulama olarak yükleyin. (APK önbelleğine yalnızca ayrıcalıklı uygulamaların erişebileceğini unutmayın.) Bunun için rootlanmış bir cihaz gerekir:
    adb root && adb remount
    adb shell mkdir /system/priv-app/ApkCacheTest
    adb push $ANDROID_PRODUCT_OUT/data/app/ApkCacheTest/ApkCacheTest.apk /system/priv-app/ApkCacheTest/
    adb shell stop && adb shell start
    
    .
  3. Gerekirse dosya önbellek dizinini ve içeriğini simüle edin (kök ayrıcalıkları da gerekir):
    adb shell mkdir -p /data/preloads/file_cache/com.android.apkcachetest
    adb shell restorecon -r /data/preloads
    adb shell "echo "Test File" > /data/preloads/file_cache/com.android.apkcachetest/test.txt"
    
    .
  4. Uygulamayı test edin. Uygulamayı yükleyip test file_cache dizinini oluşturduktan sonra ApkCacheTest uygulamasını açın. Bir adet test.txt dosyası ve içindekiler gösterilecektir. Bu sonuçların kullanıcı arayüzünde nasıl göründüğünü görmek için bu ekran görüntüsüne bakın.

    Şekil 1. ApkCacheTest sonuçları.