রানটাইমে একটি অ্যাপের সম্পদের মান পরিবর্তন করুন

রানটাইম রিসোর্স ওভারলে (RRO) হলো এমন একটি প্যাকেজ যা রানটাইমে কোনো টার্গেট প্যাকেজের রিসোর্স ভ্যালু পরিবর্তন করে। উদাহরণস্বরূপ, সিস্টেম ইমেজে ইনস্টল করা একটি অ্যাপ কোনো রিসোর্সের ভ্যালুর ওপর ভিত্তি করে তার আচরণ পরিবর্তন করতে পারে। বিল্ড টাইমে রিসোর্স ভ্যালু হার্ডকোড করার পরিবর্তে, ভিন্ন পার্টিশনে ইনস্টল করা একটি RRO রানটাইমে অ্যাপটির রিসোর্সগুলোর ভ্যালু পরিবর্তন করতে পারে।

RRO-গুলো সক্রিয় বা নিষ্ক্রিয় করা যায়। রিসোর্স ভ্যালু পরিবর্তন করার জন্য একটি RRO-এর ক্ষমতা চালু/বন্ধ করতে আপনি প্রোগ্রাম্যাটিকভাবে এর সক্রিয়/নিষ্ক্রিয় অবস্থা নির্ধারণ করতে পারেন। RRO-গুলো ডিফল্টরূপে নিষ্ক্রিয় থাকে (তবে, স্ট্যাটিক RRO-গুলো ডিফল্টরূপে সক্রিয় থাকে)।

ওভারলে রিসোর্স

ওভারলে প্যাকেজে সংজ্ঞায়িত রিসোর্সগুলোকে টার্গেট প্যাকেজে সংজ্ঞায়িত রিসোর্সগুলোর সাথে ম্যাপ করার মাধ্যমে ওভারলে কাজ করে। যখন কোনো অ্যাপ টার্গেট প্যাকেজের কোনো রিসোর্সের মান রিজলভ করার চেষ্টা করে, তখন তার পরিবর্তে সেই ওভারলে রিসোর্সের মানটি রিটার্ন করা হয়, যেটির সাথে টার্গেট রিসোর্সটি ম্যাপ করা আছে।

ম্যানিফেস্ট সেট আপ করুন

একটি প্যাকেজকে RRO প্যাকেজ হিসেবে গণ্য করা হয়, যদি তাতে <manifest> ট্যাগের চাইল্ড হিসেবে একটি <overlay> ট্যাগ থাকে।

  • প্রয়োজনীয় android:targetPackage অ্যাট্রিবিউটের মান সেই প্যাকেজের নাম নির্দিষ্ট করে, যার উপর RRO ওভারলে করতে চায়।

  • ঐচ্ছিক android:targetName অ্যাট্রিবিউটের মান টার্গেট প্যাকেজের রিসোর্সের সেই ওভারলেযোগ্য উপসেটের নাম নির্দিষ্ট করে, যার উপর RRO ওভারলে করতে চায়। যদি টার্গেট কোনো ওভারলেযোগ্য রিসোর্স সেট সংজ্ঞায়িত না করে, তবে এই অ্যাট্রিবিউটটি থাকা উচিত নয়।

নিম্নলিখিত কোডটি AndroidManifest.xml একটি উদাহরণ ওভারলে দেখাচ্ছে।

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.overlay">
    <application android:hasCode="false" />
    <overlay android:targetPackage="com.example.target"
                   android:targetName="OverlayableResources"/>
</manifest>

ওভারলে কোডের উপর ওভারলে করতে পারে না, তাই সেগুলোতে DEX ফাইল থাকতে পারে না। এছাড়াও, ম্যানিফেস্টের <application > ট্যাগের android:hasCode অ্যাট্রিবিউটটি অবশ্যই false সেট করতে হবে।

সম্পদ মানচিত্র সংজ্ঞায়িত করুন

