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

Bu sayfada, sorunları belirleyip kaldırarak performansı nasıl iyileştirebileceğiniz açıklanmaktadır. gerekli olmayan paketlere öncelik vermektir.

Gereksiz paketleri devre dışı bırakma

Otomotiv'de sistem kullanıcısı: gözetimsiz, diğer bir deyişle, sistem kullanıcısının bir kullanıcı tarafından kullanılması veya doğrudan erişilmemesi insan. 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, içeriği kaldırma sistem kullanıcısı (Kullanıcı 0) için gereksiz uygulamalar oluşturur.

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

  • SİSTEM. Her zaman 0 numaralı kullanıcı
  • TAM. Kullanıcı 10+

Android 11

Android 11'de config_userTypePackageWhitelistMode ayarını değiştirin yapılandırma. İş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 listesinde olmayan paketleri günlüğe kaydedin.
4 İzin verilenler listesinde belirtilmemiş tüm paketler dolaylı olarak tüm kullanıcılar için izin verilenler listesine eklenir.
8 Sistem kullanıcısı için 4 ile aynıdır.
16 OTA'ları yoksayın. OTA'lar sırasında sistem paketlerini yüklemeyin.

Aşağıdaki sık karşılaşılan 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ının yerel gelişimi kolaylaştırmak için bir özelliği etkinleştirmek üzere 9 (dolaylı 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,.mk . XML dosyasını adlandırırken konumu da ekleyin. paketin derlemede tanımlandığı yer (ö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

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. Hangi paketlerin olması gerektiğini listeleyen bir config.xml dosyası oluşturun sistem kullanıcısı için devre dışı bırakıldı, ö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 öğesine 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üklenmesi gerekip gerekmediğini belirlemek için paketin AndroidManifest.xml dosyası, ve bileşenleri de dahil olmak üzere proje kaynağını hizmetleri, yayın alıcılarını ve içeriklerini kapsayan sağlayıcılar. Daha fazla bilgi edinmek için bkz. Uygulama manifeste genel bakış bölümüne bakın.

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

Şekil 1. Paket 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. Uygulama büyük ihtimalle çoklu kullanıcıya duyarlı bir uygulama olarak tasarlanmıştır. Çok kullanıcıya duyarlı hakkında daha fazla bilgi edinmek için Çok kullanıcıya duyarlı uygulamalar oluşturma başlıklı makaleye göz atın.

  1. android:singleUser="true" için Android manifestini 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ı 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, yönlendirme yapan sistem uygulamaları Ayrıca bu işlem, cihazda şifrelenmiş depolama alanını da kullanır. Doğrudan trafik hakkında daha fazla bilgi edinmek için başlatmaya duyarlı uygulamalar için Destek Sistem uygulamalarında Doğrudan Başlatma.

  1. Android manifest'ini şunun için kontrol edin: android:defaultToDeviceProtectedStorage="true" (Bu metrik, çok sayıda sistem başlatma hizmeti sunar.
  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 Giriş'e bakın. dikkat edin.

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

Etkinlikler kullanıcı arayüzüne yöneliktir. Çünkü sistem kullanıcısı Otomotiv. Sistem kullanıcısıyla 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ı.

Ö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'nin izlenme oranı ayrıcalığının 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 gizli olarak beyan edilip edilmediğini ve diğer uygulamalardan erişip erişilemediğini kontrol edin

Hizmet private olarak tanımlanırsa diğer paketler bu hizmeti kullanmaz. android:exported="false"'yi bulun. Hizmetin beyan edilmiş olması diğer uygulamaların erişimine açık değilse veya diğer uygulamalar. Bu nedenle, aşağıdaki c adımı ve aşağıdaki d adımı 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 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. Seviye'de izin verilenler listesindeki paketleri kontrol edip hizmetleri tanımlayın karar vermemiz gerekir. Bu hizmetteki intent filtresinden ve startService ürününden iz oluştur diğer paketlerde kullanabilirsiniz.

Bu hizmet, sistem kullanıcısında yüklü uygulamalara bağlıysa (örneğin, com.android.car.companiondevicesupport, bir sistem kullanıcısına ait), ardından hizmeti izin verilenler listesine ekleyin:

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

d. Hizmetin diğer uygulamalardan bağlı olup olmadığını ve ön planda çalışacağı beyan edilip edilmediğini kontrol edin

startForeground arayın. Bu, kullanıcıların alışveriş sırasında arka planda görünmesi gerekir. Büyük olasılıkla bu hizmet, izin verilenler listesine eklenmemesi gerekir:

  • 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 edin

AndroidManifest dosyasında android:process="system" öğesini bulun. Hizmet, sistem işleminde çalışmak üzere kasıtlı olarak tanımlanmışsa o da sistem hizmetiyle aynı işlemde çalışır izin verilenler listesine eklenmiş olmalıdır. Android'in bellek ayırma tasarımı kapsamında, sistem hizmetleri son öldürülen işlemlerden bazılarıdır. Bu da bu tür bir özellikle tanımlanan hizmetlerin kritik olduğunu gösterir. Alıcı: Android’in bellek ayırma tasarımı hakkında daha fazla bilgi edinmek için bkz. Düşük bellek katil.

  • Yanıtınız Evet ise izin verilenler listesine eklemeyin.
  • 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.

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

Seviye 1'de izin verilenler listesine eklenmiş paketleri kontrol edin ve hangi sağlayıcıların olduğunu kontrol edin. biraz zaman alabilir. Sistem kullanıcısında çalışan bir uygulama (örneğin, com.android.car.companiondevicesupport, içerik sağlayıcıya bağlı olduğunu fark ederseniz bu içeriğin sağlayıcı da izin verilenler listesinde.

  1. 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. Bu durumda, com.android.car.EXAMPLE WebViewFactoryProvider için android.webkit değerine bağlıdır, com.android.webview, sistem kullanıcısı için izin verilenler listesine eklenmelidir ancak android.webkit yüklendiğini gösteriyor.

Örnek paket için adım adım açıklamalı kılavuz

Aşağıdaki örnekte, bir anahtar kelimenin AndroidManifest.xml değerinin nasıl değerlendirileceği paket:

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