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. |
- 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:
- Überlagern Sie die Konfiguration
config_systemUserPackagesBlacklistSupported
“ ausframeworks/base/core/res/res/values/config.xml
und setzen Sie sie auftrue
. 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. - 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>
- Fügen Sie eine Zeile zu
device.mk
hinzu, um die Datei in den Zielordnersystem/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 .
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 .
- Überprüfen Sie das Android-Manifest auf
android:singleUser="true"
. - Wenn true , Zulassungsliste. Wird für den Systembenutzer benötigt.
- 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 .
- Überprüfen Sie das Android-Manifest auf
android:defaultToDeviceProtectedStorage="true"
, das für zahlreiche Systemstartdienste benötigt wird. - Wenn true , Zulassungsliste.
- 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.
- Wenn Ja , möglicherweise für den Systembenutzer erforderlich.
- 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.
- Wenn Ja , überprüfen Sie die nächste Komponente.
- 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.
- Wenn ja , Zulassungsliste.
- 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.
- Wenn Ja , nicht auf die Zulassungsliste setzen.
- 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 .
- Wenn Ja , nicht auf die Zulassungsliste setzen.
- 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.
- Wenn ja , Zulassungsliste.
- 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>