इस पेज पर, सिस्टम के उपयोगकर्ता के लिए ज़रूरी नहीं होने वाले पैकेज की पहचान करके उन्हें हटाकर, परफ़ॉर्मेंस को बेहतर बनाने का तरीका बताया गया है.
ग़ैर-ज़रूरी पैकेज बंद करना
वाहन संबंधित ऐप्लिकेशन में, सिस्टम उपयोगकर्ता हेडलेस होता है. इसका मतलब है कि सिस्टम उपयोगकर्ता का इस्तेमाल, सीधे तौर पर कोई व्यक्ति नहीं करता या उसे ऐक्सेस नहीं करता. इस वजह से, कई ऐप्लिकेशन और सेवाओं को सिस्टम उपयोगकर्ता के तौर पर चलाने की ज़रूरत नहीं होती. साथ ही, परफ़ॉर्मेंस को बेहतर बनाने के लिए, इन्हें बंद किया जा सकता है. इसलिए, सिस्टम उपयोगकर्ता (उपयोगकर्ता 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
डायरेक्ट्री में एक्सएमएल फ़ाइल इंस्टॉल करें
(यह वही डायरेक्ट्री है जिसमें डिवाइस के लिए सिस्टम इमेज बनाने के लिए इस्तेमाल की जाने वाली makefile (.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 में इस सुविधा को कॉन्फ़िगर करने के लिए:
frameworks/base/core/res/res/values/config.xml
सेconfig_systemUserPackagesBlacklistSupported
कॉन्फ़िगरेशन को ओवरले करें और इसेtrue
पर सेट करें. इस सुविधा के चालू होने पर, डिफ़ॉल्ट रूप से सभी पैकेज, सिस्टम उपयोगकर्ता और फ़ुल उपयोगकर्ता, दोनों के लिए इंस्टॉल होने चाहिए.config.xml
फ़ाइल बनाएं, जिसमें उन पैकेज की सूची हो जिन्हें सिस्टम के उपयोगकर्ता के लिए बंद करना है. उदाहरण के लिए:<config> <!-- This package will be uninstalled for the system user --> <system-user-blacklisted-app package="com.google.car.calendar" /> </config>
- फ़ाइल को डिवाइस के टारगेट फ़ोल्डर
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 मेनिफ़ेस्ट देखें.- अगर
true
है, तो अनुमति वाली सूची में जोड़ें. सिस्टम के उपयोगकर्ता के लिए ज़रूरी है. - अगर
false
है, तो जारी रखें. हटाने से पहले, अन्य शर्तें देखें.
2. देखें कि ऐप्लिकेशन को सुरक्षित स्टोरेज का ऐक्सेस चाहिए या नहीं
कई सिस्टम बूट सेवाएं, क्रेडेंशियल एन्क्रिप्ट (सीई) स्टोरेज के बजाय, डिवाइस एन्क्रिप्ट (डीई) स्टोरेज पर अक्सर निर्भर करती हैं. साथ ही, डिवाइस के एन्क्रिप्ट किए गए स्टोरेज पर, डिरेक्ट बूट अवेयर सिस्टम ऐप्लिकेशन भी निर्भर करते हैं. डायरेक्ट बूट के बारे में ज़्यादा जानने के लिए, सिस्टम ऐप्लिकेशन में डायरेक्ट बूट की सुविधा का इस्तेमाल करना लेख पढ़ें.
- Android मेनिफ़ेस्ट में
android:defaultToDeviceProtectedStorage="true"
देखें. इसकी ज़रूरत कई सिस्टम बूट सेवाओं के लिए होती है. - अगर
true
है, तो अनुमति वाली सूची में जोड़ें. - अगर
false
है, तो जारी रखें.
लेवल 2, ऐप्लिकेशन कॉम्पोनेंट
गतिविधियां
गतिविधियों के बारे में ज़्यादा जानने के लिए, गतिविधियों के बारे में जानकारी देखें.
a. देखें कि ऐप्लिकेशन में सिर्फ़ गतिविधियां शामिल हैं या नहीं
गतिविधियां, यूज़र इंटरफ़ेस पर आधारित होती हैं. वाहन से जुड़े ऐप्लिकेशन में सिस्टम उपयोगकर्ता, हेडलेस होता है. इसलिए, सिस्टम उपयोगकर्ता के साथ कोई भी व्यक्ति इंटरैक्ट नहीं कर सकता. इसलिए, अगर ऐप्लिकेशन में सिर्फ़ गतिविधियां शामिल हैं, तो हो सकता है कि वह ऐप्लिकेशन सिस्टम के उपयोगकर्ता के लिए काम का न हो.
प्राथमिकता और खास सुविधाएं पाने के लिए:
- अगर हां, तो हो सकता है कि सिस्टम के उपयोगकर्ता के लिए इसकी ज़रूरत पड़े.
- अगर नहीं, तो सिस्टम उपयोगकर्ता के लिए अनुमति वाली सूची न बनाएं.
उदाहरण के लिए, काम करने की जांच के लिए उपलब्ध सुइट (सीटीएस)
(com.android.cts.priv.ctsshim
) में सिर्फ़ गतिविधियां होती हैं. साथ ही, गतिविधियों को इंटेंट फ़िल्टर की जांच करने के लिए तय किया जाता है. हालांकि, CTS के पास ज़्यादा ऐक्सेस होता है. इसलिए, जांच के लिए सिस्टम उपयोगकर्ता को इसे इंस्टॉल करना होगा.
सेवा
सेवाओं के बारे में ज़्यादा जानने के लिए, सेवाओं की खास जानकारी देखें.
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
को सिस्टम उपयोगकर्ता के तौर पर चलने की अनुमति है) और वह इस कॉन्टेंट की सेवा देने वाली कंपनी पर निर्भर है, तो पक्का करें कि इस कॉन्टेंट की सेवा देने वाली कंपनी को भी अनुमति दी गई हो.
- अगर हां, तो अनुमति वाली सूची में जोड़ें.
- अगर नहीं, तो अनुमति वाली सूची में शामिल न करें.
उदाहरण के लिए, अगर 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>