ওয়াচডগ `/proc/uid_io/stats` অবস্থানে কার্নেল দ্বারা প্রকাশিত প্রতি-UID ডিস্ক I/O পরিসংখ্যান ব্যবহার করে সমস্ত অ্যাপ এবং পরিষেবা দ্বারা তৈরি ডিস্ক I/O লেখার মোট পরিমাণ ট্র্যাক করে ফ্ল্যাশ মেমরির ব্যবহার নিরীক্ষণ করে। যখন একটি অ্যাপ বা পরিষেবা ডিস্ক I/O অতিরিক্ত ব্যবহার থ্রেশহোল্ড অতিক্রম করে, ওয়াচডগ অ্যাপ বা পরিষেবার উপর পদক্ষেপ নেয়। ডিস্ক I/O অত্যধিক ব্যবহার থ্রেশহোল্ড এবং অতিরিক্ত ব্যবহার করার জন্য পদক্ষেপ ডিস্ক I/O অতিরিক্ত ব্যবহার কনফিগারেশনে পূর্বনির্ধারিত।
অত্যধিক ব্যবহার থ্রেশহোল্ড
- ডিস্ক I/O অত্যধিক ব্যবহারের থ্রেশহোল্ডগুলি প্রতিদিনের ভিত্তিতে প্রয়োগ করা হয়, অর্থাৎ, একটি অ্যাপ/পরিষেবা দ্বারা করা সমস্ত লেখা বর্তমান UTC ক্যালেন্ডার দিনের শুরু থেকে একত্রিত করা হয় এবং অতিরিক্ত ব্যবহার কনফিগারেশনে সংজ্ঞায়িত থ্রেশহোল্ডগুলির বিপরীতে পরীক্ষা করা হয়।
- একটি নির্দিষ্ট দিনে একটি গাড়ি একাধিকবার চালু হলে, ওয়াচডগ মডিউল ফ্ল্যাশ মেমরিতে ডিস্ক I/O ব্যবহারের পরিসংখ্যান সংরক্ষণ করে এবং বর্তমান UTC ক্যালেন্ডার দিনের শুরু থেকে সেগুলিকে একত্রিত করে।
অতিরিক্ত ব্যবহার কর্ম
যখন একটি অ্যাপ বারবার সংজ্ঞায়িত ডিস্ক I/O অতিরিক্ত ব্যবহার থ্রেশহোল্ড অতিক্রম করে, ওয়াচডগ অতিরিক্ত ব্যবহার কনফিগারেশনে সংজ্ঞায়িত পদক্ষেপ নেয়।
- সমস্ত বিক্রেতা অ্যাপ এবং পরিষেবাগুলি সামগ্রিক সিস্টেম স্থিতিশীলতার জন্য গুরুত্বপূর্ণ বলে বিবেচিত হয়, তাই সেগুলি ডিস্ক I/O অতিরিক্ত ব্যবহারে বন্ধ করা হয় না। যাইহোক, অতিরিক্ত ব্যবহার কনফিগারেশন নিরাপদ-টু-টার্মিনেট বিক্রেতা অ্যাপ এবং পরিষেবাগুলির একটি তালিকা নির্ধারণ করতে পারে।
- সমস্ত থার্ড-পার্টি অ্যাপস নিরাপদ-টু-টার্মিনেট।
যখন একটি অ্যাপ বা পরিষেবা নিরাপদে বন্ধ করা হয়, তখন ওয়াচডগ অ্যাপের উপাদান অবস্থা PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED
সহ অ্যাপ বা পরিষেবাটিকে অক্ষম করে।
অত্যধিক ব্যবহার কনফিগারেশন
অত্যধিক ব্যবহার কনফিগারেশন ডিস্ক I/O অতিরিক্ত ব্যবহার থ্রেশহোল্ড এবং কর্ম ধারণ করে। ডিফল্ট অত্যধিক ব্যবহার কনফিগারেশন সিস্টেম এবং বিক্রেতা ইমেজ সংজ্ঞায়িত করা হয়, এবং বিল্ড সঙ্গে পাঠানো হয়. বিক্রেতারা ঐচ্ছিকভাবে বিক্রেতার ছবিতে বিক্রেতার কনফিগারেশন অন্তর্ভুক্ত করতে পারে। যখন বিক্রেতা কনফিগারেশন প্রদান করা হয় না, তখন সিস্টেম কনফিগারেশনটি বিক্রেতা অ্যাপ এবং পরিষেবাগুলির জন্যও ব্যবহার করা হয়।
ওয়াচডগ CarWatchdogManager
মাধ্যমে সিস্টেম APIগুলিকে প্রকাশ করে, যা বিক্রেতাদের অ্যাপ বা পরিষেবাগুলিকে যেকোনো সময় বিক্রেতা কনফিগারেশন আপডেট করতে দেয়।
অত্যধিক ব্যবহার কনফিগারেশন সংজ্ঞা
অতিরিক্ত ব্যবহার কনফিগারেশন উপাদান প্রকার দ্বারা বিভক্ত করা হয়, উদাহরণস্বরূপ, সিস্টেম, বিক্রেতা, এবং তৃতীয় পক্ষ। OEMs শুধুমাত্র বিক্রেতা উপাদান কনফিগারেশন আপডেট করা আবশ্যক.
বিক্রেতা কনফিগারেশন
ভেন্ডর কনফিগারেশন ডিস্ক I/O অত্যধিক ব্যবহার থ্রেশহোল্ড এবং সমস্ত বিক্রেতা অ্যাপ এবং পরিষেবা এবং সমস্ত মানচিত্র এবং মিডিয়া অ্যাপের জন্য অ্যাকশন সংজ্ঞায়িত করে। কনফিগারেশনে নিচের কনফিগারেশন ক্ষেত্র রয়েছে।
- বিক্রেতা প্যাকেজ উপসর্গ । ভেন্ডর পার্টিশনে ইনস্টল করা সমস্ত প্যাকেজ ভেন্ডর প্যাকেজ হিসাবে বিবেচিত হয়। এই প্যাকেজগুলি ছাড়াও, বিক্রেতারা বিক্রেতা প্যাকেজ উপসর্গ কনফিগারে প্যাকেজ উপসর্গ যোগ করে বিক্রেতা প্যাকেজ হিসাবে পূর্বে ইনস্টল করা প্যাকেজগুলিকে শ্রেণিবদ্ধ করতে পারে। এই কনফিগারেশন রেগুলার এক্সপ্রেশন গ্রহণ করে না।
- সেফ-টু-টার্মিনেট প্যাকেজ । সেফ-টু-টার্মিনেট প্যাকেজ কনফিগারেশনে সম্পূর্ণ প্যাকেজের নাম যোগ করে বিক্রেতারা নির্দিষ্ট করতে পারেন কোন ভেন্ডর প্যাকেজগুলো বন্ধ করা নিরাপদ।
- অ্যাপ্লিকেশন বিভাগ ম্যাপিং । বিক্রেতারা যেকোন প্যাকেজ (তৃতীয়-পক্ষের প্যাকেজ সহ) দুটি সমর্থিত অ্যাপ বিভাগের একটিতে ম্যাপ করতে পারে - মানচিত্র এবং মিডিয়া অ্যাপ। এই ম্যাপিংটি মানচিত্র এবং মিডিয়া অ্যাপগুলিকে উচ্চতর ডিস্ক I/O অত্যধিক ব্যবহার থ্রেশহোল্ড প্রদান করার জন্য করা হয় কারণ এই অ্যাপগুলি অন্যান্য অ্যাপের প্রকারের তুলনায় ডিস্কে বেশি ডেটা ডাউনলোড এবং লিখতে থাকে।
- কম্পোনেন্ট লেভেল থ্রেশহোল্ড সমস্ত বিক্রেতা প্যাকেজের জন্য জেনেরিক থ্রেশহোল্ড সংজ্ঞায়িত করে (অর্থাৎ, প্যাকেজ নির্দিষ্ট থ্রেশহোল্ড বা অ্যাপ্লিকেশন বিভাগের নির্দিষ্ট থ্রেশহোল্ডগুলি এই থ্রেশহোল্ডগুলি পায়)। ডিস্ক I/O অত্যধিক ব্যবহার কনফিগারেশন সংজ্ঞায়িত করার সময় বিক্রেতাদের অবশ্যই নন-জিরো কম্পোনেন্ট-লেভেল থ্রেশহোল্ড সংজ্ঞায়িত করতে হবে।
- প্যাকেজ নির্দিষ্ট থ্রেশহোল্ড । বিক্রেতারা নির্দিষ্ট বিক্রেতা প্যাকেজের জন্য বিশেষ থ্রেশহোল্ড সংজ্ঞায়িত করতে পারেন। ম্যাপিংগুলিতে সম্পূর্ণ প্যাকেজের নাম থাকা উচিত। এই কনফিগারেশনে সংজ্ঞায়িত থ্রেশহোল্ডগুলি একটি প্রদত্ত প্যাকেজের জন্য অন্যান্য কনফিগারেশনে সংজ্ঞায়িত থ্রেশহোল্ডগুলির চেয়ে অগ্রাধিকার নেয়।
- অ্যাপ্লিকেশন বিভাগ নির্দিষ্ট থ্রেশহোল্ড । বিক্রেতারা নির্দিষ্ট অ্যাপ বিভাগের জন্য বিশেষ থ্রেশহোল্ড নির্দিষ্ট করতে পারেন। অ্যাপ বিভাগগুলি অবশ্যই সমর্থিত বিভাগগুলির মধ্যে একটি হতে হবে - মানচিত্র এবং মিডিয়া অ্যাপ৷ এই কনফিগারেশনে সংজ্ঞায়িত থ্রেশহোল্ডগুলি অ্যাপ্লিকেশন বিভাগ ম্যাপিং ব্যবহার করে নির্দিষ্ট প্যাকেজে ম্যাপ করা হয়।
- সিস্টেম-ওয়াইড থ্রেশহোল্ড । বিক্রেতাদের এই কনফিগারেশন নির্দিষ্ট করা উচিত নয়.
ভেন্ডর প্যাকেজ উপসর্গ , সেফ-টু-টার্মিনেট প্যাকেজ , কম্পোনেন্ট লেভেল থ্রেশহোল্ড , এবং প্যাকেজ নির্দিষ্ট থ্রেশহোল্ড কনফিগারেশনগুলি শুধুমাত্র ভেন্ডর অ্যাপস এবং পরিষেবাগুলির জন্য ভেন্ডর কনফিগারেশন দ্বারা আপডেট করা যায়৷ অ্যাপ্লিকেশন বিভাগ নির্দিষ্ট থ্রেশহোল্ড কনফিগারেশন শুধুমাত্র সমস্ত মানচিত্র এবং মিডিয়া অ্যাপের জন্য বিক্রেতা কনফিগারেশন দ্বারা আপডেট করা যেতে পারে।
অত্যধিক ব্যবহারের থ্রেশহোল্ডগুলিতে লেখার জন্য অনুমোদিত বাইটের পরিমাণ থাকে:
- একটি অ্যাপ বা পরিষেবা ফোরগ্রাউন্ড মোড বনাম ব্যাকগ্রাউন্ড মোড
- সিস্টেম গ্যারেজ মোড
এই শ্রেণীবিভাগ ব্যবহারকারীকে ফোরগ্রাউন্ড অ্যাপ এবং পরিষেবাগুলির মুখোমুখি হতে ব্যাকগ্রাউন্ড অ্যাপ এবং পরিষেবাগুলির চেয়ে বেশি ডেটা লেখার অনুমতি দেয়৷ গ্যারেজ মোডে, অ্যাপ্লিকেশান এবং পরিষেবাগুলি আপডেটগুলি ডাউনলোড করার প্রবণতা রয়েছে, তাই প্রতিটির জন্য অন্যান্য মোডে চলমান অ্যাপ্লিকেশান এবং পরিষেবাগুলির তুলনায় উচ্চ থ্রেশহোল্ডের প্রয়োজন৷
সিস্টেম এবং তৃতীয় পক্ষের কনফিগারেশন
OEM-এর সিস্টেম এবং তৃতীয় পক্ষের কনফিগারেশন আপডেট করা উচিত নয় ।
- সিস্টেম কনফিগারেশন I/O অত্যধিক ব্যবহারের থ্রেশহোল্ড এবং সিস্টেম অ্যাপ এবং পরিষেবাগুলির জন্য ক্রিয়াগুলিকে সংজ্ঞায়িত করে।
- এই কনফিগারেশনটি অ্যাপ্লিকেশন বিভাগের ম্যাপিংগুলিও আপডেট করতে পারে। সুতরাং, এই কনফিগারেশন ক্ষেত্রটি সিস্টেম এবং বিক্রেতা কনফিগারেশনের মধ্যে ভাগ করা হয়।
- তৃতীয় পক্ষের কনফিগারেশন সমস্ত তৃতীয় পক্ষের অ্যাপের জন্য থ্রেশহোল্ড সংজ্ঞায়িত করে। সিস্টেমে প্রি-ইন্সটল করা নয় এমন সমস্ত অ্যাপই থার্ড-পার্টি অ্যাপ।
- সমস্ত থার্ড-পার্টি অ্যাপ একই থ্রেশহোল্ড পায় (উদাহরণস্বরূপ, কোনও থার্ড-পার্টি অ্যাপ বিশেষ থ্রেশহোল্ড পায় না) ম্যাপ এবং মিডিয়া অ্যাপ ছাড়া, যার থ্রেশহোল্ড ভেন্ডর কনফিগারেশন দ্বারা সংজ্ঞায়িত করা হয়।
- নীচের ডিস্ক I/O অতিরিক্ত ব্যবহার থ্রেশহোল্ডগুলি তৃতীয় পক্ষের অ্যাপগুলির জন্য ডিফল্ট থ্রেশহোল্ড৷ এই থ্রেশহোল্ড সিস্টেম ইমেজ সঙ্গে পাঠানো হয়.
- 3 GiB অ্যাপ ফোরগ্রাউন্ড মোডে লিখুন।
- 2 GiB অ্যাপের ব্যাকগ্রাউন্ড মোডে লিখুন।
- সিস্টেম গ্যারেজ মোডে 4 GiB লিখুন।
- এগুলি বেস থ্রেশহোল্ড। ডিস্ক I/O ব্যবহার সম্পর্কে আরও জানার কারণে এই থ্রেশহোল্ডগুলি আপডেট করা হয়েছে।
অতিরিক্ত ব্যবহার কনফিগারেশন XML বিন্যাস
বিল্ড ইমেজে /vendor/etc/automotive/watchdog/resource_overuse_configuration.xml
অবস্থানে ডিফল্ট ভেন্ডর কনফিগারেশন স্থাপন করা যেতে পারে (এটি ঐচ্ছিক )। যখন এই কনফিগারেশনটি নির্দিষ্ট করা না থাকে, তখন সিস্টেম-সংজ্ঞায়িত কনফিগারেশনটি ভেন্ডর অ্যাপস এবং পরিষেবাগুলির জন্যও প্রয়োগ করা হয়।
XML ফাইলটিতে প্রতিটি কনফিগার ক্ষেত্রের জন্য শুধুমাত্র একটি ট্যাগ থাকা উচিত। I/O অতিরিক্ত ব্যবহার কনফিগারেশন XML ফাইলে সংজ্ঞায়িত করা আবশ্যক। সমস্ত থ্রেশহোল্ড মান MiB ইউনিটে নির্দিষ্ট করা উচিত।
একটি নমুনা XML কনফিগারেশন নীচে প্রদান করা হয়েছে:
<resourceOveruseConfiguration version="1.0"> <componentType> VENDOR </componentType> <!-- List of safe to kill vendor packages. --> <safeToKillPackages> <package> com.vendor.package.A </package> <package> com.vendor.package.B </package> </safeToKillPackages> <!-- List of vendor package prefixes. --> <vendorPackagePrefixes> <packagePrefix> com.vendor.package </packagePrefix> </vendorPackagePrefixes> <!-- List of unique package names to app category mappings. --> <packagesToAppCategoryTypes> <packageAppCategory type="MEDIA"> com.vendor.package.A </packageAppCategory> <packageAppCategory type="MAPS"> com.google.package.B </packageAppCategory> <packageAppCategory type="MEDIA"> com.third.party.package.C </packageAppCategory> </packagesToAppCategoryTypes> <ioOveruseConfiguration> <!-- Thresholds in MiB for all vendor packages that don't have package specific thresholds. --> <componentLevelThresholds> <state id="foreground_mode"> 1024 </state> <state id="background_mode"> 512 </state> <state id="garage_mode"> 3072 </state> </componentLevelThresholds> <packageSpecificThresholds> <!-- IDs must be unique --> <perStateThreshold id="com.vendor.package.C"> <state id="foreground_mode"> 400 </state> <state id="background_mode"> 100 </state> <state id="garage_mode"> 200 </state> </perStateThreshold> <perStateThreshold id="com.vendor.package.D"> <state id="foreground_mode"> 1024 </state> <state id="background_mode"> 500 </state> <state id="garage_mode"> 2048 </state> </perStateThreshold> </packageSpecificThresholds> <!-- Application category specific thresholds. --> <appCategorySpecificThresholds> <!-- One entry per supported application category --> <perStateThreshold id="MEDIA"> <state id="foreground_mode"> 600 </state> <state id="background_mode"> 700 </state> <state id="garage_mode"> 1024 </state> </perStateThreshold> <perStateThreshold id="MAPS"> <state id="foreground_mode"> 800 </state> <state id="background_mode"> 900 </state> <state id="garage_mode"> 2048 </state> </perStateThreshold> </appCategorySpecificThresholds> </ioOveruseConfiguration> </resourceOveruseConfiguration>
CarWatchdogManager সিস্টেম API-এর মাধ্যমে অতিরিক্ত ব্যবহার কনফিগারেশন আপডেট করুন
উপরের XML কনফিগারেশন শুধুমাত্র বিল্ড ইমেজে প্রদান করা যেতে পারে। বিল্ড রিলিজ হওয়ার পর যদি কোনো OEM অন-ডিভাইস কনফিগারেশন আপডেট করতে বেছে নেয়, তাহলে তারা ডিভাইসের কনফিগারেশনে পরিবর্তন করতে নিম্নলিখিত API ব্যবহার করতে পারে।
- কলকারীকে
Car.PERMISSION_CONTROL_CAR_WATCHDOG_CONFIG
অনুমতি দিন৷ PERMISSION_CONTROL_CAR_WATCHDOG_CONFIG৷ - নতুন কনফিগারেশন আপডেট এবং সেট করতে বিদ্যমান কনফিগারেশন ব্যবহার করতে হবে। বিদ্যমান কনফিগারেশন পেতে API
CarWatchdogManager.getResourceOveruseConfigurations
ব্যবহার করুন। বিদ্যমান কনফিগারেশন ব্যবহার না করা হলে, সমস্ত কনফিগারেশন (সিস্টেম এবং তৃতীয় পক্ষের কনফিগারেশন সহ) ওভাররাইট করা হয়, যা সুপারিশ করা হয় না। - ডেল্টা পরিবর্তনের সাথে বিদ্যমান কনফিগারেশন আপডেট করুন এবং নতুন কনফিগারেশন সেট করুন। সিস্টেম এবং তৃতীয় পক্ষের উপাদান কনফিগারেশন আপডেট করবেন না ।
- নতুন কনফিগারেশন সেট করতে API
CarWatchdogManager.setResourceOveruseConfigurations
ব্যবহার করুন। - ডিস্ক I/O অতিরিক্ত ব্যবহার কনফিগারেশন পেতে এবং সেট করতে ফ্ল্যাগ
CarWatchdogManager.FLAG_RESOURCE_OVERUSE_IO
ব্যবহার করুন।
এখানে একটি নমুনা বাস্তবায়ন যা সম্পদের অতিরিক্ত ব্যবহার কনফিগারেশন আপডেট করে:
void updateResourceOveruseConfigurations() { CarWatchdogManager manager = (CarWatchdogManager) car.getCarManager(Car.CAR_WATCHDOG_SERVICE); List<ResourceOveruseConfiguration> resourceOveruseConfigurations = manager.getResourceOveruseConfigurations( CarWatchdogManager.FLAG_RESOURCE_OVERUSE_IO); List<ResourceOveruseConfiguration> newResourceOveruseConfigurations = new List<>(); ResourceOveruseConfiguration vendorConfiguration; for(ResourceOveruseConfiguration config : resourceOveruseConfigurations) { // Do not update the configurations of the system and third-party component types. if (config.getComponentType() != ResourceOveruseConfiguration.COMPONENT_TYPE_VENDOR) { newResourceOveruseConfigurations.add(config); continue; } vendorConfiguration = config; } if (vendorConfiguration == null) { ResourceOveruseConfiguration.Builder vendorConfigBuilder = new ResourceOveruseConfiguration.Builder(); initializeConfig(vendorConfigBuilder); newResourceOveruseConfigurations.add(vendorConfigBuilder.build()); } else { ResourceOveruseConfiguration newVendorConfig = updateConfig(vendorConfiguration); newResourceOveruseConfigurations.add(newVendorConfig); } int result = manager.setResourceOveruseConfigurations( newResourceOveruseConfigurations, if (result != CarWatchdogManager.RETURN_CODE_SUCCESS) { // Failed to set the resource overuse configurations. } } /** Sets the delta between the old configuration and the new configuration. */ ResourceOveruseConfiguration updateConfig( ResourceOveruseConfiguration oldConfiguration) { // Replace com.vendor.package.A with com.vendor.package.B in the safe-to-kill list. List<String> safeToKillPackages = oldConfiguration.getSafeToKillPackages(); safeToKillPackages.remove("com.vendor.package.A"); safeToKillPackages.add("com.vendor.package.B"); ResourceOveruseConfiguration.Builder configBuilder = new ResourceOveruseConfiguration.Builder( oldConfiguration.getComponentType(), safeToKillPackages, oldConfiguration.getVendorPackagePrefixes(), oldConfiguration.getPackagesToAppCategoryTypes()); configBuilder.addVendorPackagePrefixes("com.vendor."); configBuilder.addPackagesToAppCategoryTypes("com.vendor.package.B", ResourceOveruseConfiguration.APPLICATION_CATEGORY_TYPE_MAPS); IoOveruseConfiguration oldIoConfiguration = oldConfiguration.getIoOveruseConfiguration(); IoOveruseConfiguration.Builder ioConfigBuilder = new IoOveruseConfiguration.Builder( oldIoConfiguration.getComponentLevelThresholds(), oldIoConfiguration.getPackageSpecificThresholds(), oldIoConfiguration.getAppCategorySpecificThresholds(), oldIoConfiguration.getSystemWideThresholds()); // Define the amount of bytes based on the flash memory specification, expected lifetime, // and estimated average amount of bytes written by a package during different modes. ioConfigBuilder.addPackageSpecificThresholds("com.vendor.package.B", new PerStateBytes(/* foregroundModeBytes= */ 2 * 1024 * 1024 * 1024, /* backgroundModeBytes= */ 500 * 1024 * 1024, /* garageModeBytes= */ 3 * 1024 * 1024 * 1024)); return configBuilder.setIoOveruseConfiguration(ioConfigBuilder.build()).build(); }
অ্যাপগুলি তাদের সম্পদের অতিরিক্ত ব্যবহার পর্যবেক্ষণ করছে
বিক্রেতা এবং থার্ড-পার্টি অ্যাপগুলি ওয়াচডগ থেকে অ্যাপ নির্দিষ্ট রিসোর্স অতিরিক্ত ব্যবহারের বিজ্ঞপ্তি শুনতে পারে অথবা অ্যাপ নির্দিষ্ট রিসোর্স অত্যধিক ব্যবহারের পরিসংখ্যান গত 30 দিনের জন্য পোল CarWatchdogManager
শুনতে পারে।
সম্পদের অত্যধিক ব্যবহারের বিজ্ঞপ্তির জন্য শুনুন
অ্যাপগুলি একটি রিসোর্স অত্যধিক ব্যবহার শ্রোতাকে প্রয়োগ করতে পারে এবং শ্রোতাকে তাদের ডিস্ক I/O অতিরিক্ত ব্যবহার থ্রেশহোল্ডের 80% বা 100% অতিক্রম করলে অ্যাপ নির্দিষ্ট বিজ্ঞপ্তিগুলি পেতে CarWatchdogManager
সাথে নিবন্ধন করতে পারে। অ্যাপগুলি এই বিজ্ঞপ্তিগুলি ব্যবহার করতে পারে:
- অফলাইন বিশ্লেষণের জন্য ডিস্ক I/O অতিরিক্ত ব্যবহারের পরিসংখ্যান লগ করুন। অ্যাপ বিকাশকারীরা ডিস্ক I/O অতিরিক্ত ব্যবহার সমস্যা ডিবাগ করতে এই লগিং ব্যবহার করতে পারেন।
- অত্যধিক ব্যবহার কাউন্টার রিসেট না হওয়া পর্যন্ত ডিস্ক I/O লেখা কমিয়ে দিন।
জাভা ক্লায়েন্ট
-
CarWatchdogManager.ResourceOveruseListener
উত্তরাধিকারসূত্রে শ্রোতাকে প্রয়োগ করুন :class ResourceOveruseListenerImpl implements CarWatchdogManager.ResourceOveruseListener { @Override public void onOveruse( @NonNull ResourceOveruseStats resourceOveruseStats) { // 1. Log/Upload resource overuse metrics. // 2. Reduce writes until the counters reset. IoOveruseStats ioOveruseStats = resourceOveruseStats.getIoOveruseStats(); // Stats period - [ioOveruseStats.getStartTime(), ioOveruseStats.getStartTime() // + ioOveruseStats.getDurationInSeconds()] // Total I/O overuses - ioOveruseStats.getTotalOveruses() // Total bytes written - ioOveruseStats.getTotalBytesWritten() // Remaining write bytes for the current UTC calendar day - // ioOveruseStats.getRemainingWriteBytes() } } }
CarWatchdogManager.addResourceOveruseListener
কল করে শ্রোতার উদাহরণ নিবন্ধন করুনprivate void addResourceOveruseListener() { CarWatchdogManager manager = (CarWatchdogManager) car.getCarManager(Car.CAR_WATCHDOG_SERVICE); // Choose a proper executor to handle resource overuse notifications. Executor executor = mContext.getMainExecutor(); manager.addResourceOveruseListener( executor, CarWatchdogManager.FLAG_RESOURCE_OVERUSE_IO, mListenerImpl); }
- অ্যাপটি শোনা শেষ হলে শ্রোতার উদাহরণটি নিবন্ধনমুক্ত করুন:
private void removeResourceOveruseListener() { CarWatchdogManager manager = (CarWatchdogManager) car.getCarManager(Car.CAR_WATCHDOG_SERVICE); mCarWatchdogManager.removeResourceOveruseListener( mListenerImpl); }
নেটিভ ক্লায়েন্ট
- বিল্ড নিয়মের
shared_libs
নির্ভরতায়carwatchdog_aidl_interface-ndk_platform
অন্তর্ভুক্ত করুন।Android.bp
cc_binary { name: "sample_native_client", srcs: [ "src/*.cpp" ], shared_libs: [ "carwatchdog_aidl_interface-ndk_platform", "libbinder_ndk", ], vendor: true, }
- ভেন্ডর সার্ভিস ডোমেনকে বাইন্ডার (
binder_user
ম্যাক্রো) ব্যবহার করার অনুমতি দিতে SELinux নীতি যোগ করুন এবংcarwatchdog
ক্লায়েন্ট ডোমেনে(carwatchdog_client_domain macro)
বিক্রেতা পরিষেবা ডোমেন যোগ করুন।sample_client.te
এবংfile_contexts
জন্য নিচের কোডটি দেখুন।sample_client.te
type sample_client, domain; type sample_client_exec, exec_type, file_type, vendor_file_type; carwatchdog_client_domain(sample_client) init_daemon_domain(sample_client) binder_use(sample_client)
file_contexts
/vendor/bin/sample_native_client u:object_r:sample_client_exec:s0
BnResourceOveruseListener
উত্তরাধিকারসূত্রে রিসোর্স অত্যধিক ব্যবহার শ্রোতাকে বাস্তবায়ন করুন। সম্পদের অতিরিক্ত ব্যবহারের বিজ্ঞপ্তিগুলি পরিচালনা করতেBnResourceOveruseListener::onOveruse
ওভাররাইড করুন।ResourceOveruseListenerImpl.h
class ResourceOveruseListenerImpl : public BnResourceOveruseListener { public: ndk::ScopedAStatus onOveruse( ResourceOveruseStats resourceOveruseStats) override; private: void initialize(); void terminate(); std::shared_ptr<ICarWatchdog> mWatchdogServer; std::shared_ptr<IResourceOveruseListener> mListener; }
ResourceOveruseListenerImpl.cpp
ndk::ScopedAStatus ResourceOveruseListenerImpl::onOveruse( ResourceOveruseStats resourceOveruseStats) { // 1. Log/Upload resource overuse metrics. // 2. Reduce writes until the counters reset. if (stats.getTag() != ResourceOveruseStats::ioOveruseStats) { // Received resourceOveruseStats doesn't contain I/O overuse stats. } const IoOveruseStats& ioOveruseStats = stats.get(); // Stats period - [ioOveruseStats.startTime, // ioOveruseStats.startTime + ioOveruseStats.durationInSeconds] // Total I/O overuses - ioOveruseStats.totalOveruses // Total bytes written - ioOveruseStats.writtenBytes // Remaining write bytes for the current UTC calendar day - // ioOveruseStats.remainingWriteBytes return ndk::ScopedAStatus::ok(); }
- একটি বাইন্ডার থ্রেড পুল শুরু করুন এবং ওয়াচডগ সার্ভারের সাথে রিসোর্স অতিরিক্ত ব্যবহার শ্রোতা নিবন্ধন করুন। ওয়াচডগ সার্ভার
android.automotive.watchdog.ICarWatchdog/default
পরিষেবার নামে নিবন্ধিত।main.cpp
int main(int argc, char** argv) { ABinderProcess_setThreadPoolMaxThreadCount(1); ABinderProcess_startThreadPool(); std::shared_ptr<ResourceOveruseListenerImpl> listener = ndk::SharedRefBase::make<ResourceOveruseListenerImpl>(); // The listener is added in initialize(). listener->initialize(); ... Run service ... // The listener is removed in terminate(). listener->terminate(); }
ResourceOveruseListenerImpl.cpp
void ResourceOveruseListener::initialize() { ndk::SpAIBinder binder(AServiceManager_getService( "android.automotive.watchdog.ICarWatchdog/default")); std::shared_ptr<ICarWatchdog> server = ICarWatchdog::fromBinder(binder); mWatchdogServer = server; std::shared_ptr<IResourceOveruseListener> listener = IResourceOveruseListener::fromBinder(this->asBinder()); mWatchdogServer->addResourceOveruseListener( std::vector<int>{ResourceType.IO}, listener); mListener = listener; } void ResourceOveruseListener::terminate() { mWatchdogServer->removeResourceOveruseListener(mListener); }
পোল সম্পদ অতিরিক্ত ব্যবহার পরিসংখ্যান
অ্যাপগুলি সাম্প্রতিক 30 দিনের জন্য অ্যাপ-নির্দিষ্ট I/O অতিরিক্ত ব্যবহারের পরিসংখ্যান ATS-এর জন্য CarWatchdogManager-এর জন্য পোল করতে পারে।
জাভা ক্লায়েন্ট
সম্পদের অতিরিক্ত ব্যবহারের পরিসংখ্যান পেতে CarWatchdogManager.getResourceOveruseStats
ব্যবহার করুন। ডিস্ক I/O অতিরিক্ত ব্যবহারের পরিসংখ্যান পেতে CarWatchdogManager.FLAG_RESOURCE_OVERUSE_IO
পতাকা পাস করুন৷
private void getResourceOveruseStats() { CarWatchdogManager manager = (CarWatchdogManager) car.getCarManager(Car.CAR_WATCHDOG_SERVICE); // Returns resource overuse stats with I/O overuse stats for the past // 7 days. Stats are available for up to the past 30 days. ResourceOveruseStats resourceOveruseStats = mCarWatchdogManager.getResourceOveruseStats( CarWatchdogManager.FLAG_RESOURCE_OVERUSE_IO, CarWatchdogManager.STATS_PERIOD_PAST_7_DAYS); IoOveruseStats ioOveruseStats = resourceOveruseStats.getIoOveruseStats(); // Stats period - [ioOveruseStats.getStartTime(), ioOveruseStats.getStartTime() // + ioOveruseStats.getDurationInSeconds()] // Total I/O overuses - ioOveruseStats.getTotalOveruses() // Total bytes written - ioOveruseStats.getTotalBytesWritten() // Remaining write bytes for the UTC calendar day - // ioOveruseStats.getRemainingWriteBytes() }
নেটিভ ক্লায়েন্ট
সম্পদের অতিরিক্ত ব্যবহারের পরিসংখ্যান পেতে CarWatchdogServer.getResourceOveruseStats
ব্যবহার করুন। ডিস্ক I/O অতিরিক্ত ব্যবহারের পরিসংখ্যান আনতে ResourceType.IO
enum পাস করুন।
void getResourceOveruseStats() { ndk::SpAIBinder binder(AServiceManager_getService( "android.automotive.watchdog.ICarWatchdog/default")); std::shared_ptr<ICarWatchdog> server = ICarWatchdog::fromBinder(binder); // Returns the stats only for the current UTC calendar day. const std::vector<ResourceOveruseStats> resourceOveruseStats; ndk::ScopedAStatus status = server.getResourceOveruseStats( std::vector<int>{ResourceType.IO}, &resourceOveruseStats); if (!status.isOk()) { // Failed to get the resource overuse stats. return; } for (const auto& stats : resourceOveruseStats) { if (stats.getTag() != ResourceOveruseStats::ioOveruseStats) { continue; } const IoOveruseStats& ioOveruseStats = stats.get(); // Stats period - [ioOveruseStats.startTime, // ioOveruseStats.startTime + ioOveruseStats.durationInSeconds] // Total I/O overuses - ioOveruseStats.totalOveruses // Total bytes written - ioOveruseStats.writtenBytes // Remaining write bytes for the current UTC calendar day - // ioOveruseStats.remainingWriteBytes } }
রিসোর্স অত্যধিক ব্যবহার ব্যবহারকারীর অভিজ্ঞতা
নিম্নলিখিত বিভাগগুলি ব্যবহারকারীর অভিজ্ঞতা বর্ণনা করে যখন সম্পদের অতিরিক্ত ব্যবহার ঘটে।
অ্যাপের কর্মক্ষমতা সেটিংকে অগ্রাধিকার দিন
অ্যাপ সেটিংস পৃষ্ঠায় Prioritize app performance
জন্য সেটিংস রয়েছে (নীচের চিত্রটি দেখুন), যা ব্যবহারকারীদের সিস্টেমের উপর একটি অ্যাপের কর্মক্ষমতা এবং দীর্ঘমেয়াদী হার্ডওয়্যার কর্মক্ষমতাকে অগ্রাধিকার দিতে দেয়। এই সেটিংটি শুধুমাত্র সেই অ্যাপগুলির জন্য উপলব্ধ যা সম্পদের অতিরিক্ত ব্যবহারে বন্ধ করা নিরাপদ৷ অন্যথায়, এই সেটিং অক্ষম করা হয়. যখন কোনো অ্যাপের জন্য এই সেটিংটি টগল অফ (ডিফল্ট সেটিং) করা হয়, তখন রিসোর্সের অত্যধিক ব্যবহারে অ্যাপটি বন্ধ হয়ে যেতে পারে। অন্যথায়, রিসোর্সের অত্যধিক ব্যবহারে অ্যাপটি বন্ধ করা হবে না।
যখন ব্যবহারকারী এই সেটিংটিতে টগল করেন, নিম্নলিখিত নিশ্চিতকরণ ডায়ালগ সেটিংটিতে টগল করার প্রভাব বর্ণনা করে:
90 দিন পরে, এই সেটিংটি স্বয়ংক্রিয়ভাবে ডিফল্টে রিসেট হয়৷ watchdogUserPackageSettingsResetDays
ব্যবহার করে RRO ওভারলে অ্যাপের মাধ্যমে দিনের সীমা পরিবর্তন করা যেতে পারে, সর্বোচ্চ 180 দিন পর্যন্ত। আরও জানতে, রানটাইমে অ্যাপের সম্পদের মান পরিবর্তন দেখুন। নিম্নলিখিত উদাহরণ ওভারলে ট্যাগটি AndroidManifest.xml
এ অন্তর্ভুক্ত করা যেতে পারে:
<overlay android:priority="<insert-value>" android:targetPackage="com.android.car.updatable" android:targetName="CarServiceCustomization" android:resourcesMap="@xml/overlays" />
res/values/config.xml
এ:
<resources> <integer name="watchdogUserPackageSettingsResetDays">value</integer> </resources>
res/xml/overlays.xml
এ:
<overlay> <item target="integer/watchdogUserPackageSettingsResetDays" value="@integer/watchdogUserPackageSettingsResetDays" /> </overlay>
কর্মক্ষমতা প্রভাবিত অ্যাপ্লিকেশন সেটিং
সেটিংস অ্যাপটিতে একটি পারফরম্যান্স-প্রভাবিত অ্যাপস বিভাগ রয়েছে (চিত্র 1 দেখুন)। ট্যাপ করা হলে, ফ্ল্যাশ মেমরির অত্যধিক ব্যবহারের কারণে সীমাবদ্ধ থাকা এবং সিস্টেমের কর্মক্ষমতাকে নেতিবাচকভাবে প্রভাবিত করে এমন অ্যাপগুলির একটি তালিকা প্রদর্শিত হয়৷ এটি CDD 3.5.1 প্রয়োজনীয়তা অনুসরণ করে [C-1-1] ।
চিত্র 1. কর্মক্ষমতা প্রভাবিত অ্যাপ্লিকেশন.
সম্পদের অত্যধিক ব্যবহারের কারণে বন্ধ হওয়া অ্যাপগুলি এখানে তালিকাভুক্ত করা হয়েছে (চিত্র 2 দেখুন)। তালিকাভুক্ত অ্যাপগুলিকে অগ্রাধিকার দেওয়া যেতে পারে। আরও জানতে, অ্যাপের কর্মক্ষমতা সেটিংকে অগ্রাধিকার দিন দেখুন।
ছবি 2. রিসোর্স অত্যধিক ব্যবহারের কারণে বন্ধ করা অ্যাপের তালিকা।
ব্যবহারকারীর বিজ্ঞপ্তি
যখন একটি অ্যাপ বা পরিষেবা বারবার ডিস্ক I/O ব্যবহার করে (উদাহরণস্বরূপ, সংজ্ঞায়িত থ্রেশহোল্ডের বাইরে ডিস্কে ডেটা লেখে) এবং রিসোর্স অত্যধিক ব্যবহারে এটি বন্ধ করা নিরাপদ, গাড়িটি অনুমতি-চালক-বিক্ষেপণ অবস্থায় প্রবেশ করার পরে ব্যবহারকারীকে অবহিত করা হয়।
প্রথম ব্যবহারকারীর বিজ্ঞপ্তি (ড্রাইভ চলাকালীন) একটি হেড-আপ বিজ্ঞপ্তি হিসাবে পোস্ট করা হয় এবং অন্যান্য বিজ্ঞপ্তিগুলি বিজ্ঞপ্তি কেন্দ্রে পোস্ট করা হয়।
উদাহরণস্বরূপ, যখন একটি অ্যাপ বারবার ডিস্ক I/O ব্যবহার করে, ব্যবহারকারী নিম্নলিখিত বিজ্ঞপ্তি পান:
- ব্যবহারকারী যখন অ্যাপের অগ্রাধিকার বোতামে ক্লিক করেন, তখন অ্যাপের সেটিংস পৃষ্ঠাটি চালু হয়, যেখানে ব্যবহারকারী অগ্রাধিকার প্রদান অ্যাপের কর্মক্ষমতা সেটিং চালু বা বন্ধ করতে পারে।
- যখন ব্যবহারকারী অ্যাপটি নিষ্ক্রিয় করুন বোতামে ক্লিক করেন, ব্যবহারকারী অ্যাপটি চালু না করা পর্যন্ত বা অ্যাপের সেটিংস পৃষ্ঠায় এটি সক্ষম না করা পর্যন্ত অ্যাপটি নিষ্ক্রিয় থাকে।
- আনইনস্টলযোগ্য অ্যাপের জন্য, অ্যাপ অক্ষম বোতামটি আনইনস্টল অ্যাপ বোতাম দিয়ে প্রতিস্থাপিত হয়। ব্যবহারকারী যখন অ্যাপ আনইনস্টল বোতামে ক্লিক করেন, অ্যাপটির সেটিংস পৃষ্ঠা চালু হয়, যেখান থেকে ব্যবহারকারী অ্যাপটি আনইনস্টল করতে পারেন।
লঞ্চার বাস্তবায়নের জন্য সুপারিশ
সম্পদের অত্যধিক ব্যবহারের কারণে অ্যাপগুলি অক্ষম হয়ে গেলে, অ্যাপগুলি ডিফল্ট লঞ্চার অ্যাপ থেকে অদৃশ্য হয়ে যায় কারণ CarService অ্যাপগুলির সক্ষম অবস্থাকে PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED
হিসাবে আপডেট করে।COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED। এই অ্যাপগুলিকে অস্বাভাবিক হিসাবে প্রদর্শন করতে OEMগুলিকে অবশ্যই বিল্টইন লঞ্চার বাস্তবায়ন আপডেট করতে হবে, যাতে ব্যবহারকারীরা প্রয়োজনে সেগুলি ব্যবহার করতে পারেন। বিল্ড রিলিজের উপর ভিত্তি করে নিম্নলিখিত সুপারিশগুলি দেখুন।
Android SC V2 রিলিজ
- লঞ্চারে দেখানোর জন্য প্যাকেজের তালিকা পুনরুদ্ধার করার সময় লঞ্চার বাস্তবায়নের
MATCH_DISABLED_UNTIL_USED_COMPONENTS
পতাকা ব্যবহার করা উচিত। - যখন ব্যবহারকারী
PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED
অবস্থায় থাকা একটি অ্যাপে ক্লিক করেন, তখন লঞ্চার অ্যাপটিকে সক্রিয় অবস্থায় সেট করে অ্যাপটিকে সক্রিয় করতে হবে:
ওয়াচডগ `/proc/uid_io/stats` অবস্থানে কার্নেল দ্বারা প্রকাশিত প্রতি-UID ডিস্ক I/O পরিসংখ্যান ব্যবহার করে সমস্ত অ্যাপ এবং পরিষেবা দ্বারা তৈরি ডিস্ক I/O লেখার মোট পরিমাণ ট্র্যাক করে ফ্ল্যাশ মেমরির ব্যবহার নিরীক্ষণ করে। যখন একটি অ্যাপ বা পরিষেবা ডিস্ক I/O অতিরিক্ত ব্যবহার থ্রেশহোল্ড অতিক্রম করে, ওয়াচডগ অ্যাপ বা পরিষেবার উপর পদক্ষেপ নেয়। ডিস্ক I/O অত্যধিক ব্যবহার থ্রেশহোল্ড এবং অতিরিক্ত ব্যবহার করার জন্য পদক্ষেপ ডিস্ক I/O অতিরিক্ত ব্যবহার কনফিগারেশনে পূর্বনির্ধারিত।
অত্যধিক ব্যবহার থ্রেশহোল্ড
- ডিস্ক I/O অত্যধিক ব্যবহারের থ্রেশহোল্ডগুলি প্রতিদিনের ভিত্তিতে প্রয়োগ করা হয়, অর্থাৎ, একটি অ্যাপ/পরিষেবা দ্বারা করা সমস্ত লেখা বর্তমান UTC ক্যালেন্ডার দিনের শুরু থেকে একত্রিত করা হয় এবং অতিরিক্ত ব্যবহার কনফিগারেশনে সংজ্ঞায়িত থ্রেশহোল্ডগুলির বিপরীতে পরীক্ষা করা হয়।
- একটি নির্দিষ্ট দিনে একটি গাড়ি একাধিকবার চালু হলে, ওয়াচডগ মডিউল ফ্ল্যাশ মেমরিতে ডিস্ক I/O ব্যবহারের পরিসংখ্যান সংরক্ষণ করে এবং বর্তমান UTC ক্যালেন্ডার দিনের শুরু থেকে সেগুলিকে একত্রিত করে।
অতিরিক্ত ব্যবহার কর্ম
যখন একটি অ্যাপ বারবার সংজ্ঞায়িত ডিস্ক I/O অতিরিক্ত ব্যবহার থ্রেশহোল্ড অতিক্রম করে, ওয়াচডগ অতিরিক্ত ব্যবহার কনফিগারেশনে সংজ্ঞায়িত পদক্ষেপ নেয়।
- সমস্ত বিক্রেতা অ্যাপ এবং পরিষেবাগুলি সামগ্রিক সিস্টেম স্থিতিশীলতার জন্য গুরুত্বপূর্ণ বলে বিবেচিত হয়, তাই সেগুলি ডিস্ক I/O অতিরিক্ত ব্যবহারে বন্ধ করা হয় না। যাইহোক, অতিরিক্ত ব্যবহার কনফিগারেশন নিরাপদ-টু-টার্মিনেট বিক্রেতা অ্যাপ এবং পরিষেবাগুলির একটি তালিকা নির্ধারণ করতে পারে।
- সমস্ত থার্ড-পার্টি অ্যাপস নিরাপদ-টু-টার্মিনেট।
যখন একটি অ্যাপ বা পরিষেবা নিরাপদে বন্ধ করা হয়, তখন ওয়াচডগ অ্যাপের উপাদান অবস্থা PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED
সহ অ্যাপ বা পরিষেবাটিকে অক্ষম করে।
অত্যধিক ব্যবহার কনফিগারেশন
অত্যধিক ব্যবহার কনফিগারেশন ডিস্ক I/O অতিরিক্ত ব্যবহার থ্রেশহোল্ড এবং কর্ম ধারণ করে। ডিফল্ট অত্যধিক ব্যবহার কনফিগারেশন সিস্টেম এবং বিক্রেতা ইমেজ সংজ্ঞায়িত করা হয়, এবং বিল্ড সঙ্গে পাঠানো হয়. বিক্রেতারা ঐচ্ছিকভাবে বিক্রেতার ছবিতে বিক্রেতার কনফিগারেশন অন্তর্ভুক্ত করতে পারে। যখন বিক্রেতা কনফিগারেশন প্রদান করা হয় না, তখন সিস্টেম কনফিগারেশনটি বিক্রেতা অ্যাপ এবং পরিষেবাগুলির জন্যও ব্যবহার করা হয়।
ওয়াচডগ CarWatchdogManager
মাধ্যমে সিস্টেম APIগুলিকে প্রকাশ করে, যা বিক্রেতাদের অ্যাপ বা পরিষেবাগুলিকে যেকোনো সময় বিক্রেতা কনফিগারেশন আপডেট করতে দেয়।
অত্যধিক ব্যবহার কনফিগারেশন সংজ্ঞা
অতিরিক্ত ব্যবহার কনফিগারেশন উপাদান প্রকার দ্বারা বিভক্ত করা হয়, উদাহরণস্বরূপ, সিস্টেম, বিক্রেতা, এবং তৃতীয় পক্ষ। OEMs শুধুমাত্র বিক্রেতা উপাদান কনফিগারেশন আপডেট করা আবশ্যক.
বিক্রেতা কনফিগারেশন
ভেন্ডর কনফিগারেশন ডিস্ক I/O অত্যধিক ব্যবহার থ্রেশহোল্ড এবং সমস্ত বিক্রেতা অ্যাপ এবং পরিষেবা এবং সমস্ত মানচিত্র এবং মিডিয়া অ্যাপের জন্য অ্যাকশন সংজ্ঞায়িত করে। কনফিগারেশনে নিচের কনফিগারেশন ক্ষেত্র রয়েছে।
- বিক্রেতা প্যাকেজ উপসর্গ । ভেন্ডর পার্টিশনে ইনস্টল করা সমস্ত প্যাকেজ ভেন্ডর প্যাকেজ হিসাবে বিবেচিত হয়। এই প্যাকেজগুলি ছাড়াও, বিক্রেতারা বিক্রেতা প্যাকেজ উপসর্গ কনফিগারে প্যাকেজ উপসর্গ যোগ করে বিক্রেতা প্যাকেজ হিসাবে পূর্বে ইনস্টল করা প্যাকেজগুলিকে শ্রেণিবদ্ধ করতে পারে। এই কনফিগারেশন রেগুলার এক্সপ্রেশন গ্রহণ করে না।
- সেফ-টু-টার্মিনেট প্যাকেজ । সেফ-টু-টার্মিনেট প্যাকেজ কনফিগারেশনে সম্পূর্ণ প্যাকেজের নাম যোগ করে বিক্রেতারা নির্দিষ্ট করতে পারেন কোন ভেন্ডর প্যাকেজগুলো বন্ধ করা নিরাপদ।
- অ্যাপ্লিকেশন বিভাগ ম্যাপিং । বিক্রেতারা যেকোন প্যাকেজ (তৃতীয়-পক্ষের প্যাকেজ সহ) দুটি সমর্থিত অ্যাপ বিভাগের একটিতে ম্যাপ করতে পারে - মানচিত্র এবং মিডিয়া অ্যাপ। এই ম্যাপিংটি মানচিত্র এবং মিডিয়া অ্যাপগুলিকে উচ্চতর ডিস্ক I/O অত্যধিক ব্যবহার থ্রেশহোল্ড প্রদান করার জন্য করা হয় কারণ এই অ্যাপগুলি অন্যান্য অ্যাপের প্রকারের তুলনায় ডিস্কে বেশি ডেটা ডাউনলোড এবং লিখতে থাকে।
- কম্পোনেন্ট লেভেল থ্রেশহোল্ড সমস্ত বিক্রেতা প্যাকেজের জন্য জেনেরিক থ্রেশহোল্ড সংজ্ঞায়িত করে (অর্থাৎ, প্যাকেজ নির্দিষ্ট থ্রেশহোল্ড বা অ্যাপ্লিকেশন বিভাগের নির্দিষ্ট থ্রেশহোল্ডগুলি এই থ্রেশহোল্ডগুলি পায়)। ডিস্ক I/O অত্যধিক ব্যবহার কনফিগারেশন সংজ্ঞায়িত করার সময় বিক্রেতাদের অবশ্যই নন-জিরো কম্পোনেন্ট-লেভেল থ্রেশহোল্ড সংজ্ঞায়িত করতে হবে।
- প্যাকেজ নির্দিষ্ট থ্রেশহোল্ড । বিক্রেতারা নির্দিষ্ট বিক্রেতা প্যাকেজের জন্য বিশেষ থ্রেশহোল্ড সংজ্ঞায়িত করতে পারেন। ম্যাপিংগুলিতে সম্পূর্ণ প্যাকেজের নাম থাকা উচিত। এই কনফিগারেশনে সংজ্ঞায়িত থ্রেশহোল্ডগুলি একটি প্রদত্ত প্যাকেজের জন্য অন্যান্য কনফিগারেশনে সংজ্ঞায়িত থ্রেশহোল্ডগুলির চেয়ে অগ্রাধিকার নেয়।
- অ্যাপ্লিকেশন বিভাগ নির্দিষ্ট থ্রেশহোল্ড । বিক্রেতারা নির্দিষ্ট অ্যাপ বিভাগের জন্য বিশেষ থ্রেশহোল্ড নির্দিষ্ট করতে পারেন। অ্যাপ বিভাগগুলি অবশ্যই সমর্থিত বিভাগগুলির মধ্যে একটি হতে হবে - মানচিত্র এবং মিডিয়া অ্যাপ৷ এই কনফিগারেশনে সংজ্ঞায়িত থ্রেশহোল্ডগুলি অ্যাপ্লিকেশন বিভাগ ম্যাপিং ব্যবহার করে নির্দিষ্ট প্যাকেজে ম্যাপ করা হয়।
- সিস্টেম-ওয়াইড থ্রেশহোল্ড । বিক্রেতাদের এই কনফিগারেশন নির্দিষ্ট করা উচিত নয়.
ভেন্ডর প্যাকেজ উপসর্গ , সেফ-টু-টার্মিনেট প্যাকেজ , কম্পোনেন্ট লেভেল থ্রেশহোল্ড , এবং প্যাকেজ নির্দিষ্ট থ্রেশহোল্ড কনফিগারেশনগুলি শুধুমাত্র ভেন্ডর অ্যাপস এবং পরিষেবাগুলির জন্য ভেন্ডর কনফিগারেশন দ্বারা আপডেট করা যায়৷ অ্যাপ্লিকেশন বিভাগ নির্দিষ্ট থ্রেশহোল্ড কনফিগারেশন শুধুমাত্র সমস্ত মানচিত্র এবং মিডিয়া অ্যাপের জন্য বিক্রেতা কনফিগারেশন দ্বারা আপডেট করা যেতে পারে।
অত্যধিক ব্যবহারের থ্রেশহোল্ডগুলিতে লেখার জন্য অনুমোদিত বাইটের পরিমাণ থাকে:
- একটি অ্যাপ বা পরিষেবা ফোরগ্রাউন্ড মোড বনাম ব্যাকগ্রাউন্ড মোড
- সিস্টেম গ্যারেজ মোড
এই শ্রেণীবিভাগ ব্যবহারকারীকে ফোরগ্রাউন্ড অ্যাপস এবং পরিষেবাগুলির মুখোমুখি হতে ব্যাকগ্রাউন্ড অ্যাপ এবং পরিষেবাগুলির চেয়ে বেশি ডেটা লেখার অনুমতি দেয়৷ গ্যারেজ মোডে, অ্যাপ্লিকেশান এবং পরিষেবাগুলি আপডেটগুলি ডাউনলোড করার প্রবণতা রয়েছে, তাই প্রতিটির জন্য অন্যান্য মোডে চলমান অ্যাপ্লিকেশান এবং পরিষেবাগুলির তুলনায় উচ্চ থ্রেশহোল্ডের প্রয়োজন৷
সিস্টেম এবং তৃতীয় পক্ষের কনফিগারেশন
OEM-এর সিস্টেম এবং তৃতীয় পক্ষের কনফিগারেশন আপডেট করা উচিত নয় ।
- সিস্টেম কনফিগারেশন I/O অত্যধিক ব্যবহারের থ্রেশহোল্ড এবং সিস্টেম অ্যাপ এবং পরিষেবাগুলির জন্য ক্রিয়াগুলিকে সংজ্ঞায়িত করে।
- এই কনফিগারেশনটি অ্যাপ্লিকেশন বিভাগের ম্যাপিংগুলিও আপডেট করতে পারে। সুতরাং, এই কনফিগারেশন ক্ষেত্রটি সিস্টেম এবং বিক্রেতা কনফিগারেশনের মধ্যে ভাগ করা হয়।
- তৃতীয় পক্ষের কনফিগারেশন সমস্ত তৃতীয় পক্ষের অ্যাপের জন্য থ্রেশহোল্ড সংজ্ঞায়িত করে। সিস্টেমে প্রি-ইন্সটল করা নয় এমন সমস্ত অ্যাপই থার্ড-পার্টি অ্যাপ।
- সমস্ত থার্ড-পার্টি অ্যাপ একই থ্রেশহোল্ড পায় (উদাহরণস্বরূপ, কোনও থার্ড-পার্টি অ্যাপ বিশেষ থ্রেশহোল্ড পায় না) ম্যাপ এবং মিডিয়া অ্যাপ ছাড়া, যার থ্রেশহোল্ড ভেন্ডর কনফিগারেশন দ্বারা সংজ্ঞায়িত করা হয়।
- নীচের ডিস্ক I/O অতিরিক্ত ব্যবহার থ্রেশহোল্ডগুলি তৃতীয় পক্ষের অ্যাপগুলির জন্য ডিফল্ট থ্রেশহোল্ড৷ এই থ্রেশহোল্ড সিস্টেম ইমেজ সঙ্গে পাঠানো হয়.
- 3 GiB অ্যাপ ফোরগ্রাউন্ড মোডে লিখুন।
- 2 GiB অ্যাপের ব্যাকগ্রাউন্ড মোডে লিখুন।
- সিস্টেম গ্যারেজ মোডে 4 GiB লিখুন।
- এগুলি বেস থ্রেশহোল্ড। ডিস্ক I/O ব্যবহার সম্পর্কে আরও জানার কারণে এই থ্রেশহোল্ডগুলি আপডেট করা হয়েছে।
অতিরিক্ত ব্যবহার কনফিগারেশন XML বিন্যাস
বিল্ড ইমেজে /vendor/etc/automotive/watchdog/resource_overuse_configuration.xml
অবস্থানে ডিফল্ট ভেন্ডর কনফিগারেশন স্থাপন করা যেতে পারে (এটি ঐচ্ছিক )। যখন এই কনফিগারেশনটি নির্দিষ্ট করা না থাকে, তখন সিস্টেম-সংজ্ঞায়িত কনফিগারেশনটি ভেন্ডর অ্যাপস এবং পরিষেবাগুলির জন্যও প্রয়োগ করা হয়।
XML ফাইলটিতে প্রতিটি কনফিগার ক্ষেত্রের জন্য শুধুমাত্র একটি ট্যাগ থাকা উচিত। I/O অতিরিক্ত ব্যবহার কনফিগারেশন XML ফাইলে সংজ্ঞায়িত করা আবশ্যক। সমস্ত থ্রেশহোল্ড মান MiB ইউনিটে নির্দিষ্ট করা উচিত।
একটি নমুনা XML কনফিগারেশন নীচে প্রদান করা হয়েছে:
<resourceOveruseConfiguration version="1.0"> <componentType> VENDOR </componentType> <!-- List of safe to kill vendor packages. --> <safeToKillPackages> <package> com.vendor.package.A </package> <package> com.vendor.package.B </package> </safeToKillPackages> <!-- List of vendor package prefixes. --> <vendorPackagePrefixes> <packagePrefix> com.vendor.package </packagePrefix> </vendorPackagePrefixes> <!-- List of unique package names to app category mappings. --> <packagesToAppCategoryTypes> <packageAppCategory type="MEDIA"> com.vendor.package.A </packageAppCategory> <packageAppCategory type="MAPS"> com.google.package.B </packageAppCategory> <packageAppCategory type="MEDIA"> com.third.party.package.C </packageAppCategory> </packagesToAppCategoryTypes> <ioOveruseConfiguration> <!-- Thresholds in MiB for all vendor packages that don't have package specific thresholds. --> <componentLevelThresholds> <state id="foreground_mode"> 1024 </state> <state id="background_mode"> 512 </state> <state id="garage_mode"> 3072 </state> </componentLevelThresholds> <packageSpecificThresholds> <!-- IDs must be unique --> <perStateThreshold id="com.vendor.package.C"> <state id="foreground_mode"> 400 </state> <state id="background_mode"> 100 </state> <state id="garage_mode"> 200 </state> </perStateThreshold> <perStateThreshold id="com.vendor.package.D"> <state id="foreground_mode"> 1024 </state> <state id="background_mode"> 500 </state> <state id="garage_mode"> 2048 </state> </perStateThreshold> </packageSpecificThresholds> <!-- Application category specific thresholds. --> <appCategorySpecificThresholds> <!-- One entry per supported application category --> <perStateThreshold id="MEDIA"> <state id="foreground_mode"> 600 </state> <state id="background_mode"> 700 </state> <state id="garage_mode"> 1024 </state> </perStateThreshold> <perStateThreshold id="MAPS"> <state id="foreground_mode"> 800 </state> <state id="background_mode"> 900 </state> <state id="garage_mode"> 2048 </state> </perStateThreshold> </appCategorySpecificThresholds> </ioOveruseConfiguration> </resourceOveruseConfiguration>
CarWatchdogManager সিস্টেম API-এর মাধ্যমে অতিরিক্ত ব্যবহার কনফিগারেশন আপডেট করুন
উপরের XML কনফিগারেশন শুধুমাত্র বিল্ড ইমেজে প্রদান করা যেতে পারে। বিল্ড রিলিজ হওয়ার পর যদি কোনো OEM অন-ডিভাইস কনফিগারেশন আপডেট করতে বেছে নেয়, তাহলে তারা ডিভাইসের কনফিগারেশনে পরিবর্তন করতে নিম্নলিখিত API ব্যবহার করতে পারে।
- কলকারীকে
Car.PERMISSION_CONTROL_CAR_WATCHDOG_CONFIG
অনুমতি দিন৷ PERMISSION_CONTROL_CAR_WATCHDOG_CONFIG৷ - নতুন কনফিগারেশন আপডেট এবং সেট করতে বিদ্যমান কনফিগারেশন ব্যবহার করতে হবে। বিদ্যমান কনফিগারেশন পেতে API
CarWatchdogManager.getResourceOveruseConfigurations
ব্যবহার করুন। বিদ্যমান কনফিগারেশন ব্যবহার না করা হলে, সমস্ত কনফিগারেশন (সিস্টেম এবং তৃতীয় পক্ষের কনফিগারেশন সহ) ওভাররাইট করা হয়, যা সুপারিশ করা হয় না। - ডেল্টা পরিবর্তনের সাথে বিদ্যমান কনফিগারেশন আপডেট করুন এবং নতুন কনফিগারেশন সেট করুন। সিস্টেম এবং তৃতীয় পক্ষের উপাদান কনফিগারেশন আপডেট করবেন না ।
- নতুন কনফিগারেশন সেট করতে API
CarWatchdogManager.setResourceOveruseConfigurations
ব্যবহার করুন। - ডিস্ক I/O অতিরিক্ত ব্যবহার কনফিগারেশন পেতে এবং সেট করতে ফ্ল্যাগ
CarWatchdogManager.FLAG_RESOURCE_OVERUSE_IO
ব্যবহার করুন।
এখানে একটি নমুনা বাস্তবায়ন যা সম্পদের অতিরিক্ত ব্যবহার কনফিগারেশন আপডেট করে:
void updateResourceOveruseConfigurations() { CarWatchdogManager manager = (CarWatchdogManager) car.getCarManager(Car.CAR_WATCHDOG_SERVICE); List<ResourceOveruseConfiguration> resourceOveruseConfigurations = manager.getResourceOveruseConfigurations( CarWatchdogManager.FLAG_RESOURCE_OVERUSE_IO); List<ResourceOveruseConfiguration> newResourceOveruseConfigurations = new List<>(); ResourceOveruseConfiguration vendorConfiguration; for(ResourceOveruseConfiguration config : resourceOveruseConfigurations) { // Do not update the configurations of the system and third-party component types. if (config.getComponentType() != ResourceOveruseConfiguration.COMPONENT_TYPE_VENDOR) { newResourceOveruseConfigurations.add(config); continue; } vendorConfiguration = config; } if (vendorConfiguration == null) { ResourceOveruseConfiguration.Builder vendorConfigBuilder = new ResourceOveruseConfiguration.Builder(); initializeConfig(vendorConfigBuilder); newResourceOveruseConfigurations.add(vendorConfigBuilder.build()); } else { ResourceOveruseConfiguration newVendorConfig = updateConfig(vendorConfiguration); newResourceOveruseConfigurations.add(newVendorConfig); } int result = manager.setResourceOveruseConfigurations( newResourceOveruseConfigurations, if (result != CarWatchdogManager.RETURN_CODE_SUCCESS) { // Failed to set the resource overuse configurations. } } /** Sets the delta between the old configuration and the new configuration. */ ResourceOveruseConfiguration updateConfig( ResourceOveruseConfiguration oldConfiguration) { // Replace com.vendor.package.A with com.vendor.package.B in the safe-to-kill list. List<String> safeToKillPackages = oldConfiguration.getSafeToKillPackages(); safeToKillPackages.remove("com.vendor.package.A"); safeToKillPackages.add("com.vendor.package.B"); ResourceOveruseConfiguration.Builder configBuilder = new ResourceOveruseConfiguration.Builder( oldConfiguration.getComponentType(), safeToKillPackages, oldConfiguration.getVendorPackagePrefixes(), oldConfiguration.getPackagesToAppCategoryTypes()); configBuilder.addVendorPackagePrefixes("com.vendor."); configBuilder.addPackagesToAppCategoryTypes("com.vendor.package.B", ResourceOveruseConfiguration.APPLICATION_CATEGORY_TYPE_MAPS); IoOveruseConfiguration oldIoConfiguration = oldConfiguration.getIoOveruseConfiguration(); IoOveruseConfiguration.Builder ioConfigBuilder = new IoOveruseConfiguration.Builder( oldIoConfiguration.getComponentLevelThresholds(), oldIoConfiguration.getPackageSpecificThresholds(), oldIoConfiguration.getAppCategorySpecificThresholds(), oldIoConfiguration.getSystemWideThresholds()); // Define the amount of bytes based on the flash memory specification, expected lifetime, // and estimated average amount of bytes written by a package during different modes. ioConfigBuilder.addPackageSpecificThresholds("com.vendor.package.B", new PerStateBytes(/* foregroundModeBytes= */ 2 * 1024 * 1024 * 1024, /* backgroundModeBytes= */ 500 * 1024 * 1024, /* garageModeBytes= */ 3 * 1024 * 1024 * 1024)); return configBuilder.setIoOveruseConfiguration(ioConfigBuilder.build()).build(); }
অ্যাপগুলি তাদের সম্পদের অতিরিক্ত ব্যবহার পর্যবেক্ষণ করছে
বিক্রেতা এবং থার্ড-পার্টি অ্যাপগুলি ওয়াচডগ থেকে অ্যাপ নির্দিষ্ট রিসোর্স অতিরিক্ত ব্যবহারের বিজ্ঞপ্তি শুনতে পারে অথবা অ্যাপ নির্দিষ্ট রিসোর্স অত্যধিক ব্যবহারের পরিসংখ্যান গত 30 দিনের জন্য পোল CarWatchdogManager
শুনতে পারে।
সম্পদের অত্যধিক ব্যবহারের বিজ্ঞপ্তির জন্য শুনুন
অ্যাপগুলি একটি রিসোর্স অত্যধিক ব্যবহার শ্রোতাকে প্রয়োগ করতে পারে এবং শ্রোতাকে তাদের ডিস্ক I/O অতিরিক্ত ব্যবহার থ্রেশহোল্ডের 80% বা 100% অতিক্রম করলে অ্যাপ নির্দিষ্ট বিজ্ঞপ্তিগুলি পেতে CarWatchdogManager
সাথে নিবন্ধন করতে পারে। অ্যাপগুলি এই বিজ্ঞপ্তিগুলি ব্যবহার করতে পারে:
- অফলাইন বিশ্লেষণের জন্য ডিস্ক I/O অতিরিক্ত ব্যবহারের পরিসংখ্যান লগ করুন। অ্যাপ বিকাশকারীরা ডিস্ক I/O অতিরিক্ত ব্যবহার সমস্যা ডিবাগ করতে এই লগিং ব্যবহার করতে পারেন।
- অত্যধিক ব্যবহার কাউন্টার রিসেট না হওয়া পর্যন্ত ডিস্ক I/O লেখা কমিয়ে দিন।
জাভা ক্লায়েন্ট
-
CarWatchdogManager.ResourceOveruseListener
উত্তরাধিকারসূত্রে শ্রোতাকে প্রয়োগ করুন :class ResourceOveruseListenerImpl implements CarWatchdogManager.ResourceOveruseListener { @Override public void onOveruse( @NonNull ResourceOveruseStats resourceOveruseStats) { // 1. Log/Upload resource overuse metrics. // 2. Reduce writes until the counters reset. IoOveruseStats ioOveruseStats = resourceOveruseStats.getIoOveruseStats(); // Stats period - [ioOveruseStats.getStartTime(), ioOveruseStats.getStartTime() // + ioOveruseStats.getDurationInSeconds()] // Total I/O overuses - ioOveruseStats.getTotalOveruses() // Total bytes written - ioOveruseStats.getTotalBytesWritten() // Remaining write bytes for the current UTC calendar day - // ioOveruseStats.getRemainingWriteBytes() } } }
CarWatchdogManager.addResourceOveruseListener
কল করে শ্রোতার উদাহরণ নিবন্ধন করুনprivate void addResourceOveruseListener() { CarWatchdogManager manager = (CarWatchdogManager) car.getCarManager(Car.CAR_WATCHDOG_SERVICE); // Choose a proper executor to handle resource overuse notifications. Executor executor = mContext.getMainExecutor(); manager.addResourceOveruseListener( executor, CarWatchdogManager.FLAG_RESOURCE_OVERUSE_IO, mListenerImpl); }
- অ্যাপটি শোনা শেষ হলে শ্রোতার উদাহরণটি নিবন্ধনমুক্ত করুন:
private void removeResourceOveruseListener() { CarWatchdogManager manager = (CarWatchdogManager) car.getCarManager(Car.CAR_WATCHDOG_SERVICE); mCarWatchdogManager.removeResourceOveruseListener( mListenerImpl); }
নেটিভ ক্লায়েন্ট
- বিল্ড নিয়মের
shared_libs
নির্ভরতায়carwatchdog_aidl_interface-ndk_platform
অন্তর্ভুক্ত করুন।Android.bp
cc_binary { name: "sample_native_client", srcs: [ "src/*.cpp" ], shared_libs: [ "carwatchdog_aidl_interface-ndk_platform", "libbinder_ndk", ], vendor: true, }
- ভেন্ডর সার্ভিস ডোমেনকে বাইন্ডার (
binder_user
ম্যাক্রো) ব্যবহার করার অনুমতি দিতে SELinux নীতি যোগ করুন এবংcarwatchdog
ক্লায়েন্ট ডোমেনে(carwatchdog_client_domain macro)
বিক্রেতা পরিষেবা ডোমেন যোগ করুন।sample_client.te
এবংfile_contexts
জন্য নিচের কোডটি দেখুন।sample_client.te
type sample_client, domain; type sample_client_exec, exec_type, file_type, vendor_file_type; carwatchdog_client_domain(sample_client) init_daemon_domain(sample_client) binder_use(sample_client)
file_contexts
/vendor/bin/sample_native_client u:object_r:sample_client_exec:s0
BnResourceOveruseListener
উত্তরাধিকারসূত্রে রিসোর্স অত্যধিক ব্যবহার শ্রোতাকে বাস্তবায়ন করুন। সম্পদের অতিরিক্ত ব্যবহারের বিজ্ঞপ্তিগুলি পরিচালনা করতেBnResourceOveruseListener::onOveruse
ওভাররাইড করুন।ResourceOveruseListenerImpl.h
class ResourceOveruseListenerImpl : public BnResourceOveruseListener { public: ndk::ScopedAStatus onOveruse( ResourceOveruseStats resourceOveruseStats) override; private: void initialize(); void terminate(); std::shared_ptr<ICarWatchdog> mWatchdogServer; std::shared_ptr<IResourceOveruseListener> mListener; }
ResourceOveruseListenerImpl.cpp
ndk::ScopedAStatus ResourceOveruseListenerImpl::onOveruse( ResourceOveruseStats resourceOveruseStats) { // 1. Log/Upload resource overuse metrics. // 2. Reduce writes until the counters reset. if (stats.getTag() != ResourceOveruseStats::ioOveruseStats) { // Received resourceOveruseStats doesn't contain I/O overuse stats. } const IoOveruseStats& ioOveruseStats = stats.get(); // Stats period - [ioOveruseStats.startTime, // ioOveruseStats.startTime + ioOveruseStats.durationInSeconds] // Total I/O overuses - ioOveruseStats.totalOveruses // Total bytes written - ioOveruseStats.writtenBytes // Remaining write bytes for the current UTC calendar day - // ioOveruseStats.remainingWriteBytes return ndk::ScopedAStatus::ok(); }
- একটি বাইন্ডার থ্রেড পুল শুরু করুন এবং ওয়াচডগ সার্ভারের সাথে রিসোর্স অতিরিক্ত ব্যবহার শ্রোতা নিবন্ধন করুন। ওয়াচডগ সার্ভার
android.automotive.watchdog.ICarWatchdog/default
পরিষেবার নামে নিবন্ধিত।main.cpp
int main(int argc, char** argv) { ABinderProcess_setThreadPoolMaxThreadCount(1); ABinderProcess_startThreadPool(); std::shared_ptr<ResourceOveruseListenerImpl> listener = ndk::SharedRefBase::make<ResourceOveruseListenerImpl>(); // The listener is added in initialize(). listener->initialize(); ... Run service ... // The listener is removed in terminate(). listener->terminate(); }
ResourceOveruseListenerImpl.cpp
void ResourceOveruseListener::initialize() { ndk::SpAIBinder binder(AServiceManager_getService( "android.automotive.watchdog.ICarWatchdog/default")); std::shared_ptr<ICarWatchdog> server = ICarWatchdog::fromBinder(binder); mWatchdogServer = server; std::shared_ptr<IResourceOveruseListener> listener = IResourceOveruseListener::fromBinder(this->asBinder()); mWatchdogServer->addResourceOveruseListener( std::vector<int>{ResourceType.IO}, listener); mListener = listener; } void ResourceOveruseListener::terminate() { mWatchdogServer->removeResourceOveruseListener(mListener); }
পোল সম্পদ অতিরিক্ত ব্যবহার পরিসংখ্যান
অ্যাপগুলি সাম্প্রতিক 30 দিনের জন্য অ্যাপ-নির্দিষ্ট I/O অতিরিক্ত ব্যবহারের পরিসংখ্যান ATS-এর জন্য CarWatchdogManager-এর জন্য পোল করতে পারে।
জাভা ক্লায়েন্ট
সম্পদের অতিরিক্ত ব্যবহারের পরিসংখ্যান পেতে CarWatchdogManager.getResourceOveruseStats
ব্যবহার করুন। ডিস্ক I/O অতিরিক্ত ব্যবহার পরিসংখ্যান পেতে CarWatchdogManager.FLAG_RESOURCE_OVERUSE_IO
পতাকা পাস করুন৷
private void getResourceOveruseStats() { CarWatchdogManager manager = (CarWatchdogManager) car.getCarManager(Car.CAR_WATCHDOG_SERVICE); // Returns resource overuse stats with I/O overuse stats for the past // 7 days. Stats are available for up to the past 30 days. ResourceOveruseStats resourceOveruseStats = mCarWatchdogManager.getResourceOveruseStats( CarWatchdogManager.FLAG_RESOURCE_OVERUSE_IO, CarWatchdogManager.STATS_PERIOD_PAST_7_DAYS); IoOveruseStats ioOveruseStats = resourceOveruseStats.getIoOveruseStats(); // Stats period - [ioOveruseStats.getStartTime(), ioOveruseStats.getStartTime() // + ioOveruseStats.getDurationInSeconds()] // Total I/O overuses - ioOveruseStats.getTotalOveruses() // Total bytes written - ioOveruseStats.getTotalBytesWritten() // Remaining write bytes for the UTC calendar day - // ioOveruseStats.getRemainingWriteBytes() }
নেটিভ ক্লায়েন্ট
সম্পদের অতিরিক্ত ব্যবহারের পরিসংখ্যান পেতে CarWatchdogServer.getResourceOveruseStats
ব্যবহার করুন। ডিস্ক I/O অতিরিক্ত ব্যবহারের পরিসংখ্যান আনতে ResourceType.IO
enum পাস করুন।
void getResourceOveruseStats() { ndk::SpAIBinder binder(AServiceManager_getService( "android.automotive.watchdog.ICarWatchdog/default")); std::shared_ptr<ICarWatchdog> server = ICarWatchdog::fromBinder(binder); // Returns the stats only for the current UTC calendar day. const std::vector<ResourceOveruseStats> resourceOveruseStats; ndk::ScopedAStatus status = server.getResourceOveruseStats( std::vector<int>{ResourceType.IO}, &resourceOveruseStats); if (!status.isOk()) { // Failed to get the resource overuse stats. return; } for (const auto& stats : resourceOveruseStats) { if (stats.getTag() != ResourceOveruseStats::ioOveruseStats) { continue; } const IoOveruseStats& ioOveruseStats = stats.get(); // Stats period - [ioOveruseStats.startTime, // ioOveruseStats.startTime + ioOveruseStats.durationInSeconds] // Total I/O overuses - ioOveruseStats.totalOveruses // Total bytes written - ioOveruseStats.writtenBytes // Remaining write bytes for the current UTC calendar day - // ioOveruseStats.remainingWriteBytes } }
রিসোর্স অত্যধিক ব্যবহার ব্যবহারকারীর অভিজ্ঞতা
নিম্নলিখিত বিভাগগুলি ব্যবহারকারীর অভিজ্ঞতা বর্ণনা করে যখন সম্পদের অতিরিক্ত ব্যবহার ঘটে।
অ্যাপের কর্মক্ষমতা সেটিংকে অগ্রাধিকার দিন
অ্যাপ সেটিংস পৃষ্ঠায় Prioritize app performance
জন্য সেটিংস রয়েছে (নীচের চিত্রটি দেখুন), যা ব্যবহারকারীদের সিস্টেমের উপর একটি অ্যাপের কর্মক্ষমতা এবং দীর্ঘমেয়াদী হার্ডওয়্যার কর্মক্ষমতাকে অগ্রাধিকার দিতে দেয়। এই সেটিংটি শুধুমাত্র সেই অ্যাপগুলির জন্য উপলব্ধ যা সম্পদের অতিরিক্ত ব্যবহারে বন্ধ করা নিরাপদ৷ অন্যথায়, এই সেটিং অক্ষম করা হয়. যখন কোনো অ্যাপের জন্য এই সেটিংটি টগল অফ (ডিফল্ট সেটিং) করা হয়, তখন রিসোর্সের অত্যধিক ব্যবহারে অ্যাপটি বন্ধ হয়ে যেতে পারে। অন্যথায়, রিসোর্সের অত্যধিক ব্যবহারে অ্যাপটি বন্ধ করা হবে না।
যখন ব্যবহারকারী এই সেটিংটিতে টগল করেন, নিম্নলিখিত নিশ্চিতকরণ ডায়ালগ সেটিংটিতে টগল করার প্রভাব বর্ণনা করে:
90 দিন পরে, এই সেটিংটি স্বয়ংক্রিয়ভাবে ডিফল্টে রিসেট হয়৷ watchdogUserPackageSettingsResetDays
ব্যবহার করে RRO ওভারলে অ্যাপের মাধ্যমে দিনের সীমা পরিবর্তন করা যেতে পারে, সর্বোচ্চ 180 দিন পর্যন্ত। আরও জানতে, রানটাইমে অ্যাপের সম্পদের মান পরিবর্তন দেখুন। নিম্নলিখিত উদাহরণ ওভারলে ট্যাগটি AndroidManifest.xml
এ অন্তর্ভুক্ত করা যেতে পারে:
<overlay android:priority="<insert-value>" android:targetPackage="com.android.car.updatable" android:targetName="CarServiceCustomization" android:resourcesMap="@xml/overlays" />
res/values/config.xml
এ:
<resources> <integer name="watchdogUserPackageSettingsResetDays">value</integer> </resources>
res/xml/overlays.xml
এ:
<overlay> <item target="integer/watchdogUserPackageSettingsResetDays" value="@integer/watchdogUserPackageSettingsResetDays" /> </overlay>
কর্মক্ষমতা প্রভাবিত অ্যাপ্লিকেশন সেটিং
সেটিংস অ্যাপটিতে একটি পারফরম্যান্স-প্রভাবিত অ্যাপস বিভাগ রয়েছে (চিত্র 1 দেখুন)। ট্যাপ করা হলে, ফ্ল্যাশ মেমরির অত্যধিক ব্যবহারের কারণে সীমাবদ্ধ থাকা এবং সিস্টেমের কর্মক্ষমতাকে নেতিবাচকভাবে প্রভাবিত করে এমন অ্যাপগুলির একটি তালিকা প্রদর্শিত হয়৷ এটি CDD 3.5.1 প্রয়োজনীয়তা অনুসরণ করে [C-1-1] ।
চিত্র 1. কর্মক্ষমতা প্রভাবিত অ্যাপ্লিকেশন.
সম্পদের অত্যধিক ব্যবহারের কারণে বন্ধ হওয়া অ্যাপগুলি এখানে তালিকাভুক্ত করা হয়েছে (চিত্র 2 দেখুন)। তালিকাভুক্ত অ্যাপগুলিকে অগ্রাধিকার দেওয়া যেতে পারে। আরও জানতে, অ্যাপের কর্মক্ষমতা সেটিংকে অগ্রাধিকার দিন দেখুন।
ছবি 2. রিসোর্স অত্যধিক ব্যবহারের কারণে বন্ধ করা অ্যাপের তালিকা।
ব্যবহারকারীর বিজ্ঞপ্তি
যখন একটি অ্যাপ বা পরিষেবা বারবার ডিস্ক I/O ব্যবহার করে (উদাহরণস্বরূপ, সংজ্ঞায়িত থ্রেশহোল্ডের বাইরে ডিস্কে ডেটা লেখে) এবং রিসোর্স অত্যধিক ব্যবহারে এটি বন্ধ করা নিরাপদ, গাড়িটি অনুমতি-চালক-বিক্ষেপণ অবস্থায় প্রবেশ করার পরে ব্যবহারকারীকে অবহিত করা হয়।
প্রথম ব্যবহারকারীর বিজ্ঞপ্তি (ড্রাইভ চলাকালীন) একটি হেড-আপ বিজ্ঞপ্তি হিসাবে পোস্ট করা হয় এবং অন্যান্য বিজ্ঞপ্তিগুলি বিজ্ঞপ্তি কেন্দ্রে পোস্ট করা হয়।
উদাহরণস্বরূপ, যখন একটি অ্যাপ বারবার ডিস্ক I/O ব্যবহার করে, ব্যবহারকারী নিম্নলিখিত বিজ্ঞপ্তি পান:
- ব্যবহারকারী যখন অ্যাপের অগ্রাধিকার বোতামে ক্লিক করেন, তখন অ্যাপের সেটিংস পৃষ্ঠাটি চালু হয়, যেখানে ব্যবহারকারী অগ্রাধিকার প্রদান অ্যাপের কর্মক্ষমতা সেটিং চালু বা বন্ধ করতে পারে।
- যখন ব্যবহারকারী অ্যাপটি নিষ্ক্রিয় করুন বোতামে ক্লিক করেন, ব্যবহারকারী অ্যাপটি চালু না করা পর্যন্ত বা অ্যাপের সেটিংস পৃষ্ঠায় এটি সক্ষম না করা পর্যন্ত অ্যাপটি নিষ্ক্রিয় থাকে।
- আনইনস্টলযোগ্য অ্যাপের জন্য, অ্যাপ অক্ষম বোতামটি আনইনস্টল অ্যাপ বোতাম দিয়ে প্রতিস্থাপিত হয়। ব্যবহারকারী যখন অ্যাপ আনইনস্টল বোতামে ক্লিক করেন, অ্যাপটির সেটিংস পৃষ্ঠা চালু হয়, যেখান থেকে ব্যবহারকারী অ্যাপটি আনইনস্টল করতে পারেন।
লঞ্চার বাস্তবায়নের জন্য সুপারিশ
সম্পদের অত্যধিক ব্যবহারের কারণে অ্যাপগুলি অক্ষম হয়ে গেলে, অ্যাপগুলি ডিফল্ট লঞ্চার অ্যাপ থেকে অদৃশ্য হয়ে যায় কারণ CarService অ্যাপগুলির সক্ষম অবস্থাকে PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED
হিসাবে আপডেট করে।COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED। এই অ্যাপগুলিকে অস্বাভাবিক হিসাবে প্রদর্শন করতে OEMগুলিকে অবশ্যই বিল্টইন লঞ্চার বাস্তবায়ন আপডেট করতে হবে, যাতে ব্যবহারকারীরা প্রয়োজনে সেগুলি ব্যবহার করতে পারেন। বিল্ড রিলিজের উপর ভিত্তি করে নিম্নলিখিত সুপারিশগুলি দেখুন।
Android SC V2 রিলিজ
- লঞ্চারে দেখানোর জন্য প্যাকেজের তালিকা পুনরুদ্ধার করার সময় লঞ্চার বাস্তবায়নের
MATCH_DISABLED_UNTIL_USED_COMPONENTS
পতাকা ব্যবহার করা উচিত। - যখন ব্যবহারকারী
PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED
অবস্থায় থাকা একটি অ্যাপে ক্লিক করেন, তখন লঞ্চার অ্যাপটিকে সক্রিয় অবস্থায় সেট করে অ্যাপটিকে সক্রিয় করতে হবে:
ওয়াচডগ `/proc/uid_io/stats` অবস্থানে কার্নেল দ্বারা প্রকাশিত প্রতি-UID ডিস্ক I/O পরিসংখ্যান ব্যবহার করে সমস্ত অ্যাপ এবং পরিষেবা দ্বারা তৈরি ডিস্ক I/O লেখার মোট পরিমাণ ট্র্যাক করে ফ্ল্যাশ মেমরির ব্যবহার নিরীক্ষণ করে। যখন একটি অ্যাপ বা পরিষেবা ডিস্ক I/O অতিরিক্ত ব্যবহার থ্রেশহোল্ড অতিক্রম করে, ওয়াচডগ অ্যাপ বা পরিষেবার উপর পদক্ষেপ নেয়। ডিস্ক I/O অত্যধিক ব্যবহার থ্রেশহোল্ড এবং অতিরিক্ত ব্যবহার করার জন্য পদক্ষেপ ডিস্ক I/O অতিরিক্ত ব্যবহার কনফিগারেশনে পূর্বনির্ধারিত।
অত্যধিক ব্যবহার থ্রেশহোল্ড
- ডিস্ক I/O অত্যধিক ব্যবহারের থ্রেশহোল্ডগুলি প্রতিদিনের ভিত্তিতে প্রয়োগ করা হয়, অর্থাৎ, একটি অ্যাপ/পরিষেবা দ্বারা করা সমস্ত লেখা বর্তমান UTC ক্যালেন্ডার দিনের শুরু থেকে একত্রিত করা হয় এবং অতিরিক্ত ব্যবহার কনফিগারেশনে সংজ্ঞায়িত থ্রেশহোল্ডগুলির বিপরীতে পরীক্ষা করা হয়।
- একটি নির্দিষ্ট দিনে একটি গাড়ি একাধিকবার চালু হলে, ওয়াচডগ মডিউল ফ্ল্যাশ মেমরিতে ডিস্ক I/O ব্যবহারের পরিসংখ্যান সংরক্ষণ করে এবং বর্তমান UTC ক্যালেন্ডার দিনের শুরু থেকে সেগুলিকে একত্রিত করে।
অতিরিক্ত ব্যবহার কর্ম
যখন একটি অ্যাপ বারবার সংজ্ঞায়িত ডিস্ক I/O অতিরিক্ত ব্যবহার থ্রেশহোল্ড অতিক্রম করে, ওয়াচডগ অতিরিক্ত ব্যবহার কনফিগারেশনে সংজ্ঞায়িত পদক্ষেপ নেয়।
- সমস্ত বিক্রেতা অ্যাপ এবং পরিষেবাগুলি সামগ্রিক সিস্টেম স্থিতিশীলতার জন্য গুরুত্বপূর্ণ বলে বিবেচিত হয়, তাই সেগুলি ডিস্ক I/O অতিরিক্ত ব্যবহারে বন্ধ করা হয় না। যাইহোক, অতিরিক্ত ব্যবহার কনফিগারেশন নিরাপদ-টু-টার্মিনেট বিক্রেতা অ্যাপ এবং পরিষেবাগুলির একটি তালিকা নির্ধারণ করতে পারে।
- সমস্ত থার্ড-পার্টি অ্যাপস নিরাপদ-টু-টার্মিনেট।
যখন একটি অ্যাপ বা পরিষেবা নিরাপদে বন্ধ করা হয়, তখন ওয়াচডগ অ্যাপের উপাদান অবস্থা PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED
সহ অ্যাপ বা পরিষেবাটিকে অক্ষম করে।
অত্যধিক ব্যবহার কনফিগারেশন
অত্যধিক ব্যবহার কনফিগারেশন ডিস্ক I/O অতিরিক্ত ব্যবহার থ্রেশহোল্ড এবং কর্ম ধারণ করে। ডিফল্ট অত্যধিক ব্যবহার কনফিগারেশন সিস্টেম এবং বিক্রেতা ইমেজ সংজ্ঞায়িত করা হয়, এবং বিল্ড সঙ্গে পাঠানো হয়. বিক্রেতারা ঐচ্ছিকভাবে বিক্রেতার ছবিতে বিক্রেতার কনফিগারেশন অন্তর্ভুক্ত করতে পারে। যখন বিক্রেতা কনফিগারেশন প্রদান করা হয় না, তখন সিস্টেম কনফিগারেশনটি বিক্রেতা অ্যাপ এবং পরিষেবাগুলির জন্যও ব্যবহার করা হয়।
ওয়াচডগ CarWatchdogManager
মাধ্যমে সিস্টেম API-গুলি প্রকাশ করে, যা বিক্রেতাদের অ্যাপ বা পরিষেবাগুলিকে যে কোনও সময় বিক্রেতা কনফিগারেশন আপডেট করতে দেয়৷
অত্যধিক ব্যবহার কনফিগারেশন সংজ্ঞা
অতিরিক্ত ব্যবহার কনফিগারেশন উপাদান প্রকার দ্বারা বিভক্ত করা হয়, উদাহরণস্বরূপ, সিস্টেম, বিক্রেতা, এবং তৃতীয় পক্ষ। OEMs শুধুমাত্র বিক্রেতা উপাদান কনফিগারেশন আপডেট করা আবশ্যক.
বিক্রেতা কনফিগারেশন
ভেন্ডর কনফিগারেশন ডিস্ক I/O অত্যধিক ব্যবহার থ্রেশহোল্ড এবং সমস্ত বিক্রেতা অ্যাপ এবং পরিষেবা এবং সমস্ত মানচিত্র এবং মিডিয়া অ্যাপের জন্য অ্যাকশন সংজ্ঞায়িত করে। কনফিগারেশনে নিচের কনফিগারেশন ক্ষেত্র রয়েছে।
- বিক্রেতা প্যাকেজ উপসর্গ । ভেন্ডর পার্টিশনে ইনস্টল করা সমস্ত প্যাকেজ ভেন্ডর প্যাকেজ হিসাবে বিবেচিত হয়। এই প্যাকেজগুলি ছাড়াও, বিক্রেতারা বিক্রেতা প্যাকেজ উপসর্গ কনফিগারে প্যাকেজ উপসর্গ যোগ করে বিক্রেতা প্যাকেজ হিসাবে পূর্বে ইনস্টল করা প্যাকেজগুলিকে শ্রেণিবদ্ধ করতে পারে। এই কনফিগারেশন রেগুলার এক্সপ্রেশন গ্রহণ করে না।
- সেফ-টু-টার্মিনেট প্যাকেজ । নিরাপদ থেকে টার্মিনেট প্যাকেজস কনফিগারেশনে সম্পূর্ণ প্যাকেজের নাম যুক্ত করে কোন বিক্রেতার প্যাকেজগুলি সমাপ্ত করতে নিরাপদ তা নির্দিষ্ট করতে পারেন বিক্রেতারা।
- অ্যাপ্লিকেশন বিভাগ ম্যাপিংস । বিক্রেতারা দুটি সমর্থিত অ্যাপ্লিকেশন বিভাগের একটি - মানচিত্র এবং মিডিয়া অ্যাপ্লিকেশনগুলির মধ্যে যে কোনও প্যাকেজ (তৃতীয় পক্ষের প্যাকেজ সহ) মানচিত্র করতে পারে। এই ম্যাপিংটি মানচিত্র এবং মিডিয়া অ্যাপ্লিকেশনগুলি উচ্চতর ডিস্ক আই/ও অতিরিক্ত ব্যবহারের থ্রেশহোল্ডগুলি সরবরাহ করার জন্য করা হয় কারণ এই অ্যাপ্লিকেশনগুলি অন্যান্য অ্যাপ্লিকেশন ধরণের তুলনায় ডিস্কে আরও ডেটা ডাউনলোড এবং লেখার প্রবণতা রাখে।
- উপাদান স্তরের প্রান্তিক । সমস্ত বিক্রেতার প্যাকেজগুলির জন্য জেনেরিক থ্রেশহোল্ডগুলি সংজ্ঞায়িত করে (এটি প্যাকেজ নির্দিষ্ট থ্রেশহোল্ড বা অ্যাপ্লিকেশন বিভাগের নির্দিষ্ট থ্রেশহোল্ডগুলি এই প্রান্তিকগুলি পান) দ্বারা আচ্ছাদিত প্যাকেজগুলি)। ডিস্ক আই/ও অতিরিক্ত ব্যবহারের কনফিগারেশন সংজ্ঞায়িত করার সময় বিক্রেতাদের অবশ্যই শূন্য-উপাদান-স্তরের প্রান্তিকগুলি সংজ্ঞায়িত করতে হবে।
- প্যাকেজ নির্দিষ্ট থ্রেশহোল্ডস । বিক্রেতারা নির্দিষ্ট বিক্রেতার প্যাকেজগুলির জন্য বিশেষ থ্রেশহোল্ডগুলি সংজ্ঞায়িত করতে পারেন। ম্যাপিংগুলিতে সম্পূর্ণ প্যাকেজের নাম থাকা উচিত। এই কনফিগারেশনে সংজ্ঞায়িত থ্রেশহোল্ডগুলি প্রদত্ত প্যাকেজের জন্য অন্যান্য কনফিগারেশনে সংজ্ঞায়িত থ্রেশহোল্ডগুলির চেয়ে অগ্রাধিকার গ্রহণ করে।
- অ্যাপ্লিকেশন বিভাগ নির্দিষ্ট থ্রেশহোল্ড । বিক্রেতারা নির্দিষ্ট অ্যাপ্লিকেশন বিভাগগুলির জন্য বিশেষ থ্রেশহোল্ডগুলি নির্দিষ্ট করতে পারেন। অ্যাপ্লিকেশন বিভাগগুলি অবশ্যই সমর্থিত বিভাগগুলির মধ্যে একটি হতে হবে - মানচিত্র এবং মিডিয়া অ্যাপ্লিকেশন। এই কনফিগারেশনে সংজ্ঞায়িত থ্রেশহোল্ডগুলি অ্যাপ্লিকেশন বিভাগের ম্যাপিংগুলি ব্যবহার করে নির্দিষ্ট প্যাকেজগুলিতে ম্যাপ করা হয়।
- সিস্টেম-প্রশস্ত থ্রেশহোল্ডস । বিক্রেতাদের অবশ্যই এই কনফিগারেশন নির্দিষ্ট করতে হবে না।
বিক্রেতা প্যাকেজ উপসর্গ , নিরাপদ থেকে টার্মিনেট প্যাকেজ , উপাদান স্তরের থ্রেশহোল্ডস এবং প্যাকেজ নির্দিষ্ট থ্রেশহোল্ড কনফিগারগুলি কেবল বিক্রেতার অ্যাপ্লিকেশন এবং পরিষেবাদির জন্য বিক্রেতার কনফিগারেশন দ্বারা আপডেটযোগ্য। অ্যাপ্লিকেশন বিভাগ নির্দিষ্ট থ্রেশহোল্ডস কনফিগারেশন কেবলমাত্র সমস্ত মানচিত্র এবং মিডিয়া অ্যাপ্লিকেশনগুলির জন্য বিক্রেতার কনফিগারেশন দ্বারা আপডেট করা যেতে পারে।
অতিরিক্ত ব্যবহারের থ্রেশহোল্ডগুলিতে বাইটের পরিমাণ লিখিত হওয়ার অনুমতি রয়েছে:
- একটি অ্যাপ্লিকেশন বা পরিষেবা অগ্রভাগ মোড বনাম ব্যাকগ্রাউন্ড মোড
- সিস্টেম গ্যারেজ মোড
এই শ্রেণিবিন্যাসটি ব্যবহারকারীকে অগ্রভাগ অ্যাপ্লিকেশন এবং পরিষেবাদিগুলির মুখোমুখি করে ব্যাকগ্রাউন্ড অ্যাপ্লিকেশন এবং পরিষেবাদির চেয়ে আরও বেশি ডেটা লিখতে। গ্যারেজ মোডে, অ্যাপ্লিকেশন এবং পরিষেবাদি আপডেটগুলি ডাউনলোড করার ঝোঁক থাকে, তাই প্রতিটি মোডে চলমান অ্যাপ্লিকেশন এবং পরিষেবাদির চেয়ে প্রত্যেকেরই উচ্চতর প্রান্তিকের প্রয়োজন।
সিস্টেম এবং তৃতীয় পক্ষের কনফিগারেশন
OEMS সিস্টেম এবং তৃতীয় পক্ষের কনফিগারেশন আপডেট করা উচিত নয় ।
- সিস্টেম কনফিগারেশন সিস্টেম অ্যাপ্লিকেশন এবং পরিষেবাদির জন্য আই/ও অতিরিক্ত ব্যবহার থ্রেশহোল্ড এবং ক্রিয়াগুলি সংজ্ঞায়িত করে।
- এই কনফিগারেশনটি অ্যাপ্লিকেশন বিভাগের ম্যাপিংগুলিও আপডেট করতে পারে। সুতরাং, এই কনফিগার ক্ষেত্রটি সিস্টেম এবং বিক্রেতার কনফিগারেশনের মধ্যে ভাগ করা হয়।
- তৃতীয় পক্ষের কনফিগারেশন সমস্ত তৃতীয় পক্ষের অ্যাপ্লিকেশনগুলির জন্য প্রান্তিকগুলি সংজ্ঞায়িত করে। সিস্টেমে পূর্বনির্ধারিত নয় এমন সমস্ত অ্যাপ্লিকেশনগুলি তৃতীয় পক্ষের অ্যাপ্লিকেশন।
- সমস্ত তৃতীয় পক্ষের অ্যাপ্লিকেশনগুলি একই থ্রেশহোল্ডগুলি গ্রহণ করে (উদাহরণস্বরূপ, কোনও তৃতীয় পক্ষের অ্যাপ্লিকেশন বিশেষ থ্রেশহোল্ডগুলি গ্রহণ করে না) মানচিত্র এবং মিডিয়া অ্যাপ্লিকেশনগুলি ব্যতীত, যার প্রান্তিকগুলি বিক্রেতার কনফিগারেশন দ্বারা সংজ্ঞায়িত করা হয়।
- নীচের ডিস্ক আই/ও অতিরিক্ত ব্যবহারের থ্রেশহোল্ডগুলি তৃতীয় পক্ষের অ্যাপ্লিকেশনগুলির জন্য ডিফল্ট থ্রেশহোল্ড। এই থ্রেশহোল্ডগুলি সিস্টেমের চিত্রের সাথে প্রেরণ করা হয়।
- 3 গিব অ্যাপ ফোরগ্রাউন্ড মোডে লিখুন।
- 2 গিব অ্যাপ ব্যাকগ্রাউন্ড মোডে লিখুন।
- 4 গিব সিস্টেম গ্যারেজ মোডে লিখুন।
- এগুলি বেস থ্রেশহোল্ড। এই প্রান্তিকগুলি আপডেট করা হয় কারণ ডিস্ক আই/ও ব্যবহার সম্পর্কে আরও কিছু শিখতে হয়।
অতিরিক্ত ব্যবহার কনফিগারেশন এক্সএমএল ফর্ম্যাট
ডিফল্ট বিক্রেতার কনফিগারেশনটি স্থাপন করা যেতে পারে (এটি al চ্ছিক ) অবস্থান /vendor/etc/automotive/watchdog/resource_overuse_configuration.xml
/watchdog/resource_overuse_configration.xml বিল্ড ইমেজে। যখন এই কনফিগারেশনটি নির্দিষ্ট না করা হয়, তখন সিস্টেম-সংজ্ঞায়িত কনফিগারেশনটি বিক্রেতার অ্যাপ্লিকেশন এবং পরিষেবার জন্যও প্রয়োগ করা হয়।
এক্সএমএল ফাইলটিতে প্রতিটি কনফিগার ক্ষেত্রের জন্য কেবল একটি ট্যাগ থাকা উচিত। আই/ও অতিরিক্ত ব্যবহার কনফিগারেশন অবশ্যই এক্সএমএল ফাইলে সংজ্ঞায়িত করা উচিত। সমস্ত প্রান্তিক মানগুলি এমআইবি ইউনিটে নির্দিষ্ট করা উচিত।
একটি নমুনা এক্সএমএল কনফিগারেশন নীচে সরবরাহ করা হয়েছে:
<resourceOveruseConfiguration version="1.0"> <componentType> VENDOR </componentType> <!-- List of safe to kill vendor packages. --> <safeToKillPackages> <package> com.vendor.package.A </package> <package> com.vendor.package.B </package> </safeToKillPackages> <!-- List of vendor package prefixes. --> <vendorPackagePrefixes> <packagePrefix> com.vendor.package </packagePrefix> </vendorPackagePrefixes> <!-- List of unique package names to app category mappings. --> <packagesToAppCategoryTypes> <packageAppCategory type="MEDIA"> com.vendor.package.A </packageAppCategory> <packageAppCategory type="MAPS"> com.google.package.B </packageAppCategory> <packageAppCategory type="MEDIA"> com.third.party.package.C </packageAppCategory> </packagesToAppCategoryTypes> <ioOveruseConfiguration> <!-- Thresholds in MiB for all vendor packages that don't have package specific thresholds. --> <componentLevelThresholds> <state id="foreground_mode"> 1024 </state> <state id="background_mode"> 512 </state> <state id="garage_mode"> 3072 </state> </componentLevelThresholds> <packageSpecificThresholds> <!-- IDs must be unique --> <perStateThreshold id="com.vendor.package.C"> <state id="foreground_mode"> 400 </state> <state id="background_mode"> 100 </state> <state id="garage_mode"> 200 </state> </perStateThreshold> <perStateThreshold id="com.vendor.package.D"> <state id="foreground_mode"> 1024 </state> <state id="background_mode"> 500 </state> <state id="garage_mode"> 2048 </state> </perStateThreshold> </packageSpecificThresholds> <!-- Application category specific thresholds. --> <appCategorySpecificThresholds> <!-- One entry per supported application category --> <perStateThreshold id="MEDIA"> <state id="foreground_mode"> 600 </state> <state id="background_mode"> 700 </state> <state id="garage_mode"> 1024 </state> </perStateThreshold> <perStateThreshold id="MAPS"> <state id="foreground_mode"> 800 </state> <state id="background_mode"> 900 </state> <state id="garage_mode"> 2048 </state> </perStateThreshold> </appCategorySpecificThresholds> </ioOveruseConfiguration> </resourceOveruseConfiguration>
কারওয়াচডোগম্যানেজার সিস্টেম এপিআইগুলির মাধ্যমে অতিরিক্ত ব্যবহার কনফিগারেশন আপডেট করুন
উপরের এক্সএমএল কনফিগারেশনটি কেবল বিল্ড ইমেজে সরবরাহ করা যেতে পারে। যদি কোনও ওএম কোনও বিল্ড প্রকাশের পরে অন-ডিভাইস কনফিগারেশন আপডেট করতে পছন্দ করে তবে তারা অন-ডিভাইস কনফিগারেশনে পরিবর্তন করতে নিম্নলিখিত এপিআইগুলি ব্যবহার করতে পারে।
- অনুমতি
Car.PERMISSION_CONTROL_CAR_WATCHDOG_CONFIG
Permission_control_car_watchdog_config কলারকে মঞ্জুর করুন। - নতুন কনফিগারেশনগুলি আপডেট এবং সেট করতে অবশ্যই বিদ্যমান কনফিগারেশনগুলি ব্যবহার করতে হবে। বিদ্যমান কনফিগারেশনগুলি পেতে এপিআই
CarWatchdogManager.getResourceOveruseConfigurations
ব্যবহার করুন। যদি বিদ্যমান কনফিগারেশনগুলি ব্যবহার না করা হয় তবে সমস্ত কনফিগারেশন (সিস্টেম এবং তৃতীয় পক্ষের কনফিগারেশন সহ) ওভাররাইট করা হয়, যা প্রস্তাবিত নয়। - ডেল্টা পরিবর্তনের সাথে বিদ্যমান কনফিগারেশনগুলি আপডেট করুন এবং নতুন কনফিগারেশনগুলি সেট করুন। সিস্টেম এবং তৃতীয় পক্ষের উপাদান কনফিগারেশন আপডেট করবেন না ।
- নতুন কনফিগারেশনগুলি সেট করতে এপিআই
CarWatchdogManager.setResourceOveruseConfigurations
ব্যবহার করুন। - ডিস্ক আই/ও অতিরিক্ত ব্যবহারের কনফিগারেশনগুলি পেতে এবং সেট করতে পতাকাটি
CarWatchdogManager.FLAG_RESOURCE_OVERUSE_IO
ব্যবহার করুন।
এখানে একটি নমুনা বাস্তবায়ন যা রিসোর্সকে অতিরিক্ত ব্যবহারের কনফিগারেশনগুলি আপডেট করে:
void updateResourceOveruseConfigurations() { CarWatchdogManager manager = (CarWatchdogManager) car.getCarManager(Car.CAR_WATCHDOG_SERVICE); List<ResourceOveruseConfiguration> resourceOveruseConfigurations = manager.getResourceOveruseConfigurations( CarWatchdogManager.FLAG_RESOURCE_OVERUSE_IO); List<ResourceOveruseConfiguration> newResourceOveruseConfigurations = new List<>(); ResourceOveruseConfiguration vendorConfiguration; for(ResourceOveruseConfiguration config : resourceOveruseConfigurations) { // Do not update the configurations of the system and third-party component types. if (config.getComponentType() != ResourceOveruseConfiguration.COMPONENT_TYPE_VENDOR) { newResourceOveruseConfigurations.add(config); continue; } vendorConfiguration = config; } if (vendorConfiguration == null) { ResourceOveruseConfiguration.Builder vendorConfigBuilder = new ResourceOveruseConfiguration.Builder(); initializeConfig(vendorConfigBuilder); newResourceOveruseConfigurations.add(vendorConfigBuilder.build()); } else { ResourceOveruseConfiguration newVendorConfig = updateConfig(vendorConfiguration); newResourceOveruseConfigurations.add(newVendorConfig); } int result = manager.setResourceOveruseConfigurations( newResourceOveruseConfigurations, if (result != CarWatchdogManager.RETURN_CODE_SUCCESS) { // Failed to set the resource overuse configurations. } } /** Sets the delta between the old configuration and the new configuration. */ ResourceOveruseConfiguration updateConfig( ResourceOveruseConfiguration oldConfiguration) { // Replace com.vendor.package.A with com.vendor.package.B in the safe-to-kill list. List<String> safeToKillPackages = oldConfiguration.getSafeToKillPackages(); safeToKillPackages.remove("com.vendor.package.A"); safeToKillPackages.add("com.vendor.package.B"); ResourceOveruseConfiguration.Builder configBuilder = new ResourceOveruseConfiguration.Builder( oldConfiguration.getComponentType(), safeToKillPackages, oldConfiguration.getVendorPackagePrefixes(), oldConfiguration.getPackagesToAppCategoryTypes()); configBuilder.addVendorPackagePrefixes("com.vendor."); configBuilder.addPackagesToAppCategoryTypes("com.vendor.package.B", ResourceOveruseConfiguration.APPLICATION_CATEGORY_TYPE_MAPS); IoOveruseConfiguration oldIoConfiguration = oldConfiguration.getIoOveruseConfiguration(); IoOveruseConfiguration.Builder ioConfigBuilder = new IoOveruseConfiguration.Builder( oldIoConfiguration.getComponentLevelThresholds(), oldIoConfiguration.getPackageSpecificThresholds(), oldIoConfiguration.getAppCategorySpecificThresholds(), oldIoConfiguration.getSystemWideThresholds()); // Define the amount of bytes based on the flash memory specification, expected lifetime, // and estimated average amount of bytes written by a package during different modes. ioConfigBuilder.addPackageSpecificThresholds("com.vendor.package.B", new PerStateBytes(/* foregroundModeBytes= */ 2 * 1024 * 1024 * 1024, /* backgroundModeBytes= */ 500 * 1024 * 1024, /* garageModeBytes= */ 3 * 1024 * 1024 * 1024)); return configBuilder.setIoOveruseConfiguration(ioConfigBuilder.build()).build(); }
অ্যাপ্লিকেশনগুলি তাদের সংস্থান অতিরিক্ত ব্যবহার পর্যবেক্ষণ করছে
বিক্রেতা এবং তৃতীয় পক্ষের অ্যাপ্লিকেশনগুলি গত 30 দিন পর্যন্ত অ্যাপ্লিকেশন নির্দিষ্ট রিসোর্স অতিরিক্ত ব্যবহারের পরিসংখ্যানের জন্য ওয়াচডগ বা পোল CarWatchdogManager
কাছ থেকে অ্যাপ্লিকেশন নির্দিষ্ট সংস্থান অতিরিক্ত ব্যবহারের বিজ্ঞপ্তিগুলি শুনতে পারে।
রিসোর্স অতিরিক্ত ব্যবহারের বিজ্ঞপ্তিগুলির জন্য শুনুন
অ্যাপ্লিকেশনগুলি একটি রিসোর্সকে অতিরিক্ত ব্যবহার শ্রোতার প্রয়োগ করতে পারে এবং শ্রোতাকে CarWatchdogManager
সাথে নিবন্ধ করতে পারে যখন তারা তাদের ডিস্ক আই/ও অতিরিক্ত ব্যবহারের থ্রেশহোল্ডগুলির 80% বা 100% ছাড়িয়ে যায় তখন অ্যাপ নির্দিষ্ট বিজ্ঞপ্তিগুলি পেতে পারে। অ্যাপ্লিকেশনগুলি এই বিজ্ঞপ্তিগুলি এখানে ব্যবহার করতে পারে:
- অফলাইন বিশ্লেষণের জন্য ডিস্ক আই/ও অতিরিক্ত ব্যবহারের পরিসংখ্যান লগ করুন। অ্যাপ্লিকেশন বিকাশকারীরা ডিস্ক আই/ও অতিরিক্ত ব্যবহারের সমস্যাটি ডিবাগ করতে এই লগিংটি ব্যবহার করতে পারেন।
- অতিরিক্ত ব্যবহার কাউন্টারগুলি পুনরায় সেট না করা পর্যন্ত আই/ও লেখার ডিস্কটি হ্রাস করুন।
জাভা ক্লায়েন্ট
-
CarWatchdogManager.ResourceOveruseListener
উত্তরাধিকারী করে শ্রোতাদের বাস্তবায়ন করুন resclass ResourceOveruseListenerImpl implements CarWatchdogManager.ResourceOveruseListener { @Override public void onOveruse( @NonNull ResourceOveruseStats resourceOveruseStats) { // 1. Log/Upload resource overuse metrics. // 2. Reduce writes until the counters reset. IoOveruseStats ioOveruseStats = resourceOveruseStats.getIoOveruseStats(); // Stats period - [ioOveruseStats.getStartTime(), ioOveruseStats.getStartTime() // + ioOveruseStats.getDurationInSeconds()] // Total I/O overuses - ioOveruseStats.getTotalOveruses() // Total bytes written - ioOveruseStats.getTotalBytesWritten() // Remaining write bytes for the current UTC calendar day - // ioOveruseStats.getRemainingWriteBytes() } } }
CarWatchdogManager.addResourceOveruseListener
কল করে শ্রোতার উদাহরণটি নিবন্ধ করুন।private void addResourceOveruseListener() { CarWatchdogManager manager = (CarWatchdogManager) car.getCarManager(Car.CAR_WATCHDOG_SERVICE); // Choose a proper executor to handle resource overuse notifications. Executor executor = mContext.getMainExecutor(); manager.addResourceOveruseListener( executor, CarWatchdogManager.FLAG_RESOURCE_OVERUSE_IO, mListenerImpl); }
- যখন অ্যাপটি শুনে শেষ হয়েছে তখন শ্রোতার উদাহরণটি নিবন্ধভুক্ত করুন:
private void removeResourceOveruseListener() { CarWatchdogManager manager = (CarWatchdogManager) car.getCarManager(Car.CAR_WATCHDOG_SERVICE); mCarWatchdogManager.removeResourceOveruseListener( mListenerImpl); }
নেটিভ ক্লায়েন্ট
- বিল্ড নিয়মের
shared_libs
নির্ভরতার মধ্যেcarwatchdog_aidl_interface-ndk_platform
অন্তর্ভুক্ত করুন।Android.bp
cc_binary { name: "sample_native_client", srcs: [ "src/*.cpp" ], shared_libs: [ "carwatchdog_aidl_interface-ndk_platform", "libbinder_ndk", ], vendor: true, }
- বিক্রেতার পরিষেবা ডোমেনকে বাইন্ডার (
binder_user
ম্যাক্রো) ব্যবহার করার অনুমতি দেওয়ার জন্য সেলিনাক্স নীতি যুক্ত করুন এবংcarwatchdog
ক্লায়েন্ট ডোমেনে(carwatchdog_client_domain macro)
বিক্রেতার পরিষেবা ডোমেন যুক্ত করুন।sample_client.te
এবংfile_contexts
জন্য নীচের কোডটি দেখুন।sample_client.te
type sample_client, domain; type sample_client_exec, exec_type, file_type, vendor_file_type; carwatchdog_client_domain(sample_client) init_daemon_domain(sample_client) binder_use(sample_client)
file_contexts
/vendor/bin/sample_native_client u:object_r:sample_client_exec:s0
BnResourceOveruseListener
উত্তরাধিকারী হয়ে রিসোর্স অতিরিক্ত ব্যবহার শ্রোতার প্রয়োগ করুন। ওভাররাইডBnResourceOveruseListener::onOveruse
।ResourceOveruseListenerImpl.h
class ResourceOveruseListenerImpl : public BnResourceOveruseListener { public: ndk::ScopedAStatus onOveruse( ResourceOveruseStats resourceOveruseStats) override; private: void initialize(); void terminate(); std::shared_ptr<ICarWatchdog> mWatchdogServer; std::shared_ptr<IResourceOveruseListener> mListener; }
ResourceOveruseListenerImpl.cpp
ndk::ScopedAStatus ResourceOveruseListenerImpl::onOveruse( ResourceOveruseStats resourceOveruseStats) { // 1. Log/Upload resource overuse metrics. // 2. Reduce writes until the counters reset. if (stats.getTag() != ResourceOveruseStats::ioOveruseStats) { // Received resourceOveruseStats doesn't contain I/O overuse stats. } const IoOveruseStats& ioOveruseStats = stats.get(); // Stats period - [ioOveruseStats.startTime, // ioOveruseStats.startTime + ioOveruseStats.durationInSeconds] // Total I/O overuses - ioOveruseStats.totalOveruses // Total bytes written - ioOveruseStats.writtenBytes // Remaining write bytes for the current UTC calendar day - // ioOveruseStats.remainingWriteBytes return ndk::ScopedAStatus::ok(); }
- একটি বাইন্ডার থ্রেড পুল শুরু করুন এবং ওয়াচডগ সার্ভারের সাথে রিসোর্স অতিরিক্ত ব্যবহার শ্রোতা নিবন্ধন করুন। ওয়াচডগ সার্ভার পরিষেবার নাম
android.automotive.watchdog.ICarWatchdog/default
অধীনে নিবন্ধিত।main.cpp
int main(int argc, char** argv) { ABinderProcess_setThreadPoolMaxThreadCount(1); ABinderProcess_startThreadPool(); std::shared_ptr<ResourceOveruseListenerImpl> listener = ndk::SharedRefBase::make<ResourceOveruseListenerImpl>(); // The listener is added in initialize(). listener->initialize(); ... Run service ... // The listener is removed in terminate(). listener->terminate(); }
ResourceOveruseListenerImpl.cpp
void ResourceOveruseListener::initialize() { ndk::SpAIBinder binder(AServiceManager_getService( "android.automotive.watchdog.ICarWatchdog/default")); std::shared_ptr<ICarWatchdog> server = ICarWatchdog::fromBinder(binder); mWatchdogServer = server; std::shared_ptr<IResourceOveruseListener> listener = IResourceOveruseListener::fromBinder(this->asBinder()); mWatchdogServer->addResourceOveruseListener( std::vector<int>{ResourceType.IO}, listener); mListener = listener; } void ResourceOveruseListener::terminate() { mWatchdogServer->removeResourceOveruseListener(mListener); }
পোল রিসোর্স অতিরিক্ত ব্যবহারের পরিসংখ্যান
অ্যাপ্লিকেশনগুলি সাম্প্রতিক 30 দিনের জন্য অ্যাপ-নির্দিষ্ট আই/ও অতিরিক্ত ব্যবহারের পরিসংখ্যান এটিএসের জন্য কারওয়াচডোগম্যানেজারকে পোল করতে পারে।
জাভা ক্লায়েন্ট
রিসোর্সকে অতিরিক্ত ব্যবহারের পরিসংখ্যান পেতে CarWatchdogManager.getResourceOveruseStats
ব্যবহার করুন। ডিস্ক আই/ও অতিরিক্ত ব্যবহারের পরিসংখ্যান পেতে CarWatchdogManager.FLAG_RESOURCE_OVERUSE_IO
পতাকাটি পাস করুন।
private void getResourceOveruseStats() { CarWatchdogManager manager = (CarWatchdogManager) car.getCarManager(Car.CAR_WATCHDOG_SERVICE); // Returns resource overuse stats with I/O overuse stats for the past // 7 days. Stats are available for up to the past 30 days. ResourceOveruseStats resourceOveruseStats = mCarWatchdogManager.getResourceOveruseStats( CarWatchdogManager.FLAG_RESOURCE_OVERUSE_IO, CarWatchdogManager.STATS_PERIOD_PAST_7_DAYS); IoOveruseStats ioOveruseStats = resourceOveruseStats.getIoOveruseStats(); // Stats period - [ioOveruseStats.getStartTime(), ioOveruseStats.getStartTime() // + ioOveruseStats.getDurationInSeconds()] // Total I/O overuses - ioOveruseStats.getTotalOveruses() // Total bytes written - ioOveruseStats.getTotalBytesWritten() // Remaining write bytes for the UTC calendar day - // ioOveruseStats.getRemainingWriteBytes() }
নেটিভ ক্লায়েন্ট
রিসোর্সকে অতিরিক্ত ব্যবহারের পরিসংখ্যান পেতে CarWatchdogServer.getResourceOveruseStats
ব্যবহার করুন। ডিস্ক আই/ও অতিরিক্ত ব্যবহারের পরিসংখ্যান আনতে ResourceType.IO
এনামটি পাস করুন।
void getResourceOveruseStats() { ndk::SpAIBinder binder(AServiceManager_getService( "android.automotive.watchdog.ICarWatchdog/default")); std::shared_ptr<ICarWatchdog> server = ICarWatchdog::fromBinder(binder); // Returns the stats only for the current UTC calendar day. const std::vector<ResourceOveruseStats> resourceOveruseStats; ndk::ScopedAStatus status = server.getResourceOveruseStats( std::vector<int>{ResourceType.IO}, &resourceOveruseStats); if (!status.isOk()) { // Failed to get the resource overuse stats. return; } for (const auto& stats : resourceOveruseStats) { if (stats.getTag() != ResourceOveruseStats::ioOveruseStats) { continue; } const IoOveruseStats& ioOveruseStats = stats.get(); // Stats period - [ioOveruseStats.startTime, // ioOveruseStats.startTime + ioOveruseStats.durationInSeconds] // Total I/O overuses - ioOveruseStats.totalOveruses // Total bytes written - ioOveruseStats.writtenBytes // Remaining write bytes for the current UTC calendar day - // ioOveruseStats.remainingWriteBytes } }
রিসোর্স অতিরিক্ত ব্যবহারকারীর অভিজ্ঞতা
নিম্নলিখিত বিভাগগুলি যখন রিসোর্স অতিরিক্ত ব্যবহার ঘটে তখন ব্যবহারকারীর অভিজ্ঞতা বর্ণনা করে।
অ্যাপ্লিকেশন পারফরম্যান্স সেটিংকে অগ্রাধিকার দিন
অ্যাপ্লিকেশন সেটিংস পৃষ্ঠায় Prioritize app performance
জন্য সেটিংস রয়েছে (নীচের চিত্রটি দেখুন), যা ব্যবহারকারীদের সিস্টেমের চেয়ে অ্যাপ্লিকেশনটির কার্যকারিতা এবং দীর্ঘমেয়াদী হার্ডওয়্যার পারফরম্যান্সকে অগ্রাধিকার দিতে দেয়। এই সেটিংটি কেবলমাত্র এমন অ্যাপ্লিকেশনগুলির জন্য উপলব্ধ যা সংস্থান অতিরিক্ত ব্যবহারের উপর সমাপ্ত হওয়া নিরাপদ। অন্যথায়, এই সেটিংটি অক্ষম। যখন কোনও অ্যাপ্লিকেশনটির জন্য এই সেটিংটি টগল করা (ডিফল্ট সেটিংস) বন্ধ করা হয়, তখন অ্যাপ্লিকেশনটি রিসোর্স অতিরিক্ত ব্যবহারের উপর সমাপ্ত করা যায়। অন্যথায়, অ্যাপ্লিকেশনটি রিসোর্স অতিরিক্ত ব্যবহারের উপর সমাপ্ত হয় না।
যখন ব্যবহারকারী এই সেটিংটিতে টগল করে, নিম্নলিখিত নিশ্চিতকরণ ডায়ালগটি সেটিংসে টগলিংয়ের প্রভাবগুলি বর্ণনা করে:
90 দিনের পরে, এই সেটিংটি স্বয়ংক্রিয়ভাবে ডিফল্টটিতে পুনরায় সেট করা হয়। দিনের সীমাটি সর্বাধিক 180 দিন পর্যন্ত watchdogUserPackageSettingsResetDays
ব্যবহার করে একটি আরআরও ওভারলে অ্যাপ্লিকেশন দিয়ে সংশোধন করা যেতে পারে। আরও জানতে, রানটাইমে কোনও অ্যাপের সংস্থানগুলির মান পরিবর্তন করুন । নিম্নলিখিত উদাহরণ ওভারলে ট্যাগটি AndroidManifest.xml
অন্তর্ভুক্ত করা যেতে পারে:
<overlay android:priority="<insert-value>" android:targetPackage="com.android.car.updatable" android:targetName="CarServiceCustomization" android:resourcesMap="@xml/overlays" />
res/values/config.xml
:
<resources> <integer name="watchdogUserPackageSettingsResetDays">value</integer> </resources>
res/xml/overlays.xml
:
<overlay> <item target="integer/watchdogUserPackageSettingsResetDays" value="@integer/watchdogUserPackageSettingsResetDays" /> </overlay>
পারফরম্যান্স-প্রভাব অ্যাপ্লিকেশন সেটিং
সেটিংস অ্যাপ্লিকেশনটিতে একটি পারফরম্যান্স-প্রভাবিত অ্যাপ্লিকেশন বিভাগ রয়েছে (চিত্র 1 দেখুন)। যখন ট্যাপ করা হয়, ফ্ল্যাশ মেমরি অতিরিক্ত ব্যবহারের কারণে সীমাবদ্ধ থাকা অ্যাপ্লিকেশনগুলির একটি তালিকা এবং এটি নেতিবাচকভাবে প্রভাবিত করে সিস্টেমের কার্যকারিতা প্রদর্শিত হয়। এটি সিডিডি 3.5.1 প্রয়োজনীয়তা অনুসরণ করে [সি -1-1] ।
চিত্র 1। পারফরম্যান্স-প্রভাবিত অ্যাপ্লিকেশন।
রিসোর্স অতিরিক্ত ব্যবহারের কারণে সমাপ্ত অ্যাপ্লিকেশনগুলি এখানে তালিকাভুক্ত করা হয়েছে (চিত্র 2 দেখুন)। তালিকাভুক্ত অ্যাপ্লিকেশনগুলি অগ্রাধিকার দেওয়া যেতে পারে। আরও জানতে, অ্যাপের পারফরম্যান্স সেটিংটিকে অগ্রাধিকার দিন ।
চিত্র 2। রিসোর্স অতিরিক্ত ব্যবহারের কারণে সমাপ্ত অ্যাপ্লিকেশনগুলির তালিকা।
ব্যবহারকারীর বিজ্ঞপ্তি
যখন কোনও অ্যাপ্লিকেশন বা পরিষেবা বারবার ডিস্ক আই/ওকে অতিরিক্ত ব্যবহার করে (উদাহরণস্বরূপ, সংজ্ঞায়িত থ্রেশহোল্ডগুলি ছাড়িয়ে ডিস্ককে ডেটা লেখেন) একটি নির্দিষ্ট সময়ের মধ্যে এবং রিসোর্স অতিরিক্ত ব্যবহারের উপর অবসান হওয়া নিরাপদ, ব্যবহারকারীকে অনুমতি-ডিস্ট্রাকশন স্টেটে প্রবেশের পরে ব্যবহারকারীকে অবহিত করা হয়।
প্রথম ব্যবহারকারী বিজ্ঞপ্তি (একটি ড্রাইভ চলাকালীন) হেড-আপ বিজ্ঞপ্তি হিসাবে পোস্ট করা হয় এবং অন্যান্য বিজ্ঞপ্তিগুলি বিজ্ঞপ্তি কেন্দ্রে পোস্ট করা হয়।
উদাহরণস্বরূপ, যখন কোনও অ্যাপ্লিকেশন বারবার ডিস্ক আই/ওকে অতিরিক্ত ব্যবহার করে, তখন ব্যবহারকারী নিম্নলিখিত বিজ্ঞপ্তি পান:
- ব্যবহারকারী যখন অগ্রাধিকার অ্যাপ্লিকেশন বোতামে ক্লিক করেন, তখন অ্যাপের সেটিংস পৃষ্ঠাটি চালু করা হয়, যেখানে ব্যবহারকারী অ্যাপ পারফরম্যান্স সেটিংটিকে অগ্রাধিকার দেওয়া বা বন্ধ করতে পারেন।
- যখন ব্যবহারকারী অ্যাপল অ্যাপ্লিকেশন বোতামে ক্লিক করেন, ব্যবহারকারী অ্যাপটি চালু না করা বা অ্যাপের সেটিংস পৃষ্ঠায় এটি সক্ষম না করা পর্যন্ত অ্যাপ্লিকেশনটি অক্ষম করা হয়।
- আনইনস্টলযোগ্য অ্যাপ্লিকেশনগুলির জন্য, অক্ষম অ্যাপ্লিকেশন বোতামটি আনইনস্টল অ্যাপ বোতামের সাথে প্রতিস্থাপন করা হয়েছে। ব্যবহারকারী যখন আনইনস্টল অ্যাপ বোতামে ক্লিক করেন, তখন অ্যাপের সেটিংস পৃষ্ঠাটি চালু করা হয়, যা থেকে ব্যবহারকারী অ্যাপটি আনইনস্টল করতে পারে।
লঞ্চার বাস্তবায়নের জন্য সুপারিশ
যখন রিসোর্স অতিরিক্ত ব্যবহারের কারণে অ্যাপ্লিকেশনগুলি অক্ষম করা হয়, তখন অ্যাপ্লিকেশনগুলি ডিফল্ট লঞ্চার অ্যাপ্লিকেশন থেকে অদৃশ্য হয়ে যায় কারণ কার সার্ভিস অ্যাপস সক্ষম রাষ্ট্রকে PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED
হিসাবে আপডেট করে com এই অ্যাপ্লিকেশনগুলিকে অস্বাভাবিক হিসাবে প্রদর্শন করতে OEMs অবশ্যই বিল্টিন লঞ্চার বাস্তবায়ন আপডেট করতে হবে, যাতে ব্যবহারকারীরা প্রয়োজনে সেগুলি ব্যবহার করতে পারেন। বিল্ড রিলিজের ভিত্তিতে নিম্নলিখিত সুপারিশগুলি দেখুন।
অ্যান্ড্রয়েড এসসি ভি 2 রিলিজ
- লঞ্চার বাস্তবায়নটি লঞ্চারে দেখানোর জন্য প্যাকেজগুলির তালিকা পুনরুদ্ধার করার সময়
MATCH_DISABLED_UNTIL_USED_COMPONENTS
পতাকা ব্যবহার করা উচিত। - ব্যবহারকারী যখন
PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED
রাজ্যে থাকা কোনও অ্যাপ্লিকেশন ক্লিক করেন, তখন লঞ্চার অ্যাপ্লিকেশনটি অবশ্যই সক্ষম রাষ্ট্রটি সেট করে অ্যাপটি সক্ষম করতে হবে:
ওয়াচডগ Mack/Proc/uid_io/stats` লোকেশনে কার্নেল দ্বারা উন্মুক্ত প্রতি-ইউড ডিস্ক I/O পরিসংখ্যান ব্যবহার করে সমস্ত অ্যাপ্লিকেশন এবং পরিষেবাদি দ্বারা নির্মিত মোট ডিস্ক I/O এর মোট পরিমাণ ট্র্যাক করে ওয়াচডগ ফ্ল্যাশ মেমরির ব্যবহার পর্যবেক্ষণ করে ` যখন কোনও অ্যাপ্লিকেশন বা পরিষেবা ডিস্ক আই/ও অতিরিক্ত ব্যবহারের থ্রেশহোল্ডকে ছাড়িয়ে যায়, ওয়াচডগ অ্যাপ্লিকেশন বা পরিষেবাতে পদক্ষেপ নেয়। ডিস্ক আই/ও অতিরিক্ত ব্যবহারের থ্রেশহোল্ডগুলি এবং অতিরিক্ত ব্যবহার গ্রহণের ক্রিয়াটি ডিস্ক আই/ও অতিরিক্ত ব্যবহারের কনফিগারেশনে পূর্বনির্ধারিত।
অতিরিক্ত ব্যবহার থ্রেশহোল্ডস
- ডিস্ক আই/ও অতিরিক্ত ব্যবহারের থ্রেশহোল্ডগুলি প্রতিদিনের ভিত্তিতে প্রয়োগ করা হয়, অর্থাৎ, একটি অ্যাপ্লিকেশন/পরিষেবা দ্বারা তৈরি সমস্ত লেখার বর্তমান ইউটিসি ক্যালেন্ডার দিবসের শুরু থেকেই একত্রিত করা হয় এবং অতিরিক্ত ব্যবহারের কনফিগারেশনে সংজ্ঞায়িত থ্রেশহোল্ডগুলির বিরুদ্ধে পরীক্ষা করা হয়।
- নির্দিষ্ট দিনে যখন কোনও যানবাহন একাধিকবার শুরু হয়, ওয়াচডগ মডিউলটি ফ্ল্যাশ মেমরিতে ডিস্ক আই/ও ব্যবহারের পরিসংখ্যান সংরক্ষণ করে এবং বর্তমান ইউটিসি ক্যালেন্ডার দিনের শুরু থেকে তাদের একত্রিত করে।
অতিরিক্ত ব্যবহার ক্রিয়া
যখন কোনও অ্যাপ বার বার সংজ্ঞায়িত ডিস্ক আই/ও অতিরিক্ত ব্যবহারের থ্রেশহোল্ডগুলি ছাড়িয়ে যায়, ওয়াচডগ অতিরিক্ত ব্যবহারের কনফিগারেশনে সংজ্ঞায়িত ক্রিয়া গ্রহণ করে।
- সমস্ত বিক্রেতার অ্যাপ্লিকেশন এবং পরিষেবাগুলি সামগ্রিক সিস্টেমের স্থিতিশীলতার জন্য সমালোচনামূলক হিসাবে বিবেচিত হয়, সুতরাং সেগুলি ডিস্ক আই/ও অতিরিক্ত ব্যবহারের উপর সমাপ্ত হয় না। তবে অতিরিক্ত ব্যবহার কনফিগারেশন নিরাপদ থেকে টার্মিনেট বিক্রেতার অ্যাপ্লিকেশন এবং পরিষেবাদির একটি তালিকা সংজ্ঞায়িত করতে পারে।
- সমস্ত তৃতীয় পক্ষের অ্যাপ্লিকেশনগুলি নিরাপদ থেকে টার্মিনেট।
যখন কোনও অ্যাপ্লিকেশন বা পরিষেবা নিরাপদ থেকে টার্মিনেট হয়, ওয়াচডগ অ্যাপ্লিকেশন বা পরিষেবাটি অ্যাপ্লিকেশন উপাদানটি স্টেট PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED
অতিরিক্ত ব্যবহার কনফিগারেশন
অতিরিক্ত ব্যবহার কনফিগারেশনে ডিস্ক আই/ও অতিরিক্ত ব্যবহারের থ্রেশহোল্ড এবং ক্রিয়া রয়েছে। ডিফল্ট অতিরিক্ত ব্যবহার কনফিগারেশনগুলি সিস্টেম এবং বিক্রেতার চিত্রগুলিতে সংজ্ঞায়িত করা হয় এবং বিল্ডের সাথে প্রেরণ করা হয়। বিক্রেতারা বিক্রেতার চিত্রটিতে বিক্রেতার কনফিগারেশনটি ally চ্ছিকভাবে অন্তর্ভুক্ত করতে পারেন। যখন বিক্রেতার কনফিগারেশন সরবরাহ করা হয় না, তখন সিস্টেম কনফিগারেশনটি বিক্রেতার অ্যাপ্লিকেশন এবং পরিষেবাদির জন্যও ব্যবহৃত হয়।
ওয়াচডগ CarWatchdogManager
মাধ্যমে সিস্টেম এপিআইগুলি প্রকাশ করে, যা বিক্রেতাদের অ্যাপ্লিকেশন বা পরিষেবাগুলি যে কোনও সময় বিক্রেতার কনফিগারেশন আপডেট করতে দেয়।
অতিরিক্ত ব্যবহার কনফিগারেশন সংজ্ঞা
অতিরিক্ত ব্যবহার কনফিগারেশন উপাদান ধরণের দ্বারা বিভক্ত হয়, উদাহরণস্বরূপ, সিস্টেম, বিক্রেতা এবং তৃতীয় পক্ষ। OEMS অবশ্যই কেবল বিক্রেতার উপাদান কনফিগারেশন আপডেট করতে হবে।
বিক্রেতা কনফিগারেশন
বিক্রেতার কনফিগারেশনটি সমস্ত বিক্রেতার অ্যাপ্লিকেশন এবং পরিষেবাদি এবং সমস্ত মানচিত্র এবং মিডিয়া অ্যাপ্লিকেশনগুলির জন্য ডিস্ক আই/ও অতিরিক্ত ব্যবহার থ্রেশহোল্ড এবং ক্রিয়াগুলি সংজ্ঞায়িত করে। কনফিগারেশনে নীচের কনফিগারেশন ক্ষেত্রগুলি রয়েছে।
- বিক্রেতা প্যাকেজ উপসর্গ । বিক্রেতার পার্টিশনে ইনস্টল করা সমস্ত প্যাকেজগুলি বিক্রেতার প্যাকেজ হিসাবে বিবেচিত হয়। এই প্যাকেজগুলি ছাড়াও, বিক্রেতারা বিক্রেতার প্যাকেজ হিসাবে প্যাকেজগুলি বিক্রেতার প্যাকেজ হিসাবে শ্রেণীবদ্ধ করতে পারে বিক্রেতার প্যাকেজ উপসর্গ কনফিগারেশনে প্যাকেজ উপসর্গগুলি যুক্ত করে। এই কনফিগারেশন নিয়মিত অভিব্যক্তি গ্রহণ করে না।
- নিরাপদ থেকে টার্মিনেট প্যাকেজ । নিরাপদ থেকে টার্মিনেট প্যাকেজস কনফিগারেশনে সম্পূর্ণ প্যাকেজের নাম যুক্ত করে কোন বিক্রেতার প্যাকেজগুলি সমাপ্ত করতে নিরাপদ তা নির্দিষ্ট করতে পারেন বিক্রেতারা।
- অ্যাপ্লিকেশন বিভাগ ম্যাপিংস । বিক্রেতারা দুটি সমর্থিত অ্যাপ্লিকেশন বিভাগের একটি - মানচিত্র এবং মিডিয়া অ্যাপ্লিকেশনগুলির মধ্যে যে কোনও প্যাকেজ (তৃতীয় পক্ষের প্যাকেজ সহ) মানচিত্র করতে পারে। এই ম্যাপিংটি মানচিত্র এবং মিডিয়া অ্যাপ্লিকেশনগুলি উচ্চতর ডিস্ক আই/ও অতিরিক্ত ব্যবহারের থ্রেশহোল্ডগুলি সরবরাহ করার জন্য করা হয় কারণ এই অ্যাপ্লিকেশনগুলি অন্যান্য অ্যাপ্লিকেশন ধরণের তুলনায় ডিস্কে আরও ডেটা ডাউনলোড এবং লেখার প্রবণতা রাখে।
- উপাদান স্তরের প্রান্তিক । সমস্ত বিক্রেতার প্যাকেজগুলির জন্য জেনেরিক থ্রেশহোল্ডগুলি সংজ্ঞায়িত করে (এটি প্যাকেজ নির্দিষ্ট থ্রেশহোল্ড বা অ্যাপ্লিকেশন বিভাগের নির্দিষ্ট থ্রেশহোল্ডগুলি এই প্রান্তিকগুলি পান) দ্বারা আচ্ছাদিত প্যাকেজগুলি)। ডিস্ক আই/ও অতিরিক্ত ব্যবহারের কনফিগারেশন সংজ্ঞায়িত করার সময় বিক্রেতাদের অবশ্যই শূন্য-উপাদান-স্তরের প্রান্তিকগুলি সংজ্ঞায়িত করতে হবে।
- প্যাকেজ নির্দিষ্ট থ্রেশহোল্ডস । বিক্রেতারা নির্দিষ্ট বিক্রেতার প্যাকেজগুলির জন্য বিশেষ থ্রেশহোল্ডগুলি সংজ্ঞায়িত করতে পারেন। ম্যাপিংগুলিতে সম্পূর্ণ প্যাকেজের নাম থাকা উচিত। এই কনফিগারেশনে সংজ্ঞায়িত থ্রেশহোল্ডগুলি প্রদত্ত প্যাকেজের জন্য অন্যান্য কনফিগারেশনে সংজ্ঞায়িত থ্রেশহোল্ডগুলির চেয়ে অগ্রাধিকার গ্রহণ করে।
- অ্যাপ্লিকেশন বিভাগ নির্দিষ্ট থ্রেশহোল্ড । বিক্রেতারা নির্দিষ্ট অ্যাপ্লিকেশন বিভাগগুলির জন্য বিশেষ থ্রেশহোল্ডগুলি নির্দিষ্ট করতে পারেন। অ্যাপ্লিকেশন বিভাগগুলি অবশ্যই সমর্থিত বিভাগগুলির মধ্যে একটি হতে হবে - মানচিত্র এবং মিডিয়া অ্যাপ্লিকেশন। এই কনফিগারেশনে সংজ্ঞায়িত থ্রেশহোল্ডগুলি অ্যাপ্লিকেশন বিভাগের ম্যাপিংগুলি ব্যবহার করে নির্দিষ্ট প্যাকেজগুলিতে ম্যাপ করা হয়।
- সিস্টেম-প্রশস্ত থ্রেশহোল্ডস । বিক্রেতাদের অবশ্যই এই কনফিগারেশন নির্দিষ্ট করতে হবে না।
বিক্রেতা প্যাকেজ উপসর্গ , নিরাপদ থেকে টার্মিনেট প্যাকেজ , উপাদান স্তরের থ্রেশহোল্ডস এবং প্যাকেজ নির্দিষ্ট থ্রেশহোল্ড কনফিগারগুলি কেবল বিক্রেতার অ্যাপ্লিকেশন এবং পরিষেবাদির জন্য বিক্রেতার কনফিগারেশন দ্বারা আপডেটযোগ্য। অ্যাপ্লিকেশন বিভাগ নির্দিষ্ট থ্রেশহোল্ডস কনফিগারেশন কেবলমাত্র সমস্ত মানচিত্র এবং মিডিয়া অ্যাপ্লিকেশনগুলির জন্য বিক্রেতার কনফিগারেশন দ্বারা আপডেট করা যেতে পারে।
অতিরিক্ত ব্যবহারের থ্রেশহোল্ডগুলিতে বাইটের পরিমাণ লিখিত হওয়ার অনুমতি রয়েছে:
- একটি অ্যাপ্লিকেশন বা পরিষেবা অগ্রভাগ মোড বনাম ব্যাকগ্রাউন্ড মোড
- সিস্টেম গ্যারেজ মোড
এই শ্রেণিবিন্যাসটি ব্যবহারকারীকে অগ্রভাগ অ্যাপ্লিকেশন এবং পরিষেবাদিগুলির মুখোমুখি করে ব্যাকগ্রাউন্ড অ্যাপ্লিকেশন এবং পরিষেবাদির চেয়ে আরও বেশি ডেটা লিখতে। গ্যারেজ মোডে, অ্যাপ্লিকেশন এবং পরিষেবাদি আপডেটগুলি ডাউনলোড করার ঝোঁক থাকে, তাই প্রতিটি মোডে চলমান অ্যাপ্লিকেশন এবং পরিষেবাদির চেয়ে প্রত্যেকেরই উচ্চতর প্রান্তিকের প্রয়োজন।
সিস্টেম এবং তৃতীয় পক্ষের কনফিগারেশন
OEMS সিস্টেম এবং তৃতীয় পক্ষের কনফিগারেশন আপডেট করা উচিত নয় ।
- সিস্টেম কনফিগারেশন সিস্টেম অ্যাপ্লিকেশন এবং পরিষেবাদির জন্য আই/ও অতিরিক্ত ব্যবহার থ্রেশহোল্ড এবং ক্রিয়াগুলি সংজ্ঞায়িত করে।
- এই কনফিগারেশনটি অ্যাপ্লিকেশন বিভাগের ম্যাপিংগুলিও আপডেট করতে পারে। সুতরাং, এই কনফিগার ক্ষেত্রটি সিস্টেম এবং বিক্রেতার কনফিগারেশনের মধ্যে ভাগ করা হয়।
- তৃতীয় পক্ষের কনফিগারেশন সমস্ত তৃতীয় পক্ষের অ্যাপ্লিকেশনগুলির জন্য প্রান্তিকগুলি সংজ্ঞায়িত করে। সিস্টেমে পূর্বনির্ধারিত নয় এমন সমস্ত অ্যাপ্লিকেশনগুলি তৃতীয় পক্ষের অ্যাপ্লিকেশন।
- সমস্ত তৃতীয় পক্ষের অ্যাপ্লিকেশনগুলি একই থ্রেশহোল্ডগুলি গ্রহণ করে (উদাহরণস্বরূপ, কোনও তৃতীয় পক্ষের অ্যাপ্লিকেশন বিশেষ থ্রেশহোল্ডগুলি গ্রহণ করে না) মানচিত্র এবং মিডিয়া অ্যাপ্লিকেশনগুলি ব্যতীত, যার প্রান্তিকগুলি বিক্রেতার কনফিগারেশন দ্বারা সংজ্ঞায়িত করা হয়।
- নীচের ডিস্ক আই/ও অতিরিক্ত ব্যবহারের থ্রেশহোল্ডগুলি তৃতীয় পক্ষের অ্যাপ্লিকেশনগুলির জন্য ডিফল্ট থ্রেশহোল্ড। এই থ্রেশহোল্ডগুলি সিস্টেমের চিত্রের সাথে প্রেরণ করা হয়।
- 3 গিব অ্যাপ ফোরগ্রাউন্ড মোডে লিখুন।
- 2 গিব অ্যাপ ব্যাকগ্রাউন্ড মোডে লিখুন।
- 4 গিব সিস্টেম গ্যারেজ মোডে লিখুন।
- এগুলি বেস থ্রেশহোল্ড। এই প্রান্তিকগুলি আপডেট করা হয় কারণ ডিস্ক আই/ও ব্যবহার সম্পর্কে আরও কিছু শিখতে হয়।
অতিরিক্ত ব্যবহার কনফিগারেশন এক্সএমএল ফর্ম্যাট
ডিফল্ট বিক্রেতার কনফিগারেশনটি স্থাপন করা যেতে পারে (এটি al চ্ছিক ) অবস্থান /vendor/etc/automotive/watchdog/resource_overuse_configuration.xml
/watchdog/resource_overuse_configration.xml বিল্ড ইমেজে। যখন এই কনফিগারেশনটি নির্দিষ্ট না করা হয়, তখন সিস্টেম-সংজ্ঞায়িত কনফিগারেশনটি বিক্রেতার অ্যাপ্লিকেশন এবং পরিষেবার জন্যও প্রয়োগ করা হয়।
এক্সএমএল ফাইলটিতে প্রতিটি কনফিগার ক্ষেত্রের জন্য কেবল একটি ট্যাগ থাকা উচিত। আই/ও অতিরিক্ত ব্যবহার কনফিগারেশন অবশ্যই এক্সএমএল ফাইলে সংজ্ঞায়িত করা উচিত। সমস্ত প্রান্তিক মানগুলি এমআইবি ইউনিটে নির্দিষ্ট করা উচিত।
একটি নমুনা এক্সএমএল কনফিগারেশন নীচে সরবরাহ করা হয়েছে:
<resourceOveruseConfiguration version="1.0"> <componentType> VENDOR </componentType> <!-- List of safe to kill vendor packages. --> <safeToKillPackages> <package> com.vendor.package.A </package> <package> com.vendor.package.B </package> </safeToKillPackages> <!-- List of vendor package prefixes. --> <vendorPackagePrefixes> <packagePrefix> com.vendor.package </packagePrefix> </vendorPackagePrefixes> <!-- List of unique package names to app category mappings. --> <packagesToAppCategoryTypes> <packageAppCategory type="MEDIA"> com.vendor.package.A </packageAppCategory> <packageAppCategory type="MAPS"> com.google.package.B </packageAppCategory> <packageAppCategory type="MEDIA"> com.third.party.package.C </packageAppCategory> </packagesToAppCategoryTypes> <ioOveruseConfiguration> <!-- Thresholds in MiB for all vendor packages that don't have package specific thresholds. --> <componentLevelThresholds> <state id="foreground_mode"> 1024 </state> <state id="background_mode"> 512 </state> <state id="garage_mode"> 3072 </state> </componentLevelThresholds> <packageSpecificThresholds> <!-- IDs must be unique --> <perStateThreshold id="com.vendor.package.C"> <state id="foreground_mode"> 400 </state> <state id="background_mode"> 100 </state> <state id="garage_mode"> 200 </state> </perStateThreshold> <perStateThreshold id="com.vendor.package.D"> <state id="foreground_mode"> 1024 </state> <state id="background_mode"> 500 </state> <state id="garage_mode"> 2048 </state> </perStateThreshold> </packageSpecificThresholds> <!-- Application category specific thresholds. --> <appCategorySpecificThresholds> <!-- One entry per supported application category --> <perStateThreshold id="MEDIA"> <state id="foreground_mode"> 600 </state> <state id="background_mode"> 700 </state> <state id="garage_mode"> 1024 </state> </perStateThreshold> <perStateThreshold id="MAPS"> <state id="foreground_mode"> 800 </state> <state id="background_mode"> 900 </state> <state id="garage_mode"> 2048 </state> </perStateThreshold> </appCategorySpecificThresholds> </ioOveruseConfiguration> </resourceOveruseConfiguration>
কারওয়াচডোগম্যানেজার সিস্টেম এপিআইগুলির মাধ্যমে অতিরিক্ত ব্যবহার কনফিগারেশন আপডেট করুন
উপরের এক্সএমএল কনফিগারেশনটি কেবল বিল্ড ইমেজে সরবরাহ করা যেতে পারে। যদি কোনও ওএম কোনও বিল্ড প্রকাশের পরে অন-ডিভাইস কনফিগারেশন আপডেট করতে পছন্দ করে তবে তারা অন-ডিভাইস কনফিগারেশনে পরিবর্তন করতে নিম্নলিখিত এপিআইগুলি ব্যবহার করতে পারে।
- অনুমতি
Car.PERMISSION_CONTROL_CAR_WATCHDOG_CONFIG
Permission_control_car_watchdog_config কলারকে মঞ্জুর করুন। - নতুন কনফিগারেশনগুলি আপডেট এবং সেট করতে অবশ্যই বিদ্যমান কনফিগারেশনগুলি ব্যবহার করতে হবে। বিদ্যমান কনফিগারেশনগুলি পেতে এপিআই
CarWatchdogManager.getResourceOveruseConfigurations
ব্যবহার করুন। যদি বিদ্যমান কনফিগারেশনগুলি ব্যবহার না করা হয় তবে সমস্ত কনফিগারেশন (সিস্টেম এবং তৃতীয় পক্ষের কনফিগারেশন সহ) ওভাররাইট করা হয়, যা প্রস্তাবিত নয়। - ডেল্টা পরিবর্তনের সাথে বিদ্যমান কনফিগারেশনগুলি আপডেট করুন এবং নতুন কনফিগারেশনগুলি সেট করুন। সিস্টেম এবং তৃতীয় পক্ষের উপাদান কনফিগারেশন আপডেট করবেন না ।
- নতুন কনফিগারেশনগুলি সেট করতে এপিআই
CarWatchdogManager.setResourceOveruseConfigurations
ব্যবহার করুন। - ডিস্ক আই/ও অতিরিক্ত ব্যবহারের কনফিগারেশনগুলি পেতে এবং সেট করতে পতাকাটি
CarWatchdogManager.FLAG_RESOURCE_OVERUSE_IO
ব্যবহার করুন।
এখানে একটি নমুনা বাস্তবায়ন যা রিসোর্সকে অতিরিক্ত ব্যবহারের কনফিগারেশনগুলি আপডেট করে:
void updateResourceOveruseConfigurations() { CarWatchdogManager manager = (CarWatchdogManager) car.getCarManager(Car.CAR_WATCHDOG_SERVICE); List<ResourceOveruseConfiguration> resourceOveruseConfigurations = manager.getResourceOveruseConfigurations( CarWatchdogManager.FLAG_RESOURCE_OVERUSE_IO); List<ResourceOveruseConfiguration> newResourceOveruseConfigurations = new List<>(); ResourceOveruseConfiguration vendorConfiguration; for(ResourceOveruseConfiguration config : resourceOveruseConfigurations) { // Do not update the configurations of the system and third-party component types. if (config.getComponentType() != ResourceOveruseConfiguration.COMPONENT_TYPE_VENDOR) { newResourceOveruseConfigurations.add(config); continue; } vendorConfiguration = config; } if (vendorConfiguration == null) { ResourceOveruseConfiguration.Builder vendorConfigBuilder = new ResourceOveruseConfiguration.Builder(); initializeConfig(vendorConfigBuilder); newResourceOveruseConfigurations.add(vendorConfigBuilder.build()); } else { ResourceOveruseConfiguration newVendorConfig = updateConfig(vendorConfiguration); newResourceOveruseConfigurations.add(newVendorConfig); } int result = manager.setResourceOveruseConfigurations( newResourceOveruseConfigurations, if (result != CarWatchdogManager.RETURN_CODE_SUCCESS) { // Failed to set the resource overuse configurations. } } /** Sets the delta between the old configuration and the new configuration. */ ResourceOveruseConfiguration updateConfig( ResourceOveruseConfiguration oldConfiguration) { // Replace com.vendor.package.A with com.vendor.package.B in the safe-to-kill list. List<String> safeToKillPackages = oldConfiguration.getSafeToKillPackages(); safeToKillPackages.remove("com.vendor.package.A"); safeToKillPackages.add("com.vendor.package.B"); ResourceOveruseConfiguration.Builder configBuilder = new ResourceOveruseConfiguration.Builder( oldConfiguration.getComponentType(), safeToKillPackages, oldConfiguration.getVendorPackagePrefixes(), oldConfiguration.getPackagesToAppCategoryTypes()); configBuilder.addVendorPackagePrefixes("com.vendor."); configBuilder.addPackagesToAppCategoryTypes("com.vendor.package.B", ResourceOveruseConfiguration.APPLICATION_CATEGORY_TYPE_MAPS); IoOveruseConfiguration oldIoConfiguration = oldConfiguration.getIoOveruseConfiguration(); IoOveruseConfiguration.Builder ioConfigBuilder = new IoOveruseConfiguration.Builder( oldIoConfiguration.getComponentLevelThresholds(), oldIoConfiguration.getPackageSpecificThresholds(), oldIoConfiguration.getAppCategorySpecificThresholds(), oldIoConfiguration.getSystemWideThresholds()); // Define the amount of bytes based on the flash memory specification, expected lifetime, // and estimated average amount of bytes written by a package during different modes. ioConfigBuilder.addPackageSpecificThresholds("com.vendor.package.B", new PerStateBytes(/* foregroundModeBytes= */ 2 * 1024 * 1024 * 1024, /* backgroundModeBytes= */ 500 * 1024 * 1024, /* garageModeBytes= */ 3 * 1024 * 1024 * 1024)); return configBuilder.setIoOveruseConfiguration(ioConfigBuilder.build()).build(); }
অ্যাপ্লিকেশনগুলি তাদের সংস্থান অতিরিক্ত ব্যবহার পর্যবেক্ষণ করছে
বিক্রেতা এবং তৃতীয় পক্ষের অ্যাপ্লিকেশনগুলি গত 30 দিন পর্যন্ত অ্যাপ্লিকেশন নির্দিষ্ট রিসোর্স অতিরিক্ত ব্যবহারের পরিসংখ্যানের জন্য ওয়াচডগ বা পোল CarWatchdogManager
কাছ থেকে অ্যাপ্লিকেশন নির্দিষ্ট সংস্থান অতিরিক্ত ব্যবহারের বিজ্ঞপ্তিগুলি শুনতে পারে।
রিসোর্স অতিরিক্ত ব্যবহারের বিজ্ঞপ্তিগুলির জন্য শুনুন
অ্যাপ্লিকেশনগুলি একটি রিসোর্সকে অতিরিক্ত ব্যবহার শ্রোতার প্রয়োগ করতে পারে এবং শ্রোতাকে CarWatchdogManager
সাথে নিবন্ধ করতে পারে যখন তারা তাদের ডিস্ক আই/ও অতিরিক্ত ব্যবহারের থ্রেশহোল্ডগুলির 80% বা 100% ছাড়িয়ে যায় তখন অ্যাপ নির্দিষ্ট বিজ্ঞপ্তিগুলি পেতে পারে। অ্যাপ্লিকেশনগুলি এই বিজ্ঞপ্তিগুলি এখানে ব্যবহার করতে পারে:
- অফলাইন বিশ্লেষণের জন্য ডিস্ক আই/ও অতিরিক্ত ব্যবহারের পরিসংখ্যান লগ করুন। অ্যাপ্লিকেশন বিকাশকারীরা ডিস্ক আই/ও অতিরিক্ত ব্যবহারের সমস্যাটি ডিবাগ করতে এই লগিংটি ব্যবহার করতে পারেন।
- অতিরিক্ত ব্যবহার কাউন্টারগুলি পুনরায় সেট না করা পর্যন্ত আই/ও লেখার ডিস্কটি হ্রাস করুন।
জাভা ক্লায়েন্ট
-
CarWatchdogManager.ResourceOveruseListener
উত্তরাধিকারী করে শ্রোতাদের বাস্তবায়ন করুন resclass ResourceOveruseListenerImpl implements CarWatchdogManager.ResourceOveruseListener { @Override public void onOveruse( @NonNull ResourceOveruseStats resourceOveruseStats) { // 1. Log/Upload resource overuse metrics. // 2. Reduce writes until the counters reset. IoOveruseStats ioOveruseStats = resourceOveruseStats.getIoOveruseStats(); // Stats period - [ioOveruseStats.getStartTime(), ioOveruseStats.getStartTime() // + ioOveruseStats.getDurationInSeconds()] // Total I/O overuses - ioOveruseStats.getTotalOveruses() // Total bytes written - ioOveruseStats.getTotalBytesWritten() // Remaining write bytes for the current UTC calendar day - // ioOveruseStats.getRemainingWriteBytes() } } }
CarWatchdogManager.addResourceOveruseListener
কল করে শ্রোতার উদাহরণটি নিবন্ধ করুন।private void addResourceOveruseListener() { CarWatchdogManager manager = (CarWatchdogManager) car.getCarManager(Car.CAR_WATCHDOG_SERVICE); // Choose a proper executor to handle resource overuse notifications. Executor executor = mContext.getMainExecutor(); manager.addResourceOveruseListener( executor, CarWatchdogManager.FLAG_RESOURCE_OVERUSE_IO, mListenerImpl); }
- যখন অ্যাপটি শুনে শেষ হয়েছে তখন শ্রোতার উদাহরণটি নিবন্ধভুক্ত করুন:
private void removeResourceOveruseListener() { CarWatchdogManager manager = (CarWatchdogManager) car.getCarManager(Car.CAR_WATCHDOG_SERVICE); mCarWatchdogManager.removeResourceOveruseListener( mListenerImpl); }
নেটিভ ক্লায়েন্ট
- বিল্ড নিয়মের
shared_libs
নির্ভরতার মধ্যেcarwatchdog_aidl_interface-ndk_platform
অন্তর্ভুক্ত করুন।Android.bp
cc_binary { name: "sample_native_client", srcs: [ "src/*.cpp" ], shared_libs: [ "carwatchdog_aidl_interface-ndk_platform", "libbinder_ndk", ], vendor: true, }
- বিক্রেতার পরিষেবা ডোমেনকে বাইন্ডার (
binder_user
ম্যাক্রো) ব্যবহার করার অনুমতি দেওয়ার জন্য সেলিনাক্স নীতি যুক্ত করুন এবংcarwatchdog
ক্লায়েন্ট ডোমেনে(carwatchdog_client_domain macro)
বিক্রেতার পরিষেবা ডোমেন যুক্ত করুন।sample_client.te
এবংfile_contexts
জন্য নীচের কোডটি দেখুন।sample_client.te
type sample_client, domain; type sample_client_exec, exec_type, file_type, vendor_file_type; carwatchdog_client_domain(sample_client) init_daemon_domain(sample_client) binder_use(sample_client)
file_contexts
/vendor/bin/sample_native_client u:object_r:sample_client_exec:s0
BnResourceOveruseListener
উত্তরাধিকারী হয়ে রিসোর্স অতিরিক্ত ব্যবহার শ্রোতার প্রয়োগ করুন। ওভাররাইডBnResourceOveruseListener::onOveruse
।ResourceOveruseListenerImpl.h
class ResourceOveruseListenerImpl : public BnResourceOveruseListener { public: ndk::ScopedAStatus onOveruse( ResourceOveruseStats resourceOveruseStats) override; private: void initialize(); void terminate(); std::shared_ptr<ICarWatchdog> mWatchdogServer; std::shared_ptr<IResourceOveruseListener> mListener; }
ResourceOveruseListenerImpl.cpp
ndk::ScopedAStatus ResourceOveruseListenerImpl::onOveruse( ResourceOveruseStats resourceOveruseStats) { // 1. Log/Upload resource overuse metrics. // 2. Reduce writes until the counters reset. if (stats.getTag() != ResourceOveruseStats::ioOveruseStats) { // Received resourceOveruseStats doesn't contain I/O overuse stats. } const IoOveruseStats& ioOveruseStats = stats.get(); // Stats period - [ioOveruseStats.startTime, // ioOveruseStats.startTime + ioOveruseStats.durationInSeconds] // Total I/O overuses - ioOveruseStats.totalOveruses // Total bytes written - ioOveruseStats.writtenBytes // Remaining write bytes for the current UTC calendar day - // ioOveruseStats.remainingWriteBytes return ndk::ScopedAStatus::ok(); }
- একটি বাইন্ডার থ্রেড পুল শুরু করুন এবং ওয়াচডগ সার্ভারের সাথে রিসোর্স অতিরিক্ত ব্যবহার শ্রোতা নিবন্ধন করুন। ওয়াচডগ সার্ভার পরিষেবার নাম
android.automotive.watchdog.ICarWatchdog/default
অধীনে নিবন্ধিত।main.cpp
int main(int argc, char** argv) { ABinderProcess_setThreadPoolMaxThreadCount(1); ABinderProcess_startThreadPool(); std::shared_ptr<ResourceOveruseListenerImpl> listener = ndk::SharedRefBase::make<ResourceOveruseListenerImpl>(); // The listener is added in initialize(). listener->initialize(); ... Run service ... // The listener is removed in terminate(). listener->terminate(); }
ResourceOveruseListenerImpl.cpp
void ResourceOveruseListener::initialize() { ndk::SpAIBinder binder(AServiceManager_getService( "android.automotive.watchdog.ICarWatchdog/default")); std::shared_ptr<ICarWatchdog> server = ICarWatchdog::fromBinder(binder); mWatchdogServer = server; std::shared_ptr<IResourceOveruseListener> listener = IResourceOveruseListener::fromBinder(this->asBinder()); mWatchdogServer->addResourceOveruseListener( std::vector<int>{ResourceType.IO}, listener); mListener = listener; } void ResourceOveruseListener::terminate() { mWatchdogServer->removeResourceOveruseListener(mListener); }
পোল রিসোর্স অতিরিক্ত ব্যবহারের পরিসংখ্যান
অ্যাপ্লিকেশনগুলি সাম্প্রতিক 30 দিনের জন্য অ্যাপ-নির্দিষ্ট আই/ও অতিরিক্ত ব্যবহারের পরিসংখ্যান এটিএসের জন্য কারওয়াচডোগম্যানেজারকে পোল করতে পারে।
জাভা ক্লায়েন্ট
রিসোর্সকে অতিরিক্ত ব্যবহারের পরিসংখ্যান পেতে CarWatchdogManager.getResourceOveruseStats
ব্যবহার করুন। ডিস্ক আই/ও অতিরিক্ত ব্যবহারের পরিসংখ্যান পেতে CarWatchdogManager.FLAG_RESOURCE_OVERUSE_IO
পতাকাটি পাস করুন।
private void getResourceOveruseStats() { CarWatchdogManager manager = (CarWatchdogManager) car.getCarManager(Car.CAR_WATCHDOG_SERVICE); // Returns resource overuse stats with I/O overuse stats for the past // 7 days. Stats are available for up to the past 30 days. ResourceOveruseStats resourceOveruseStats = mCarWatchdogManager.getResourceOveruseStats( CarWatchdogManager.FLAG_RESOURCE_OVERUSE_IO, CarWatchdogManager.STATS_PERIOD_PAST_7_DAYS); IoOveruseStats ioOveruseStats = resourceOveruseStats.getIoOveruseStats(); // Stats period - [ioOveruseStats.getStartTime(), ioOveruseStats.getStartTime() // + ioOveruseStats.getDurationInSeconds()] // Total I/O overuses - ioOveruseStats.getTotalOveruses() // Total bytes written - ioOveruseStats.getTotalBytesWritten() // Remaining write bytes for the UTC calendar day - // ioOveruseStats.getRemainingWriteBytes() }
নেটিভ ক্লায়েন্ট
রিসোর্সকে অতিরিক্ত ব্যবহারের পরিসংখ্যান পেতে CarWatchdogServer.getResourceOveruseStats
ব্যবহার করুন। ডিস্ক আই/ও অতিরিক্ত ব্যবহারের পরিসংখ্যান আনতে ResourceType.IO
এনামটি পাস করুন।
void getResourceOveruseStats() { ndk::SpAIBinder binder(AServiceManager_getService( "android.automotive.watchdog.ICarWatchdog/default")); std::shared_ptr<ICarWatchdog> server = ICarWatchdog::fromBinder(binder); // Returns the stats only for the current UTC calendar day. const std::vector<ResourceOveruseStats> resourceOveruseStats; ndk::ScopedAStatus status = server.getResourceOveruseStats( std::vector<int>{ResourceType.IO}, &resourceOveruseStats); if (!status.isOk()) { // Failed to get the resource overuse stats. return; } for (const auto& stats : resourceOveruseStats) { if (stats.getTag() != ResourceOveruseStats::ioOveruseStats) { continue; } const IoOveruseStats& ioOveruseStats = stats.get(); // Stats period - [ioOveruseStats.startTime, // ioOveruseStats.startTime + ioOveruseStats.durationInSeconds] // Total I/O overuses - ioOveruseStats.totalOveruses // Total bytes written - ioOveruseStats.writtenBytes // Remaining write bytes for the current UTC calendar day - // ioOveruseStats.remainingWriteBytes } }
রিসোর্স অতিরিক্ত ব্যবহারকারীর অভিজ্ঞতা
নিম্নলিখিত বিভাগগুলি যখন রিসোর্স অতিরিক্ত ব্যবহার ঘটে তখন ব্যবহারকারীর অভিজ্ঞতা বর্ণনা করে।
অ্যাপ্লিকেশন পারফরম্যান্স সেটিংকে অগ্রাধিকার দিন
অ্যাপ্লিকেশন সেটিংস পৃষ্ঠায় Prioritize app performance
জন্য সেটিংস রয়েছে (নীচের চিত্রটি দেখুন), যা ব্যবহারকারীদের সিস্টেমের চেয়ে অ্যাপ্লিকেশনটির কার্যকারিতা এবং দীর্ঘমেয়াদী হার্ডওয়্যার পারফরম্যান্সকে অগ্রাধিকার দিতে দেয়। এই সেটিংটি কেবলমাত্র এমন অ্যাপ্লিকেশনগুলির জন্য উপলব্ধ যা সংস্থান অতিরিক্ত ব্যবহারের উপর সমাপ্ত হওয়া নিরাপদ। অন্যথায়, এই সেটিংটি অক্ষম। যখন কোনও অ্যাপ্লিকেশনটির জন্য এই সেটিংটি টগল করা (ডিফল্ট সেটিংস) বন্ধ করা হয়, তখন অ্যাপ্লিকেশনটি রিসোর্স অতিরিক্ত ব্যবহারের উপর সমাপ্ত করা যায়। অন্যথায়, অ্যাপ্লিকেশনটি রিসোর্স অতিরিক্ত ব্যবহারের উপর সমাপ্ত হয় না।
যখন ব্যবহারকারী এই সেটিংটিতে টগল করে, নিম্নলিখিত নিশ্চিতকরণ ডায়ালগটি সেটিংসে টগলিংয়ের প্রভাবগুলি বর্ণনা করে:
90 দিনের পরে, এই সেটিংটি স্বয়ংক্রিয়ভাবে ডিফল্টটিতে পুনরায় সেট করা হয়। দিনের সীমাটি সর্বাধিক 180 দিন পর্যন্ত watchdogUserPackageSettingsResetDays
ব্যবহার করে একটি আরআরও ওভারলে অ্যাপ্লিকেশন দিয়ে সংশোধন করা যেতে পারে। আরও জানতে, রানটাইমে কোনও অ্যাপের সংস্থানগুলির মান পরিবর্তন করুন । নিম্নলিখিত উদাহরণ ওভারলে ট্যাগটি AndroidManifest.xml
অন্তর্ভুক্ত করা যেতে পারে:
<overlay android:priority="<insert-value>" android:targetPackage="com.android.car.updatable" android:targetName="CarServiceCustomization" android:resourcesMap="@xml/overlays" />
res/values/config.xml
:
<resources> <integer name="watchdogUserPackageSettingsResetDays">value</integer> </resources>
res/xml/overlays.xml
:
<overlay> <item target="integer/watchdogUserPackageSettingsResetDays" value="@integer/watchdogUserPackageSettingsResetDays" /> </overlay>
পারফরম্যান্স-প্রভাব অ্যাপ্লিকেশন সেটিং
সেটিংস অ্যাপ্লিকেশনটিতে একটি পারফরম্যান্স-প্রভাবিত অ্যাপ্লিকেশন বিভাগ রয়েছে (চিত্র 1 দেখুন)। যখন ট্যাপ করা হয়, ফ্ল্যাশ মেমরি অতিরিক্ত ব্যবহারের কারণে সীমাবদ্ধ থাকা অ্যাপ্লিকেশনগুলির একটি তালিকা এবং এটি নেতিবাচকভাবে প্রভাবিত করে সিস্টেমের কার্যকারিতা প্রদর্শিত হয়। এটি সিডিডি 3.5.1 প্রয়োজনীয়তা অনুসরণ করে [সি -1-1] ।
চিত্র 1। পারফরম্যান্স-প্রভাবিত অ্যাপ্লিকেশন।
রিসোর্স অতিরিক্ত ব্যবহারের কারণে সমাপ্ত অ্যাপ্লিকেশনগুলি এখানে তালিকাভুক্ত করা হয়েছে (চিত্র 2 দেখুন)। তালিকাভুক্ত অ্যাপ্লিকেশনগুলি অগ্রাধিকার দেওয়া যেতে পারে। আরও জানতে, অ্যাপের পারফরম্যান্স সেটিংটিকে অগ্রাধিকার দিন ।
চিত্র 2। রিসোর্স অতিরিক্ত ব্যবহারের কারণে সমাপ্ত অ্যাপ্লিকেশনগুলির তালিকা।
ব্যবহারকারীর বিজ্ঞপ্তি
যখন কোনও অ্যাপ্লিকেশন বা পরিষেবা বারবার ডিস্ক আই/ওকে অতিরিক্ত ব্যবহার করে (উদাহরণস্বরূপ, সংজ্ঞায়িত থ্রেশহোল্ডগুলি ছাড়িয়ে ডিস্ককে ডেটা লেখেন) একটি নির্দিষ্ট সময়ের মধ্যে এবং রিসোর্স অতিরিক্ত ব্যবহারের উপর অবসান হওয়া নিরাপদ, ব্যবহারকারীকে অনুমতি-ডিস্ট্রাকশন স্টেটে প্রবেশের পরে ব্যবহারকারীকে অবহিত করা হয়।
প্রথম ব্যবহারকারী বিজ্ঞপ্তি (একটি ড্রাইভ চলাকালীন) হেড-আপ বিজ্ঞপ্তি হিসাবে পোস্ট করা হয় এবং অন্যান্য বিজ্ঞপ্তিগুলি বিজ্ঞপ্তি কেন্দ্রে পোস্ট করা হয়।
উদাহরণস্বরূপ, যখন কোনও অ্যাপ্লিকেশন বারবার ডিস্ক আই/ওকে অতিরিক্ত ব্যবহার করে, তখন ব্যবহারকারী নিম্নলিখিত বিজ্ঞপ্তি পান:
- ব্যবহারকারী যখন অগ্রাধিকার অ্যাপ্লিকেশন বোতামে ক্লিক করেন, তখন অ্যাপের সেটিংস পৃষ্ঠাটি চালু করা হয়, যেখানে ব্যবহারকারী অ্যাপ পারফরম্যান্স সেটিংটিকে অগ্রাধিকার দেওয়া বা বন্ধ করতে পারেন।
- যখন ব্যবহারকারী অ্যাপল অ্যাপ্লিকেশন বোতামে ক্লিক করেন, ব্যবহারকারী অ্যাপটি চালু না করা বা অ্যাপের সেটিংস পৃষ্ঠায় এটি সক্ষম না করা পর্যন্ত অ্যাপ্লিকেশনটি অক্ষম করা হয়।
- আনইনস্টলযোগ্য অ্যাপ্লিকেশনগুলির জন্য, অক্ষম অ্যাপ্লিকেশন বোতামটি আনইনস্টল অ্যাপ বোতামের সাথে প্রতিস্থাপন করা হয়েছে। ব্যবহারকারী যখন আনইনস্টল অ্যাপ বোতামে ক্লিক করেন, তখন অ্যাপের সেটিংস পৃষ্ঠাটি চালু করা হয়, যা থেকে ব্যবহারকারী অ্যাপটি আনইনস্টল করতে পারে।
লঞ্চার বাস্তবায়নের জন্য সুপারিশ
রিসোর্স অতিরিক্ত ব্যবহারের কারণে যখন অ্যাপ্লিকেশনগুলি অক্ষম করা হয়, তখন অ্যাপ্লিকেশনগুলি ডিফল্ট লঞ্চার অ্যাপ্লিকেশন থেকে অদৃশ্য হয়ে যায় কারণ কার সার্ভিস অ্যাপস সক্ষম রাষ্ট্রকে PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED
হিসাবে আপডেট করে com এই অ্যাপ্লিকেশনগুলিকে অস্বাভাবিক হিসাবে প্রদর্শন করতে OEMs অবশ্যই বিল্টিন লঞ্চার বাস্তবায়ন আপডেট করতে হবে, যাতে ব্যবহারকারীরা প্রয়োজনে সেগুলি ব্যবহার করতে পারেন। বিল্ড রিলিজের ভিত্তিতে নিম্নলিখিত সুপারিশগুলি দেখুন।
অ্যান্ড্রয়েড এসসি ভি 2 রিলিজ
- লঞ্চার বাস্তবায়নটি লঞ্চারে দেখানোর জন্য প্যাকেজগুলির তালিকা পুনরুদ্ধার করার সময়
MATCH_DISABLED_UNTIL_USED_COMPONENTS
পতাকা ব্যবহার করা উচিত। - ব্যবহারকারী যখন
PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED
রাজ্যে থাকা কোনও অ্যাপ্লিকেশন ক্লিক করেন, তখন লঞ্চার অ্যাপ্লিকেশনটি অবশ্যই সক্ষম রাষ্ট্রটি সেট করে অ্যাপটি সক্ষম করতে হবে: