सिस्टम उपयोगकर्ता के लिए पैकेज हटाएं

इस पेज में बताया गया है कि ऐसे पैकेज जिनकी सिस्टम उपयोगकर्ता के लिए ज़रूरत नहीं है.

गै़र-ज़रूरी पैकेज बंद करें

Automotive में, सिस्टम का उपयोगकर्ता बिना ग्राफ़िक यूज़र इंटरफ़ेस वाला, इसका मतलब है कि सिस्टम यूज़र, इंसान. इस वजह से, कई ऐप्लिकेशन और सेवाओं को सिस्टम उपयोगकर्ता के तौर पर चलाने की ज़रूरत नहीं होती. साथ ही, परफ़ॉर्मेंस को बेहतर बनाने के लिए, इन्हें बंद किया जा सकता है. इसलिए, इस सेगमेंट को हटाने का विकल्प सिस्टम यूज़र के लिए ग़ैर-ज़रूरी ऐप्लिकेशन (उपयोगकर्ता 0).

इस पेज पर, दो तरह के उपयोगकर्ताओं के बारे में बताया गया है:

  • SYSTEM. हमेशा उपयोगकर्ता 0
  • FULL. ऐसा उपयोगकर्ता जिसका इस्तेमाल कोई व्यक्ति (सिस्टम का उपयोगकर्ता नहीं) करे, 10 से ज़्यादा उपयोगकर्ता

Android 11

Android 11 में, config_userTypePackageWhitelistMode कॉन्फ़िगरेशन बदलें. फ़्लैग जोड़े जा सकते हैं. इस मामले में, 5 का मतलब 1 और 4 (फ़्लैग 1 और 4 का कॉम्बिनेशन) के साथ 1 होता है.

चिह्नित करें ब्यौरा
0 अनुमति वाली सूची बंद करें. सभी सिस्टम पैकेज इंस्टॉल करें. लॉगिंग नहीं की जाती.
1 लागू करें. सिस्टम पैकेज सिर्फ़ तब इंस्टॉल करें, जब वे अनुमति वाली सूची में शामिल हों.
2 ऐसे पैकेज लॉग करें जिन्हें अनुमति नहीं दी गई है.
4 अगर किसी पैकेज के बारे में अनुमति वाली फ़ाइल में नहीं बताया गया है, तो उसे सभी उपयोगकर्ताओं के लिए डिफ़ॉल्ट रूप से अनुमति वाली सूची में शामिल कर लिया जाता है.
8 सिस्टम के उपयोगकर्ता के लिए, 4 की तरह.
16 ओटीए को अनदेखा करें. ओटीए के दौरान सिस्टम पैकेज इंस्टॉल न करें.

इन सामान्य स्थितियों पर ध्यान दें:

  • पूरी अनुमति सूची के लिए कोई सुविधा चालू करने के लिए, 1 (पूरी तरह से लागू)
  • अगर अनुमति वाली सूची में किसी सुविधा को अधूरी जगह के लिए चालू करना है, तो 5
  • SYSTEM उपयोगकर्ता के लिए, स्थानीय डेवलपमेंट को आसान बनाने वाली सुविधा चालू करने के लिए, 9 (अनुमति वाली सूची में शामिल है)
  • किसी सुविधा को इस तरह बंद करने के लिए जैसे कि वह कभी चालू ही नहीं थी, 16
  • किसी सुविधा को बंद करने और पिछले सभी इफ़ेक्ट को पहले जैसा करने के लिए, 0

डिवाइस के लिए, sysconfig डायरेक्ट्री में एक्सएमएल फ़ाइल इंस्टॉल करें (यह वही डायरेक्ट्री है जिसमें मेकफ़ाइल (.mk) होती है, जिसका इस्तेमाल डिवाइस के लिए सिस्टम इमेज). एक्सएमएल फ़ाइल को नाम देते समय, उसकी जगह की जानकारी शामिल करें जहां बिल्ड में पैकेज के बारे में बताया गया है, उदाहरण के लिए, 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 और Android 10

