Modul kernel Sistem File Inkremental (IncFS) yang diperkenalkan di Android 11 memungkinkan OS Android menerima APK yang dialirkan melalui Android Debug Bridge (ADB).
Modul kernel mandiri ini menciptakan sistem file virtual baru yang berada di atas sistem file Android yang sudah ada. Hal ini melengkapi perubahan pada framework dan SDK yang memungkinkan developer aplikasi dan game men-deploy APK berukuran besar melalui ADB ke perangkat yang menjalankan Android 11 atau lebih tinggi.
Perubahan kernel mengaktifkan format APK Signature Scheme v4 baru dan mendukung perubahan kerangka kerja Android di Manajer Paket Android, layanan sistem baru, dan perubahan pada ADB.
Penerapan
Untuk mengimplementasikan IncFS, OEM dan produsen SoC harus menambahkan driver kernel baru ke perangkat Android mereka.
Hanya untuk Android 11 , jika driver kernel dibuat sebagai modul, driver tersebut dimuat sesuai permintaan. Jika tidak ada aplikasi apa pun yang diinstal melalui instalasi tambahan ADB, perangkat tidak memuat driver kernel.
Jika tidak, ketika dibuat sebagai bagian dari image kernel, driver selalu dimuat. Implementasi ini valid untuk Android 12 dan lebih tinggi, dan dapat digunakan dengan Android 11 . Untuk informasi tentang mengupgrade driver kernel ke Android 12, lihat Peningkatan driver kernel .
Driver kernel adalah bagian dari sistem yang lebih besar untuk mengaktifkan instalasi APK yang dialirkan. OEM dan vendor tidak perlu menggunakan kode IncFS persis yang disediakan dalam contoh implementasi. Namun, untuk memastikan pengalaman yang konsisten di seluruh perangkat, Anda harus memastikan implementasi API memiliki sistem file yang memiliki fungsi baca file dan fungsi baca-tulis direktori seperti yang ditentukan dalam antarmuka Userspace untuk dokumentasi FS Inkremental .
Selain itu, implementasi harus memiliki opsi mount dan file khusus yang secara fungsional cocok dengan implementasi sampel IncFS.
Berikut ini daftar perubahan yang diperlukan untuk implementasi:
- Siapkan mesin pengembangan untuk membangun kernel.
- Targetkan kernel umum dari cabang
common-android-mainline
.repo init -u https://android.googlesource.com/kernel/manifest -b common-android-mainline
repo sync
- Validasi bahwa perubahan berikut yang diperlukan untuk IncFS ada di checkout cabang:
- https://android-review.googlesource.com/c/kernel/common/+/1222869/
- https://android-review.googlesource.com/c/kernel/common/+/1222870
- https://android-review.googlesource.com/c/kernel/common/+/1222871
- https://android-review.googlesource.com/q/%2522ANDROID:+Inkremental+fs:%2522+branch:android-mainline+status:merg
- Tambahkan
CONFIG_INCREMENTAL_FS=y
atau hanya untuk Android 11 ,CONFIG_INCREMENTAL_FS=m
di bagian bawah filedefconfig
. Untuk melihat contohnya, klik salah satu link di bawah ini: - Bangun kernelnya
- Sematkan kernel ke dalam build image perangkat Android .
- Untuk perangkat Android target Anda, tambahkan salah satu baris properti sistem khusus vendor berikut ke file
device.mk
Anda ( opsional pada perangkat yang diluncurkan dengan Android 12 dan lebih tinggi ): -
PRODUCT_PROPERTY_OVERRIDES += \
-
ro.incremental.enable=yes
-
PRODUCT_PROPERTY_OVERRIDES += \
-
ro.incremental.enable=module:/vendor/lib/modules/incrementalfs.ko
- Lihat contoh file
device.mk
untuk emulator Android dan Pixel 4 . - Hanya untuk Android 11 : Jika Anda menggunakan
CONFIG_INCREMENTAL_FS=m
, tambahkan SE Linux Rules . -
vold.te
-
allow vold self:capability sys_module;
-
allow vold vendor_incremental_module:file r_file_perms;
-
allow vold vendor_incremental_module:system module_load;
-
file.te
file - Sebagai contoh, lihat filefile.te
ini.) - Driver sistem file tambahan
-
type vendor_incremental_module, vendor_file_type, file_type;
-
file_contents
file - Sebagai contoh, lihat filefile_contents
ini. -
# Incremental file system driver
-
/vendor/lib/modules/incrementalfs\.ko
-
u:object_r:vendor_incremental_module:s0
Saat Anda menggunakan CONFIG_INCREMENTAL_FS=y
, tambahkan file dengan salah satu dari ini:
Saat Anda menggunakan CONFIG_INCREMENTAL_FS=m
( hanya untuk Android 11 ), tambahkan file dengan salah satu dari ini:
Buat dan tambahkan file vold.te
ke folder /system/sepolicy/vendor
perangkat Anda dengan konten berikut:
Izinkan untuk memuat driver sistem file tambahan:
Tambahkan aturan SE Linux berikut ke file file.te
yang ada di folder /system/sepolicy/vendor
Anda:
Tambahkan aturan SE Linux berikut ke file file_contents
yang ada di folder /system/sepolicy/vendor
Anda:
Peningkatan driver kernel
Perangkat yang diupgrade ke Android 12 mungkin menyertakan driver IncFS versi lama. Untuk perangkat tersebut, AOSP menyarankan Anda memperbarui driver IncFS ke versi saat ini (dalam hal ini v2) karena alasan berikut:
- Versi yang dirilis dengan Android 11 merupakan implementasi awal IncFS, yang ditargetkan hanya untuk dukungan instalasi ADB.
- Android 12 menggunakan driver IncFS untuk streaming instalasi Play game, yang memerlukan fitur baru dan pengoptimalan IncFS v2 untuk pengalaman pengguna yang lebih baik.
- V1 mendukung streaming game, tetapi melakukannya dengan penalti kinerja dan penggunaan baterai, CPU, dan RAM yang lebih tinggi daripada v2.
- V2 memberikan UX yang lebih baik untuk streaming, dengan animasi kemajuan yang mulus, pelaporan penggunaan ruang disk yang tepat, dan pencegahan gangguan streaming aplikasi pihak ketiga.
Untuk memutakhirkan driver IncFS di kernel Anda, terapkan patch berikut untuk kernel 4.14 atau kernel 4.19:
- Tambalan Kernel 4.14
- Tambalan Kernel 4.19
Untuk semua versi kernel khusus lainnya, harap porting salah satu patchset. Mereka hanya mempengaruhi direktori fs/incfs
dan diterapkan dengan bersih ke kode v1 yang ada.
- Perbaikan Kernel 4.14 ke driver v1
- Kernel 4.19 diperbaiki ke driver v1
- Perbaikan Kernel 5.4 ke driver v1
Lanjutkan menggunakan driver IncFS dengan cara yang sama seperti Android 11 asli tetapi sekarang telah ditingkatkan, baik sebagai bagian bawaan dari image kernel, atau sebagai modul terpisah. Jangan mengubah konfigurasi board sistem atau properti sistem.
Perangkat baru yang menggunakan image kernel GKI mendapatkan driver IncFS terbaru (v2) secara otomatis, yang dikonfigurasi sebagai bagian dari image kernel. Ini tidak memerlukan langkah tambahan.
Konfigurasi modul yang dapat dimuat tidak digunakan lagi di Android 12, dan tidak didukung untuk perangkat baru. Ini hanya diperbolehkan untuk pemutakhiran, atau untuk pembekuan gambar vendor ketika kernel asli sudah membuatnya sebagai modul.
Implementasi referensi
Implementasi ini dapat dianggap sebagai bagian dari image kernel, atau ( hanya untuk Android 11 ) sebagai modul yang dapat dimuat.
Modul yang dapat dimuat (perangkat Pixel 4)- Tambahkan Modul Kernel Prebuilt
- Tambahkan dan Aktifkan Perubahan Properti Sistem Modul Kernel pada Perangkat
- Perbarui Aturan SE Linux
Validasi dan pengujian
Validasi implementasi menggunakan Feature Unit Tests, CTS dan GTS.
CTS
GunakanCtsIncrementalInstallHostTestCases
.GTS
atest GtsIncrementalInstallTestCases
:
/gts-tests/tests/packageinstaller/incremental/src/com/google/android/packageinstaller/incremental/gts/IncrementalInstallerTest.java
Uji IncFS
- Siapkan lingkungan pengembangan.
- Selesaikan tugas implementasi yang diuraikan di bagian implementasi.
- Jalankan tes manual berikut:
mmma system/incremental_delivery/incfs/tests
atest libincfs-test
atest IncrementalServiceTest
atest PackageManagerShellCommandTest
PackageManagerShellCommandIncrementalTest
Cara menguji IncFS dengan Android SDK (ADB dan apksigner)
- Siapkan lingkungan pengembangan.
- Selesaikan tugas implementasi yang diuraikan di bagian implementasi.
- Flash build pada perangkat fisik target atau emulator.
- Hasilkan atau dapatkan APK yang ada.
- Buat kunci penandatanganan debug .
- Tanda tangani APK dengan format tanda tangan v4 dari folder
build-tools
../apksigner sign --ks debug.keystore game.apk
- Instal APK di perangkat dari folder
platform-tools
../adb install game.apk
Temukan tes ini
- /android/kernel/common/tools/testing/selftests/filesystems/incfs/
- /android/system/incremental_delivery/incfs/tests/incfs_test.cpp
- /android/cts/tests/tests/content/src/android/content/pm/cts/PackageManagerShellCommandIncrementalTest.java