Usuwanie pakietów dla użytkownika systemowego

Z tego artykułu dowiesz się, jak poprawić skuteczność przez identyfikowanie i usuwanie i nie są potrzebne użytkownikowi systemowemu.

Wyłącz niepotrzebne pakiety

W branży motoryzacyjnej użytkownik systemu bez interfejsu graficznego, co oznacza, że dane Użytkownika nie powinny być używane człowieka. W związku z tym wiele aplikacji i usług nie musi być uruchamianych w sekcji Użytkownik systemowy można je wyłączyć, by poprawić wydajność. Dlatego udostępniamy opcję usuwania niepotrzebne aplikacje dla użytkownika systemowego (Użytkownik 0).

Na tej stronie omówione zostaną 2 typy użytkowników:

  • SYSTEM. Zawsze użytkownik 0
  • PEŁNA. informacje o użytkowniku, który ma być używany przez człowieka (niebędący użytkownikiem systemu), Użytkownik 10+

Android 11

W Androidzie 11 zmieniasz konfigurację, config_userTypePackageWhitelistMode Flagi można łączyć. W tym przypadku 5 odpowiada 1. plus 4 (kombinacja flag 1 i 4).

Zgłoś Opis
0 Wyłącz listę dozwolonych. zainstalować wszystkie pakiety systemowe; brak logowania.
1 Wymuś. Instaluj pakiety systemowe tylko wtedy, gdy znajdują się na liście dozwolonych.
2 Rejestruj pakiety spoza listy dozwolonych.
4 Każdy pakiet, który nie znajduje się w pliku listy dozwolonych, jest domyślnie dozwolony dla wszystkich użytkowników.
8 Takie same jak 4 w przypadku użytkownika systemowego.
16 Ignoruj OTA . Nie instaluj pakietów systemowych podczas korzystania z OTA.
Weź pod uwagę te typowe scenariusze.
  • Aby włączyć funkcję na liście dozwolonych, 1 (w pełni wymuszone)
  • Aby włączyć funkcję niepełnej listy dozwolonych, 5
  • Aby włączyć funkcję dla użytkownika SYSTEM w celu ułatwienia rozwoju lokalnego, 9 (niejawna lista dozwolonych)
  • Aby wyłączyć funkcję, tak jakby nigdy nie była włączona, 16
  • Aby wyłączyć funkcję i cofnąć wszystkie poprzednie efekty, 0

Pamiętaj, aby zainstalować plik XML w katalogu sysconfig urządzenia (jest to ten sam katalog, który zawiera plik Makerfile (`.mk`) użyty do utworzenia obraz systemu). W nazwie pliku XML umieść lokalizację w którym pakiet jest zdefiniowany w kompilacji. Na przykład: 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 i Android 10

Aby skonfigurować tę funkcję na Androidzie 9 i 10:

  1. Nałóż: config_systemUserPackagesBlacklistSupported konfiguracja z frameworks/base/core/res/res/values/config.xml i ustawiona go do true. Gdy ta funkcja jest włączona, domyślnie wszystkie pakiety powinna być zainstalowana zarówno dla użytkownika systemowego, jak i dla użytkownika PEŁNEGO.
  2. Utwórz plik config.xml z listą pakietów, które powinny wyłączone dla użytkownika systemowego. Na przykład:
    <config>
        <!-- This package will be uninstalled for the system user -->
        <system-user-blacklisted-app package="com.google.car.calendar" />
    </config>
    
  3. Dodaj wiersz do pliku device.mk, aby skopiować plik do folderu folder docelowy system/etc/sysconfig/. Na przykład:
    PRODUCT_COPY_FILES += <full path to the config file>:system/etc/sysconfig/<new denylist config file>.xml
    

Sprawdź wynik

Aby sprawdzić wynik, uruchom polecenie:

$ 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

Budynek