Android 9 और Android 10 में इस सुविधा को कॉन्फ़िगर करने के लिए:

  1. config_systemUserPackagesBlacklistSupported को ओवरले करें frameworks/base/core/res/res/values/config.xml से कॉन्फ़िगरेशन किया गया और इसे सेट किया गया इसे true तक पहुंचाएं. इस सुविधा के चालू होने पर, डिफ़ॉल्ट रूप से सभी पैकेज, सिस्टम के उपयोगकर्ता और फ़ुल ऐक्सेस वाले उपयोगकर्ता, दोनों के लिए इंस्टॉल होने चाहिए.
  2. config.xml फ़ाइल बनाएं, जिसमें उन पैकेज की सूची हो जिन्हें सिस्टम के उपयोगकर्ता के लिए बंद करना है. उदाहरण के लिए:
    <config>
        <!-- This package will be uninstalled for the system user -->
        <system-user-blacklisted-app package="com.google.car.calendar" />
    </config>
  3. फ़ाइल को डिवाइस के टारगेट फ़ोल्डर system/etc/sysconfig/ में कॉपी करने के लिए, device.mk में एक लाइन जोड़ें. उदाहरण के लिए:
    PRODUCT_COPY_FILES += <full path to the config file>:system/etc/sysconfig/<new denylist config file>.xml

नतीजे की पुष्टि करना

नतीजे की पुष्टि करने के लिए, इसे चलाएं:

$ 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

परिसर

यह तय करने के लिए कि सिस्टम उपयोगकर्ता में पैकेज इंस्टॉल किया जाना चाहिए या नहीं, पैकेज की AndroidManifest.xml फ़ाइल इसमें ऐप्लिकेशन के एट्रिब्यूट और इसके कॉम्पोनेंट शामिल होते हैं ऐप्लिकेशन में सभी गतिविधियां, सेवाएं, ब्रॉडकास्ट रिसीवर, और कॉन्टेंट शामिल है सेवा देने वाली कंपनियां. इस बारे में ज़्यादा जानने के लिए, यह देखें ऐप्लिकेशन मेनिफ़ेस्ट की खास जानकारी देखें.

पैकेज का वर्कफ़्लो बंद करें

पहला डायग्राम. पैकेज का वर्कफ़्लो बंद करें.

पहला लेवल, ऐप्लिकेशन लेवल

1. देखें कि ऐप्लिकेशन (या ऐप्लिकेशन के कॉम्पोनेंट) को सिंगलटन के तौर पर घोषित किया गया है या नहीं

अगर ऐप्लिकेशन सिंगलटन है, तो सिस्टम सिर्फ़ सिस्टम उपयोगकर्ता के लिए ऐप्लिकेशन को इंस्टैंशिएट करता है. ऐसा हो सकता है कि ऐप्लिकेशन को कई उपयोगकर्ताओं के लिए बनाया गया हो. कई उपयोगकर्ताओं के लिए बने ऐप्लिकेशन के बारे में ज़्यादा जानने के लिए, कई उपयोगकर्ताओं के लिए बने ऐप्लिकेशन बनाना लेख पढ़ें.

  1. android:singleUser="true" के लिए Android मेनिफ़ेस्ट देखें.
  2. अगर true, अनुमति वाली सूची में शामिल है. सिस्टम के उपयोगकर्ता के लिए ज़रूरी है.
  3. अगर false है, तो जारी रखें. हटाने से पहले, अन्य शर्तें देखें.

2. देखें कि ऐप्लिकेशन को सुरक्षित स्टोरेज का ऐक्सेस चाहिए या नहीं

कई सिस्टम बूट सेवाएं, क्रेडेंशियल एन्क्रिप्ट (सीई) स्टोरेज के बजाय, डिवाइस एन्क्रिप्ट (डीई) स्टोरेज पर अक्सर निर्भर करती हैं. साथ ही, डिवाइस के एन्क्रिप्ट किए गए स्टोरेज पर, डिरेक्ट बूट अवेयर सिस्टम ऐप्लिकेशन भी निर्भर करते हैं. डायरेक्ट मार्केटिंग के बारे में ज़्यादा जानने के लिए जागरूक ऐप्लिकेशन को चालू करें, देखें सहायता सिस्टम के ऐप्लिकेशन में सीधे तौर पर चालू करने की सुविधा.

  1. इसके लिए Android मेनिफ़ेस्ट देखें android:defaultToDeviceProtectedStorage="true", जो इसके लिए ज़रूरी है कई सिस्टम बूट सेवाएं हैं.
  2. अगर true, अनुमति वाली सूची में शामिल है.
  3. अगर यह false है, तो जारी रखें.

