Partisi dinamis diimplementasikan menggunakan device-mapper dm-linear
pada kernel Linux. Partisi super
berisi
metadata yang mencantumkan nama dan rentang blok setiap partisi dinamis
dalam super
. Selama init
tahap pertama,
metadata diuraikan dan divalidasi, dan perangkat blok virtual dibuat untuk
yang mewakili setiap partisi dinamis.
Saat menerapkan OTA, partisi dinamis otomatis dibuat, diubah ukurannya, atau dihapus sesuai kebutuhan. Untuk perangkat A/B, ada dua salinan metadata, dan perubahan hanya diterapkan pada salinan yang mewakili slot target.
Karena partisi dinamis diimplementasikan
dalam ruang pengguna, partisi diperlukan
oleh {i>bootloader<i} tidak
dapat dibuat dinamis. Misalnya boot
,
dtbo
, dan vbmeta
dibaca oleh bootloader, dan
jadi harus tetap sebagai
partisi fisik.
Setiap partisi dinamis dapat dimasukkan ke grup update. Ini
grup membatasi ruang maksimum yang dapat digunakan oleh partisi dalam grup tersebut.
Misalnya, system
dan vendor
dapat menjadi bagian dari
yang membatasi ukuran total system
dan
vendor
.
Mengimplementasikan partisi dinamis pada perangkat baru
Bagian ini menjelaskan cara menerapkan partisi dinamis pada perangkat baru diluncurkan dengan Android 10 dan yang lebih tinggi. Untuk memperbarui perangkat yang ada, lihat Mengupgrade Android perangkat.
Perubahan partisi
Untuk perangkat yang diluncurkan dengan Android 10, buat
partisi yang disebut super
. super
partisi menangani slot A/B secara internal, sehingga perangkat A/B tidak perlu
partisi super_a
dan super_b
terpisah.
Semua partisi AOSP hanya-baca yang tidak digunakan oleh bootloader harus
bersifat dinamis dan harus dihapus dari Tabel Partisi GUID (GPT).
Partisi khusus vendor tidak harus dinamis dan dapat ditempatkan
dalam GPT.
Untuk memperkirakan ukuran super
, tambahkan ukuran
partisi yang dihapus dari GPT. Untuk perangkat A/B,
harus menyertakan
ukuran kedua slot. Gambar 1 menunjukkan
contoh tabel partisi sebelum dan sesudah melakukan konversi ke dinamis
partisi.
Partisi dinamis yang didukung adalah:
- Sistem
- Vendor
- Produk
- di Luar Sistem
- Pengelolaan Pesanan dan Pemenuhan Produk
Untuk perangkat yang diluncurkan dengan Android 10,
opsi command line kernel androidboot.super_partition
harus kosong agar perintah sysprop
ro.boot.super_partition
kosong.
Perataan partisi
Modul mapper perangkat mungkin
beroperasi kurang efisien jika
Partisi super
tidak disejajarkan dengan benar. Tujuan
Partisi super
HARUS diselaraskan dengan I/O minimum
ukuran permintaan seperti yang ditentukan oleh lapisan blok. Secara default,
sistem build (melalui lpmake
, yang menghasilkan
gambar partisi super
), mengasumsikan bahwa penyelarasan 1 MiB
sudah cukup untuk setiap partisi dinamis. Namun, vendor harus
pastikan partisi super
diselaraskan dengan benar.
Anda bisa menentukan ukuran permintaan minimum
perangkat blok dengan
memeriksa sysfs
. Contoh:
# ls -l /dev/block/by-name/super lrwxrwxrwx 1 root root 16 1970-04-05 01:41 /dev/block/by-name/super -> /dev/block/sda17 # cat /sys/block/sda/queue/minimum_io_size 786432
Anda dapat memverifikasi perataan partisi super
dalam file
serupa:
# cat /sys/block/sda/sda17/alignment_offset
Offset perataan HARUS 0.
Perubahan konfigurasi perangkat
Untuk mengaktifkan partisi dinamis, tambahkan flag berikut di
device.mk
:
PRODUCT_USE_DYNAMIC_PARTITIONS := true
Perubahan konfigurasi board
Anda harus menetapkan ukuran partisi super
:
BOARD_SUPER_PARTITION_SIZE := <size-in-bytes>
Pada perangkat A/B, sistem build akan menampilkan error jika ukuran total
lebih dari setengah super
image partisi dinamis
ukuran partisi.
Anda dapat mengonfigurasi daftar partisi dinamis sebagai berikut. Sebagai
perangkat menggunakan grup pembaruan, buat daftar grup dalam
Variabel BOARD_SUPER_PARTITION_GROUPS
. Setiap nama grup
kemudian memiliki BOARD_group_SIZE
dan BOARD_group_PARTITION_LIST
.
Untuk perangkat A/B, ukuran maksimum grup hanya boleh mencakup satu
{i>slot <i}karena nama grup telah
diakhiri slot secara internal.
Berikut adalah contoh perangkat yang menempatkan semua partisi ke dalam sebuah grup
disebut example_dynamic_partitions
:
BOARD_SUPER_PARTITION_GROUPS := example_dynamic_partitions BOARD_EXAMPLE_DYNAMIC_PARTITIONS_SIZE := 6442450944 BOARD_EXAMPLE_DYNAMIC_PARTITIONS_PARTITION_LIST := system vendor product
Berikut adalah contoh perangkat yang menempatkan layanan produk dan sistem ke dalam
group_foo
, dan vendor
, product
,
dan odm
ke dalam group_bar
:
BOARD_SUPER_PARTITION_GROUPS := group_foo group_bar BOARD_GROUP_FOO_SIZE := 4831838208 BOARD_GROUP_FOO_PARTITION_LIST := system product_services BOARD_GROUP_BAR_SIZE := 1610612736 BOARD_GROUP_BAR_PARTITION_LIST := vendor product odm
-
Untuk perangkat peluncuran A/B Virtual, jumlah ukuran maksimum semua grup harus
maksimal:
BOARD_SUPER_PARTITION_SIZE
- overhead
Lihat Mengimplementasikan A/B Virtual. -
Untuk perangkat peluncuran A/B, jumlah ukuran maksimum semua grup harus
menjadi:
BOARD_SUPER_PARTITION_SIZE
/ 2 - overhead -
Untuk perangkat non-A/B dan retrofit perangkat A/B, jumlah
ukuran semua grup harus:
BOARD_SUPER_PARTITION_SIZE
- overhead - Pada waktu build, jumlah ukuran image setiap partisi dalam grup update tidak boleh melebihi ukuran maksimum grup.
- Overhead diperlukan dalam komputasi untuk memperhitungkan metadata, keselarasan, dan sebagainya. Overhead yang wajar adalah 4 MiB, tetapi Anda dapat memilih overhead yang lebih besar sesuai kebutuhan perangkat.
Mengukur partisi dinamis
Sebelum partisi dinamis, ukuran partisi dialokasikan secara berlebihan untuk memastikan bahwa mereka memiliki cukup ruang untuk pembaruan berikutnya. Ukuran sebenarnya digunakan sebagaimana adanya dan sebagian besar partisi {i>read-only<i} memiliki beberapa ruang penyimpanan di sistem file mereka. Dalam partisi dinamis, ruang kosong itu tidak dapat digunakan dan dapat digunakan untuk mengembangkan partisi selama OTA. Sangat penting untuk memastikan bahwa partisi tidak membuang-buang ruang dan dialokasikan ke ukuran yang seminimal mungkin.
Untuk image ext4 hanya-baca, sistem build secara otomatis mengalokasikan ukuran minimum jika tidak ada ukuran partisi {i>hardcode<i} yang ditentukan. Tujuan sesuai dengan gambar sehingga sistem file hanya memiliki sedikit ruang yang tidak digunakan mungkin. Hal ini memastikan bahwa perangkat tidak terbuang yang dapat digunakan untuk OTA.
Selain itu, gambar ext4 dapat dikompresi lebih lanjut dengan mengaktifkan penghapusan duplikat. Untuk mengaktifkannya, gunakan konfigurasi berikut:
BOARD_EXT4_SHARE_DUP_BLOCKS := true
Jika alokasi otomatis ukuran minimum partisi tidak diinginkan,
ada dua cara untuk
mengontrol ukuran partisi. Anda dapat menentukan
jumlah minimum ruang kosong dengan
BOARD_partitionIMAGE_PARTITION_RESERVED_SIZE
,
atau Anda bisa menentukan
BOARD_partitionIMAGE_PARTITION_SIZE
untuk memaksa
partisi dinamis ke ukuran tertentu. Tak satu pun dari ini adalah
direkomendasikan kecuali jika diperlukan.
Contoh:
BOARD_PRODUCTIMAGE_PARTITION_RESERVED_SIZE := 52428800
Tindakan ini memaksa sistem file di product.img
untuk memiliki
50 MiB ruang yang tidak digunakan.
Perubahan sistem sebagai root
Perangkat yang diluncurkan dengan Android 10 tidak boleh menggunakan {i>system-as-root<i}.
Perangkat dengan partisi dinamis (baik yang diluncurkan dengan maupun yang retrofit
dinamis) tidak boleh menggunakan {i>system-as-root<i}. Kernel Linux tidak bisa
menafsirkan partisi super
sehingga tidak dapat dipasang
system
itu sendiri. system
kini dipasang oleh
tahap pertama init
, yang berada dalam ramdisk.
Jangan setel BOARD_BUILD_SYSTEM_ROOT_IMAGE
. Di beberapa
Android 10,
Flag BOARD_BUILD_SYSTEM_ROOT_IMAGE
hanya digunakan untuk
membedakan apakah sistem dipasang
oleh {i>kernel<i} atau oleh
init
tahap pertama di ramdisk.
Menetapkan BOARD_BUILD_SYSTEM_ROOT_IMAGE
ke true
yang menyebabkan error build
PRODUCT_USE_DYNAMIC_PARTITIONS
juga true
.
Jika BOARD_USES_RECOVERY_AS_BOOT
ditetapkan ke true,
image pemulihan dibangun sebagai boot.img, yang berisi konfigurasi
ramdisk. Sebelumnya, bootloader menggunakan kernel skip_initramfs
parameter baris perintah untuk menentukan
mode mana yang akan di-{i>booting<i}. Sebagai
Perangkat Android 10, bootloader TIDAK BOLEH lulus
skip_initramfs
ke command line kernel. Sebagai gantinya, bootloader
harus melewati androidboot.force_normal_boot=1
untuk melewati pemulihan
dan mem-booting Android normal. Perangkat yang diluncurkan dengan Android 12
atau yang lebih baru harus menggunakan bootconfig untuk meneruskan androidboot.force_normal_boot=1
.
Perubahan konfigurasi AVB
Saat menggunakan Android Booting Terverifikasi 2.0, jika perangkat tidak menggunakan partisi berantai deskripsi, maka tidak diperlukan perubahan. Jika menggunakan rantai partisi, namun, dan salah satu partisi terverifikasi bersifat dinamis, maka perubahan diperlukan.
Berikut adalah contoh konfigurasi
untuk perangkat yang rantai
vbmeta
untuk system
dan
Partisi vendor
.
BOARD_AVB_SYSTEM_KEY_PATH := external/avb/test/data/testkey_rsa2048.pem BOARD_AVB_SYSTEM_ALGORITHM := SHA256_RSA2048 BOARD_AVB_SYSTEM_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP) BOARD_AVB_SYSTEM_ROLLBACK_INDEX_LOCATION := 1 BOARD_AVB_VENDOR_KEY_PATH := external/avb/test/data/testkey_rsa2048.pem BOARD_AVB_VENDOR_ALGORITHM := SHA256_RSA2048 BOARD_AVB_VENDOR_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP) BOARD_AVB_VENDOR_ROLLBACK_INDEX_LOCATION := 1
Dengan konfigurasi ini, bootloader akan menemukan file vbmeta
footer di akhir system
dan
Partisi vendor
. Karena partisi ini tidak lagi
terlihat oleh bootloader (mereka berada di super
), dua
diperlukan perubahan.
-
Menambahkan
vbmeta_system
danvbmeta_vendor
partisi ke tabel partisi perangkat. Untuk perangkat A/B, tambahkanvbmeta_system_a
,vbmeta_system_b
,vbmeta_vendor_a
, danvbmeta_vendor_b
. Jika menambahkan satu atau beberapa partisi ini, ukurannya harus sama sebagai partisivbmeta
. -
Ganti nama flag konfigurasi dengan menambahkan
VBMETA_
dan menentukan partisi mana yang diperluas oleh rantai:BOARD_AVB_VBMETA_SYSTEM := system BOARD_AVB_VBMETA_SYSTEM_KEY_PATH := external/avb/test/data/testkey_rsa2048.pem BOARD_AVB_VBMETA_SYSTEM_ALGORITHM := SHA256_RSA2048 BOARD_AVB_VBMETA_SYSTEM_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP) BOARD_AVB_VBMETA_SYSTEM_ROLLBACK_INDEX_LOCATION := 1 BOARD_AVB_VBMETA_VENDOR := vendor BOARD_AVB_VBMETA_VENDOR_KEY_PATH := external/avb/test/data/testkey_rsa2048.pem BOARD_AVB_VBMETA_VENDOR_ALGORITHM := SHA256_RSA2048 BOARD_AVB_VBMETA_VENDOR_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP) BOARD_AVB_VBMETA_VENDOR_ROLLBACK_INDEX_LOCATION := 1
Perangkat mungkin menggunakan salah satu, keduanya, atau tidak menggunakan partisi ini. Perubahan diperlukan hanya saat membuat rantai ke partisi logis.
Perubahan bootloader AVB
Jika bootloader telah menyematkan libavb, menyertakan patch berikut:
- 818cf56740775446285466eda984acedd4baeac0 — "libavb: Hanya buat kueri GUID partisi saat cmdline memerlukan mereka".
- 5abd6bc2578968d24406d834471adfd995a0c2e9 — "Izinkan partisi sistem agar tidak ada"
- 9ba3b6613b4e5130fa01a11d984c6b5f0eb3af05 — "Fix AvbSlotVerifyData->cmdline mungkin NULL"
Jika menggunakan partisi berantai, sertakan patch tambahan:
- 49936b4c0109411fdd38bd4ba3a32a01c40439a9 — "libavb: Mendukung vbmeta blobs di awal partisi."
Perubahan command line kernel
Parameter baru, androidboot.boot_devices
, harus ditambahkan
ke baris perintah {i>kernel<i}. ID ini digunakan oleh init
untuk
mengaktifkan /dev/block/by-name
symlink. Ini harusnya
komponen jalur perangkat ke symlink menurut nama yang mendasarinya yang dibuat oleh
ueventd
, yaitu,
/dev/block/platform/device-path/by-name/partition-name
.
Perangkat yang diluncurkan dengan Android 12 atau yang lebih baru harus menggunakan
bootconfig untuk meneruskan androidboot.boot_devices
ke init
.
Misalnya, jika {i>symlink<i}
menurut nama partisi super adalah
/dev/block/platform/soc/100000.ufshc/by-name/super
,
Anda dapat menambahkan parameter baris
perintah dalam file BoardConfig.mk sebagai
berikut ini:
BOARD_KERNEL_CMDLINE += androidboot.boot_devices=soc/100000.ufshcAnda dapat menambahkan parameter bootconfig dalam file BoardConfig.mk sebagai berikut:
BOARD_BOOTCONFIG += androidboot.boot_devices=soc/100000.ufshc
perubahan fstab
Overlay hierarki perangkat dan hierarki perangkat tidak boleh berisi fstab entri. Gunakan file fstab yang akan menjadi bagian dari ramdisk.
Perubahan harus dilakukan pada file fstab untuk partisi logis:
-
Kolom flag fs_mgr harus menyertakan tanda
logical
dan flagfirst_stage_mount
, yang diperkenalkan di Android 10, yang menunjukkan bahwa partisi akan dipasang pada tahap pertama. -
Partisi dapat menentukan
avb=vbmeta partition name
sebagai Flagfs_mgr
, laluvbmeta
yang ditentukan partisi diinisialisasi oleh tahap pertamainit
sebelum mencoba memasang perangkat apa pun. -
Kolom
dev
harus berupa nama partisi.
Entri fstab berikut menetapkan sistem, vendor, dan produk sebagai logis partisi dengan mengikuti aturan di atas.
#<dev> <mnt_point> <type> <mnt_flags options> <fs_mgr_flags> system /system ext4 ro,barrier=1 wait,slotselect,avb=vbmeta,logical,first_stage_mount vendor /vendor ext4 ro,barrier=1 wait,slotselect,avb,logical,first_stage_mount product /product ext4 ro,barrier=1 wait,slotselect,avb,logical,first_stage_mount
Salin file fstab ke ramdisk tahap pertama.
Perubahan SELinux
Perangkat blok partisi super harus ditandai dengan label
super_block_device
. Misalnya, jika {i>symlink<i}
menurut nama partisi super adalah
/dev/block/platform/soc/100000.ufshc/by-name/super
,
tambahkan baris berikut ke file_contexts
:
/dev/block/platform/soc/10000\.ufshc/by-name/super u:object_r:super_block_device:s0
fastboot
Bootloader (atau alat flash non-userspace) tidak memahami dinamis, sehingga tidak dapat di-{i>flash<i}. Untuk mengatasinya, perangkat harus menggunakan implementasi ruang-pengguna dari protokol {i>fastboot<i}, yang disebut {i>fastbootd<i}.
Untuk mengetahui informasi selengkapnya tentang cara menerapkan fastbootd, lihat Memindahkan Fastboot ke User Space.
pemasangan ulang adb
Untuk developer yang menggunakan build eng atau userdebug, adb remount
sangat berguna untuk iterasi yang cepat. Partisi dinamis menampilkan
masalah untuk adb remount
karena tidak ada lagi paket gratis
ruang di dalam setiap sistem file. Untuk mengatasinya, perangkat dapat mengaktifkan
overlayfs. Selama ada ruang kosong
di dalam partisi super,
adb remount
otomatis membuat dinamis sementara
dan menggunakan overlayfs untuk penulisan. Partisi sementara adalah
bernama scratch
, jadi jangan gunakan nama ini untuk orang lain
partisi.
Untuk informasi selengkapnya tentang cara mengaktifkan overlay, lihat overlayf README di AOSP.
Mengupgrade perangkat Android
Jika Anda mengupgrade perangkat ke Android 10, dan ingin menyertakan dukungan partisi dinamis di OTA, Anda tidak perlu mengubah tabel partisi {i>built-in<i}. Beberapa konfigurasi tambahan tidak diperlukan.
Perubahan konfigurasi perangkat
Untuk memperbaiki partisi dinamis, tambahkan flag berikut di
device.mk
:
PRODUCT_USE_DYNAMIC_PARTITIONS := true PRODUCT_RETROFIT_DYNAMIC_PARTITIONS := true
Perubahan konfigurasi board
Anda harus menetapkan variabel board berikut:
- Setel
BOARD_SUPER_PARTITION_BLOCK_DEVICES
ke daftar perangkat blok yang digunakan untuk menyimpan luasnya partisi dinamis. Ini adalah daftar nama nama fisik yang ada partisi pada perangkat. - Setel
BOARD_SUPER_PARTITION_partition_DEVICE_SIZE
ke ukuran dari setiap perangkat blok diBOARD_SUPER_PARTITION_BLOCK_DEVICES
. Ini adalah daftar ukuran partisi fisik yang ada di perangkat. Hal ini biasanyaBOARD_partitionIMAGE_PARTITION_SIZE
pada papan yang ada konfigurasi standar. - Batalkan penetapan
BOARD_partitionIMAGE_PARTITION_SIZE
yang ada untuk semua partisi diBOARD_SUPER_PARTITION_BLOCK_DEVICES
. - Tetapkan
BOARD_SUPER_PARTITION_SIZE
ke jumlah dariBOARD_SUPER_PARTITION_partition_DEVICE_SIZE
. - Setel
BOARD_SUPER_PARTITION_METADATA_DEVICE
ke perangkat blok tempat metadata partisi dinamis. Ini harus berupa salah satuBOARD_SUPER_PARTITION_BLOCK_DEVICES
. Biasanya, ini diatur kesystem
. - Setel
BOARD_SUPER_PARTITION_GROUPS
,BOARD_group_SIZE
danBOARD_group_PARTITION_LIST
. Lihat Perubahan konfigurasi Board di perangkat baru untuk mengetahui detailnya.
Misalnya, jika perangkat sudah memiliki partisi sistem dan vendor, dan Anda ingin mengonversi ke partisi dinamis dan menambahkan partisi produk baru selama update, setel konfigurasi board ini:
BOARD_SUPER_PARTITION_BLOCK_DEVICES := system vendor BOARD_SUPER_PARTITION_METADATA_DEVICE := system # Rename BOARD_SYSTEMIMAGE_PARTITION_SIZE to BOARD_SUPER_PARTITION_SYSTEM_DEVICE_SIZE. BOARD_SUPER_PARTITION_SYSTEM_DEVICE_SIZE := <size-in-bytes> # Rename BOARD_VENDORIMAGE_PARTITION_SIZE to BOARD_SUPER_PARTITION_VENDOR_DEVICE_SIZE BOARD_SUPER_PARTITION_VENDOR_DEVICE_SIZE := <size-in-bytes> # This is BOARD_SUPER_PARTITION_SYSTEM_DEVICE_SIZE + BOARD_SUPER_PARTITION_VENDOR_DEVICE_SIZE BOARD_SUPER_PARTITION_SIZE := <size-in-bytes> # Configuration for dynamic partitions. For example: BOARD_SUPER_PARTITION_GROUPS := group_foo BOARD_GROUP_FOO_SIZE := <size-in-bytes> BOARD_GROUP_FOO_PARTITION_LIST := system vendor product
Perubahan SELinux
Perangkat blok partisi super harus ditandai dengan atribut
super_block_device_type
. Misalnya, jika perangkat sudah memiliki
Partisi system
dan vendor
, Anda ingin menggunakannya sebagai blok
perangkat untuk menyimpan luasnya partisi dinamis, dan symlink menurut namanya ditandai sebagai
system_block_device
:
/dev/block/platform/soc/10000\.ufshc/by-name/system u:object_r:system_block_device:s0 /dev/block/platform/soc/10000\.ufshc/by-name/vendor u:object_r:system_block_device:s0
Kemudian, tambahkan baris berikut ke device.te
:
typeattribute system_block_device super_block_device_type;
Untuk konfigurasi lainnya, lihat Menerapkan partisi dinamis pada perangkat baru.
Untuk informasi selengkapnya tentang update retrofit, lihat OTA untuk Perangkat A/B tanpa Dynamic Partisi.
Setelan pabrik
Untuk peluncuran perangkat dengan dukungan partisi dinamis, hindari penggunaan {i>userspace fastboot<i} untuk mem-flash setelan pabrik, karena {i>booting<i} ke ruang pengguna lebih lambat dibandingkan metode flash lainnya.
Untuk mengatasinya, make dist
kini membuat
super.img
gambar yang dapat di-flash langsung ke super
partisi. Paket ini secara otomatis menggabungkan
partisi, yang berarti berisi system.img
,
vendor.img
, dan seterusnya, selain super
metadata partisi. Gambar ini dapat di-flash langsung ke
Partisi super
tanpa alat tambahan atau penggunaan
{i>fastbootd<i}. Setelah build, super.img
ditempatkan di
${ANDROID_PRODUCT_OUT}
.
Untuk perangkat A/B yang
diluncurkan dengan partisi dinamis,
super.img
berisi gambar dalam slot A. Setelah mem-flash
super image secara langsung, tandai slot A sebagai bootable sebelum me-reboot
perangkat seluler.
Untuk perangkat retrofit, make dist
mem-build kumpulan
super_*.img
gambar yang dapat di-flash langsung ke
partisi fisik yang sesuai. Misalnya, make dist
build super_system.img
dan super_vendor.img
jika BOARD_SUPER_PARTITION_BLOCK_DEVICES
adalah sistem
vendor. Image ini ditempatkan di folder OTA di
target_files.zip
.
Penyesuaian perangkat penyimpanan mapper perangkat
Partisi dinamis mengakomodasi sejumlah peta perangkat yang tidak menentukan objek terstruktur dalam jumlah besar. Ini mungkin tidak semuanya dibuat instance-nya seperti yang diharapkan, jadi Anda harus melacak semua pemasangan, dan memperbarui properti Android dari semua partisi terkait dengan perangkat penyimpanan yang mendasarinya.
Mekanisme di dalam init
melacak pemasangan dan secara asinkron
memperbarui properti Android. Jumlah waktu yang dibutuhkan tidak dijamin
dalam jangka waktu tertentu, sehingga Anda harus menyediakan waktu yang cukup
untuk semua pemicu on property
yang akan bereaksi. Propertinya adalah
dev.mnt.blk.<partition>
di mana
<partition>
adalah root
,
system
, data
, atau
vendor
, misalnya. Setiap properti dikaitkan dengan
nama perangkat penyimpanan dasar, seperti yang ditunjukkan dalam contoh berikut:
taimen:/ % getprop | grep dev.mnt.blk [dev.mnt.blk.data]: [sda] [dev.mnt.blk.firmware]: [sde] [dev.mnt.blk.metadata]: [sde] [dev.mnt.blk.persist]: [sda] [dev.mnt.blk.root]: [dm-0] [dev.mnt.blk.vendor]: [dm-1] blueline:/ $ getprop | grep dev.mnt.blk [dev.mnt.blk.data]: [dm-4] [dev.mnt.blk.metadata]: [sda] [dev.mnt.blk.mnt.scratch]: [sda] [dev.mnt.blk.mnt.vendor.persist]: [sdf] [dev.mnt.blk.product]: [dm-2] [dev.mnt.blk.root]: [dm-0] [dev.mnt.blk.system_ext]: [dm-3] [dev.mnt.blk.vendor]: [dm-1] [dev.mnt.blk.vendor.firmware_mnt]: [sda]
Bahasa init.rc
memungkinkan properti Android
diperluas sebagai bagian dari aturan, dan perangkat penyimpanan dapat disesuaikan oleh platform
sesuai kebutuhan dengan perintah seperti berikut:
write /sys/block/${dev.mnt.blk.root}/queue/read_ahead_kb 128 write /sys/block/${dev.mnt.blk.data}/queue/read_ahead_kb 128
Setelah pemrosesan perintah dimulai di init
tahap kedua,
epoll loop
menjadi aktif, dan nilai mulai diperbarui. Namun,
karena pemicu properti tidak aktif sampai akhir init
, pemicu tersebut
tidak dapat digunakan pada tahap booting awal untuk menangani root
,
system
, atau vendor
. Anda mungkin mengharapkan
default kernel read_ahead_kb
cukup memadai hingga
Skrip init.rc
dapat diganti di early-fs
(saat
berbagai {i>daemon<i} dan
fasilitas dimulai). Oleh karena itu, Google
merekomendasikan agar
Anda akan menggunakan fitur on property
, ditambah dengan
Properti yang dikontrol init.rc
seperti sys.read_ahead_kb
,
untuk menangani pengaturan waktu operasi dan untuk
mencegah kondisi race, seperti dalam
contoh:
on property:dev.mnt.blk.root=* && property:sys.read_ahead_kb=* write /sys/block/${dev.mnt.blk.root}/queue/read_ahead_kb ${sys.read_ahead_kb:-2048} on property:dev.mnt.blk.system=* && property:sys.read_ahead_kb=* write /sys/block/${dev.mnt.blk.system}/queue/read_ahead_kb ${sys.read_ahead_kb:-2048} on property:dev.mnt.blk.vendor=* && property:sys.read_ahead_kb=* write /sys/block/${dev.mnt.blk.vendor}/queue/read_ahead_kb ${sys.read_ahead_kb:-2048} on property:dev.mnt.blk.product=* && property:sys.read_ahead_kb=* write /sys/block/${dev.mnt.blk.system_ext}/queue/read_ahead_kb ${sys.read_ahead_kb:-2048} on property:dev.mnt.blk.oem=* && property:sys.read_ahead_kb=* write /sys/block/${dev.mnt.blk.oem}/queue/read_ahead_kb ${sys.read_ahead_kb:-2048} on property:dev.mnt.blk.data=* && property:sys.read_ahead_kb=* write /sys/block/${dev.mnt.blk.data}/queue/read_ahead_kb ${sys.read_ahead_kb:-2048} on early-fs: setprop sys.read_ahead_kb ${ro.read_ahead_kb.boot:-2048} on property:sys.boot_completed=1 setprop sys.read_ahead_kb ${ro.read_ahead_kb.bootcomplete:-128}