সিস্টেম ব্যবহারকারীর জন্য প্যাকেজ সরান

এই পৃষ্ঠাটি বর্ণনা করে যে কীভাবে সিস্টেম ব্যবহারকারীর জন্য প্রয়োজন নেই এমন প্যাকেজগুলি সনাক্ত করে এবং অপসারণের মাধ্যমে কর্মক্ষমতা উন্নত করা যায়।

অপ্রয়োজনীয় প্যাকেজ নিষ্ক্রিয় করুন

অটোমোটিভ-এ, সিস্টেম ব্যবহারকারী মাথাবিহীন , যার মানে সিস্টেম ব্যবহারকারী ব্যবহার করার উদ্দেশ্যে বা সরাসরি কোনো মানুষের দ্বারা অ্যাক্সেস করার উদ্দেশ্যে নয়। ফলস্বরূপ, সিস্টেম ব্যবহারকারীর মধ্যে অনেক অ্যাপ এবং পরিষেবা চালানোর প্রয়োজন নেই এবং কর্মক্ষমতা উন্নত করতে অক্ষম করা যেতে পারে। অতএব, সিস্টেম ব্যবহারকারী (ব্যবহারকারী 0) এর জন্য অপ্রয়োজনীয় অ্যাপগুলি সরানোর জন্য একটি বিকল্প সরবরাহ করা হয়েছে।

এই পৃষ্ঠায়, দুই ধরনের ব্যবহারকারীর বিষয়ে আলোচনা করা হয়েছে:

  • সিস্টেম সর্বদা ব্যবহারকারী 0
  • পূর্ণ । ব্যবহারকারী যেটি একজন মানুষের দ্বারা ব্যবহার করার উদ্দেশ্যে (একটি নন-সিস্টেম ব্যবহারকারী), ব্যবহারকারী 10+

অ্যান্ড্রয়েড 11

Android 11-এ, config_userTypePackageWhitelistMode কনফিগারেশন পরিবর্তন করুন। পতাকা একত্রিত করা যেতে পারে। এই ক্ষেত্রে, 5 মানে 1 প্লাস 4 (পতাকা 1 এবং 4 এর সংমিশ্রণ)।

পতাকা বর্ণনা
0 অনুমতি তালিকা অক্ষম করুন। সমস্ত সিস্টেম প্যাকেজ ইনস্টল করুন; কোন লগিং
1 বলবৎ করা। সিস্টেম প্যাকেজগুলি শুধুমাত্র তখনই ইনস্টল করুন যখন সেগুলি অনুমোদিত তালিকাভুক্ত হয়৷
2 অ-অনুমোদিত প্যাকেজ লগ করুন.
4 অনুমোদিত তালিকা ফাইলে উল্লেখ না থাকা যেকোন প্যাকেজ সমস্ত ব্যবহারকারীর জন্য অন্তর্নিহিতভাবে অনুমোদিত তালিকাভুক্ত।
8 সিস্টেম ব্যবহারকারীর জন্য 4 এর মতো।
16 OTAs উপেক্ষা করুন। OTA-এর সময় সিস্টেম প্যাকেজ ইনস্টল করবেন না।

এই সাধারণ পরিস্থিতিতে বিবেচনা করুন:

  • একটি সম্পূর্ণ অনুমোদিত তালিকার জন্য একটি বৈশিষ্ট্য সক্ষম করতে, 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->

Android 9 এবং Android 10

Android 9 এবং Android 10-এ এই বৈশিষ্ট্যটি কনফিগার করতে:

  1. frameworks/base/core/res/res/values/config.xml থেকে config_systemUserPackagesBlacklistSupported কনফিগারেশন ওভারলে করুন এবং এটি 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, অ্যাপ লেভেল

1. অ্যাপ (বা অ্যাপের উপাদান) সিঙ্গলটন হিসেবে ঘোষণা করা হয়েছে কিনা তা পরীক্ষা করুন

অ্যাপটি যদি সিঙ্গলটন হয়, তবে সিস্টেমটি শুধুমাত্র সিস্টেম ব্যবহারকারীর মধ্যে অ্যাপটিকে ইনস্ট্যান্টিয়েট করে। সম্ভবত অ্যাপটি একটি মাল্টি-ইউজার-সচেতন অ্যাপ হওয়ার উদ্দেশ্যে করা হয়েছিল। মাল্টি-ইউজার-সচেতন অ্যাপস সম্পর্কে আরও জানতে, মাল্টি-ইউজার-সচেতন অ্যাপ তৈরি করুন দেখুন।

  1. android:singleUser="true" এর জন্য Android ম্যানিফেস্ট চেক করুন।
  2. true হলে, অনুমোদিত তালিকা. সিস্টেম ব্যবহারকারীর জন্য প্রয়োজন.
  3. false হলে, চালিয়ে যান। অপসারণের আগে অন্যান্য মানদণ্ড পরীক্ষা করুন।