दूसरा लेवल, ऐप्लिकेशन के कॉम्पोनेंट

गतिविधियां

गतिविधियों के बारे में ज़्यादा जानने के लिए, गतिविधियों के बारे में जानकारी देखें.

a. देखें कि क्या ऐप्लिकेशन में सिर्फ़ गतिविधियां हैं

ऐक्टिविटी, यूज़र इंटरफ़ेस की मदद से की जाती हैं. वाहन संबंधित ऐप्लिकेशन में सिस्टम उपयोगकर्ता हेडलेस होता है. इसलिए, सिस्टम उपयोगकर्ता के साथ कोई भी व्यक्ति इंटरैक्ट नहीं कर सकता. इसलिए, अगर ऐप्लिकेशन में सिर्फ़ गतिविधियां हैं, तो हो सकता है कि वह ऐप्लिकेशन सिस्टम के उपयोगकर्ता के लिए काम का न हो.

प्राथमिकता और खास अधिकारों को देखें:

  1. अगर हां, तो हो सकता है कि सिस्टम के उपयोगकर्ता के लिए यह ज़रूरी हो.
  2. अगर नहीं, तो सिस्टम उपयोगकर्ता के लिए अनुमति वाली सूची न बनाएं.

उदाहरण के लिए, कंपैटबिलिटी टेस्ट सुइट (सीटीएस) (com.android.cts.priv.ctsshim) में सिर्फ़ गतिविधियां हैं और गतिविधियों को इंटेंट फ़िल्टर की जांच करने के लिए तय किया जाता है. हालांकि, सीटीएस ने अधिकार नहीं है, तो इसे परीक्षण के उद्देश्य से सिस्टम उपयोगकर्ता के लिए इंस्टॉल किया जाना चाहिए.

सेवा

सेवाओं के बारे में ज़्यादा जानने के लिए, सेवाओं की खास जानकारी देखें.

b. देखें कि सेवा को निजी के तौर पर दिखाया गया है या नहीं और उसे दूसरे ऐप्लिकेशन से ऐक्सेस किया जा सकता है या नहीं

अगर सेवा को निजी के तौर पर दिखाया गया है, तो अन्य पैकेज उस सेवा का इस्तेमाल नहीं करेंगे. android:exported="false" ढूंढें. अगर सेवा को 'निजी' के तौर पर घोषित किया गया है या उसे दूसरे ऐप्लिकेशन से ऐक्सेस नहीं किया जा सकता, तो उसे दूसरे ऐप्लिकेशन से बंधा नहीं जा सकता. इसलिए, यहां दिए गए चरण c और d चरण काम के नहीं हैं. इस वजह से, यह कॉम्पोनेंट इस बारे में ज़्यादा संकेत नहीं देगा कि सेवा की ज़रूरत है या नहीं का इस्तेमाल करने के लिए प्रोत्साहित करते हैं.

  • अगर हां है, तो अगले कॉम्पोनेंट की जांच करें.
  • अगर नहीं है, तो इस कॉम्पोनेंट की जांच करना जारी रखें.

c. देखें कि सिस्टम उपयोगकर्ता के डिवाइस पर इंस्टॉल किए गए ऐप्लिकेशन, इस सेवा से बंधे हो सकते हैं या नहीं

पहले लेवल में, अनुमति वाले पैकेज देखें और उन सेवाओं की पहचान करें जिनके लिए ये पैकेज उपलब्ध हैं. इस सेवा और अन्य पैकेज में startService के इंटेंट फ़िल्टर से ट्रैक करें.

अगर यह सेवा सिस्टम उपयोगकर्ता में इंस्टॉल किए गए ऐप्लिकेशन तक सीमित है (उदाहरण के लिए, com.android.car.companiondevicesupport को इस सूची में चलाने के लिए, अनुमति वाली सूची में शामिल किया गया है सिस्टम उपयोगकर्ता) है, तो इस सेवा को अनुमति वाली सूची में जोड़ दिया जाता है:

  • अगर हां है, तो अनुमति वाली सूची में जोड़ें.
  • अगर नहीं है, तो इस कॉम्पोनेंट की जांच करना जारी रखें.

