Artikel ini menjelaskan cara meningkatkan performa dengan mengidentifikasi dan menghapus paket yang tidak diperlukan untuk {i>System User<i}.
Menonaktifkan paket yang tidak diperlukan
Di Otomotif, Pengguna Sistem headless, yang berarti Pengguna Sistem tidak dimaksudkan untuk digunakan atau diakses langsung oleh manusia. Akibatnya, banyak aplikasi dan layanan tidak perlu dijalankan di {i>System User<i} dan dapat dinonaktifkan untuk meningkatkan performa. Oleh karena itu, tersedia opsi untuk menghapus aplikasi yang tidak diperlukan bagi Pengguna Sistem (Pengguna 0).
Di halaman ini, ada dua jenis Pengguna yang dibahas:
- SISTEM. Selalu Pengguna 0
- LENGKAP. Pengguna yang dimaksudkan untuk digunakan oleh manusia (bukan Pengguna Sistem), Pengguna 10+
Android 11
Di Android 11, Anda mengubah konfigurasi,
config_userTypePackageWhitelistMode
.
Tanda dapat digabungkan. Dalam hal ini, 5
sama dengan 1
ditambah 4
(kombinasi tanda 1
dan 4
).
Flag | Deskripsi |
---|---|
0 |
Nonaktifkan daftar yang diizinkan. Menginstal semua paket sistem; tanpa {i>logging<i}. |
1 |
Terapkan. Instal paket sistem hanya jika paket tersebut diizinkan. |
2 |
Catat paket yang tidak diizinkan. |
4 |
Paket apa pun yang tidak disebutkan dalam file daftar yang diizinkan akan masuk ke daftar yang diizinkan secara implisit untuk semua pengguna. |
8 |
Sama seperti 4 , untuk pengguna Sistem. |
16 |
Abaikan OTA . Jangan menginstal paket sistem selama proses OTA. |
- Guna mengaktifkan fitur untuk daftar yang diizinkan yang lengkap,
1
(diterapkan sepenuhnya) - Untuk mengaktifkan fitur daftar yang diizinkan yang tidak lengkap,
5
- Untuk mengaktifkan fitur bagi pengguna
SYSTEM
guna memudahkan pengembangan lokal,9
(daftar yang diizinkan implisit) - Untuk menonaktifkan fitur seolah-olah fitur tersebut tidak pernah diaktifkan,
16
- Untuk menonaktifkan fitur dan mengurungkan semua efek sebelumnya,
0
Pastikan untuk menginstal file XML di direktori sysconfig
untuk perangkat
(ini adalah direktori yang sama yang berisi makefile (`.mk`) yang digunakan untuk membangun
image sistem untuk perangkat). Saat Anda memberi nama file XML, sertakan lokasinya
tempat paket
ditentukan di dalam build. Misalnya, preinstalled-packages-product-car-CAR_PRODUCT_NAME.xml
.
<!- this package will be installed for both FULL and SYSTEM user --> <install-in-user-type package="com.android.bluetooth"-> <install-in user-type="FULL" /-> <install-in user-type="SYSTEM" /-> </install-in-user-type-> <!- this package will only be installed for both FULL user --> <install-in-user-type package="com.android.car.calendar"-> <install-in user-type="FULL" > </install-in-user-type->
Android 9 dan Android 10
Untuk mengonfigurasi fitur ini di Android 9 dan Android 10:
- Buat overlay
config_systemUserPackagesBlacklistSupported
dariframeworks/base/core/res/res/values/config.xml
lalu tetapkan menjaditrue
. Jika fitur ini diaktifkan, secara default, semua paket harus diinstal untuk {i>System User<i} dan Pengguna LENGKAP. - Buat daftar file
config.xml
paket mana yang seharusnya dinonaktifkan untuk Pengguna Sistem. Contoh:<config> <!-- This package will be uninstalled for the system user --> <system-user-blacklisted-app package="com.google.car.calendar" /> </config>
- Tambahkan baris ke
device.mk
untuk menyalin file ke folder targetsystem/etc/sysconfig/
. Contoh:PRODUCT_COPY_FILES += <full path to the config file>:system/etc/sysconfig/<new denylist config file>.xml
Memverifikasi hasilnya
Untuk memverifikasi hasilnya, jalankan:
$ adb shell dumpsys user | grep PACKAGE_SUBSTRING $ adb shell pm list packages --user USER_ID PACKAGE_SUBSTRING $ adb shell cmd user report-system-user-package-whitelist-problems
Premis
Untuk menentukan apakah sebuah paket harus diinstal di {i>System User<i}, periksa
file AndroidManifest.xml
paket yang terletak di root
sumber proyek, termasuk atribut aplikasi dan komponen
aplikasi, yang mencakup semua aktivitas, layanan, penerima siaran, dan konten
penyedia layanan. Untuk mempelajari lebih lanjut, lihat Aplikasi
Ringkasan Manifes.
Gambar 1. Nonaktifkan alur kerja paket
Tingkat 1, tingkat aplikasi
1. Memeriksa apakah aplikasi (atau komponen aplikasi) dideklarasikan sebagai singleton
Jika aplikasi adalah singleton, sistem akan membuat instance aplikasi hanya di {i>System User<i}. Kemungkinan aplikasi dimaksudkan untuk menjadi aplikasi yang {i>multiuser-aware<i}. Untuk mempelajari lebih lanjut tentang multi-pengguna aplikasi, lihat Membuat Aplikasi Multipengguna.
- Periksa manifes Android untuk
android:singleUser="true"
. - Jika true, masukkan daftar yang diizinkan. Dibutuhkan untuk Pengguna Sistem.
- Jika false, lanjutkan. Periksa kriteria lain sebelum menghapus.
2. Memeriksa apakah aplikasi memerlukan akses penyimpanan yang dilindungi
Banyak layanan {i>booting<i} sistem sering kali mengandalkan penyimpanan yang dienkripsi dengan perangkat (DE) dari penyimpanan yang dienkripsi dengan kredensial (CE). Selain itu, aplikasi sistem yang sadar booting juga bergantung pada penyimpanan yang dienkripsi dengan perangkat. Untuk mempelajari lebih lanjut aplikasi yang sadar booting, lihat Mendukung Direct Boot di aplikasi sistem.
- Periksa manifes Android untuk
android:defaultToDeviceProtectedStorage="true"
, yang diperlukan untuk banyak layanan {i>booting<i} sistem. - Jika true, masukkan daftar yang diizinkan.
- Jika false, lanjutkan.
Level 2, komponen aplikasi
Aktivitas
Untuk mempelajari aktivitas lebih lanjut, lihat Pengantar ke Aktivitas.
a. Memeriksa apakah aplikasi hanya berisi aktivitas
Aktivitas berorientasi pada antarmuka pengguna. Karena Pengguna Sistem adalah headless di Otomotif, tidak ada manusia yang harus berinteraksi dengan Pengguna Sistem. Akibatnya, jika aplikasi hanya berisi Aktivitas, aplikasi kemungkinan besar tidak relevan dengan Pengguna Sistem.
Periksa prioritas dan hak istimewa khusus.
- Jika Yes, mungkin diperlukan untuk Pengguna Sistem.
- Jika Tidak, jangan izinkan Pengguna Sistem.
Misalnya, Compatibility Test Suite (CTS)
(com.android.cts.priv.ctsshim
) hanya berisi Aktivitas, dan
Aktivitas ditetapkan untuk menguji filter intent. Namun, karena memiliki
istimewa, akses itu perlu diinstal
untuk {i>System User<i} untuk tujuan pengujian.
Layanan
Untuk mempelajari layanan lebih lanjut, lihat Ringkasan layanan.
b. Memeriksa apakah layanan dideklarasikan sebagai pribadi dan tidak dapat diakses dari aplikasi lain
Jika layanan dideklarasikan sebagai pribadi, paket lain tidak akan menggunakan
layanan. Cari android:exported="false"
. Jika layanan dideklarasikan
bersifat pribadi atau tidak dapat diakses dari aplikasi lain, maka aplikasi tidak dapat terikat oleh
aplikasi lain. Oleh karena itu, Langkah C dan Langkah D di bawah tidak relevan. Hasilnya,
komponen ini tidak akan memberikan lebih banyak petunjuk
mengenai apakah layanan tersebut diperlukan atau tidak
untuk Pengguna Sistem.
- Jika Ya, periksa komponen berikutnya.
- Jika Tidak, lanjutkan pemeriksaan komponen ini.
sekitar tahun Periksa apakah aplikasi yang diinstal di Pengguna Sistem mungkin terikat ke layanan ini
Periksa paket yang diizinkan di Level 1 dan identifikasi layanan yang
mereka terikat. Rekaman aktivitas dari filter intent di layanan ini dan startService
pada paket lain.
Jika layanan ini terikat dengan aplikasi yang diinstal di Pengguna Sistem (misalnya,
com.android.car.companiondevicesupport
diizinkan untuk berjalan di
Pengguna Sistem), lalu izinkan layanan.
- Jika Ya, tambahkan ke daftar yang diizinkan.
- Jika Tidak, lanjutkan pemeriksaan komponen ini.
d. Memeriksa apakah layanan terikat dari aplikasi lain dan dideklarasikan untuk berjalan di latar depan
Cari startForeground
. Ini berarti orang-orang
akan berinteraksi dengan
aplikasi di latar depan. Kemungkinan besar, layanan ini
tidak akan diperlukan untuk
Pengguna Sistem dan tidak perlu diizinkan.
- Jika Ya, jangan izinkan.
- Jika Tidak, lanjutkan untuk memeriksa komponen berikutnya.
e. Memeriksa apakah layanan ditetapkan untuk dijalankan dalam proses sistem
Di AndroidManifest, cari android:process="system"
.
Jika layanan sengaja didefinisikan
untuk berjalan dalam proses sistem, maka
artinya secara eksplisit akan berjalan
dalam proses yang sama dengan layanan sistem dan
harus diizinkan untuk
dijalankan di {i>System User<i}. Sebagai bagian dari memori Android
desain alokasi, layanan sistem adalah
beberapa proses terakhir yang harus dimatikan,
yang menyiratkan kekritisan layanan
yang didefinisikan dengan atribut tersebut. Kepada
Pelajari desain alokasi memori Android lebih lanjut, lihat Memori rendah
yang mengagumkan.
- Jika Ya, jangan izinkan.
- Jika Tidak, lanjutkan periksa komponen lainnya.
Misalnya, paket com.android.networkstack.inprocess
harus
diizinkan karena berisi RegularMaintenanceJobService
, yang
memiliki tag android:process="system"
.
Penyedia konten
Untuk mempelajari lebih lanjut penyedia konten, lihat Penyedia konten.
f. Periksa apakah aplikasi yang diinstal di System User bergantung pada penyedia ini
Memeriksa paket yang diizinkan di Level 1 dan memeriksa penyedia yang diizinkan
bergantung padanya. Jika aplikasi berjalan di System User (misalnya,
com.android.car.companiondevicesupport
diizinkan untuk berjalan di
(Pengguna Sistem) dan bergantung pada penyedia konten ini, maka pastikan bahwa
juga diizinkan.
- Jika Ya, masukkan daftar yang diizinkan.
- Jika Tidak, jangan izinkan.
Misalnya, jika com.android.car.EXAMPLE
berisi singleton
penyedia (SystemActionsContentProvider
dan
ManagedProvisioningActionsContentProvider
), seharusnya
untuk Pengguna Sistem. Lalu, jika com.android.car.EXAMPLE
bergantung pada android.webkit
untuk WebViewFactoryProvider
maka, com.android.webview
harus diizinkan untuk Pengguna Sistem
mengingat kode tersebut memuat android.webkit
.
Contoh panduan paket
Contoh berikut menunjukkan cara mengevaluasi AndroidManifest.xml
dari
paket:
<?xml version="1.0" encoding="utf-8"?> <!-- 1. Search in the entire manifest for singleUser attribute. No. Move to step 2 --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.providers.calendar" android:sharedUserId="android.uid.calendar"> We can ignore the entire permission section <uses-permission android:name="android.permission.READ_CALENDAR" /> ... <uses-permission android:name="android.permission.UPDATE_APP_OPS_STATS" /> <!-- 2. Look for defaultToDeviceProtectedStorage in application's attribute. No. Continue evaluating app components. --> <application android:label="@string/calendar_storage" android:allowBackup="false" android:icon="@drawable/app_icon" android:usesCleartextTraffic="false"> <!-- a. Contain only activities? No. Continue to evaluate components other than activities. --> <provider android:name="CalendarProvider2" android:authorities="com.android.calendar" <!-- b. Is this component exported? Yes. Continue evaluating this component. f. App on u0 might depend on this? Search for CalendarProvider2 in dumpsys, shows ContentProviderRecord{b710923 u0 com.android.providers.calendar/.CalendarProvider2} Yes. Whitelist for system user. --> android:label="@string/provider_label" android:multiprocess="false" android:exported="true" android:readPermission="android.permission.READ_CALENDAR" android:writePermission="android.permission.WRITE_CALENDAR" />
<activity android:name="CalendarContentProviderTests" android:label="Calendar Content Provider" android:exported="false"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.UNIT_TEST" /> </intent-filter> </activity> <!-- Not service/content provider. Ignore. --> <receiver android:name="CalendarProviderBroadcastReceiver" android:exported="false"> <intent-filter> <action android:name="com.android.providers.calendar.intent.CalendarProvider2"/> <category android:name="com.android.providers.calendar"/> </intent-filter> <intent-filter> <action android:name="android.intent.action.EVENT_REMINDER"/> <data android:scheme="content" /> </intent-filter> </receiver> <service android:name="CalendarProviderIntentService"/> </application> </manifest>