Halaman ini menjelaskan cara meningkatkan performa dengan mengidentifikasi dan menghapus paket yang tidak diperlukan untuk pengguna sistem.
Menonaktifkan paket yang tidak diperlukan
Di Automotive, pengguna sistem headless, yang berarti pengguna sistem tidak dimaksudkan untuk digunakan atau diakses langsung oleh manusia. Akibatnya, banyak aplikasi dan layanan tidak perlu berjalan di pengguna sistem dan dapat dinonaktifkan untuk meningkatkan performa. Oleh karena itu, opsi disediakan untuk menghapus aplikasi yang tidak diperlukan bagi pengguna sistem (Pengguna 0).
Di halaman ini, dua jenis pengguna akan dibahas:
- SISTEM. Selalu Pengguna 0
- FULL. Pengguna yang dimaksudkan untuk digunakan oleh manusia (pengguna non-sistem), Pengguna 10+
Android 11
Di Android 11, ubah konfigurasi
config_userTypePackageWhitelistMode
. Flag dapat digabungkan. Dalam hal ini, 5
sama dengan 1
ditambah 4
(kombinasi flag 1
dan 4
).
Flag | Deskripsi |
---|---|
0 |
Nonaktifkan daftar yang diizinkan. Menginstal semua paket sistem; tidak ada logging. |
1 |
Terapkan. Menginstal paket sistem hanya jika diizinkan. |
2 |
Membuat log paket yang tidak diizinkan. |
4 |
Semua paket yang tidak disebutkan dalam file daftar yang diizinkan secara implisit diizinkan untuk semua pengguna. |
8 |
Sama seperti 4 , untuk pengguna sistem. |
16 |
Abaikan OTA. Jangan menginstal paket sistem selama OTA. |
Pertimbangkan skenario umum berikut:
- Untuk mengaktifkan fitur bagi daftar yang diizinkan lengkap,
1
(diberlakukan sepenuhnya) - Untuk mengaktifkan fitur untuk daftar yang diizinkan yang belum selesai,
5
- Untuk mengaktifkan fitur bagi pengguna
SYSTEM
guna memudahkan pengembangan lokal,9
(implicit allowlist) - Untuk menonaktifkan fitur seolah-olah belum pernah diaktifkan,
16
- Untuk menonaktifkan fitur dan mengurungkan semua efek sebelumnya,
0
Instal file XML di direktori sysconfig
untuk perangkat
(ini adalah direktori yang sama dengan yang berisi makefile (.mk
) yang digunakan untuk mem-build
image sistem untuk perangkat). Saat Anda memberi nama file XML, sertakan lokasi
tempat paket ditentukan 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:
- Tumpang-tindih konfigurasi
config_systemUserPackagesBlacklistSupported
dariframeworks/base/core/res/res/values/config.xml
dan tetapkan ketrue
. Jika fitur diaktifkan, secara default, semua paket harus diinstal untuk pengguna sistem dan pengguna FULL. - Buat file
config.xml
yang mencantumkan paket yang harus dinonaktifkan untuk pengguna sistem, misalnya:<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 target perangkatsystem/etc/sysconfig/
, misalnya: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 paket harus diinstal di pengguna sistem, periksa
file AndroidManifest.xml
paket yang terletak di root
sumber project, termasuk atribut aplikasi dan komponen
aplikasi, yang mencakup semua aktivitas, layanan, penerima siaran, dan penyedia
konten. Untuk mempelajari lebih lanjut, lihat
Ringkasan
manifes aplikasi.
Gambar 1. Nonaktifkan alur kerja paket.
Level 1, tingkat aplikasi
1. Memeriksa apakah aplikasi (atau komponen aplikasi) dideklarasikan sebagai singleton
Jika aplikasi adalah singleton, sistem akan membuat instance aplikasi hanya di pengguna sistem. Aplikasi ini kemungkinan dimaksudkan untuk menjadi aplikasi yang mendukung multi-pengguna. Untuk mempelajari aplikasi yang mendukung multi-pengguna lebih lanjut, lihat Mem-build aplikasi yang mendukung multi-pengguna.
- Periksa manifes Android untuk
android:singleUser="true"
. - Jika
true
, izinkan. Diperlukan untuk pengguna sistem. - Jika
false
, lanjutkan. Periksa kriteria lain sebelum menghapus.
2. Memeriksa apakah aplikasi memerlukan akses penyimpanan yang dilindungi
Banyak layanan booting sistem sering kali mengandalkan penyimpanan yang dienkripsi perangkat (DE), bukan penyimpanan yang dienkripsi kredensial (CE). Selain itu, aplikasi sistem yang mendukung booting langsung juga mengandalkan penyimpanan terenkripsi perangkat. Untuk mempelajari lebih lanjut aplikasi yang mendukung booting langsung, lihat Mendukung Booting Langsung di aplikasi sistem.
- Periksa manifes Android untuk
android:defaultToDeviceProtectedStorage="true"
, yang diperlukan untuk sejumlah layanan booting sistem. - Jika
true
, izinkan. - Jika
false
, lanjutkan.
Level 2, komponen aplikasi
Aktivitas
Untuk mempelajari aktivitas lebih lanjut, lihat Pengantar aktivitas.
a. Memeriksa apakah aplikasi hanya berisi aktivitas
Aktivitas berorientasi pada antarmuka pengguna. Karena pengguna sistem bersifat headless di Automotive, tidak ada manusia yang boleh berinteraksi dengan pengguna sistem. Akibatnya, jika aplikasi hanya berisi aktivitas, aplikasi kemungkinan besar tidak relevan bagi pengguna sistem.
Periksa prioritas dan hak istimewa khusus:
- Jika Ya, mungkin diperlukan untuk pengguna sistem.
- Jika Tidak, jangan masukkan pengguna sistem ke dalam daftar yang diizinkan.
Misalnya, Compatibility Test Suite (CTS)
(com.android.cts.priv.ctsshim
) hanya berisi aktivitas, dan
aktivitas ditentukan untuk menguji filter intent. Namun, karena CTS memiliki hak istimewa
yang tinggi, CTS perlu diinstal untuk pengguna sistem 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 tersebut. Cari android:exported="false"
. Jika layanan dideklarasikan
sebagai pribadi atau tidak dapat diakses dari aplikasi lain, layanan tersebut tidak dapat terikat oleh
aplikasi lain. Oleh karena itu, Langkah c dan Langkah d di bawah tidak relevan. Akibatnya,
komponen ini tidak akan memberikan lebih banyak petunjuk tentang apakah layanan diperlukan
untuk pengguna sistem.
- Jika Ya, periksa komponen berikutnya.
- Jika Tidak, lanjutkan memeriksa komponen ini.
sekitar tahun Memeriksa apakah aplikasi yang diinstal di pengguna sistem dapat terikat ke layanan ini
Periksa paket yang diizinkan di Level 1 dan identifikasi layanan
yang terikat dengan paket tersebut. Pelacakan dari filter intent dalam layanan ini dan startService
dalam paket lain.
Jika layanan ini terikat dengan aplikasi yang diinstal di pengguna sistem (misalnya,
com.android.car.companiondevicesupport
diizinkan untuk dijalankan di
pengguna sistem), izinkan layanan tersebut:
- Jika Ya, masukkan ke daftar yang diizinkan.
- Jika Tidak, lanjutkan untuk memeriksa komponen ini.
d. Memeriksa apakah layanan terikat dari aplikasi lain dan dideklarasikan untuk berjalan di latar depan
Cari startForeground
. Artinya, orang akan berinteraksi dengan
aplikasi di latar depan. Kemungkinan besar, layanan ini tidak diperlukan untuk
pengguna sistem dan tidak perlu diizinkan:
- Jika Ya, jangan masukkan ke daftar yang diizinkan.
- Jika Tidak, lanjutkan untuk memeriksa komponen berikutnya.
e. Memeriksa apakah layanan ditentukan untuk berjalan dalam proses sistem
Dalam file AndroidManifest, cari android:process="system"
.
Jika layanan sengaja ditentukan untuk berjalan dalam proses sistem, layanan tersebut
akan berjalan dalam proses yang sama dengan layanan sistem dan
harus diizinkan untuk berjalan di pengguna sistem. Sebagai bagian dari desain
alokasi memori Android, layanan sistem adalah beberapa proses terakhir yang dihentikan,
yang menyiratkan tingkat kepentingan layanan yang ditentukan dengan atribut tersebut. Untuk
mempelajari lebih lanjut desain alokasi memori Android, lihat Pembunuh
memori rendah.
- Jika Ya, jangan masukkan ke daftar yang diizinkan.
- Jika Tidak, lanjutkan memeriksa komponen lain.
Misalnya, paket com.android.networkstack.inprocess
harus
diizinkan karena berisi RegularMaintenanceJobService
, yang
memiliki tag android:process="system"
.
Penyedia konten
Untuk mempelajari penyedia konten lebih lanjut, lihat Penyedia konten.
f. Memeriksa apakah aplikasi yang diinstal di pengguna sistem bergantung pada penyedia ini
Periksa paket yang diizinkan di Level 1 dan periksa penyedia yang
menjadi dependensinya. Jika aplikasi berjalan di pengguna sistem (misalnya,
com.android.car.companiondevicesupport
diizinkan untuk berjalan di
pengguna sistem) dan bergantung pada penyedia konten ini, pastikan penyedia konten
ini juga diizinkan.
- Jika Ya, masukkan ke daftar yang diizinkan.
- Jika Tidak, jangan masukkan ke daftar yang diizinkan.
Misalnya, jika com.android.car.EXAMPLE
berisi penyedia
singleton (SystemActionsContentProvider
dan
ManagedProvisioningActionsContentProvider
), penyedia tersebut harus
diizinkan untuk pengguna sistem. Kemudian, jika com.android.car.EXAMPLE
bergantung pada android.webkit
untuk WebViewFactoryProvider
,
com.android.webview
harus diizinkan untuk pengguna sistem
karena memuat android.webkit
.
Contoh panduan paket
Contoh berikut menunjukkan cara mengevaluasi AndroidManifest.xml
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>