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:
- Kopyalama işlemini yapan komut dosyasını
device-common.mk
hedefine ekleyin dosyasını (bu örnektedevice/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 -
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
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: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- Alanı yeni bir
sisteminde kaydedin dosya:/sepolicy/file_contexts /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 - 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. - 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.
- Kök dizinden bu komutu çalıştırarak uygulamayı oluşturun:
make ApkCacheTest
- 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
- 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"
- Uygulamayı test edin. Uygulamayı yükleyip test
file_cache
dizinini oluşturduktan sonra ApkCacheTest uygulamasını açın. Bir adettest.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ı.