Pakete für den Systemnutzer entfernen

In diesem Artikel wird beschrieben, wie Sie die Leistung verbessern können, indem Sie die nicht für den Systemnutzer benötigt werden.

Unnötige Pakete deaktivieren

In der Automobilbranche monitorlos, Das bedeutet, dass der Systemnutzer nicht für die Nutzung oder den direkten Zugriff durch eine Person bestimmt ist. Mensch. Daher müssen viele Apps und Dienste nicht im Systemnutzer- kann deaktiviert werden, um die Leistung zu verbessern. Daher wird eine Option angeboten, unnötige Apps für den Systemnutzer (Nutzer 0).

Auf dieser Seite werden zwei Arten von Nutzern behandelt:

  • SYSTEM. Immer Nutzer 0
  • FULL gesetzt. Nutzer, der von einem Menschen verwendet werden soll (kein Systemnutzer), Nutzer 10+

Android 11

In Android 11 ändern Sie die Konfiguration, config_userTypePackageWhitelistMode Flags können kombiniert werden. In diesem Fall entspricht 5 1 plus 4 (eine Kombination der Flags 1 und 4).

Melden Beschreibung
0 Zulassungsliste deaktivieren. Alle Systempakete installieren Kein Logging.
1 Erzwingen. Installieren Sie Systempakete nur, wenn sie auf der Zulassungsliste stehen.
2 Pakete protokollieren, die nicht auf der Zulassungsliste stehen.
4 Jedes Paket, das nicht in der Zulassungslistendatei aufgeführt ist, wird implizit für alle Nutzer auf die Zulassungsliste gesetzt.
8 Wie bei 4 für den Systemnutzer.
16 OTAs ignorieren . Installieren Sie während OTAs keine Systempakete.
Berücksichtigen Sie diese häufigen Szenarien.
  • Zum Aktivieren einer Funktion für eine vollständige Zulassungsliste 1 (vollständig erzwungen)
  • Wenn Sie eine Funktion für eine unvollständige Zulassungsliste aktivieren möchten, 5
  • So aktivieren Sie eine Funktion für den SYSTEM-Nutzer zur Vereinfachung der lokalen Entwicklung: 9 (implizite Zulassungsliste)
  • Um eine Funktion so zu deaktivieren, als wäre sie nie aktiviert worden, 16
  • Wenn Sie eine Funktion deaktivieren und alle vorherigen Effekte rückgängig machen möchten, 0

Achten Sie darauf, die XML-Datei im Verzeichnis sysconfig für das Gerät zu installieren (Dies ist das Verzeichnis, in dem sich das Makefile (".mk") befindet, das zum Erstellen der Datei verwendet wird. System-Image für das Gerät). Geben Sie beim Benennen der XML-Datei den Speicherort an. auf der das Paket im Build definiert ist. Beispiel: 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 und Android 10

So konfigurieren Sie diese Funktion unter Android 9 und Android 10:

  1. config_systemUserPackagesBlacklistSupported als Overlay Konfiguration aus frameworks/base/core/res/res/values/config.xml und legen Sie es an true. Wenn die Funktion aktiviert ist, werden standardmäßig alle Pakete sollte sowohl für den Systemnutzer als auch für den FULL User installiert werden.
  2. Erstelle eine config.xml-Datei mit der Liste der Pakete Systemnutzer deaktiviert. Hier einige Beispiele:
    <config>
        <!-- This package will be uninstalled for the system user -->
        <system-user-blacklisted-app package="com.google.car.calendar" />
    </config>
    
  3. Fügen Sie device.mk eine Zeile hinzu, um die Datei auf den Zielordner system/etc/sysconfig/. Hier einige Beispiele:
    PRODUCT_COPY_FILES += <full path to the config file>:system/etc/sysconfig/<new denylist config file>.xml
    

Ergebnis prüfen

Führen Sie folgenden Befehl aus, um das Ergebnis zu prüfen:

$ 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

Gebäude

