Sistem Kullanıcısı için paketleri kaldırın

Bu makalede, Sistem Kullanıcısı için gerekli olmayan paketleri belirleyip kaldırarak performansın nasıl artırılacağı açıklanmaktadır.

Gereksiz paketleri devre dışı bırakın

Otomotivde Sistem Kullanıcısı başsızdır ; bu, Sistem Kullanıcısının bir insan tarafından kullanılması veya doğrudan erişilmesinin amaçlanmadığı anlamına gelir. Sonuç olarak, birçok uygulama ve hizmetin Sistem Kullanıcısında çalıştırılmasına gerek yoktur ve performansı artırmak için devre dışı bırakılabilir. Bu nedenle Sistem Kullanıcısı (Kullanıcı 0) için gereksiz uygulamaların kaldırılması seçeneği sunulmuştur.

Bu sayfada iki tür Kullanıcı tartışılmaktadır:

  • SİSTEM . Her Zaman Kullanıcı 0
  • TAM DOLU . Bir insan (Sistem dışı Kullanıcı) tarafından kullanılması amaçlanan Kullanıcı, 10+ Kullanıcı

Android 11

Android 11'de, config_userTypePackageWhitelistMode yapılandırmasını değiştirirsiniz. Bayraklar birleştirilebilir. Bu durumda 5 , 1 artı 4 ( 1 ve 4 işaretlerinin birleşimi) eşittir.

Bayrak Tanım
0 İzin verilenler listesini devre dışı bırakın. Tüm sistem paketlerini yükleyin; kayıt yok.
1 Yürüt. Sistem paketlerini yalnızca izin verilenler listesine eklendiğinde yükleyin.
2 İzin verilenler listesinde olmayan paketleri günlüğe kaydedin.
4 İzin verilenler listesi dosyasında belirtilmeyen herhangi bir paket, tüm kullanıcılar için dolaylı olarak izin verilenler listesine eklenir.
8 Sistem kullanıcısı için 4 ile aynıdır.
16 OTA'ları dikkate almayın. OTA'lar sırasında sistem paketlerini kurmayın.
Bu yaygın senaryoları göz önünde bulundurun.
  • Bir özelliği tam bir izin verilenler listesi için etkinleştirmek üzere 1 ( tamamen zorunlu kılındı )
  • Tamamlanmamış bir izin verilenler listesi için bir özelliği etkinleştirmek üzere, 5
  • SYSTEM kullanıcısının yerel geliştirmeyi kolaylaştıracak bir özelliği etkinleştirmek için, 9 ( örtük izin verilenler listesi )
  • Bir özelliği sanki hiç etkinleştirilmemiş gibi devre dışı bırakmak için 16
  • Bir özelliği devre dışı bırakmak ve önceki tüm efektleri geri almak için 0

XML dosyasını aygıtın sysconfig dizinine yüklediğinizden emin olun (bu, aygıtın sistem görüntüsünü oluşturmak için kullanılan makefile dosyasını (`.mk`) içeren dizinle aynıdır). XML dosyasını adlandırdığınızda, paketin build.gradle dosyasında tanımlandığı konumu ekleyin. Örneğin, 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 ve Android 10

Bu özelliği Android 9 ve Android 10'da yapılandırmak için:

  1. frameworks/base/core/res/res/values/config.xml dosyasındaki config_systemUserPackagesBlacklistSupported yapılandırmasını yerleştirin ve true olarak ayarlayın. Özellik açıldığında varsayılan olarak hem Sistem Kullanıcısı hem de TAM Kullanıcı için tüm paketlerin kurulması gerekir.
  2. Sistem Kullanıcısı için hangi paketlerin devre dışı bırakılması gerektiğini listeleyen bir config.xml dosyası oluşturun. Örneğin:
    <config>
        <!-- This package will be uninstalled for the system user -->
        <system-user-blacklisted-app package="com.google.car.calendar" />
    </config>
    
  3. Dosyayı aygıtın hedef klasörü system/etc/sysconfig/ 'e kopyalamak için device.mk dosyasına bir satır ekleyin. Örneğin:
    PRODUCT_COPY_FILES += <full path to the config file>:system/etc/sysconfig/<new denylist config file>.xml
    

Sonucu doğrulayın

Sonucu doğrulamak için şunu çalıştırın:

$ 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

Öncül

