Menghapus paket untuk pengguna sistem

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:

  1. Tempatkan konfigurasi config_systemUserPackagesBlacklistSupported dari frameworks/base/core/res/res/values/config.xml dan tetapkan ke true. Jika fitur ini diaktifkan, secara default, semua paket harus diinstal untuk pengguna sistem dan pengguna FULL.
  2. 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>
  3. Tambahkan baris ke device.mk untuk menyalin file ke folder target perangkat system/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.

Nonaktifkan alur kerja paket

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.

  1. Periksa manifes Android untuk android:singleUser="true".
  2. Jika true, masukkan ke 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 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.

  1. Periksa manifes Android untuk android:defaultToDeviceProtectedStorage="true", yang diperlukan untuk berbagai layanan booting sistem.
  2. Jika true, izinkan.
  3. 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:

  1. Jika Ya, mungkin diperlukan untuk pengguna sistem.
  2. 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.

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