Um zu ermitteln, ob ein Paket im Systemnutzer installiert werden sollte, prüfen Sie die der Datei AndroidManifest.xml des Pakets im Stammverzeichnis des Projektquelle, einschließlich der Attribute der App und der Komponenten App, einschließlich aller Aktivitäten, Dienste, Übertragungsempfänger und Inhalte Anbieter. Weitere Informationen finden Sie unter App-Kampagnen Manifestübersicht.

Paketworkflow deaktivieren

Abbildung 1: Paketworkflow deaktivieren

Ebene 1, App-Ebene

1. Prüfen, ob die App (oder App-Komponenten) als Singleton deklariert ist

Wenn es sich bei der App singleton instanziiert das System die App nur im Systemnutzer. Wahrscheinlich wurde die App war für die Nutzung durch mehrere Nutzer gedacht. Weitere Informationen zur Erkennung mehrerer Nutzer finden Sie unter Apps für mehrere Nutzer erstellen.

  1. Prüfe das Android-Manifest auf android:singleUser="true".
  2. Wenn true, setzen Sie die Zulassungsliste auf die Zulassungsliste. Wird für den Systemnutzer benötigt.
  3. Wenn false, fahren Sie fort. Prüfe vor dem Entfernen die anderen Kriterien.

2. Prüfen, ob die App Zugriff auf den geschützten Speicher benötigt

Viele Systemstartdienste nutzen stattdessen häufig den DE-Speicher (mit dem Gerät verschlüsselter Speicher). mit Anmeldedaten verschlüsselt (CE) Außerdem werden direkte System-Apps und Boot-Aware funktionieren, sind auch auf dem Gerät verschlüsselt. Weitere Informationen zu direkten bootfähige Apps finden Sie unter Unterstützend Direct Boot in System-Apps

  1. Überprüfen Sie das Android-Manifest auf android:defaultToDeviceProtectedStorage="true", die für zahlreiche Systemstartdienste.
  2. Wenn true, setzen Sie die Zulassungsliste auf die Zulassungsliste.
  3. Wenn false, fahren Sie fort.

Ebene 2, App-Komponenten

Aktivitäten

Weitere Informationen zu Aktivitäten finden Sie unter Einführung zu „Aktivitäten“.

a. Prüfen, ob die App nur Aktivitäten enthält

Die Aktivitäten sind auf die Benutzeroberfläche ausgerichtet. Da der Systemnutzer Automotive, darf kein Mensch mit dem Systemnutzer interagieren. Wenn Sie also die App nur Aktivitäten enthält, ist sie höchstwahrscheinlich nicht relevant für Systemnutzer.

Überprüfen Sie, ob Priorität und spezielle Berechtigungen vorhanden sind.

  1. Falls Ja, möglicherweise für den Systemnutzer erforderlich.
  2. Wenn Nein, setzen Sie keine Zulassungsliste für den Systemnutzer.

Beispiel: Compatibility Test Suite (CTS) (com.android.cts.priv.ctsshim) enthält nur Aktivitäten und Aktivitäten sind definiert, um Intent-Filter zu testen. Da es jedoch ein hohes müssen Sie sie zu Testzwecken für den Systemnutzer installieren.

Dienst

Weitere Informationen zu Diensten finden Sie unter Dienstübersicht.

b. Prüfen, ob der Dienst als privat deklariert ist und über andere Apps nicht aufgerufen werden kann

Wenn der Dienst als privat deklariert ist, verwenden andere Pakete nicht Service. Suchen Sie nach android:exported="false". Wenn der Dienst deklariert ist als privat gekennzeichnet oder über andere Apps nicht zugänglich sind, kann sie nicht an anderen Apps. Daher sind Schritt C und Schritt D unten irrelevant. Daher würde diese Komponente keine weiteren Hinweise dazu geben, ob die Dienstleistung benötigt wird oder nicht. für den Systemnutzer.

  1. Wenn Ja, markieren Sie die nächste Komponente.
  2. Falls Nein, fahren Sie mit der Überprüfung dieser Komponente fort.