Sistem Kullanıcısına bir paketin kurulması gerekip gerekmediğini belirlemek için, uygulamanın öznitelikleri ve tüm etkinlikleri, hizmetleri, yayın alıcılarını içeren uygulama bileşenlerini içeren paketin proje kaynağının kökünde bulunan AndroidManifest.xml dosyasını inceleyin. ve içerik sağlayıcılar. Daha fazla bilgi edinmek için Uygulama Bildirimine Genel Bakış bölümüne bakın.

Paket iş akışını devre dışı bırak

Şekil 1. Paket iş akışını devre dışı bırakın

1. Düzey, uygulama düzeyi

1. Uygulamanın (veya uygulama bileşenlerinin) tekil olarak bildirilip bildirilmediğini kontrol edin

Uygulama bir singleton ise sistem, uygulamayı yalnızca Sistem Kullanıcısında başlatacaktır. Uygulamanın çok kullanıcılı bir uygulama olması amaçlanmış olabilir. Çok kullanıcılı uygulamalar hakkında daha fazla bilgi edinmek için Çok Kullanıcılı Uygulamalar Oluşturma konusuna bakın.

  1. android:singleUser="true" için Android bildirimini kontrol edin.
  2. Doğruysa izin verilenler listesine ekleyin. Sistem Kullanıcısı için gereklidir.
  3. Yanlış ise devam edin. Kaldırmadan önce diğer kriterleri kontrol edin.

2. Uygulamanın korumalı depolama erişimi gerektirip gerektirmediğini kontrol edin

Çoğu sistem önyükleme hizmeti genellikle kimlik bilgisi şifreli (CE) depolama yerine cihaz şifreli (DE) depolamayı kullanır. Ayrıca, doğrudan önyüklemeyi tanıyan sistem uygulamaları da cihazın şifrelenmiş depolama alanına güvenir. Doğrudan önyüklemeyi destekleyen uygulamalar hakkında daha fazla bilgi edinmek için bkz . Sistem uygulamalarında Doğrudan Önyüklemeyi Destekleme .

  1. Çok sayıda sistem önyükleme hizmeti için gerekli olan android:defaultToDeviceProtectedStorage="true" için Android bildirimini kontrol edin.
  2. Doğruysa izin verilenler listesine ekleyin.
  3. Yanlış ise devam edin.

Düzey 2, uygulama bileşenleri

Faaliyetler

Etkinlikler hakkında daha fazla bilgi edinmek için bkz. Etkinliklere Giriş .

A. Uygulamanın yalnızca etkinlikler içerip içermediğini kontrol edin

Faaliyetler kullanıcı arayüzü odaklıdır. Otomotiv'de Sistem Kullanıcısı başsız olduğundan, Sistem Kullanıcısı ile hiçbir insan etkileşime girmemelidir. Sonuç olarak, uygulama yalnızca Etkinlikler içeriyorsa uygulama büyük olasılıkla Sistem Kullanıcısıyla alakalı değildir.

Öncelik ve özel ayrıcalık olup olmadığını kontrol edin.

  1. Evet ise, Sistem Kullanıcısı için gerekli olabilir.
  2. Hayır ise Sistem Kullanıcısı için izin verilenler listesine eklemeyin.

Örneğin Uyumluluk Test Paketi (CTS) ( com.android.cts.priv.ctsshim ) yalnızca Etkinlikleri içerir ve Etkinlikler, amaç filtrelerini test etmek için tanımlanır. Ancak yüksek ayrıcalıklara sahip olduğundan Sistem Kullanıcısına test amaçlı kurulması gerekmektedir.

Hizmet

Hizmetler hakkında daha fazla bilgi edinmek için Hizmetlere genel bakış bölümüne bakın.

B. Hizmetin özel olarak bildirilip bildirilmediğini ve diğer uygulamalardan erişilemediğini kontrol edin

Hizmetin özel olarak bildirilmesi durumunda diğer paketler hizmeti kullanmayacaktır. android:exported="false" arayın. Hizmet özel olarak bildirilirse veya başka uygulamalardan erişilemiyorsa bu durumda diğer uygulamalar tarafından bağlanamaz. Bu nedenle aşağıdaki C Adımı ve D Adımı önemsizdir. Sonuç olarak bu bileşen, Sistem Kullanıcısı için hizmetin gerekli olup olmadığı konusunda daha fazla ipucu sağlamayacaktır.

  1. Evet ise sonraki bileşeni kontrol edin.
  2. Hayır ise bu bileşeni kontrol etmeye devam edin.

