APK Önbelleğe Alma

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

OEM'ler, ön yüklemeleri ve popüler uygulamaları, kullanıcıya yönelik herhangi bir veri alanını etkilemeden, yeni A/B bölümlü cihazlarda çoğunlukla boş olan B bölümünde depolanan APK önbelleğine yerleştirebilir. Cihazda bir APK önbelleğinin bulunması sayesinde, yeni veya yakın zamanda fabrika ayarlarına sıfırlanan cihazlar, Google Play'den APK dosyalarını indirmeye gerek kalmadan neredeyse anında kullanıma hazır hale gelir.

Kullanım örnekleri

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

Önkoşullar

Bu özelliği kullanmak için cihazın aşağıdakilere ihtiyacı vardır:

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

Önceden yüklenmiş içerik yalnızca ilk önyükleme sırasında kopyalanabilir. Bunun nedeni, A/B sistem güncellemelerini destekleyen cihazlarda B bölümünün aslında sistem görüntü dosyalarını depolamaması, bunun yerine perakende demo kaynakları, OAT dosyaları ve APK önbelleği gibi önceden yüklenmiş içeriği depolamasıdır. Kaynaklar /data bölümüne kopyalandıktan sonra (bu ilk önyüklemede gerçekleşir), B bölümü, sistem görüntüsünün güncellenmiş sürümlerini indirmek için kablosuz (OTA) güncellemeler tarafından kullanılacaktır.

Bu nedenle APK önbelleği OTA aracılığıyla güncellenemez; yalnızca fabrikada önceden yüklenebilir. Fabrika ayarlarına sıfırlama yalnızca /data bölümünü etkiler. Sistem B bölümü, OTA görüntüsü indirilene kadar önceden yüklenmiş içeriğe sahip olmaya devam eder. Fabrika ayarlarına sıfırlamanın ardından sistem tekrar ilk önyüklemeye geçecektir. Bu, OTA görüntüsü B bölümüne indirilirse ve ardından cihaz fabrika ayarlarına sıfırlanırsa APK önbelleğe almanın kullanılamayacağı anlamına gelir.

Uygulama

Yaklaşım 1. system_other bölümündeki içerik

Pro : Fabrika ayarlarına sıfırlama sonrasında önceden yüklenen içerik kaybolmaz; yeniden başlatmanın ardından B bölümünden kopyalanır.

Con : B bölümünde alan gerektirir. Fabrika ayarlarına sıfırlamadan sonra önyükleme, önceden yüklenmiş içeriğin kopyalanması için ek süre gerektirir.

İlk önyükleme sırasında ön yüklemelerin kopyalanması için sistem /system/bin/preloads_copy.sh dosyasında bir komut dosyası çağırır. Betik tek bir argümanla çağrılır ( system_b bölümü için salt okunur bağlama noktasının yolu):

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

  1. Kopyalama işlemini gerçekleştiren komut dosyasını device-common.mk dosyasına (bu durumda, device/google/marlin/device-common.mk ) şu şekilde ekleyin:
    # 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 bulun: Device/google/marlin /preloads_copy.sh
  2. Gerekli /data/preloads dizinini ve alt dizinlerini oluşturması için init.common.rc dosyasını düzenleyin:
    mkdir /data/preloads 0775 system system
    mkdir /data/preloads/media 0775 system system
    mkdir /data/preloads/demo 0775 system system
    
    Örnek init dosyası kaynağını şu adreste bulun: Device/google/marlin/init.common.rc
  3. preloads_copy.te dosyasında yeni bir SELinux alan adı 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;
    
    Örnek bir SELinux alan adı dosyasını şurada bulun: /device/google/marlin/+/main/sepolicy/preloads_copy.te
  4. Alan adını yeni bir şekilde kaydedin /sepolicy/file_contexts dosyası:
    /system/bin/preloads_copy\.sh     u:object_r:preloads_copy_exec:s0
    
    Örnek bir SELinux içerik dosyası bulun: 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üne kopyalanmalıdır:
    # 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, Makefile'da APK önbellek kaynaklarının satıcının Git deposundan kopyalanmasına izin veren bir değişikliğin örneğidir (bizim durumumuzda satıcı/google_devices/ idi) marlin/preloads), daha sonra cihaz ilk kez önyüklendiğinde /data/preloads dizinine kopyalanacak olan system_other bölümündeki konuma kopyalayın. Bu komut dosyası, system_other görüntüsünü hazırlamak için derleme zamanında çalışır. Önceden yüklenmiş içeriğin satıcı/google_devices/marlin/preloads konumunda mevcut olmasını bekler. OEM, gerçek depo adını/yolunu seçmekte özgürdür.
  6. APK önbelleği /data/preloads/file_cache konumunda bulunur ve aşağıdaki düzene sahiptir:
    /data/preloads/file_cache/
        app.package.name.1/
              file1
              fileN
        app.package.name.N/
    
    Bu, cihazlardaki son dizin yapısıdır. OEM'ler, nihai dosya yapısı yukarıda açıklananla aynı olduğu sürece herhangi bir uygulama yaklaşımını seçmekte özgürdür.

Yaklaşım 2. Fabrikada flaşlanan kullanıcı verisi görselindeki içerik

Bu alternatif yaklaşım, önceden yüklenmiş içeriğin, /data bölümündeki /data/preloads dizininde zaten bulunduğunu varsayar.

Pro : Kutudan çıktığı gibi çalışır; ilk açılışta dosyaları kopyalamak için cihazda özelleştirmeler yapmanıza gerek yoktur. İçerik zaten /data bölümünde bulunuyor.

Con : Fabrika ayarlarına sıfırlamanın ardından önceden yüklenen içerik kaybolur. Bazıları için bu kabul edilebilir olsa da, kalite kontrol denetimleri yaptıktan sonra cihazları fabrika ayarlarına sıfırlayan OEM'ler için her zaman işe yaramayabilir.

android.content.Context yeni bir @SystemApi yöntemi, getPreloadsFileCache() eklendi. Önceden yüklenmiş önbellekteki uygulamaya özel dizine mutlak bir yol döndürür.

Tüm alanı geri kazanmak için önyükleme dizininin silinmesine olanak tanıyan yeni bir yöntem olan IPackageManager.deletePreloadsFileCache eklendi. Yöntem yalnızca SYSTEM_UID'ye sahip uygulamalar (yani sistem sunucusu veya Ayarlar) tarafından çağrılabilir.

Uygulama hazırlığı

Ön yükleme önbellek dizinine yalnızca ayrıcalıklı uygulamalar erişebilir. Bu erişim için uygulamaların /system/priv-app dizinine yüklenmesi gerekir.

Doğrulama

  • İlk açılıştan sonra cihazın /data/preloads/file_cache dizininde içeriğe sahip olması gerekir.
  • Cihazın depolama alanı azalırsa file_cache/ dizinindeki içerik silinmelidir.

APK önbelleğini test etmek için örnek ApkCacheTest uygulamasını kullanın.

  1. Bu komutu kök dizinden çalıştırarak uygulamayı oluşturun:
    make ApkCacheTest
    
  2. Uygulamayı ayrıcalıklı bir uygulama olarak yükleyin. (Unutmayın, yalnızca ayrıcalıklı uygulamalar APK önbelleğine erişebilir.) Bunun için köklü 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 (aynı zamanda kök ayrıcalıkları da gerektirir):
    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ükledikten ve test file_cache dizinini oluşturduktan sonra ApkCacheTest uygulamasını açın. Bir test.txt dosyasını ve içeriğini göstermelidir. 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ı