Entfernen Sie Pakete für den Systembenutzer

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

Deaktivieren Sie unnötige Pakete

Im Automobilbereich ist der Systembenutzer kopflos , was bedeutet, dass der Systembenutzer nicht dazu gedacht ist, von einem Menschen verwendet zu werden oder direkt darauf zuzugreifen. Daher müssen viele Apps und Dienste nicht im Systembenutzer ausgeführt werden und können zur Verbesserung der Leistung deaktiviert werden. Daher gibt es eine Option zum Entfernen unnötiger Apps für den Systembenutzer (Benutzer 0).

Auf dieser Seite werden zwei Arten von Benutzern besprochen:

  • SYSTEM . Immer Benutzer 0
  • VOLL . Benutzer, der von einem Menschen (einem Nicht-Systembenutzer) verwendet werden soll, Benutzer 10+

Android 11

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

Flagge Beschreibung
0 Zulassungsliste deaktivieren. Installieren Sie alle Systempakete; keine Protokollierung.
1 Erzwingen. Installieren Sie Systempakete nur, wenn sie auf der Zulassungsliste stehen.
2 Nicht zugelassene Pakete protokollieren.
4 Jedes Paket, das nicht in der Zulassungslistendatei erwähnt wird, wird implizit für alle Benutzer auf die Zulassungsliste gesetzt.
8 Das Gleiche wie 4 für den Systembenutzer.
16 Ignorieren Sie OTAs. Installieren Sie während OTAs keine Systempakete.
Betrachten Sie diese häufigen Szenarien.
  • Um eine Funktion für eine vollständige Zulassungsliste zu aktivieren, 1 ( vollständig durchgesetzt )
  • So aktivieren Sie eine Funktion für eine unvollständige Zulassungsliste: 5
  • Um eine Funktion für den SYSTEM Benutzer zu aktivieren, um die lokale Entwicklung zu erleichtern, 9 ( implizite Zulassungsliste )
  • Um eine Funktion zu deaktivieren, als ob sie nie aktiviert worden wäre, 16
  • Um eine Funktion zu deaktivieren und alle vorherigen Effekte rückgängig zu machen, 0

Stellen Sie sicher, dass Sie die XML-Datei im sysconfig Verzeichnis für das Gerät installieren (dies ist dasselbe Verzeichnis, das die Makefile („.mk“) enthält, die zum Erstellen des Systemabbilds für das Gerät verwendet wird). Geben Sie beim Benennen der XML-Datei den Speicherort an, an dem das Paket im Build definiert ist. Zum 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 in Android 9 und Android 10:

  1. Überlagern Sie die Konfiguration config_systemUserPackagesBlacklistSupported “ aus frameworks/base/core/res/res/values/config.xml und setzen Sie sie auf true . Wenn die Funktion aktiviert ist, sollten standardmäßig alle Pakete sowohl für den Systembenutzer als auch für den VOLLSTÄNDIGEN Benutzer installiert werden.
  2. Erstellen Sie eine config.xml Datei, die auflistet, welche Pakete für den Systembenutzer deaktiviert werden sollen. Beispiel:
    <config>
        <!-- This package will be uninstalled for the system user -->
        <system-user-blacklisted-app package="com.google.car.calendar" />
    </config>
    
  3. Fügen Sie eine Zeile zu device.mk hinzu, um die Datei in den Zielordner system/etc/sysconfig/ des Geräts zu kopieren. Beispiel:
    PRODUCT_COPY_FILES += <full path to the config file>:system/etc/sysconfig/<new denylist config file>.xml
    

Überprüfen Sie das Ergebnis

Um das Ergebnis zu überprüfen, führen Sie Folgendes aus:

$ 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

Prämisse

Um festzustellen, ob ein Paket im Systembenutzer installiert werden sollte, untersuchen Sie die Datei AndroidManifest.xml des Pakets im Stammverzeichnis der Projektquelle, einschließlich der Attribute der App und der Komponenten der App, einschließlich aller Aktivitäten, Dienste, Rundfunkempfänger usw. und Inhaltsanbieter. Weitere Informationen finden Sie unter App-Manifest-Übersicht .

Deaktivieren Sie den Paketworkflow

Abbildung 1. Workflow zum Deaktivieren von Paketen

Ebene 1, App-Ebene

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

Wenn es sich bei der App um einen Singleton handelt, instanziiert das System die App nur im Systembenutzer. Es ist wahrscheinlich, dass die App als Mehrbenutzer-App gedacht war. Weitere Informationen zu Mehrbenutzer-fähigen Apps finden Sie unter Erstellen von Mehrbenutzer-fähigen Apps .

  1. Überprüfen Sie das Android-Manifest auf android:singleUser="true" .
  2. Wenn true , Zulassungsliste. Wird für den Systembenutzer benötigt.
  3. Wenn false , fahren Sie fort. Überprüfen Sie vor dem Entfernen andere Kriterien.

2. Prüfen Sie, ob die App einen geschützten Speicherzugriff erfordert

Viele Systemstartdienste basieren häufig auf geräteverschlüsseltem (DE) Speicher anstelle von mit Anmeldeinformationen verschlüsseltem (CE) Speicher. Außerdem sind System-Apps, die direkt bootfähig sind, ebenfalls auf geräteverschlüsselten Speicher angewiesen. Weitere Informationen zu Direct-Boot-fähigen Apps finden Sie unter Supporting Direct Boot in System-Apps .

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

