Dokumen ini menjelaskan desain solusi caching APK untuk penginstalan cepat aplikasi yang sudah dimuat sebelumnya di perangkat yang mendukung partisi A/B.
OEM dapat menempatkan aplikasi populer dan hasil pramuat di cache APK yang disimpan di partisi B yang sebagian besar kosong pada perangkat berpartisi A/B baru tanpa memengaruhi ruang data yang terlihat oleh pengguna. Dengan adanya cache APK di perangkat, perangkat baru atau yang baru direset ke setelan pabrik dapat langsung digunakan, tanpa perlu mendownload file APK dari Google Play.
Kasus penggunaan
- Menyimpan aplikasi bawaan di partisi B untuk penyiapan yang lebih cepat
- Menyimpan aplikasi populer di partisi B untuk pemulihan yang lebih cepat
Prasyarat
Untuk menggunakan fitur ini, perangkat memerlukan:
- Rilis Android 8.1 (O MR1) terinstal
- Partisi A/B diterapkan
Konten yang sudah dimuat sebelumnya hanya dapat disalin selama booting pertama. Hal ini karena pada perangkat yang mendukung update sistem A/B, partisi B sebenarnya tidak menyimpan file image sistem, tetapi konten yang dimuat sebelumnya seperti resource demo retail, file OAT, dan cache APK. Setelah resource disalin ke partisi /data (hal ini terjadi saat booting pertama), partisi B akan digunakan oleh update over-the-air (OTA)untuk mendownload versi terbaru image sistem.
Oleh karena itu, cache APK tidak dapat diupdate melalui OTA; cache hanya dapat dimuat sebelumnya di pabrik. Reset ke setelan pabrik hanya memengaruhi partisi /data. Partisi B sistem masih memiliki konten yang telah dimuat sebelumnya hingga image OTA didownload. Setelah direset ke setelan pabrik, sistem akan melalui booting pertama lagi. Artinya, penyimpanan APK ke cache tidak tersedia jika image OTA didownload ke partisi B, lalu perangkat direset ke setelan pabrik.
Implementasi
Pendekatan 1. Konten di partisi system_other
Pro: Konten yang sudah dimuat tidak akan hilang setelah reset ke setelan pabrik - konten tersebut akan disalin dari partisi B setelah perangkat di-reboot.
Kontra: Memerlukan ruang di partisi B. Booting setelah reset ke setelan pabrik memerlukan waktu tambahan untuk menyalin konten yang sudah dimuat sebelumnya.
Agar pramuat disalin selama booting pertama, sistem memanggil skrip
di /system/bin/preloads_copy.sh
. Skrip dipanggil dengan satu
argumen (jalur ke titik pemasangan hanya baca untuk partisi system_b
):
Untuk mengimplementasikan fitur ini, lakukan perubahan khusus perangkat berikut. Berikut adalah contoh dari Marlin:
- Tambahkan skrip yang melakukan penyalinan ke file
device-common.mk
(dalam hal ini,device/google/marlin/device-common.mk
), seperti berikut: Temukan contoh sumber skrip di: 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
- Edit file
init.common.rc
agar membuat direktori dan subdirektori/data/preloads
yang diperlukan: Temukan contoh sumber filemkdir /data/preloads 0775 system system
mkdir /data/preloads/media 0775 system system
mkdir /data/preloads/demo 0775 system system
init
di: device/google/marlin/init.common.rc - Tentukan domain SELinux baru dalam file
preloads_copy.te
: Temukan contoh file domain SELinux di: /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;
- Daftarkan domain di file
baru:/sepolicy/file_contexts Temukan contoh file konteks SELinux di: device/google/marlin/sepolicy/preloads_copy.te/system/bin/preloads_copy\.sh u:object_r:preloads_copy_exec:s0
- Pada waktu build, direktori dengan konten pramuat harus disalin ke partisi
system_other
: Berikut adalah contoh perubahan pada Makefile yang memungkinkan penyalinan resource cache APK dari repositori Git vendor (dalam kasus ini adalah vendor/google_devices/marlin/preloads) ke lokasi di partisi system_other yang nantinya akan disalin ke /data/preloads saat perangkat di-boot untuk pertama kalinya. Skrip ini berjalan pada waktu build untuk menyiapkan image system_other. File ini mengharapkan konten yang sudah dimuat sebelumnya tersedia di vendor/google_devices/marlin/preloads. OEM dapat memilih nama/jalur repositori yang sebenarnya.# 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)
- Cache APK terletak di
/data/preloads/file_cache
dan memiliki tata letak berikut: Ini adalah struktur direktori akhir di perangkat. OEM bebas memilih pendekatan penerapan apa pun selama struktur file akhir mereplikasi struktur yang dijelaskan di atas./data/preloads/file_cache/ app.package.name.1/ file1 fileN app.package.name.N/
Pendekatan 2. Konten pada data pengguna gambar di-flash di pabrik
Pendekatan alternatif ini mengasumsikan bahwa konten yang sudah dimuat sebelumnya sudah disertakan dalam
direktori /data/preloads
di partisi /data
.
Pro: Berfungsi langsung - tidak perlu melakukan penyesuaian perangkat untuk menyalin file saat booting pertama. Konten sudah ada di partisi
/data
.
Kontra: Konten yang sudah dimuat sebelumnya akan hilang setelah perangkat direset ke setelan pabrik. Meskipun hal ini dapat diterima oleh sebagian orang, hal ini mungkin tidak selalu berfungsi untuk OEM yang mereset perangkat ke setelan pabrik setelah melakukan pemeriksaan kontrol kualitas.
Metode @SystemApi baru, getPreloadsFileCache()
, telah ditambahkan ke
android.content.Context
. Metode ini menampilkan jalur absolut ke direktori khusus aplikasi dalam cache yang telah dimuat sebelumnya.
Metode baru, IPackageManager.deletePreloadsFileCache
, telah ditambahkan
yang memungkinkan penghapusan direktori pramuat untuk mendapatkan kembali semua ruang. Metode ini hanya dapat dipanggil oleh aplikasi dengan SYSTEM_UID, yaitu server sistem atau Setelan.
Persiapan aplikasi
Hanya aplikasi dengan hak istimewa yang dapat mengakses direktori cache pramuat. Untuk akses tersebut, aplikasi harus diinstal di direktori /system/priv-app
.
Validasi
- Setelah booting pertama, perangkat akan memiliki konten di
direktori
/data/preloads/file_cache
. - Konten di direktori
file_cache/
harus dihapus jika penyimpanan perangkat hampir penuh.
Gunakan aplikasi contoh ApkCacheTest untuk menguji cache APK.
- Bangun aplikasi dengan menjalankan perintah ini dari direktori root:
make ApkCacheTest
- Instal aplikasi sebagai aplikasi dengan hak istimewa. (Ingat, hanya aplikasi dengan hak istimewa yang dapat mengakses cache APK.)
Tindakan ini memerlukan perangkat yang telah di-root:
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
- Simulasikan direktori cache file dan kontennya jika diperlukan (juga memerlukan hak istimewa root):
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"
- Uji aplikasi. Setelah menginstal aplikasi dan membuat direktori pengujian
file_cache
, buka aplikasi ApkCacheTest. Aplikasi tersebut akan menampilkan satu filetest.txt
dan isinya. Lihat screenshot ini untuk melihat tampilan hasil ini di antarmuka pengguna.
Gambar 1. Hasil ApkCacheTest.