Menghapus paket untuk Pengguna Sistem

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.
Pertimbangkan skenario umum berikut.
  • 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:

  1. Buat overlay config_systemUserPackagesBlacklistSupported dari frameworks/base/core/res/res/values/config.xml lalu tetapkan menjadi true. Jika fitur ini diaktifkan, secara default, semua paket harus diinstal untuk {i>System User<i} dan Pengguna LENGKAP.
  2. 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>
    
  3. Tambahkan baris ke device.mk untuk menyalin file ke folder target system/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.

Nonaktifkan alur kerja paket

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.

  1. Periksa manifes Android untuk android:singleUser="true".
  2. Jika true, masukkan daftar yang diizinkan. Dibutuhkan untuk Pengguna Sistem.
  3. 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.

  1. Periksa manifes Android untuk android:defaultToDeviceProtectedStorage="true", yang diperlukan untuk banyak layanan {i>booting<i} sistem.
  2. Jika true, masukkan daftar yang diizinkan.
  3. 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.

  1. Jika Yes, 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 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.

  1. Jika Ya, periksa komponen berikutnya.
  2. 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.

  1. Jika Ya, tambahkan ke daftar yang diizinkan.
  2. 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.

  1. Jika Ya, jangan izinkan.
  2. 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.

  1. Jika Ya, jangan izinkan.
  2. 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.

  1. Jika Ya, masukkan daftar yang diizinkan.
  2. 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>