অ্যান্ড্রয়েড ১১ বা তার পরবর্তী সংস্করণে, ওভারলে রিসোর্স ম্যাপ নির্ধারণ করার জন্য প্রস্তাবিত পদ্ধতি হলো: ওভারলে প্যাকেজের res/xml ডিরেক্টরিতে একটি ফাইল তৈরি করা, যে টার্গেট রিসোর্সগুলোকে ওভারলে করা হবে এবং সেগুলোর প্রতিস্থাপন মান তালিকাভুক্ত করা, এবং তারপর <overlay> ম্যানিফেস্ট ট্যাগের android:resourcesMap অ্যাট্রিবিউটের মান হিসেবে রিসোর্স ম্যাপিং ফাইলের একটি রেফারেন্স সেট করা।

নিম্নলিখিত কোডটি res/xml/overlays.xml ফাইলের একটি উদাহরণ দেখাচ্ছে।

<?xml version="1.0" encoding="utf-8"?>
<overlay xmlns:android="http://schemas.android.com/apk/res/android" >
    <!-- Overlays string/config1 and string/config2 with the same resource. -->
    <item target="string/config1" value="@string/overlay1" />
    <item target="string/config2" value="@string/overlay1" />

    <!-- Overlays string/config3 with the string "yes". -->
    <item target="string/config3" value="@android:string/yes" />

    <!-- Overlays string/config4 with the string "Hardcoded string". -->
    <item target="string/config4" value="Hardcoded string" />

    <!-- Overlays integer/config5 with the integer "42". -->
    <item target="integer/config5" value="42" />
</overlay>

নিম্নলিখিত কোডটি একটি উদাহরণ ওভারলে ম্যানিফেস্ট দেখাচ্ছে।

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.overlay">
    <application android:hasCode="false" />
    <overlay android:targetPackage="com.example.target"
                   android:targetName="OverlayableResources"
                   android:resourcesMap="@xml/overlays"/>
</manifest>

প্যাকেজটি তৈরি করুন

অ্যান্ড্রয়েড ১১ বা তার উচ্চতর সংস্করণ ওভারলে-এর জন্য একটি সুং বিল্ড রুল সমর্থন করে, যা অ্যান্ড্রয়েড অ্যাসেট প্যাকেজিং টুল ২ (AAPT2)-কে একই মানের রিসোর্সের কনফিগারেশন ডিডুপ করার চেষ্টা ( --no-resource-deduping ) এবং ডিফল্ট কনফিগারেশন ছাড়া রিসোর্স অপসারণ ( --no-resource-removal ) করা থেকে বিরত রাখে। নিম্নলিখিত কোডটি একটি উদাহরণ Android.bp ফাইল দেখাচ্ছে।

runtime_resource_overlay {
    name: "ExampleOverlay",
    sdk_version: "current",
}

সম্পদ সমাধান করুন

যদি কোনো টার্গেট রিসোর্স বা ওভারলে রিসোর্সের জন্য একাধিক কনফিগারেশন সংজ্ঞায়িত থাকে, তাহলে রিসোর্স রানটাইম সেই কনফিগারেশনের মান ফেরত দেয় যা ডিভাইস কনফিগারেশনের সাথে সবচেয়ে ভালোভাবে মেলে। কোন কনফিগারেশনটি সবচেয়ে ভালোভাবে মেলে তা নির্ধারণ করতে, ওভারলে রিসোর্স কনফিগারেশনের সেটটিকে টার্গেট রিসোর্স কনফিগারেশনের সেটের সাথে মার্জ করুন এবং তারপর সাধারণ রিসোর্স রেজোলিউশন ফ্লো অনুসরণ করুন (বিস্তারিত জানতে, "অ্যান্ড্রয়েড কীভাবে সবচেয়ে ভালোভাবে মেলে এমন রিসোর্স খুঁজে বের করে" দেখুন)।

উদাহরণস্বরূপ, যদি একটি ওভারলে drawable-en কনফিগারেশনের জন্য একটি মান নির্ধারণ করে এবং টার্গেট drawable-en-port এর জন্য একটি মান নির্ধারণ করে, তবে ` drawable-en-port সাথে ভালো মিল থাকায় রানটাইমে টার্গেট কনফিগারেশন drawable-en-port এর মানটিই বেছে নেওয়া হয়। সমস্ত ` drawable-en কনফিগারেশনকে ওভারলে করার জন্য, টার্গেট দ্বারা নির্ধারিত প্রতিটি drawable-en কনফিগারেশনের জন্য ওভারলেটিকে অবশ্যই একটি মান নির্ধারণ করতে হবে।

