Sistem kullanıcısı için paketleri kaldırma

Bu sayfada, sistem kullanıcısı için gerekli olmayan paketleri tespit edip kaldırarak performansın nasıl iyileştirileceği açıklanmaktadır.

Gereksiz paketleri devre dışı bırakma

Automotive'te sistem kullanıcısı başsızdır. Yani sistem kullanıcısının bir insan tarafından kullanılması veya doğrudan erişilmesi amaçlanmamıştır. Sonuç olarak, birçok uygulama ve hizmetin sistem kullanıcısında çalışması gerekmez ve performansı artırmak için devre dışı bırakılabilir. Bu nedenle, sistem kullanıcısı (Kullanıcı 0) için gereksiz uygulamaları kaldırma seçeneği sunulur.

Bu sayfada iki tür kullanıcı ele alınmaktadır:

  • SİSTEM. Her zaman 0. kullanıcı
  • TAM. Kullanıcı 10+: Bir insan tarafından (sistem kullanıcısı olmayan) kullanılması amaçlanan kullanıcı

Android 11

Android 11'de config_userTypePackageWhitelistMode yapılandırmasını değiştirin. İşaretler birleştirilebilir. Bu durumda 5, 1 ve 4'nin toplamına (1 ve 4 işaretlerinin bir kombinasyonu) eşittir.

İşaretle Açıklama
0 İzin verilenler listesini devre dışı bırakın. Tüm sistem paketlerini yükleyin, günlük kaydı yok.
1 Uygula'ya dokunun. Sistem paketlerini yalnızca izin verilenler listesine eklendiklerinde yükleyin.
2 İzin verilenler listesine eklenmemiş paketleri günlüğe kaydedin.
4 İzin verilenler listesi dosyasında belirtilmeyen tüm paketler, tüm kullanıcılar için varsayılan olarak izin verilenler listesine eklenir.
8 Sistem kullanıcısı için 4 ile aynı.
16 OTA'ları yoksayabilirsiniz. OTA'lar sırasında sistem paketleri yüklemeyin.