Aby określić, czy pakiet powinien być zainstalowany u użytkownika systemowego, przejrzyj AndroidManifest.xml pakietu znajduje się w katalogu głównym źródła projektu, w tym atrybuty aplikacji i komponenty w tym wszystkie działania, usługi, odbiorniki i treści dostawców usług. Więcej informacji znajdziesz w sekcji Aplikacja Omówienie pliku manifestu.

Wyłączanie przepływu pracy pakietów

Rysunek 1. Wyłączanie przepływu pracy pakietów

Poziom 1, poziom aplikacji

1. Sprawdź, czy aplikacja (lub jej komponenty) jest zadeklarowana jako singleton

Jeśli aplikacja jest singleton, system utworzy instancję aplikacji tylko u użytkownika systemowego. Prawdopodobnie aplikacja Aplikacja była przeznaczona dla wielu użytkowników. Więcej informacji o uwzględnianiu wielu użytkowników Więcej informacji znajdziesz w artykule na temat tworzenia aplikacji rozpoznawanych przez wielu użytkowników.

  1. Sprawdź plik manifestu Androida dla aplikacji android:singleUser="true".
  2. Jeśli ma wartość true (prawda), dodaj do listy dozwolonych. Wymagane dla użytkownika systemowego.
  3. Jeśli ma wartość false, przejdź dalej. Zanim usuniesz, sprawdź inne kryteria.

2. Sprawdzanie, czy aplikacja wymaga dostępu do pamięci chronionej

Wiele usług uruchamiania systemu często korzysta z pamięci zaszyfrowanej na urządzeniu (DE) magazynu danych uwierzytelniających zaszyfrowanego (CE). Poza tym bezpośrednie aplikacje systemowe również zależy od pamięci zaszyfrowanej na urządzeniu. Aby dowiedzieć się więcej o płatnościach bezpośrednich aplikacje wykrywające uruchamianie się aplikacji, zobacz Zespół pomocy Bezpośredni rozruch w aplikacjach systemowych.

  1. Sprawdź plik manifestu Androida android:defaultToDeviceProtectedStorage="true", które jest wymagane w przypadku przy uruchamianiu systemu.
  2. Jeśli ma wartość true (prawda), dodaj do listy dozwolonych.
  3. Jeśli ma wartość false, przejdź dalej.

Poziom 2. Komponenty aplikacji

Działania

Więcej informacji o zadaniach znajdziesz we wprowadzeniu w sekcji Aktywność.

a. Sprawdzanie, czy aplikacja zawiera tylko aktywności

Czynności te są dostosowane do interfejsu użytkownika. Użytkownik systemowy nie ma interfejsu graficznego W branży motoryzacyjnej nie należy wchodzić w interakcję z użytkownikiem systemu. Z tego względu, jeśli Aplikacja zawiera tylko aktywność, raczej nie pasuje do Użytkownik systemowy.

Sprawdź priorytet i specjalne uprawnienia.

  1. Jeśli Tak, być może potrzebne w przypadku użytkownika systemowego.
  2. Jeśli wybierzesz Nie, nie dodawaj użytkownika systemowego do listy dozwolonych.

Na przykład Compatibility Test Suite (CTS) (com.android.cts.priv.ctsshim) zawiera tylko aktywności, Zdefiniowano działania na potrzeby testowania filtrów intencji. Ze względu na dużą musi zostać zainstalowany dla użytkownika systemowego w celach testowych.

Usługa

Więcej informacji o usługach znajdziesz w artykule Omówienie usług.

b. Sprawdź, czy usługa jest zadeklarowana jako prywatna i czy nie można uzyskać do niej dostępu z innych aplikacji

Jeśli usługa jest zadeklarowana jako prywatna, inne pakiety nie będą używać parametru posprzedażna. Poszukaj aplikacji android:exported="false". Jeśli usługa jest zadeklarowana jako prywatne lub nie można uzyskać do niego dostępu z innych aplikacji, nie mogą go powiązać z innymi aplikacjami. W związku z tym poniższe kroki C i D są nieistotne. W rezultacie ten komponent nie dostarczyłby więcej wskazówek dotyczących tego, czy usługa jest potrzebna dla Użytkownika systemowego.

  1. Jeśli Tak, sprawdź następny komponent.
  2. Jeśli Nie, kontynuuj sprawdzanie tego komponentu.