ওভারলেগুলো তাদের নিজস্ব রিসোর্স রেফারেন্স করতে পারে, এবং অ্যান্ড্রয়েডের বিভিন্ন রিলিজের মধ্যে এর আচরণে ভিন্নতা দেখা যায়।

  • অ্যান্ড্রয়েড ১১ বা তার পরবর্তী সংস্করণগুলোতে, প্রতিটি ওভারলের নিজস্ব সংরক্ষিত রিসোর্স আইডি স্পেস থাকে যা টার্গেট রিসোর্স আইডি স্পেস বা অন্য কোনো ওভারলের রিসোর্স আইডি স্পেসের সাথে ওভারল্যাপ করে না, ফলে নিজেদের রিসোর্স রেফারেন্সকারী ওভারলেগুলো প্রত্যাশিতভাবেই কাজ করে।

  • অ্যান্ড্রয়েড ১০ বা তার নিচের সংস্করণগুলোতে, ওভারলে এবং টার্গেট প্যাকেজগুলো একই রিসোর্স আইডি স্পেস শেয়ার করে, যার ফলে @type/name সিনট্যাক্স ব্যবহার করে নিজেদের রিসোর্স রেফারেন্স করার চেষ্টার সময় সংঘর্ষ এবং অপ্রত্যাশিত আচরণ ঘটতে পারে।

ওভারলেগুলি সক্ষম/অক্ষম করুন

ওভারলেগুলি ম্যানুয়ালি এবং প্রোগ্রাম্যাটিকভাবে সক্রিয়/নিষ্ক্রিয় করা যেতে পারে।

ম্যানুয়ালি ওভারলে নিষ্ক্রিয় বা সক্রিয় করুন

একটি RRO ম্যানুয়ালি সক্রিয় এবং যাচাই করতে, চালান:

adb shell cmd overlay enable --user current com.example.carrro
adb shell cmd overlay list --user current | grep -i com.example com.example.carrro

এটি সিস্টেম ইউজারের ( userId = 0 ) জন্য RRO সক্রিয় করে, যিনি SystemUI-এর মালিক। এই নির্দেশনাটি ফোরগ্রাউন্ড ইউজারের ( userId = 10 ) দ্বারা চালু করা অ্যাপগুলিকে প্রভাবিত করে না। ফোরগ্রাউন্ড ইউজারের জন্য RRO সক্রিয় করতে, -–user 10 প্যারামিটারটি ব্যবহার করুন:

adb shell cmd overlay enable --user 10 com.example.carrro

প্রোগ্রামের মাধ্যমে ওভারলেগুলি সক্রিয় বা নিষ্ক্রিয় করুন

