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

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

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

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

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

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

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

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

পতাকা বর্ণনা
0 অনুমতি তালিকা অক্ষম করুন। সমস্ত সিস্টেম প্যাকেজ ইনস্টল করুন; কোন লগিং
1 বলবৎ করা। সিস্টেম প্যাকেজগুলি শুধুমাত্র তখনই ইনস্টল করুন যখন সেগুলি অনুমোদিত তালিকাভুক্ত হয়৷
2 অ-অনুমোদিত প্যাকেজ লগ করুন.
4 অনুমোদিত তালিকা ফাইলে উল্লেখ না থাকা যেকোন প্যাকেজ সমস্ত ব্যবহারকারীর জন্য অন্তর্নিহিতভাবে অনুমোদিত তালিকাভুক্ত।
8 সিস্টেম ব্যবহারকারীর জন্য 4 এর মতো।
16 ওটিএ উপেক্ষা করুন। 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. সত্য হলে, অনুমোদিত তালিকা. সিস্টেম ব্যবহারকারীর জন্য প্রয়োজন.
  3. মিথ্যা হলে, চালিয়ে যান। অপসারণের আগে অন্যান্য মানদণ্ড পরীক্ষা করুন।

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

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

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

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

কার্যক্রম

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

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

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

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

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

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

সেবা

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

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

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

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

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

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

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

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

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

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

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

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

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

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

উদাহরণস্বরূপ, 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>