c. Sprawdź, czy aplikacje zainstalowane u użytkownika systemowego mogą być powiązane z tą usługą

Sprawdź pakiety umieszczone na liście dozwolonych na poziomie 1 i zidentyfikuj usługi, do których z innymi. Ślad z filtra intencji w tej usłudze i w startService w innych pakietach.

Jeśli ta usługa jest powiązana z aplikacjami zainstalowanymi u użytkownika systemowego (na przykład com.android.car.companiondevicesupport może działać w użytkownika systemowego), a następnie dodaj usługę do listy dozwolonych.

  1. Jeśli Tak, dodaj do listy dozwolonych.
  2. Jeśli Nie, kontynuuj sprawdzanie tego komponentu.

d. Sprawdź, czy usługa jest powiązana z innymi aplikacjami i zadeklarowana do działania na pierwszym planie

Poszukaj aplikacji startForeground. Oznacza to, że ludzie wchodzą w interakcję z: i aplikacjami na pierwszym planie. Najprawdopodobniej ta usługa nie będzie potrzebna w przypadku Użytkownik systemowy, który nie musi znajdować się na liście dozwolonych.

  1. Jeśli Tak, nie dodawaj do listy dozwolonych.
  2. Jeśli nie, sprawdź następny komponent.

e. Sprawdź, czy usługa ma być uruchamiana w procesie systemowym

W pliku AndroidManifest znajdź android:process="system".
Jeśli usługa jest celowo zdefiniowana do uruchamiania w procesie systemowym, oznacza to, że będzie uruchamiane w tym samym procesie co usługa systemowa powinny znajdować się na liście dozwolonych, aby można było uruchamiać je u użytkownika systemowego. Jako część pamięci Androida projektowanie alokacji, usługi systemowe to tylko niektóre z ostatnich procesów, które należy zakończyć co wskazuje na krytykę usług zdefiniowanych za pomocą danego atrybutu. Do więcej informacji o projekcie alokacji pamięci w Androidzie znajdziesz w sekcji Mała ilość pamięci .

  1. Jeśli Tak, nie dodawaj do listy dozwolonych.
  2. Jeśli nie, sprawdź inne komponenty.

Na przykład pakiet com.android.networkstack.inprocess musi być znajduje się na liście dozwolonych, ponieważ zawiera RegularMaintenanceJobService, który zawiera tag android:process="system".

Dostawca treści

Więcej informacji o dostawcach treści: Dostawcy treści.

f. Sprawdź, czy aplikacja zainstalowana w użytkowniku systemowym zależy od tego dostawcy

Sprawdź, czy znajdują się na liście dozwolonych na poziomie 1, i sprawdź, których dostawców od których zależy. Jeśli aplikacja uruchomiona przez użytkownika systemowego (na przykład com.android.car.companiondevicesupport może działać w użytkownika systemowego) i zależnie od tego dostawcy treści, upewnij się, że treści dostawca usług znajduje się na liście dozwolonych.

  1. Jeśli Tak, dodaj do listy dozwolonych.
  2. Jeśli Nie, nie dodawaj domeny do listy dozwolonych.

Na przykład jeśli com.android.car.EXAMPLE zawiera słowo jednotonowe dostawcy (SystemActionsContentProvider i ManagedProvisioningActionsContentProvider), powinno być znajduje się na liście dozwolonych dla użytkownika systemowego. Następnie, jeśli com.android.car.EXAMPLE zależy od wartości android.webkit w przypadku WebViewFactoryProvider następnie com.android.webview musi znajdować się na liście dozwolonych dla użytkownika systemowego biorąc pod uwagę, że wczytuje on android.webkit.

Przewodnik po przykładowym pakiecie

Poniższy przykład pokazuje, jak ocenić AndroidManifest.xml pakiet:

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