Hapus paket untuk Pengguna Sistem

Artikel ini menjelaskan cara meningkatkan kinerja dengan mengidentifikasi dan menghapus paket yang tidak diperlukan untuk Pengguna Sistem.

Nonaktifkan paket yang tidak perlu

Di Otomotif, Pengguna Sistem bersifat tanpa kepala , artinya Pengguna Sistem tidak dimaksudkan untuk digunakan atau diakses langsung oleh manusia. Akibatnya, banyak aplikasi dan layanan tidak perlu dijalankan di Pengguna Sistem dan dapat dinonaktifkan untuk meningkatkan kinerja. Oleh karena itu, disediakan opsi untuk menghapus aplikasi yang tidak diperlukan bagi Pengguna Sistem (Pengguna 0).

Di halaman ini, dua jenis Pengguna dibahas:

  • SISTEM . Selalu Pengguna 0
  • PENUH . Pengguna yang dimaksudkan untuk digunakan oleh manusia (bukan Pengguna Sistem), Pengguna 10+

Android 11

Di Android 11, Anda mengubah konfigurasi, config_userTypePackageWhitelistMode . Bendera dapat digabungkan. Dalam hal ini, 5 sama dengan 1 ditambah 4 (kombinasi flag 1 dan 4 ).

Bendera Keterangan
0 Nonaktifkan daftar yang diizinkan. Instal semua paket sistem; tidak ada pencatatan.
1 Melaksanakan. Instal paket sistem hanya jika diizinkan.
2 Catat paket yang tidak diizinkan.
4 Paket apa pun yang tidak disebutkan dalam file daftar yang diizinkan secara implisit dimasukkan ke dalam daftar yang diizinkan untuk semua pengguna.
8 Sama seperti 4 , untuk pengguna Sistem.
16 Abaikan OTA. Jangan menginstal paket sistem selama OTA.
Pertimbangkan skenario umum berikut ini.
  • Untuk mengaktifkan fitur pada daftar lengkap yang diizinkan, 1 ( diterapkan sepenuhnya )
  • Untuk mengaktifkan fitur pada daftar yang diizinkan yang tidak lengkap, 5
  • Untuk mengaktifkan fitur bagi pengguna SYSTEM guna memudahkan pengembangan lokal, 9 ( daftar yang diizinkan secara implisit )
  • Untuk menonaktifkan fitur seolah-olah belum pernah diaktifkan, 16
  • Untuk menonaktifkan fitur dan membatalkan 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 lokasi di mana paket tersebut 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:

  1. Hamparkan konfigurasi config_systemUserPackagesBlacklistSupported dari frameworks/base/core/res/res/values/config.xml dan setel ke true . Ketika fitur ini diaktifkan, secara default, semua paket harus diinstal untuk Pengguna Sistem dan Pengguna LENGKAP.
  2. Buat daftar file config.xml paket mana 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>
    
  3. Tambahkan baris ke device.mk untuk menyalin file ke folder target system/etc/sysconfig/ . Misalnya:
    PRODUCT_COPY_FILES += <full path to the config file>:system/etc/sysconfig/<new denylist config file>.xml
    

Verifikasi 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 suatu paket harus diinstal di Pengguna Sistem, 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 penyedia konten. Untuk mempelajari lebih lanjut, lihat Ikhtisar Manifes Aplikasi .

Nonaktifkan alur kerja paket

Gambar 1. Alur kerja menonaktifkan paket

Tingkat 1, tingkat aplikasi

1. Periksa apakah aplikasi (atau komponen aplikasi) dideklarasikan sebagai singleton

Jika aplikasinya singleton , sistem akan membuat instance aplikasi hanya di Pengguna Sistem. Sepertinya aplikasi tersebut dimaksudkan untuk menjadi aplikasi multi-pengguna. Untuk mempelajari lebih lanjut tentang aplikasi multi-pengguna, lihat Membuat Aplikasi Multi-pengguna .

  1. Periksa manifes Android untuk android:singleUser="true" .
  2. Jika benar , daftar yang diizinkan. Dibutuhkan untuk Pengguna Sistem.
  3. Jika salah , lanjutkan. Periksa kriteria lain sebelum menghapus.

2. Periksa apakah aplikasi memerlukan akses penyimpanan yang dilindungi

Banyak layanan boot sistem sering kali mengandalkan penyimpanan terenkripsi perangkat (DE) dan bukan penyimpanan terenkripsi kredensial (CE). Selain itu, aplikasi sistem yang mengetahui booting langsung juga mengandalkan penyimpanan terenkripsi perangkat. Untuk mempelajari lebih lanjut tentang aplikasi yang sadar boot langsung, lihat Mendukung Boot Langsung di aplikasi sistem .

  1. Periksa manifes Android untuk android:defaultToDeviceProtectedStorage="true" , ​​yang diperlukan untuk berbagai layanan boot sistem.
  2. Jika benar , daftar yang diizinkan.
  3. Jika salah , lanjutkan.

Level 2, komponen aplikasi

Kegiatan

Untuk mempelajari lebih lanjut tentang aktivitas, lihat Pengantar Aktivitas .

