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 üzere9
(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:
frameworks/base/core/res/res/values/config.xml
'dakiconfig_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.- 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>
- Dosyayı cihazın hedef klasörüne
system/etc/sysconfig/
kopyalamak içindevice.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.
Ş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.
android:singleUser="true"
için Android manifestini kontrol edin.true
ise izin verilenler listesine ekleyin. Sistem kullanıcısı için gereklidir.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.
- Android manifest'ini şunun için kontrol edin:
android:defaultToDeviceProtectedStorage="true"
(Bu metrik, çok sayıda sistem başlatma hizmeti sunar. true
ise izin verilenler listesine ekleyin.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:
- Evet ise sistem kullanıcısı için gerekli olabilir.
- 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.
- Evet ise izin verilenler listesine ekleyin.
- 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>