यह आलेख वर्णन करता है कि सिस्टम उपयोगकर्ता के लिए आवश्यक पैकेजों की पहचान करके और उन्हें हटाकर प्रदर्शन में सुधार कैसे किया जाए।
अनावश्यक पैकेज अक्षम करें
ऑटोमोटिव में, सिस्टम उपयोगकर्ता नेतृत्वहीन होता है, जिसका अर्थ है कि सिस्टम उपयोगकर्ता का उपयोग या सीधे किसी मानव द्वारा उपयोग करने का इरादा नहीं है। परिणामस्वरूप, कई ऐप्स और सेवाओं को सिस्टम उपयोगकर्ता में चलाने की आवश्यकता नहीं होती है और प्रदर्शन को बेहतर बनाने के लिए उन्हें अक्षम किया जा सकता है। इसलिए, सिस्टम उपयोगकर्ता (उपयोगकर्ता 0) के लिए अनावश्यक ऐप्स को हटाने का विकल्प प्रदान किया गया है।
इस पृष्ठ पर, दो प्रकार के उपयोगकर्ताओं पर चर्चा की गई है:
- प्रणाली । सदैव उपयोक्ता 0
- भरा हुआ । वह उपयोगकर्ता जिसका उपयोग किसी मानव (एक गैर-सिस्टम उपयोगकर्ता) द्वारा किया जाना है, उपयोगकर्ता 10+
एंड्रॉइड 11
एंड्रॉइड 11 में, आप कॉन्फ़िगरेशन, config_userTypePackageWhitelistMode
बदलते हैं। झंडों को जोड़ा जा सकता है. इस मामले में, 5
1
प्लस 4
(झंडे 1
और 4
का संयोजन) के बराबर है।
झंडा | विवरण |
---|---|
0 | अनुमति सूची अक्षम करें. सभी सिस्टम पैकेज स्थापित करें; कोई लॉगिंग नहीं. |
1 | लागू करना. सिस्टम पैकेज तभी स्थापित करें जब वे अनुमति सूची में हों। |
2 | गैर-अनुमत सूचीबद्ध पैकेज लॉग करें. |
4 | अनुमति सूची फ़ाइल में उल्लिखित कोई भी पैकेज सभी उपयोगकर्ताओं के लिए अंतर्निहित रूप से अनुमति सूची में नहीं है। |
8 | सिस्टम उपयोगकर्ता के लिए 4 के समान। |
16 | ओटीए पर ध्यान न दें. ओटीए के दौरान सिस्टम पैकेज इंस्टॉल न करें। |
- संपूर्ण अनुमति सूची के लिए एक सुविधा सक्षम करने के लिए,
1
( पूरी तरह से लागू ) - अपूर्ण अनुमति सूची के लिए एक सुविधा सक्षम करने के लिए,
5
- स्थानीय विकास को आसान बनाने के लिए
SYSTEM
उपयोगकर्ता के लिए एक सुविधा सक्षम करने के लिए,9
( अंतर्निहित अनुमति सूची ) - किसी सुविधा को ऐसे अक्षम करना जैसे उसे कभी सक्षम ही नहीं किया गया हो,
16
- किसी सुविधा को अक्षम करने और पिछले सभी प्रभावों को पूर्ववत करने के लिए,
0
डिवाइस के लिए sysconfig
निर्देशिका में XML फ़ाइल स्थापित करना सुनिश्चित करें (यह वही निर्देशिका है जिसमें डिवाइस के लिए सिस्टम छवि बनाने के लिए उपयोग की जाने वाली मेकफ़ाइल (`.mk`) शामिल है)। जब आप XML फ़ाइल को नाम देते हैं, तो बिल्ड में वह स्थान शामिल करें जिस पर पैकेज परिभाषित किया गया है। उदाहरण के लिए, 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->
एंड्रॉइड 9 और एंड्रॉइड 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, ऐप लेवल
1. जांचें कि क्या ऐप (या ऐप घटक) को सिंगलटन के रूप में घोषित किया गया है
यदि ऐप एक सिंगलटन है, तो सिस्टम केवल सिस्टम उपयोगकर्ता में ऐप को इंस्टेंट करेगा। यह संभव है कि ऐप का उद्देश्य एक बहुउपयोगकर्ता-जागरूक ऐप होना था। मल्टी-यूज़र अवेयर ऐप्स के बारे में अधिक जानने के लिए, बिल्डिंग मल्टीयूज़र-अवेयर ऐप्स देखें।
-
android:singleUser="true"
के लिए Android मेनिफ़ेस्ट जांचें। - यदि सत्य है , तो अनुमति सूची। सिस्टम उपयोगकर्ता के लिए आवश्यक.
- यदि गलत है तो जारी रखें. हटाने से पहले अन्य मानदंड जांचें.
2. जांचें कि क्या ऐप को संरक्षित स्टोरेज एक्सेस की आवश्यकता है
कई सिस्टम बूट सेवाएँ अक्सर क्रेडेंशियल एन्क्रिप्टेड (CE) स्टोरेज के बजाय डिवाइस एन्क्रिप्टेड (DE) स्टोरेज पर निर्भर करती हैं। इसके अलावा, सिस्टम ऐप्स जो सीधे बूट के बारे में जानते हैं, वे भी डिवाइस एन्क्रिप्टेड स्टोरेज पर भरोसा करते हैं। डायरेक्ट बूट अवेयर ऐप्स के बारे में अधिक जानने के लिए, सिस्टम ऐप्स में डायरेक्ट बूट को सपोर्ट करना देखें।
-
android:defaultToDeviceProtectedStorage="true"
के लिए Android मेनिफ़ेस्ट की जाँच करें, जो कई सिस्टम बूट सेवाओं के लिए आवश्यक है। - यदि सत्य है , तो अनुमति सूची।
- यदि गलत है तो जारी रखें.
स्तर 2, ऐप घटक
गतिविधियाँ
गतिविधियों के बारे में अधिक जानने के लिए, गतिविधियों का परिचय देखें।
एक। जाँचें कि क्या ऐप में केवल गतिविधियाँ हैं
गतिविधियाँ उपयोगकर्ता इंटरफ़ेस-उन्मुख हैं। चूंकि ऑटोमोटिव में सिस्टम उपयोगकर्ता नेतृत्वहीन होता है, इसलिए किसी भी इंसान को सिस्टम उपयोगकर्ता के साथ बातचीत नहीं करनी चाहिए। परिणामस्वरूप, यदि ऐप में केवल गतिविधियाँ शामिल हैं, तो संभवतः ऐप सिस्टम उपयोगकर्ता के लिए प्रासंगिक नहीं है।
प्राथमिकता और विशेष विशेषाधिकार की जाँच करें।
- यदि हाँ , तो संभवतः सिस्टम उपयोगकर्ता के लिए आवश्यक है।
- यदि नहीं , तो सिस्टम उपयोगकर्ता के लिए अनुमति सूची न बनाएं।
उदाहरण के लिए, संगतता परीक्षण सूट (सीटीएस) ( com.android.cts.priv.ctsshim
) में केवल गतिविधियां शामिल हैं, और गतिविधियों को इरादे फिल्टर का परीक्षण करने के लिए परिभाषित किया गया है। हालाँकि, चूँकि इसे उच्च विशेषाधिकार प्राप्त है, इसलिए इसे परीक्षण उद्देश्यों के लिए सिस्टम उपयोगकर्ता के लिए स्थापित करने की आवश्यकता है।
सेवा
सेवाओं के बारे में अधिक जानने के लिए, सेवा अवलोकन देखें।
बी। जांचें कि क्या सेवा को निजी घोषित किया गया है और अन्य ऐप्स से उस तक नहीं पहुंचा जा सकता है
यदि सेवा को निजी घोषित किया जाता है, तो अन्य पैकेज सेवा का उपयोग नहीं करेंगे। android:exported="false"
खोजें। यदि सेवा को निजी घोषित किया गया है या अन्य ऐप्स से एक्सेस नहीं किया जा सकता है, तो इसे अन्य ऐप्स द्वारा बाध्य नहीं किया जा सकता है। इसलिए, नीचे चरण C और चरण D अप्रासंगिक हैं। परिणामस्वरूप, यह घटक इस बारे में अधिक संकेत नहीं देगा कि सिस्टम उपयोगकर्ता के लिए सेवा की आवश्यकता है या नहीं।
- यदि हाँ , तो अगले घटक की जाँच करें।
- यदि नहीं , तो इस घटक की जाँच करना जारी रखें।
सी। जांचें कि क्या सिस्टम उपयोगकर्ता में इंस्टॉल किए गए ऐप्स इस सेवा से जुड़ सकते हैं
लेवल 1 में अनुमत सूचीबद्ध पैकेजों की जांच करें और उन सेवाओं की पहचान करें जिनसे वे बंधे हैं। इस सेवा में इंटेंट फ़िल्टर और अन्य पैकेजों में startService
से ट्रेस करें।
यदि यह सेवा सिस्टम उपयोगकर्ता में इंस्टॉल किए गए ऐप्स से जुड़ी है (उदाहरण के लिए, com.android.car.companiondevicesupport
को सिस्टम उपयोगकर्ता में चलने की अनुमति है), तो सेवा को अनुमति दें।
- यदि हां , तो अनुमति सूची।
- यदि नहीं , तो इस घटक की जाँच करना जारी रखें।
डी। जांचें कि क्या सेवा अन्य ऐप्स से जुड़ी हुई है और अग्रभूमि में चलने के लिए घोषित की गई है
startForeground
की तलाश करें। इसका मतलब है कि लोग अग्रभूमि में ऐप के साथ बातचीत कर रहे होंगे। सबसे अधिक संभावना है, सिस्टम उपयोगकर्ता के लिए इस सेवा की आवश्यकता नहीं होगी और इसे अनुमति सूची में शामिल करने की आवश्यकता नहीं होगी।
- यदि हाँ , तो अनुमति न दें।
- यदि नहीं , तो अगले घटक की जाँच करना जारी रखें।
इ। जांचें कि क्या सेवा को सिस्टम प्रक्रिया में चलाने के लिए परिभाषित किया गया है
AndroidManifest में, android:process="system"
देखें।
यदि सेवा को जानबूझकर सिस्टम प्रक्रिया में चलाने के लिए परिभाषित किया गया है, तो इसका मतलब है कि यह स्पष्ट रूप से सिस्टम सेवा के समान प्रक्रिया में चलेगी और सिस्टम उपयोगकर्ता में चलने के लिए अनुमति दी जानी चाहिए। एंड्रॉइड के मेमोरी आवंटन डिज़ाइन के हिस्से के रूप में, सिस्टम सेवाएँ समाप्त होने वाली कुछ अंतिम प्रक्रियाएँ हैं, जो ऐसी विशेषता के साथ परिभाषित सेवाओं की गंभीरता को दर्शाती हैं। एंड्रॉइड के मेमोरी आवंटन डिज़ाइन के बारे में अधिक जानने के लिए, लो-मेमोरी किलर देखें।
- यदि हाँ , तो अनुमति न दें।
- यदि नहीं , तो अन्य घटकों की जाँच करना जारी रखें।
उदाहरण के लिए, पैकेज com.android.networkstack.inprocess
अनुमति दी जानी चाहिए क्योंकि इसमें RegularMaintenanceJobService
शामिल है, जिसमें android:process="system"
टैग है।
सामग्री प्रदाता
सामग्री प्रदाताओं के बारे में अधिक जानने के लिए, सामग्री प्रदाता देखें।
एफ। जांचें कि सिस्टम उपयोगकर्ता में इंस्टॉल किया गया ऐप इस प्रदाता पर निर्भर करता है या नहीं
लेवल 1 में अनुमत सूचीबद्ध पैकेजों की जाँच करें और जाँचें कि वे किन प्रदाताओं पर निर्भर हैं। यदि कोई ऐप सिस्टम उपयोगकर्ता में चल रहा है (उदाहरण के लिए, 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>