Menghapus Paket untuk Pengguna Sistem

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

Menonaktifkan paket yang tidak perlu

Di Otomotif, Pengguna SISTEM tidak memiliki kepala , yang berarti 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, opsi disediakan untuk menghapus aplikasi yang tidak perlu untuk Pengguna SISTEM (Pengguna 0).

Dalam artikel ini, dua jenis Pengguna dibahas:

  • SISTEM . Selalu Pengguna 0
  • PENUH . Pengguna yang dimaksudkan untuk digunakan oleh manusia (Pengguna non-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 dari flag 1 dan 4 ).

  0  - disable whitelist (install all system packages; no logging)
  1  - enforce (only install system packages if they are whitelisted)
  2  - log (log non-whitelisted packages)
  4  - any package not mentioned in the whitelist file is implicitly whitelisted on all users
  8  - same as 4, but just for the SYSTEM user
  16 - ignore OTAs (don't install system packages during OTAs)
  Common scenarios:
  - to enable feature (fully enforced) for a complete allowlist: 1
  - to enable feature for an incomplete allowlist (so use implicit allowlist mode): 5
  - to enable feature but implicitly allowlist for SYSTEM user to ease local development: 9
  - to disable feature completely if it had never been enabled: 16
  - to henceforth disable feature and try to undo its previous effects: 0

Pastikan untuk menginstal file XML di direktori sysconfig untuk perangkat (ini adalah direktori yang sama yang berisi makefile (.mk) yang digunakan untuk membangun citra sistem untuk perangkat). Saat Anda memberi nama file XML, sertakan lokasi di mana paket didefinisikan dalam file 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. Overlay konfigurasi config_systemUserPackagesBlacklistSupported dari frameworks/base/core/res/res/values/config.xml dan setel ke true . Ketika fitur diaktifkan, secara default, semua paket harus diinstal baik untuk Pengguna SISTEM maupun 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 perangkat 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 sebuah paket harus diinstal di Pengguna SISTEM, periksa file AndroidManifest.xml paket yang terletak di akar 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. Nonaktifkan alur kerja paket

Level 1, Level aplikasi

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

Jika aplikasi adalah singleton , sistem akan membuat aplikasi hanya di Pengguna SISTEM. Sepertinya aplikasi tersebut dimaksudkan untuk menjadi aplikasi yang sadar akan banyak pengguna. Untuk mempelajari lebih lanjut tentang aplikasi yang menyadari banyak pengguna, lihat Membuat Aplikasi yang Sadar Banyak 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 mengandalkan penyimpanan terenkripsi perangkat (DE) alih-alih penyimpanan terenkripsi kredensial (CE). Selain itu, aplikasi sistem yang menyadari boot langsung juga mengandalkan penyimpanan terenkripsi perangkat. Untuk mempelajari lebih lanjut tentang aplikasi yang menyadari boot langsung, lihat Mendukung Direct Boot 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 Pengenalan Aktivitas .

sebuah. Periksa apakah aplikasi hanya berisi Aktivitas

Aktivitas berorientasi pada antarmuka pengguna. Karena Pengguna SISTEM tidak memiliki kepala di Otomotif, tidak ada manusia yang boleh 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 daftarkan untuk Pengguna SISTEM.

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

Melayani

Untuk mempelajari lebih lanjut tentang layanan, lihat Ikhtisar layanan .

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

Jika layanan dideklarasikan sebagai private , paket lain tidak akan menggunakan layanan tersebut. Cari android:exported="false" . Jika layanan dinyatakan sebagai pribadi atau tidak dapat diakses dari aplikasi lain, maka 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 lebih banyak petunjuk apakah layanan tersebut diperlukan untuk Pengguna SISTEM atau tidak.

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

c. Periksa apakah aplikasi yang diinstal di SISTEM Pengguna mungkin mengikat ke layanan ini

Periksa paket yang diizinkan di Level 1 dan identifikasi layanan yang terikat padanya. Lacak dari filter maksud di layanan ini dan startService di paket lain.

Jika layanan ini terikat ke aplikasi yang diinstal di Pengguna SISTEM (misalnya, com.android.car.companiondevicesupport diizinkan untuk berjalan di Pengguna SISTEM), maka daftarkan layanan yang diizinkan.

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

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

Cari startForeground . Ini berarti 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 dibolehkan.
  2. Jika Tidak , lanjutkan untuk memeriksa komponen berikutnya.

e. Periksa apakah layanan didefinisikan untuk dijalankan dalam proses sistem

Di AndroidManifest, cari android:process="system" .
Jika layanan sengaja ditetapkan untuk berjalan dalam proses sistem, maka itu berarti secara eksplisit 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 harus dihentikan, yang menyiratkan kekritisan layanan yang ditentukan dengan atribut tersebut. Untuk mempelajari lebih lanjut tentang desain alokasi memori Android, lihatPembunuh memori rendah .

  1. Jika Ya , jangan dibolehkan.
  2. 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 lebih lanjut tentang penyedia konten, lihat Penyedia konten .

f. Periksa apakah aplikasi yang diinstal di SISTEM Pengguna bergantung pada penyedia ini

Periksa paket yang diizinkan di Level 1 dan periksa penyedia mana yang mereka andalkan. 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 ini juga diizinkan.

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

Misalnya, jika com.android.car.EXAMPLE berisi penyedia tunggal ( SystemActionsContentProvider dan ManagedProvisioningActionsContentProvider ), itu harus diizinkan untuk Pengguna SISTEM. Kemudian, 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 paket walk-through

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