Aşağıdaki yaygın senaryoları göz önünde bulundurun:

  • Bir özelliği tam izin verilenler listesi için etkinleştirmek üzere 1 (tam olarak uygulanır)
  • Eksik bir izin verilenler listesi için bir özelliği etkinleştirmek üzere 5
  • SYSTEM kullanıcısı için yerel geliştirmeyi kolaylaştırmak amacıyla bir özelliği etkinleştirmek için, 9 (örtülü izin verilenler listesi)
  • Bir özelliği 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ı cihazın sysconfig dizinine yükleyin (bu, cihazın sistem resmini oluşturmak için kullanılan makefile'i (.mk) içeren dizindir). XML dosyasını adlandırırken paketin derlemede tanımlandığı konumu ekleyin (ör. 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

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

  1. frameworks/base/core/res/res/values/config.xml'daki config_systemUserPackagesBlacklistSupported yapılandırmasını true'ye yerleştirin ve ayarlayın. Özellik etkinleştirildiğinde varsayılan olarak tüm paketler hem sistem kullanıcısı hem de TAM kullanıcı için yüklenir.
  2. Sistem kullanıcısı için devre dışı bırakılması gereken paketleri 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ı cihazın hedef klasörüne system/etc/sysconfig/ kopyalamak için device.mk içine 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ğrulama

Sonucu doğrulamak için şu komutu ç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

Bina Adı

Bir paketin sistem kullanıcısına yüklenip yüklenmeyeceğini belirlemek için proje kaynağının kökünde bulunan paketin AndroidManifest.xml dosyasını inceleyin. Bu dosya, uygulamanın özellikleri ve tüm etkinlikleri, hizmetleri, yayın alıcıları ve içerik sağlayıcıları içeren uygulama bileşenlerini içerir. Daha fazla bilgi edinmek için Uygulama manifest dosyasına genel bakış başlıklı makaleyi inceleyin.

Paketler iş akışını devre dışı bırakma

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

1. seviye, uygulama düzeyi

1. Uygulamanın (veya uygulama bileşenlerinin) tekil olarak tanımlanıp tanımlanmadığını kontrol edin

Uygulama bir tekil ise sistem, uygulamayı yalnızca sistem kullanıcısında oluşturur. Uygulamanın, çok kullanıcılı bir uygulama olarak tasarlanmış olması muhtemeldir. Çok kullanıcılı uygulamalar hakkında daha fazla bilgi edinmek için Çok kullanıcılı uygulamalar oluşturma başlıklı makaleyi inceleyin.

  1. android:singleUser="true" için Android manifest dosyasını kontrol edin.
  2. true ise izin verilenler listesine ekleyin. Sistem kullanıcısı için gereklidir.
  3. false ise devam edin. Kaldırmadan önce diğer ölçütleri kontrol edin.

2. Uygulamanın korumalı depolama alanına erişimi gerektirip gerektirmediğini kontrol etme

Birçok sistem önyükleme hizmeti, genellikle kimlik bilgisi şifrelenmiş (CE) depolama alanı yerine cihaz şifrelenmiş (DE) depolama alanını kullanır. Ayrıca, doğrudan önyükleme bilincine sahip sistem uygulamaları da cihazda şifrelenmiş depolama alanına dayanır. Doğrudan başlatma bilincine sahip uygulamalar hakkında daha fazla bilgi edinmek için Sistem uygulamalarında doğrudan başlatmayı destekleme başlıklı makaleyi inceleyin.

  1. Android manifest dosyasında, birçok sistem başlatma hizmeti için gereken android:defaultToDeviceProtectedStorage="true" değerini kontrol edin.
  2. true ise izin verilenler listesine ekleyin.
  3. false ise devam edin.

2. seviye, uygulama bileşenleri

Etkinlikler

Etkinlikler hakkında daha fazla bilgi edinmek için Etkinliklere giriş başlıklı makaleyi inceleyin.

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

Etkinlikler kullanıcı arayüzüne yöneliktir. Automotive'te sistem kullanıcısı başsız olduğundan sistem kullanıcısıyla hiçbir insan etkileşime girmemelidir. Sonuç olarak, uygulama yalnızca etkinlikler içeriyorsa büyük olasılıkla sistem kullanıcısıyla alakasızdır.

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

  1. Evet ise sistem kullanıcısı için gerekli olabilir.
  2. Yanıtınız Hayır ise sistem kullanıcısını izin verilenler listesine eklemeyin.

Örneğin, Compatibility Test Suite (CTS) (com.android.cts.priv.ctsshim) yalnızca etkinlikler içerir ve etkinlikler, intent filtrelerini test etmek için tanımlanır. Ancak CTS yüksek ayrıcalığa sahip olduğundan, test amacıyla sistem kullanıcısı için yüklenmesi gerekir.

Hizmet

Hizmetler hakkında daha fazla bilgi edinmek için Hizmetlere genel bakış başlıklı makaleyi inceleyin.

b. Hizmetin özel olarak tanımlanıp tanımlanmadığını ve diğer uygulamalardan erişilip erişilemediğini kontrol edin

Hizmet private olarak tanımlanırsa diğer paketler bu hizmeti kullanmaz. android:exported="false"'yi bulun. Hizmet gizli olarak tanımlanmışsa veya diğer uygulamalardan erişilemezse diğer uygulamalar tarafından bağlanamaz. Bu nedenle, aşağıdaki c ve d adımları alakasızdır. Sonuç olarak, bu bileşen, sistemin kullanıcısı için hizmetin gerekli olup olmadığına dair daha fazla ipucu sağlamaz.

  • Yanıtınız Evet ise bir sonraki bileşeni kontrol edin.
  • Yanıtınız Hayır ise bu bileşeni kontrol etmeye devam edin.

c. Sistem kullanıcısına yüklenen uygulamaların bu hizmete bağlanıp bağlanamayacağını kontrol edin

1. seviyede izin verilenler listesinde paket olup olmadığını kontrol edin ve bu paketlerin bağlı olduğu hizmetleri belirleyin. Bu hizmetteki intent filtresinden ve diğer paketlerdeki startService üzerinden izleme.

Bu hizmet, sistem kullanıcısına yüklenen uygulamalara bağlıysa (örneğin, com.android.car.companiondevicesupport, sistem kullanıcısında çalışacak şekilde izin verilenler listesine eklenmişse) hizmeti izin verilenler listesine ekleyin:

  • Yanıtınız Evet ise izin verilenler listesine ekleyin.
  • Yanıtınız Hayır ise bu bileşeni kontrol etmeye devam edin.

d. Hizmetin diğer uygulamalardan bağlanıp bağlanmadığını ve ön planda çalışacağını beyan edip etmediğini kontrol edin

startForeground'yi bulun. Bu, kullanıcıların uygulamayla ön planda etkileşimde bulunduğu anlamına gelir. Sistem kullanıcısı için bu hizmete büyük olasılıkla ihtiyaç duyulmaz ve izin verilenler listesine eklenmesine gerek yoktur:

  • Yanıtınız Evet ise izin verilenler listesine eklemeyin.
  • Yanıtınız Hayır ise bir sonraki bileşeni kontrol etmeye devam edin.

e. Hizmetin sistem işleminde çalışacak şekilde tanımlanıp tanımlanmadığını kontrol etme

AndroidManifest dosyasında android:process="system" öğesini bulun. Hizmet, sistem işleminde çalışacak şekilde kasıtlı olarak tanımlanmışsa sistem hizmetiyle aynı işlemde çalışır ve sistem kullanıcısında çalışabilmesi için izin verilenler listesine eklenmelidir. Android'in bellek ayırma tasarımı kapsamında, sistem hizmetleri son kapatılacak işlemlerden biridir. Bu da bu tür bir özellikle tanımlanan hizmetlerin kritik olduğunu gösterir. Android'in bellek ayırma tasarımı hakkında daha fazla bilgi edinmek için Düşük bellek öldürücü başlıklı makaleyi inceleyin.

  • Yanıtınız Evet ise izin verilenler listesine eklemeyin.
  • Yanıtınız Hayır ise diğer bileşenleri kontrol etmeye devam edin.

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

İçerik sağlayıcı

İçerik sağlayıcılar hakkında daha fazla bilgi edinmek için İçerik sağlayıcılar başlıklı makaleyi inceleyin.

f. Sistem kullanıcısına yüklenen uygulamanın bu sağlayıcıya bağlı olup olmadığını kontrol etme

1. seviyede izin verilenler listesinde olup olmadığını 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 listesine eklenmişse) bu içerik sağlayıcıya bağlıysa söz konusu içerik sağlayıcının da izin verilenler listesine eklendiğinden emin olun.

  1. Yanıtınız Evet ise izin verilenler listesine ekleyin.
  2. Yanıtınız Hayır ise izin verilenler listesine eklemeyin.

Örneğin, com.android.car.EXAMPLE tekil sağlayıcılar (SystemActionsContentProvider ve ManagedProvisioningActionsContentProvider) içeriyorsa sistem kullanıcısı için izin verilenler listesine eklenmelidir. Ardından, com.android.car.EXAMPLE WebViewFactoryProvider için android.webkit'e bağlıysa android.webkit'ü yüklediği için com.android.webview, sistem kullanıcısı için izin verilenler listesine eklenmelidir.

Örnek paket adım adım açıklamalı kılavuzu

Aşağıdaki örnekte, bir paketin AndroidManifest.xml değerinin nasıl değerlendirileceği gösterilmektedir:

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