c. Prüfen, ob in Systemnutzer installierte Apps an diesen Dienst gebunden werden könnten

Suchen Sie in Level 1 nach Paketen auf der Zulassungsliste und identifizieren Sie die Dienste, für die an die sie gebunden sind. Trace aus dem Intent-Filter in diesem Dienst und startService in anderen Paketen.

Wenn dieser Dienst an Apps gebunden ist, die im Systemnutzer installiert sind (z. B. com.android.car.companiondevicesupport steht auf der Zulassungsliste für die Ausführung in Systemnutzer) und setzen Sie dann den Dienst auf die Zulassungsliste.

  1. Wenn Ja, setzen Sie sie auf die Zulassungsliste.
  2. Falls Nein, fahren Sie mit der Überprüfung dieser Komponente fort.

d. Prüfen, ob der Dienst von anderen Apps gebunden und für die Ausführung im Vordergrund deklariert ist

Suchen Sie nach startForeground. Das bedeutet, dass Nutzer die App im Vordergrund ausführen. Dieser Dienst wird wahrscheinlich für die Systemnutzer und müssen nicht auf der Zulassungsliste stehen.

  1. Wenn Ja, setzen Sie sie nicht auf die Zulassungsliste.
  2. Falls Nein, fahren Sie mit der nächsten Komponente fort.

e. Prüfen, ob der Dienst für die Ausführung im Systemprozess definiert ist

Suche in AndroidManifest nach android:process="system".
Wenn der Dienst absichtlich im Systemprozess ausgeführt werden soll, wird er explizit im selben Prozess ausgeführt wie der Systemdienst sollte auf der Zulassungsliste für die Ausführung im Systemnutzer stehen. Als Teil des Arbeitsspeichers von Android Systemdienste gehören zu den letzten Prozessen, die abgebrochen werden, was die Bedeutung der mit einem solchen Attribut definierten Dienste impliziert. Bis Weitere Informationen zum Arbeitsspeicherzuweisungsdesign von Android finden Sie unter Wenig Arbeitsspeicher Killer.

  1. Wenn Ja, setzen Sie sie nicht auf die Zulassungsliste.
  2. Falls Nein, prüfen Sie die anderen Komponenten.

Beispiel: Paket com.android.networkstack.inprocess muss auf der Zulassungsliste, da sie RegularMaintenanceJobService enthält, was hat das Tag android:process="system".

Contentanbieter

Weitere Informationen zu Contentanbietern finden Sie unter Contentanbieter:

f. Prüfen, ob die App unter „Systemnutzer“ von diesem Anbieter abhängig ist

In Level 1 nach Paketen auf der Zulassungsliste suchen und prüfen, bei welchen Anbietern davon abhängen. Wenn eine App, die im Systemnutzer ausgeführt wird (z. B. com.android.car.companiondevicesupport steht auf der Zulassungsliste für die Ausführung in Systemnutzer) und ist von diesem Contentanbieter abhängig, stellen Sie sicher, dass dieser Inhalt Anbieter auf der Zulassungsliste steht.

  1. Wenn Ja, setzen Sie sie auf die Zulassungsliste.
  2. Wenn Nein, setzen Sie sie nicht auf die Zulassungsliste.

Beispiel: com.android.car.EXAMPLE enthält Singleton. (SystemActionsContentProvider und ManagedProvisioningActionsContentProvider), sollte sie so aussehen: Systemnutzer auf die Zulassungsliste gesetzt. Wenn com.android.car.EXAMPLE abhängig von android.webkit für WebViewFactoryProvider Dann muss com.android.webview auf die Zulassungsliste für den Systemnutzer gesetzt werden da er android.webkit lädt.

Schritt-für-Schritt-Anleitung für Beispielpaket

Das folgende Beispiel zeigt, wie die AndroidManifest.xml eines 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>