d. देखें कि सेवा को दूसरे ऐप्लिकेशन के लिए इस्तेमाल किया जा सकता है या नहीं और उसे फ़ोरग्राउंड में चलाने का एलान किया गया है या नहीं

startForeground खोजें. इसका मतलब है कि लोग फ़ोरग्राउंड में ऐप्लिकेशन के साथ इंटरैक्ट कर रहे होंगे. ज़्यादातर मामलों में, सिस्टम के उपयोगकर्ता को इस सेवा की ज़रूरत नहीं होती. साथ ही, इसे अनुमति वाली सूची में शामिल करने की ज़रूरत नहीं होती:

  • अगर हां है, तो अनुमति वाली सूची में शामिल न करें.
  • अगर नहीं है, तो अगले कॉम्पोनेंट की जांच करें.

e. देखें कि सेवा को सिस्टम प्रोसेस में चलाने के लिए तय किया गया है या नहीं

AndroidManifest फ़ाइल में, android:process="system" ढूंढें. अगर सेवा को सिस्टम प्रोसेस में चलाने के लिए जान-बूझकर तय किया गया है, तो वह सिस्टम सेवा की उसी प्रोसेस में चलती है. साथ ही, उसे सिस्टम उपयोगकर्ता में चलाने के लिए अनुमति दी जानी चाहिए. Android की मेमोरी के तौर पर आवंटन डिज़ाइन, सिस्टम सेवाएं ऐसी कुछ आखिरी प्रक्रियाएं हैं जो खत्म होने वाली हैं, जो इस तरह की एट्रिब्यूट के साथ तय की गई सेवाओं की गंभीरता की जानकारी देती है. यहां की यात्रा पर हूं Android के लिए स्टोरेज ऐलोकेशन डिज़ाइन के बारे में ज़्यादा जानने के लिए, कम मेमोरी वाला लेबल देखें किलर.

  • अगर हां, तो अनुमति वाली सूची में शामिल न करें.
  • अगर नहीं है, तो अन्य कॉम्पोनेंट की जांच करें.

उदाहरण के लिए, पैकेज com.android.networkstack.inprocess अनुमति वाली सूची में शामिल है, क्योंकि इसमें RegularMaintenanceJobService मौजूद है. यह में android:process="system" टैग है.

कॉन्टेंट देने वाला

कॉन्टेंट देने वालों के बारे में ज़्यादा जानने के लिए, यहां देखें कॉन्टेंट देने वाले.

f. देखें कि सिस्टम उपयोगकर्ता के डिवाइस पर इंस्टॉल किया गया ऐप्लिकेशन, सेवा देने वाली इस कंपनी पर निर्भर करता है या नहीं

पहले लेवल में, अनुमति वाले पैकेज देखें और यह देखें कि वे किन सेवा देने वाली कंपनियों पर निर्भर हैं. अगर कोई ऐप्लिकेशन, सिस्टम उपयोगकर्ता के तौर पर चल रहा है (उदाहरण के लिए, com.android.car.companiondevicesupport को सिस्टम उपयोगकर्ता के तौर पर चलने की अनुमति दी गई है) और वह इस कॉन्टेंट की सेवा देने वाली कंपनी पर निर्भर है, तो पक्का करें कि इस कॉन्टेंट की सेवा देने वाली कंपनी को भी अनुमति दी गई हो.

  1. अगर हां है, तो अनुमति वाली सूची में जोड़ें.
  2. अगर नहीं, तो अनुमति वाली सूची में शामिल न करें.

उदाहरण के लिए, अगर com.android.car.EXAMPLE में सिंगलटन है सेवा देने वाली कंपनियां (SystemActionsContentProvider और ManagedProvisioningActionsContentProvider), तो यह ऐसा होना चाहिए सिस्टम उपयोगकर्ता के लिए अनुमति वाली सूची. अगर com.android.car.EXAMPLE, WebViewFactoryProvider के लिए android.webkit पर निर्भर करता है, तो सिस्टम उपयोगकर्ता के लिए com.android.webview को अनुमति वाली सूची में शामिल किया जाना चाहिए. ऐसा इसलिए, क्योंकि यह android.webkit को लोड करता है.

पैकेज के लिए सिलसिलेवार निर्देशों का सैंपल

यहां दिए गए उदाहरण में, किसी पैकेज के AndroidManifest.xml का आकलन करने का तरीका बताया गया है:

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