Bu belgede, A/B bölümlerini destekleyen bir cihaza önceden yüklenmiş uygulamaların hızlı bir şekilde yüklenmesi için APK önbelleğe alma çözümünün tasarımı açıklanmaktadır.
OEM'ler, 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 ön yüklemeler ve popüler uygulamalar yerleştirebilir. Cihazda bir APK önbelleği bulunduğunda yeni veya yakın zamanda fabrika ayarlarına sıfırlanmış cihazlar, Google Play'den APK dosyaları 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 saklama
- Daha hızlı geri yükleme için popüler uygulamaları B bölümünde saklama
Ön koşullar
Bu özelliği kullanmak için cihazın:
- Android 8.1 (O MR1) sürümü yüklü olmalıdır.
- 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ünün aslında sistem görüntüsü dosyalarını depolamaması, bunun yerine perakende demo kaynakları, OAT dosyaları ve APK önbelleği gibi önceden yüklenmiş içerikleri depolamasıdır. Kaynaklar /data bölümüne kopyalandıktan sonra (bu işlem ilk başlatmada 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üncellemeleri tarafından kullanılır.
Bu nedenle, APK önbelleği OTA üzerinden güncellenemez. Yalnızca fabrikada önceden yüklenebilir. Fabrika ayarlarına sıfırlama yalnızca /data bölümünü etkiler. OTA görüntüsü indirilene kadar sistem B bölümünde önceden yüklenmiş içerik kalır. Fabrika ayarlarına sıfırlama işleminden sonra sistem ilk önyüklemeyi tekrar yapar. Bu, OTA görüntüsü B bölümüne indirilip cihaz fabrika ayarlarına sıfırlandığında APK önbelleğe almanın kullanılamayacağı anlamına gelir.
Uygulama
1. Yaklaşım system_other bölümündeki içerik
Avantaj: Önceden yüklenen içerik, fabrika ayarlarına sıfırlama işleminden sonra kaybolmaz. Yeniden başlatma işleminden sonra B bölümünden kopyalanır.
Dezavantaj: B bölümünde alan gerektirir. Fabrika ayarlarına sıfırlamadan sonraki başlatma işlemi, önceden yüklenmiş içeriğin kopyalanması için ek süre gerektirir.
Önceden yüklenen içeriklerin ilk başlatma sırasında kopyalanması için sistem, /system/bin/preloads_copy.sh
içinde bir komut dosyası çağırır. Komut dosyası tek bir bağımsız değişkenle (system_b
bölümü için salt okunur bağlama noktasına giden yol) çağrılır:
Bu özelliği uygulamak için cihaza özel aşağıdaki değişiklikleri yapın. Marlin'den bir örnek:
- Kopyalama işlemini yapan komut dosyasını
device-common.mk
dosyasına (bu örnektedevice/google/marlin/device-common.mk
) aşağıdaki gibi ekleyin: Örnek komut dosyası kaynağını şu adreste bulabilirsiniz: device/google/marlin/preloads_copy.sh# 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
-
init.common.rc
dosyasını, gerekli/data/preloads
dizinini ve alt dizinlerini oluşturacak şekilde düzenleyin: Örnekmkdir /data/preloads 0775 system system
mkdir /data/preloads/media 0775 system system
mkdir /data/preloads/demo 0775 system system
init
dosya kaynağını şu adreste bulabilirsiniz: device/google/marlin/init.common.rc preloads_copy.te
dosyasında yeni bir SELinux alanı tanımlayın: SELinux alan dosyası örneğini şu adreste bulabilirsiniz: /device/google/marlin/+/android16-release/sepolicy/preloads_copy.tetype 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;
- Alan adını yeni bir
dosyasına kaydedin:/sepolicy/file_contexts SELinux bağlamları dosyasının bir örneğini şu adreste bulabilirsiniz: device/google/marlin/sepolicy/preloads_copy.te/system/bin/preloads_copy\.sh u:object_r:preloads_copy_exec:s0
- Derleme sırasında, önceden yüklenmiş içeriğin bulunduğu dizin
system_other
bölümüne kopyalanmalıdır: Bu, APK önbellek kaynaklarının tedarikçinin Git deposundan (bizim durumumuzda vendor/google_devices/marlin/preloads) sistem_other bölümündeki konuma kopyalanmasına olanak tanıyan bir Makefile değişikliği örneğidir. Bu konum, cihaz ilk kez başlatıldığında /data/preloads konumuna kopyalanır. Bu komut dosyası, system_other görüntüsünü hazırlamak için derleme sırasında çalışır. Önceden yüklenmiş içeriğin vendor/google_devices/marlin/preloads dizininde bulunması beklenir. OEM, gerçek depo adını/yolunu seçmekte serbesttir.# 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)
- APK önbelleği
/data/preloads/file_cache
konumunda bulunur ve aşağıdaki düzene sahiptir: Bu, cihazlardaki son dizin yapısıdır. OEM'ler, son dosya yapısı yukarıda açıklananı kopyaladığı sürece herhangi bir uygulama yaklaşımını seçebilir./data/preloads/file_cache/ app.package.name.1/ file1 fileN app.package.name.N/
2. Yaklaşım Kullanıcı verilerindeki içerik Fabrikada yüklenen resim
Bu alternatif yaklaşımda, önceden yüklenmiş içeriğin /data
bölümündeki /data/preloads
dizinine zaten dahil olduğu varsayılır.
Avantaj: Kutudan çıkarıldığı gibi çalışır. İlk başlatmada dosyaları kopyalamak için cihazda özelleştirme yapmanız gerekmez. İçerik zaten /data
bölümünde.
Dezavantaj: Önceden yüklenen içerik, fabrika ayarlarına sıfırlama işleminden sonra kaybolur. Bu durum bazıları için kabul edilebilir olsa da kalite kontrolü incelemeleri yaptıktan sonra cihazları fabrika ayarlarına sıfırlayan OEM'ler için her zaman işe yaramayabilir.
getPreloadsFileCache()
adlı yeni bir @SystemApi yöntemi android.content.Context
'ye eklendi. Önceden yüklenmiş önbellekteki uygulamaya özel bir dizinin mutlak yolunu döndürür.
Tüm alanı geri kazanmak için ön yüklemeler dizininin silinmesine olanak tanıyan yeni bir yöntem (IPackageManager.deletePreloadsFileCache
) eklendi. Bu yöntem yalnızca SYSTEM_UID'ye sahip uygulamalar (ör. sistem sunucusu veya Ayarlar) tarafından çağrılabilir.
Uygulama hazırlama
Önceden yüklenenler ö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 başlatmadan sonra cihazın
/data/preloads/file_cache
dizininde içerik olmalıdır. - Cihazın depolama alanı azaldığında
file_cache/
dizinindeki içerik silinmelidir.
APK önbelleğini test etmek için ApkCacheTest örnek uygulamasını kullanın.
- Kök dizinden şu komutu çalıştırarak uygulamayı oluşturun:
make ApkCacheTest
- Uygulamayı ayrıcalıklı uygulama olarak yükleyin. (Yalnızca ayrıcalıklı uygulamaların APK önbelleğine erişebileceğini unutmayın.)
Bu işlem için root erişimli 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
- Gerekirse dosya önbelleği 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"
- Uygulamayı test edin. Uygulamayı yükleyip test
file_cache
dizinini oluşturduktan sonra ApkCacheTest uygulamasını açın. Uygulamada bir dosyatest.txt
ve içeriği gösterilmelidir. 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.
1. şekil. ApkCacheTest sonuçları.