A. Periksa apakah aplikasi hanya berisi aktivitas

Aktivitas berorientasi pada antarmuka pengguna. Karena Pengguna Sistem tidak memiliki kepala di Otomotif, tidak boleh ada manusia yang berinteraksi dengan Pengguna Sistem. Akibatnya, jika aplikasi hanya berisi Aktivitas, kemungkinan besar aplikasi tersebut tidak relevan dengan Pengguna Sistem.

Periksa prioritas dan hak istimewa.

  1. Jika Ya , mungkin diperlukan untuk Pengguna Sistem.
  2. Jika Tidak , jangan izinkan Pengguna Sistem.

Misalnya, Compatibility Test Suite (CTS) ( com.android.cts.priv.ctsshim ) hanya berisi Aktivitas, dan Aktivitas ditentukan untuk menguji filter maksud. Namun, karena memiliki hak istimewa yang tinggi, maka perlu diinstal untuk Pengguna Sistem untuk tujuan pengujian.

Melayani

Untuk mempelajari lebih lanjut tentang layanan, lihat Ikhtisar layanan .

B. Periksa apakah layanan dinyatakan pribadi dan tidak dapat diakses dari aplikasi lain

Jika layanan dinyatakan sebagai private , paket lain tidak akan menggunakan layanan tersebut. Cari android:exported="false" . Jika layanan dinyatakan pribadi atau tidak dapat diakses dari aplikasi lain, maka layanan tersebut tidak dapat diikat oleh aplikasi lain. Oleh karena itu, Langkah C dan Langkah D di bawah ini tidak relevan. Akibatnya, komponen ini tidak akan memberikan petunjuk lebih lanjut apakah layanan tersebut diperlukan atau tidak untuk Pengguna Sistem.

  1. Jika Ya , periksa komponen selanjutnya.
  2. Jika Tidak , lanjutkan memeriksa komponen ini.

C. Periksa apakah aplikasi yang diinstal di Pengguna Sistem mungkin terikat ke layanan ini

Periksa paket yang diizinkan di Tingkat 1 dan identifikasi layanan yang terikat dengan paket tersebut. Lacak dari filter maksud di layanan ini dan startService di paket lain.

Jika layanan ini terikat pada aplikasi yang diinstal di Pengguna Sistem (misalnya, com.android.car.companiondevicesupport diizinkan untuk dijalankan di Pengguna Sistem), maka daftarkan layanan tersebut ke daftar yang diizinkan.

  1. Jika Ya , daftar yang diizinkan.
  2. Jika Tidak , lanjutkan memeriksa komponen ini.

D. Periksa apakah layanan terikat dari aplikasi lain dan dinyatakan berjalan di latar depan

Carilah startForeground . Ini berarti orang-orang akan berinteraksi dengan aplikasi di latar depan. Kemungkinan besar, layanan ini tidak diperlukan untuk Pengguna Sistem dan tidak perlu diizinkan.

  1. Jika Ya , jangan izinkan.
  2. Jika Tidak , lanjutkan pengecekan komponen selanjutnya.

e. Periksa apakah layanan ditentukan untuk dijalankan dalam proses sistem

Di AndroidManifest, cari android:process="system" .
Jika layanan sengaja didefinisikan untuk berjalan dalam proses sistem, berarti layanan tersebut secara eksplisit akan berjalan dalam proses yang sama dengan layanan sistem dan harus diizinkan untuk dijalankan di Pengguna Sistem. Sebagai bagian dari desain alokasi memori Android, layanan sistem adalah beberapa proses terakhir yang harus dihentikan, yang menyiratkan pentingnya layanan yang ditentukan dengan atribut tersebut. Untuk mempelajari lebih lanjut tentang desain alokasi memori Android, lihat Pembunuh memori rendah .

  1. Jika Ya , jangan izinkan.
  2. Jika Tidak , lanjutkan pengecekan 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 tentang penyedia konten, lihat Penyedia konten .

F. Periksa apakah aplikasi yang diinstal di Pengguna Sistem bergantung pada penyedia ini

Periksa paket yang diizinkan di Level 1 dan periksa penyedia mana yang diandalkan. Jika aplikasi yang berjalan di Pengguna Sistem (misalnya, com.android.car.companiondevicesupport diizinkan untuk berjalan di Pengguna Sistem) dan bergantung pada penyedia konten ini, pastikan penyedia konten tersebut juga diizinkan.

  1. Jika Ya , daftar yang diizinkan.
  2. Jika Tidak , jangan izinkan.

Misalnya, jika com.android.car.EXAMPLE berisi penyedia tunggal ( SystemActionsContentProvider dan ManagedProvisioningActionsContentProvider ), penyedia tersebut harus diizinkan untuk Pengguna Sistem. Lalu, jika com.android.car.EXAMPLE bergantung pada android.webkit untuk WebViewFactoryProvider , maka com.android.webview harus diizinkan untuk Pengguna Sistem karena memuat android.webkit .

Contoh panduan paket

Contoh berikut menunjukkan cara mengevaluasi AndroidManifest.xml sebuah 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>