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 dijalankan pada 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 dibahas:
- SISTEM. Selalu Pengguna 0
- LENGKAP. Pengguna yang dimaksudkan untuk digunakan oleh manusia (pengguna non-sistem), Pengguna 10+
Android 11
Di Android 11, ubah 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; tidak ada logging. |
1 |
Terapkan. Instal paket sistem hanya jika paket tersebut diizinkan. |
2 |
Catat 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 proses 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 memberi nama file XML, sertakan lokasi
tempat paket ditetapkan 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:
- Tempatkan konfigurasi
config_systemUserPackagesBlacklistSupported
dariframeworks/base/core/res/res/values/config.xml
dan tetapkan ketrue
. Jika fitur ini 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 dalam pengguna sistem. Sepertinya aplikasi tersebut dimaksudkan untuk menjadi aplikasi multipengguna. Untuk mempelajari aplikasi multipengguna lebih lanjut, lihat Mem-build aplikasi multipengguna.
- Periksa manifes Android untuk
android:singleUser="true"
. - Jika
true
, masukkan ke 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 booting sistem sering kali mengandalkan penyimpanan yang dienkripsi dengan perangkat (DE), bukan penyimpanan yang dienkripsi dengan kredensial (CE). Selain itu, aplikasi sistem yang mendukung booting langsung juga mengandalkan penyimpanan yang dienkripsi dengan perangkat. Untuk mempelajari lebih lanjut aplikasi yang sadar booting langsung, lihat Mendukung Direct Boot di aplikasi sistem.
- Periksa manifes Android untuk
android:defaultToDeviceProtectedStorage="true"
, yang diperlukan untuk berbagai 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 tersebut 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 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 tidak dapat dibatasi 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 apakah paket yang diizinkan di Level 1 dan identifikasi layanan
yang terikat dengannya. 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, 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 akan berinteraksi dengan
aplikasi di latar depan. Kemungkinan besar, layanan ini tidak akan 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 ditetapkan untuk dijalankan 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 akan dihentikan,
yang menyiratkan kekritisan layanan yang ditentukan dengan atribut tersebut. Untuk
mempelajari desain alokasi memori Android lebih lanjut, lihat
Low-memory killer.
- Jika Ya, jangan masukkan ke daftar yang diizinkan.
- Jika Tidak, lanjutkan untuk memeriksa komponen lainnya.
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
diperlukan. 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, tambahkan ke daftar yang diizinkan.
- Jika Tidak, jangan izinkan.
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>