2. অ্যাপটির সুরক্ষিত স্টোরেজ অ্যাক্সেস প্রয়োজন কিনা তা পরীক্ষা করুন

অনেক সিস্টেম বুট পরিষেবা প্রায়শই শংসাপত্র এনক্রিপ্টেড (CE) স্টোরেজের পরিবর্তে ডিভাইস এনক্রিপ্টেড (DE) স্টোরেজের উপর নির্ভর করে। এছাড়াও, সরাসরি বুট সচেতন সিস্টেম অ্যাপগুলিও ডিভাইস এনক্রিপ্ট করা স্টোরেজের উপর নির্ভর করে। ডাইরেক্ট বুট সচেতন অ্যাপস সম্পর্কে আরও জানতে, সাপোর্ট ডাইরেক্ট বুট ইন সিস্টেম অ্যাপ দেখুন।

  1. android:defaultToDeviceProtectedStorage="true" এর জন্য Android ম্যানিফেস্ট পরীক্ষা করুন, যা অনেক সিস্টেম বুট পরিষেবার জন্য প্রয়োজন৷
  2. true হলে, অনুমোদিত তালিকা.
  3. false হলে, চালিয়ে যান।

লেভেল 2, অ্যাপের উপাদান

কার্যক্রম

ক্রিয়াকলাপ সম্পর্কে আরও জানতে, ক্রিয়াকলাপগুলির ভূমিকা দেখুন।

ক অ্যাপটিতে শুধুমাত্র ক্রিয়াকলাপ রয়েছে কিনা তা পরীক্ষা করুন

ক্রিয়াকলাপগুলি ব্যবহারকারীর ইন্টারফেস ভিত্তিক। যেহেতু সিস্টেম ব্যবহারকারী অটোমোটিভে মাথাবিহীন, কোনও মানুষের সিস্টেম ব্যবহারকারীর সাথে যোগাযোগ করা উচিত নয়। ফলস্বরূপ, অ্যাপটিতে শুধুমাত্র কার্যকলাপ থাকলে, অ্যাপটি সম্ভবত সিস্টেম ব্যবহারকারীর জন্য অপ্রাসঙ্গিক।

অগ্রাধিকার এবং বিশেষ সুবিধার জন্য পরীক্ষা করুন:

  1. যদি হ্যাঁ , সিস্টেম ব্যবহারকারীর জন্য প্রয়োজন হতে পারে।
  2. যদি না হয় , তাহলে সিস্টেম ব্যবহারকারীর জন্য অনুমোদিত তালিকা করবেন না।

উদাহরণস্বরূপ, কম্প্যাটিবিলিটি টেস্ট স্যুট (CTS) ( com.android.cts.priv.ctsshim ) এ শুধুমাত্র কার্যকলাপ রয়েছে এবং ক্রিয়াকলাপগুলি উদ্দেশ্য ফিল্টার পরীক্ষা করার জন্য সংজ্ঞায়িত করা হয়েছে৷ যাইহোক, যেহেতু CTS-এর একটি উচ্চ সুবিধা রয়েছে, এটি পরীক্ষার উদ্দেশ্যে সিস্টেম ব্যবহারকারীর জন্য ইনস্টল করা প্রয়োজন।

সেবা

পরিষেবাগুলি সম্পর্কে আরও জানতে, পরিষেবাগুলির ওভারভিউ দেখুন৷

খ. পরিষেবাটি ব্যক্তিগত হিসাবে ঘোষণা করা হয়েছে এবং অন্য অ্যাপ থেকে অ্যাক্সেস করা যাবে না কিনা তা পরীক্ষা করুন

পরিষেবাটিকে ব্যক্তিগত হিসাবে ঘোষণা করা হলে, অন্যান্য প্যাকেজগুলি পরিষেবাটি ব্যবহার করবে না৷ android:exported="false" সন্ধান করুন। যদি পরিষেবাটিকে ব্যক্তিগত হিসাবে ঘোষণা করা হয় বা অন্য অ্যাপ থেকে অ্যাক্সেস করা না যায়, তাহলে এটি অন্য অ্যাপের দ্বারা আবদ্ধ হতে পারে না। অতএব, ধাপ c এবং ধাপ d নীচের অপ্রাসঙ্গিক। ফলস্বরূপ, এই উপাদানটি সিস্টেম ব্যবহারকারীর জন্য পরিষেবাটি প্রয়োজন কিনা সে সম্পর্কে আরও ইঙ্গিত দেবে না।

  • যদি হ্যাঁ , পরবর্তী উপাদান পরীক্ষা করুন.
  • যদি না হয় , এই উপাদানটি পরীক্ষা করা চালিয়ে যান।