C. Sistem Kullanıcısında yüklü uygulamaların bu hizmete bağlanıp bağlanamayacağını kontrol edin

Düzey 1'de izin verilenler listesindeki paketleri kontrol edin ve bunların bağlı olduğu hizmetleri belirleyin. Bu hizmetteki amaç filtresinden izleme yapın ve diğer paketlerdeki startService yararlanın.

Bu hizmet, Sistem Kullanıcısında yüklü uygulamalara bağlıysa (örneğin, com.android.car.companiondevicesupport , Sistem Kullanıcısında çalıştırılmak üzere izin verilenler listesine eklenmişse), hizmeti izin verilenler listesine ekleyin.

  1. Evet ise izin verilenler listesi.
  2. Hayır ise bu bileşeni kontrol etmeye devam edin.

D. Hizmetin diğer uygulamalara bağlı olup olmadığını ve ön planda çalışacak şekilde bildirilip bildirilmediğini kontrol edin

startForeground öğesini arayın. Bu, insanların ön planda uygulamayla etkileşime gireceği anlamına gelir. Büyük ihtimalle Sistem Kullanıcısı için bu hizmete ihtiyaç duyulmaz ve izin verilenler listesine alınması da gerekmez.

  1. Evet ise izin verilenler listesine eklemeyin.
  2. Hayır ise sonraki bileşeni kontrol etmeye devam edin.

e. Hizmetin sistem sürecinde çalışacak şekilde tanımlanıp tanımlanmadığını kontrol edin

AndroidManifest'te android:process="system" arayın.
Hizmet kasıtlı olarak sistem sürecinde çalışacak şekilde tanımlanmışsa bu, açıkça sistem hizmetiyle aynı süreçte çalışacağı ve Sistem Kullanıcısında çalıştırılmak üzere izin verilenler listesine eklenmesi gerektiği anlamına gelir. Android'in bellek ayırma tasarımının bir parçası olarak sistem hizmetleri, sonlandırılacak son işlemlerden bazılarıdır; bu da, böyle bir öznitelikle tanımlanan hizmetlerin kritikliğine işaret eder. Android'in bellek ayırma tasarımı hakkında daha fazla bilgi edinmek için bkz . Düşük bellek öldürücü .

  1. Evet ise izin verilenler listesine eklemeyin.
  2. Hayır ise diğer bileşenleri kontrol etmeye devam edin.

Örneğin, com.android.networkstack.inprocess paketi android:process="system" etiketine sahip RegularMaintenanceJobService içerdiğinden izin verilenler listesine eklenmelidir.

İçerik sağlayıcı

İçerik sağlayıcılar hakkında daha fazla bilgi edinmek için bkz. İçerik sağlayıcılar .

F. Sistem Kullanıcısında yüklü uygulamanın bu sağlayıcıya bağlı olup olmadığını kontrol edin

Düzey 1'de izin verilenler listesindeki paketleri kontrol edin ve hangi sağlayıcılara bağlı olduklarını kontrol edin. Sistem Kullanıcısında çalışan bir uygulama (örneğin, com.android.car.companiondevicesupport , Sistem Kullanıcısında çalışacak şekilde izin verilenler listesindeyse) ve bu içerik sağlayıcıya bağlıysa bu içerik sağlayıcının da izin verilenler listesinde olduğundan emin olun.

  1. Evet ise izin verilenler listesi.
  2. Hayır ise izin verilenler listesine eklemeyin.

Örneğin, com.android.car.EXAMPLE tekli sağlayıcılar içeriyorsa ( SystemActionsContentProvider ve ManagedProvisioningActionsContentProvider ), Sistem Kullanıcısı için izin verilenler listesine eklenmelidir. Daha sonra, com.android.car.EXAMPLE , WebViewFactoryProvider için android.webkit bağlıysa, com.android.webview , android.webkit dosyasını yüklemesi koşuluyla Sistem Kullanıcısı için izin verilenler listesine eklenmesi gerekir.

Örnek paket açıklaması

Aşağıdaki örnek, bir paketin AndroidManifest.xml dosyasının nasıl değerlendirileceğini gösterir:

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