পরিবর্তনযোগ্য ওভারলে সক্রিয় এবং নিষ্ক্রিয় করতে OverlayManager API ব্যবহার করুন ( Context#getSystemService(Context.OVERLAY_SERVICE) ব্যবহার করে API ইন্টারফেসটি পুনরুদ্ধার করুন)। একটি ওভারলে শুধুমাত্র তার টার্গেট প্যাকেজ অথবা android.permission.CHANGE_OVERLAY_PACKAGES পারমিশনযুক্ত কোনো প্যাকেজ দ্বারা সক্রিয় করা যেতে পারে। যখন একটি ওভারলে সক্রিয় বা নিষ্ক্রিয় করা হয়, তখন কনফিগারেশন পরিবর্তনের ইভেন্টগুলো টার্গেট প্যাকেজে ছড়িয়ে পড়ে এবং টার্গেট অ্যাক্টিভিটিগুলো পুনরায় চালু হয়।

ওভারলেযোগ্য রিসোর্স সীমাবদ্ধ করুন

অ্যান্ড্রয়েড ১০ বা তার উচ্চতর সংস্করণে, <overlayable> XML ট্যাগটি এমন কিছু রিসোর্স প্রকাশ করে, যেগুলোর উপর RRO-গুলো ওভারলে করতে পারে। নিচের উদাহরণ res/values/overlayable.xml ফাইলটিতে, string/foo এবং integer/bar হলো ডিভাইসের বাহ্যিক রূপ থিমিং করার জন্য ব্যবহৃত রিসোর্স; এই রিসোর্সগুলোকে ওভারলে করতে হলে, একটি ওভারলেকে অবশ্যই নাম দিয়ে ওভারলেযোগ্য রিসোর্সগুলোর সংগ্রহকে স্পষ্টভাবে টার্গেট করতে হবে।

<!-- The collection of resources for theming the appearance of the device -->
<overlayable name="ThemeResources">
       <policy type="public">
               <item type="string" name="foo/" />
               <item type="integer" name="bar/" />
       </policy>
       ...
</overlayable>

একটি APK একাধিক <overlayable> ট্যাগ সংজ্ঞায়িত করতে পারে, কিন্তু প্যাকেজের মধ্যে প্রতিটি ট্যাগের একটি অনন্য নাম থাকতে হবে। উদাহরণস্বরূপ, এটি হলো:

  • দুটি ভিন্ন প্যাকেজ উভয়ের জন্যই <overlayable name="foo"> সংজ্ঞায়িত করা ঠিক আছে।

  • একটিমাত্র APK-তে দুটি <overlayable name="foo"> ব্লক থাকা গ্রহণযোগ্য নয়।

নিম্নলিখিত কোডটিতে AndroidManifest.xml ফাইলে একটি ওভারলের উদাহরণ দেখানো হয়েছে।

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
       package="com.my.theme.overlay">
       <application android:hasCode="false" />
       <!-- This overlay will override the ThemeResources resources -->
       <overlay android:targetPackage="android" android:targetName="ThemeResources">
</manifest>

যখন কোনো অ্যাপ একটি <overlayable> ট্যাগ সংজ্ঞায়িত করে, তখন সেই অ্যাপটিকে লক্ষ্য করে তৈরি ওভারলেগুলো:

  • অবশ্যই targetName উল্লেখ করতে হবে।

  • শুধুমাত্র <overlayable> ট্যাগের মধ্যে তালিকাভুক্ত রিসোর্সগুলোই ওভারলে করা যাবে।

  • শুধুমাত্র একটি <overlayable> নাম টার্গেট করা যাবে।

আপনি এমন কোনো প্যাকেজকে টার্গেট করে ওভারলে সক্রিয় করতে পারবেন না, যেটি ওভারলেযোগ্য রিসোর্স প্রকাশ করে কিন্তু কোনো নির্দিষ্ট <overlayable> ট্যাগকে টার্গেট করার জন্য android:targetName ব্যবহার করে না।

নীতিমালা সীমাবদ্ধ করুন

ওভারলেযোগ্য রিসোর্সের উপর বিধিনিষেধ আরোপ করতে <policy> ট্যাগ ব্যবহার করুন। type অ্যাট্রিবিউটটি নির্দিষ্ট করে যে, অন্তর্ভুক্ত রিসোর্সগুলোকে ওভাররাইড করার জন্য একটি ওভারলেকে কোন কোন পলিসি অবশ্যই পূরণ করতে হবে। সমর্থিত টাইপগুলো হলো নিম্নলিখিতগুলো।

  • public । যেকোনো ওভারলে রিসোর্সটিকে ওভাররাইড করতে পারে।
  • system পার্টিশনের উপর যেকোনো ওভারলে রিসোর্সগুলোকে ওভাররাইড করতে পারে।
  • vendor । ভেন্ডর পার্টিশনের উপর যেকোনো ওভারলে রিসোর্সগুলোকে ওভাররাইড করতে পারে।
  • product । পণ্য পার্টিশনের উপর থাকা যেকোনো ওভারলে রিসোর্সগুলোকে ওভাররাইড করতে পারে।
  • oem পার্টিশনের উপর থাকা যেকোনো ওভারলে রিসোর্সগুলোকে ওভাররাইড করতে পারে।
  • odm পার্টিশনের উপর থাকা যেকোনো ওভারলে রিসোর্সগুলোকে ওভাররাইড করতে পারে।
  • signature । টার্গেট APK-এর মতো একই স্বাক্ষর দ্বারা স্বাক্ষরিত যেকোনো ওভারলে রিসোর্সগুলোকে ওভাররাইড করতে পারে।
  • actorঅ্যাক্টর APK-এর মতো একই সিগনেচার দিয়ে স্বাক্ষরিত যেকোনো ওভারলে রিসোর্সগুলোকে ওভাররাইড করতে পারে। অ্যাক্টরটিকে সিস্টেম কনফিগের named-actor ট্যাগে ডিক্লেয়ার করা হয়।
  • config_signature . overlay-config apk-এর মতো একই সিগনেচার দিয়ে স্বাক্ষরিত যেকোনো ওভারলে রিসোর্সগুলোকে ওভাররাইড করতে পারে। overlay-config-টি সিস্টেম কনফিগের overlay-config-signature ট্যাগে ডিক্লেয়ার করা হয়।

নিম্নলিখিত কোডটি res/values/overlayable.xml ফাইলে একটি <policy> ট্যাগের উদাহরণ দেখাচ্ছে।

<overlayable name="ThemeResources">
   <policy type="vendor" >
       <item type="string" name="foo" />
   </policy>
   <policy type="product|signature"  >
       <item type="string" name="bar" />
       <item type="string" name="baz" />
   </policy>
</overlayable>

একাধিক পলিসি নির্দিষ্ট করতে, বিভাজক অক্ষর হিসেবে উল্লম্ব বার (|) ব্যবহার করুন। একাধিক পলিসি নির্দিষ্ট করা হলে, <policy> ট্যাগের মধ্যে তালিকাভুক্ত রিসোর্সগুলিকে ওভাররাইড করার জন্য একটি ওভারলেকে শুধুমাত্র একটি পলিসি পূরণ করতে হবে।

ওভারলে কনফিগার করুন

অ্যান্ড্রয়েড রিলিজ সংস্করণের উপর নির্ভর করে ওভারলেগুলির পরিবর্তনযোগ্যতা, ডিফল্ট অবস্থা এবং অগ্রাধিকার কনফিগার করার জন্য বিভিন্ন প্রক্রিয়া সমর্থন করে।

  • অ্যান্ড্রয়েড ১১ বা তার উচ্চতর সংস্করণে চালিত ডিভাইসগুলো ম্যানিফেস্ট অ্যাট্রিবিউটের পরিবর্তে একটি OverlayConfig ফাইল ( config.xml ) ব্যবহার করতে পারে। ওভারলে ব্যবহারের জন্য ওভারলে ফাইল ব্যবহার করাই প্রস্তাবিত পদ্ধতি।

  • সমস্ত ডিভাইস স্ট্যাটিক RRO কনফিগার করার জন্য ম্যানিফেস্ট অ্যাট্রিবিউট ( android:isStatic এবং android:priority ) ব্যবহার করতে পারে।

OverlayConfig ব্যবহার করুন

অ্যান্ড্রয়েড ১১ বা তার পরবর্তী সংস্করণে, আপনি ওভারলে-এর পরিবর্তনযোগ্যতা, ডিফল্ট অবস্থা এবং অগ্রাধিকার কনফিগার করতে OverlayConfig ব্যবহার করতে পারেন। একটি ওভারলে কনফিগার করার জন্য, partition/overlay/config/config.xml এ অবস্থিত ফাইলটি তৈরি বা পরিবর্তন করুন, যেখানে partition হলো যে ওভারলে-টি কনফিগার করতে হবে তার পার্টিশন। কনফিগার করার জন্য, একটি ওভারলে-কে অবশ্যই সেই পার্টিশনের overlay/ ডিরেক্টরিতে থাকতে হবে যেখানে ওভারলে-টি কনফিগার করা হচ্ছে। নিচের কোডটি product/overlay/config/config.xml একটি উদাহরণ দেখাচ্ছে।

<config>
    <merge path="OEM-common-rros-config.xml" />
    <overlay package="com.oem.overlay.device" mutable="false" enabled="true" />
    <overlay package="com.oem.green.theme" enabled="true" />
</config>"

<overlay> ট্যাগের জন্য একটি package অ্যাট্রিবিউট প্রয়োজন, যা নির্দেশ করে কোন ওভারলে প্যাকেজটি কনফিগার করা হচ্ছে। ঐচ্ছিক enabled অ্যাট্রিবিউটটি নিয়ন্ত্রণ করে যে ওভারলেটি ডিফল্টরূপে সক্রিয় থাকবে কি না (ডিফল্ট হলো false )। ঐচ্ছিক mutable অ্যাট্রিবিউটটি নিয়ন্ত্রণ করে যে ওভারলেটি পরিবর্তনযোগ্য কি না এবং রানটাইমে প্রোগ্রাম্যাটিকভাবে এর সক্রিয় অবস্থা পরিবর্তন করা যাবে কি না (ডিফল্ট হলো true )। যে ওভারলেগুলো কোনো কনফিগারেশন ফাইলে তালিকাভুক্ত নয়, সেগুলো পরিবর্তনযোগ্য এবং ডিফল্টরূপে নিষ্ক্রিয় থাকে।

ওভারলে অগ্রাধিকার

যখন একাধিক ওভারলে একই রিসোর্সকে ওভাররাইড করে, তখন ওভারলেগুলোর ক্রম গুরুত্বপূর্ণ। একটি ওভারলের অগ্রাধিকার সেইসব ওভারলেগুলোর চেয়ে বেশি, যেগুলোর কনফিগারেশন তার নিজের কনফিগারেশনের আগে থাকে। বিভিন্ন পার্টিশনে ওভারলেগুলোর অগ্রাধিকারের ক্রম (সর্বনিম্ন থেকে সর্বোচ্চ অগ্রাধিকার অনুসারে) নিম্নরূপ।

  • system
  • vendor
  • odm
  • oem
  • product
  • system_ext

ফাইলগুলি একত্রিত করুন

<merge> ট্যাগ ব্যবহার করে অন্যান্য কনফিগারেশন ফাইলকে এই কনফিগারেশন ফাইলের নির্দিষ্ট অবস্থানে মার্জ করা যায়। ট্যাগের ` path অ্যাট্রিবিউটটি ওভারলে কনফিগারেশন ফাইল ধারণকারী ডিরেক্টরির সাপেক্ষে মার্জ করার ফাইলের পাথ নির্দেশ করে।

ম্যানিফেস্ট অ্যাট্রিবিউট/স্ট্যাটিক RRO ব্যবহার করুন

অ্যান্ড্রয়েড ১০ বা তার নিচের সংস্করণগুলোতে, নিম্নলিখিত ম্যানিফেস্ট অ্যাট্রিবিউটগুলো ব্যবহার করে ওভারলে-র অপরিবর্তনীয়তা এবং অগ্রাধিকার কনফিগার করা হয়।

  • android:isStatic . যখন এই বুলিয়ান অ্যাট্রিবিউটের মান true সেট করা হয়, তখন ওভারলেটি ডিফল্টরূপে সক্রিয় থাকে এবং এটি অপরিবর্তনীয় হয়, যা ওভারলেটিকে নিষ্ক্রিয় করা থেকে বিরত রাখে।

  • android:priority . এই সাংখ্যিক অ্যাট্রিবিউটের মান (যা শুধুমাত্র স্ট্যাটিক ওভারলে-কে প্রভাবিত করে) একাধিক স্ট্যাটিক ওভারলে একই রিসোর্স ভ্যালুকে টার্গেট করলে ওভারলেটির অগ্রাধিকার নির্ধারণ করে। সংখ্যা যত বেশি হবে, অগ্রাধিকারও তত বেশি হবে।

নিম্নলিখিত কোডটিতে একটি AndroidManifest.xml উদাহরণ দেখানো হয়েছে।

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.overlay">
    <application android:hasCode="false" />
    <overlay android:targetPackage="com.example.target"
                   android:isStatic="true"
                   android:priority="5"/>
</manifest>

অ্যান্ড্রয়েড ১১-এর পরিবর্তনসমূহ

অ্যান্ড্রয়েড ১১ বা তার পরবর্তী সংস্করণে, যদি কোনো কনফিগারেশন ফাইল partition/overlay/config/config.xml এ অবস্থিত থাকে, তবে ওভারলেগুলো সেই ফাইল ব্যবহার করে কনফিগার করা হয় এবং সেই পার্টিশনে অবস্থিত ওভারলেগুলোর উপর android:isStaticandroid:priority কোনো প্রভাব থাকে না। যেকোনো পার্টিশনে একটি ওভারলে কনফিগারেশন ফাইল নির্ধারণ করলে, ওভারলে পার্টিশনের অগ্রাধিকার কার্যকর হয়।

এছাড়াও, অ্যান্ড্রয়েড ১১ বা তার উচ্চতর সংস্করণ থেকে প্যাকেজ ইনস্টলেশনের সময় পঠিত রিসোর্সগুলির মান প্রভাবিত করার জন্য স্ট্যাটিক ওভারলে ব্যবহার করার ক্ষমতাটি সরিয়ে দেওয়া হয়েছে। কম্পোনেন্টের সক্রিয় অবস্থা কনফিগার করে এমন বুলিয়ানের মান পরিবর্তন করার জন্য স্ট্যাটিক ওভারলে ব্যবহারের সাধারণ ক্ষেত্রে, <component-override> SystemConfig ট্যাগটি ব্যবহার করুন (যা অ্যান্ড্রয়েড ১১-এ নতুন)।

ডিবাগ ওভারলে

ম্যানুয়ালি ওভারলে সক্রিয়, নিষ্ক্রিয় এবং ডাম্প করতে, নিম্নলিখিত ওভারলে ম্যানেজার শেল কমান্ডটি ব্যবহার করুন।

adb shell cmd overlay

কোনো ব্যবহারকারীর নাম উল্লেখ না করে enable ব্যবহার করলে তা বর্তমান ব্যবহারকারীকে, অর্থাৎ সিস্টেম ব্যবহারকারীকে ( userId = 0 ), প্রভাবিত করে, যিনি সিস্টেম UI-এর মালিক। এটি ফোরগ্রাউন্ড ব্যবহারকারীকে ( userId = 10 ), যিনি অ্যাপগুলোর মালিক, প্রভাবিত করে না। ফোরগ্রাউন্ড ব্যবহারকারীর জন্য RRO সক্রিয় করতে, –-user 10 প্যারামিটারটি ব্যবহার করুন:

adb shell cmd overlay enable --user 10 com.example.carrro

OverlayManagerService টার্গেট প্যাকেজের রিসোর্স আইডিগুলোকে ওভারলে প্যাকেজের রিসোর্স আইডিগুলোর সাথে ম্যাপ করতে idmap2 ব্যবহার করে। তৈরি হওয়া আইডি ম্যাপিংগুলো /data/resource-cache/ -এ সংরক্ষিত থাকে। যদি আপনার ওভারলে সঠিকভাবে কাজ না করে, তাহলে /data/resource-cache/ আপনার ওভারলের জন্য সংশ্লিষ্ট idmap ফাইলটি খুঁজুন, তারপর নিম্নলিখিত কমান্ডটি চালান।

adb shell idmap2 dump --idmap-path [file]

এই কমান্ডটি নিচে দেখানো অনুযায়ী রিসোর্সগুলোর ম্যাপিং প্রিন্ট করে।

[target res id] - > [overlay res id] [resource name]
0x01040151 -> 0x01050001 string/config_dozeComponent
0x01040152 -> 0x01050002 string/config_dozeDoubleTapSensorType
0x01040153 -> 0x01050003 string/config_dozeLongPressSensorType