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 durumları
- 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ırlamanın ardından ö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ırlamanın ardından önyükleme, önceden yüklenen 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:
- 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 - Gerekli
/data/preloads
dizinini ve alt dizinlerini oluşturması içininit.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
init
dosyası kaynağını şu adreste bulun: Device/google/marlin/init.common.rc -
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 - 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 - 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. - 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 bir 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.
- Bu komutu kök dizinden çalıştırarak uygulamayı oluşturun:
make ApkCacheTest
- 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
- 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"
- Uygulamayı test edin. Uygulamayı yükledikten ve test
file_cache
dizinini oluşturduktan sonra ApkCacheTest uygulamasını açın. Birtest.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ı.