Ebene 2, App-Komponenten

Aktivitäten

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

A. Überprüfen Sie, ob die App nur Aktivitäten enthält

Aktivitäten sind benutzeroberflächenorientiert. Da der Systembenutzer im Automobilbereich kopflos ist, sollte kein Mensch mit dem Systembenutzer interagieren. Wenn die App daher nur Aktivitäten enthält, ist die App höchstwahrscheinlich für den Systembenutzer nicht relevant.

Prüfen Sie auf Priorität und besondere Privilegien.

  1. Wenn Ja , möglicherweise für den Systembenutzer erforderlich.
  2. Wenn Nein , wird der Systembenutzer nicht auf die Zulassungsliste gesetzt.

Beispielsweise enthält die Compatibility Test Suite (CTS) ( com.android.cts.priv.ctsshim ) nur Aktivitäten, und Aktivitäten sind zum Testen von Absichtsfiltern definiert. Da es jedoch über hohe Berechtigungen verfügt, muss es zu Testzwecken für den Systembenutzer installiert werden.

Service

Weitere Informationen zu Diensten finden Sie unter Dienstübersicht .

B. Überprüfen Sie, ob der Dienst als privat deklariert ist und nicht von anderen Apps aus darauf zugegriffen werden kann

Wenn der Dienst als privat deklariert ist, nutzen andere Pakete den Dienst nicht. Suchen Sie nach android:exported="false" . Wenn der Dienst als privat deklariert ist oder von anderen Apps aus nicht darauf zugegriffen werden kann, kann er nicht von anderen Apps angebunden werden. Daher sind Schritt C und Schritt D unten irrelevant. Daher würde diese Komponente keine weiteren Hinweise darauf liefern, ob der Dienst für den Systembenutzer benötigt wird oder nicht.

  1. Wenn Ja , überprüfen Sie die nächste Komponente.
  2. Wenn Nein , prüfen Sie diese Komponente weiter.

C. Überprüfen Sie, ob im Systembenutzer installierte Apps möglicherweise eine Verbindung zu diesem Dienst herstellen

Suchen Sie nach Paketen auf der Zulassungsliste in Ebene 1 und identifizieren Sie die Dienste, an die sie gebunden sind. Trace vom Intent-Filter in diesem Dienst und startService in anderen Paketen.

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

  1. Wenn ja , Zulassungsliste.
  2. Wenn Nein , prüfen Sie diese Komponente weiter.

D. Überprüfen Sie, ob der Dienst an andere Apps gebunden ist und für die Ausführung im Vordergrund deklariert ist

Suchen Sie nach startForeground . Das bedeutet, dass die Leute im Vordergrund mit der App interagieren würden. Höchstwahrscheinlich wird dieser Dienst für den Systembenutzer nicht benötigt und muss nicht auf die Zulassungsliste gesetzt werden.

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

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

Suchen Sie im AndroidManifest nach android:process="system" .
Wenn der Dienst absichtlich so definiert ist, dass er im Systemprozess ausgeführt wird, bedeutet dies, dass er explizit im selben Prozess wie der Systemdienst ausgeführt wird und für die Ausführung im Systembenutzer auf die Zulassungsliste gesetzt werden sollte. Als Teil des Speicherzuweisungsdesigns von Android gehören Systemdienste zu den letzten Prozessen, die abgebrochen werden, was die Wichtigkeit von Diensten impliziert, die mit einem solchen Attribut definiert sind. Weitere Informationen zum Speicherzuweisungsdesign von Android finden Sie unter Low-Memory Killer .

  1. Wenn Ja , nicht auf die Zulassungsliste setzen.
  2. Wenn Nein , fahren Sie mit der Überprüfung anderer Komponenten fort.

Beispielsweise muss das Paket com.android.networkstack.inprocess auf die Zulassungsliste gesetzt werden, da es RegularMaintenanceJobService enthält, das über das Tag android:process="system" verfügt.

Inhalt Anbieter

Weitere Informationen zu Inhaltsanbietern finden Sie unter Inhaltsanbieter .

F. Überprüfen Sie, ob die im Systembenutzer installierte App von diesem Anbieter abhängt

Suchen Sie nach Paketen auf der Zulassungsliste in Ebene 1 und prüfen Sie, von welchen Anbietern sie abhängig sind. Wenn eine App, die im Systembenutzer ausgeführt wird (z. B. com.android.car.companiondevicesupport , für die Ausführung im Systembenutzer zugelassen ist) und von diesem Inhaltsanbieter abhängig ist, stellen Sie sicher, dass dieser Inhaltsanbieter ebenfalls auf der Zulassungsliste steht.

  1. Wenn ja , Zulassungsliste.
  2. Wenn Nein , nicht auf die Zulassungsliste setzen.

Wenn beispielsweise com.android.car.EXAMPLE Singleton-Anbieter ( SystemActionsContentProvider und ManagedProvisioningActionsContentProvider ) enthält, sollte es für den Systembenutzer auf die Zulassungsliste gesetzt werden. Wenn dann com.android.car.EXAMPLE von android.webkit für WebViewFactoryProvider abhängt, muss com.android.webview für den Systembenutzer auf die Zulassungsliste gesetzt werden, vorausgesetzt, dass es android.webkit lädt.

Beispielpaket-Komplettlösung

Das folgende Beispiel zeigt, wie die AndroidManifest.xml eines Pakets ausgewertet wird:

<?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>