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. |
- 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:
- Nałóż:
config_systemUserPackagesBlacklistSupported
konfiguracja zframeworks/base/core/res/res/values/config.xml
i ustawiona go dotrue
. 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. - 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>
- Dodaj wiersz do pliku
device.mk
, aby skopiować plik do folderu folder docelowysystem/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.
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.
- Sprawdź plik manifestu Androida dla aplikacji
android:singleUser="true"
. - Jeśli ma wartość true (prawda), dodaj do listy dozwolonych. Wymagane dla użytkownika systemowego.
- 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.
- Sprawdź plik manifestu Androida
android:defaultToDeviceProtectedStorage="true"
, które jest wymagane w przypadku przy uruchamianiu systemu. - Jeśli ma wartość true (prawda), dodaj do listy dozwolonych.
- 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.
- Jeśli Tak, być może potrzebne w przypadku użytkownika systemowego.
- 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.
- Jeśli Tak, sprawdź następny komponent.
- 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.
- Jeśli Tak, dodaj do listy dozwolonych.
- 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.
- Jeśli Tak, nie dodawaj do listy dozwolonych.
- 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
.
- Jeśli Tak, nie dodawaj do listy dozwolonych.
- 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.
- Jeśli Tak, dodaj do listy dozwolonych.
- 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>