গ. সিস্টেম ব্যবহারকারীর মধ্যে ইনস্টল করা অ্যাপগুলি এই পরিষেবার সাথে আবদ্ধ হতে পারে কিনা তা পরীক্ষা করুন৷

লেভেল 1-এ অনুমোদিত তালিকাভুক্ত প্যাকেজগুলি পরীক্ষা করুন এবং তারা যে পরিষেবাগুলিতে আবদ্ধ তা চিহ্নিত করুন৷ এই পরিষেবাতে অভিপ্রায় ফিল্টার থেকে ট্রেস করুন এবং অন্যান্য প্যাকেজে startService

যদি এই পরিষেবাটি সিস্টেম ব্যবহারকারীর মধ্যে ইনস্টল করা অ্যাপগুলির সাথে আবদ্ধ হয় (উদাহরণস্বরূপ, com.android.car.companiondevicesupport সিস্টেম ব্যবহারকারীর মধ্যে চালানোর জন্য অনুমোদিত), তাহলে পরিষেবাটিকে অনুমতি তালিকাভুক্ত করুন:

  • যদি হ্যাঁ , অনুমোদিত তালিকা.
  • যদি না হয় , এই উপাদানটি পরীক্ষা করা চালিয়ে যান।

d পরিষেবাটি অন্যান্য অ্যাপ থেকে আবদ্ধ কিনা এবং অগ্রভাগে চালানোর জন্য ঘোষণা করা হয়েছে কিনা তা পরীক্ষা করুন

startForeground সন্ধান করুন। এর অর্থ হল লোকেরা অগ্রভাগে অ্যাপটির সাথে ইন্টারঅ্যাক্ট করবে। সম্ভবত, সিস্টেম ব্যবহারকারীর জন্য এই পরিষেবাটির প্রয়োজন হবে না এবং অনুমোদিত তালিকাভুক্ত হওয়ার প্রয়োজন নেই:

  • যদি হ্যাঁ , অনুমতি তালিকা না.
  • না হলে, পরবর্তী উপাদান চেক করা চালিয়ে যান।

e সিস্টেম প্রক্রিয়া চলার জন্য পরিষেবা সংজ্ঞায়িত করা হয়েছে কিনা তা পরীক্ষা করুন

AndroidManifest ফাইলে, android:process="system" খুঁজুন। যদি পরিষেবাটি ইচ্ছাকৃতভাবে সিস্টেম প্রক্রিয়ায় চালানোর জন্য সংজ্ঞায়িত করা হয়, তাহলে এটি সিস্টেম পরিষেবার মতো একই প্রক্রিয়ায় চলে এবং সিস্টেম ব্যবহারকারীর মধ্যে চালানোর জন্য অনুমোদিত তালিকাভুক্ত হওয়া উচিত। অ্যান্ড্রয়েডের মেমরি বরাদ্দকরণ ডিজাইনের অংশ হিসাবে, সিস্টেম পরিষেবাগুলি হ'ল শেষ হওয়া কিছু প্রক্রিয়া, যা এই জাতীয় বৈশিষ্ট্যের সাথে সংজ্ঞায়িত পরিষেবাগুলির সমালোচনাকে বোঝায়। অ্যান্ড্রয়েডের মেমরি অ্যালোকেশন ডিজাইন সম্পর্কে আরও জানতে, লো-মেমরি কিলার দেখুন।

  • যদি হ্যাঁ , অনুমতি তালিকা না.
  • না হলে, অন্যান্য উপাদান পরীক্ষা করা চালিয়ে যান।

উদাহরণস্বরূপ, com.android.networkstack.inprocess প্যাকেজটিকে অবশ্যই অনুমোদিত তালিকাভুক্ত করতে হবে কারণ এতে RegularMaintenanceJobService রয়েছে, যার android:process="system" ট্যাগ রয়েছে৷

বিষয়বস্তু প্রদানকারী

বিষয়বস্তু প্রদানকারীদের সম্পর্কে আরও জানতে, সামগ্রী প্রদানকারী দেখুন।

চ এই প্রদানকারীর উপর নির্ভর করে সিস্টেম ব্যবহারকারীর মধ্যে অ্যাপ ইনস্টল করা আছে কিনা তা পরীক্ষা করুন

লেভেল 1-এ অনুমোদিত তালিকাভুক্ত প্যাকেজগুলি পরীক্ষা করুন এবং তারা কোন প্রদানকারীর উপর নির্ভর করে তা পরীক্ষা করুন। যদি সিস্টেম ব্যবহারকারীর মধ্যে চলমান কোনো অ্যাপ (উদাহরণস্বরূপ, 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>