অ্যাপগুলি কাস্টমাইজ করুন

এখন যেহেতু কার UI লাইব্রেরির উপাদান এবং সংস্থানগুলি অ্যাপগুলিতে, এই অ্যাপগুলিকে কাস্টমাইজ করার জন্য, OEMগুলিকে অবশ্যই দুটি ওভারলে প্রদান করতে হবে:

  • বিল্ড-টাইম ওভারলে রানটাইম রিসোর্স ওভারলে (RROs) এর জন্য প্রয়োজনীয় কোনো সংস্থান যোগ করে। এটা অন্তর্ভুক্ত:

    • অঙ্কনযোগ্য
    • শৈলী (উদাহরণস্বরূপ, পাঠ্য উপস্থিতি)
    • শেয়ার করা সম্পদ (উদাহরণস্বরূপ, রং)
  • RRO ওভারলে ফোল্ডারে প্রতি টার্গেট অ্যাপে একটি RRO তৈরি করতে ব্যবহৃত সম্পদ রয়েছে। এই সম্পদগুলি শুধুমাত্র উল্লেখ করতে পারে:

    • একই RRO-এর মধ্যে সংজ্ঞায়িত মান (উদাহরণস্বরূপ, একটি রঙের জন্য এটি একটি হেক্সাডেসিমেল মান হবে)।
    • Android ফ্রেমওয়ার্ক সংস্থান (উদাহরণস্বরূপ, @android:color/accent )।
    • উপরের বিল্ড-টাইম ওভারলেতে সংজ্ঞায়িত একটি সংস্থান।

সাধারণ কাঠামো

প্রস্তাবিত কাস্টমাইজেশন ওভারলে গঠন নিম্নরূপ:

  • <path-to-OEM-overlays>/

    • overlay/framework/base/core/res/ । বিল্ড-টাইম ওভারলে রিসোর্স

    • rro/

      • Android.mk । এই ফোল্ডারে থাকা সংস্থানগুলির উপর ভিত্তি করে প্রতিটি লক্ষ্য প্যাকেজের জন্য RROs তৈরি করতে মেকফাইল ব্যবহার করা হয়।

      • AndroidManifest.xml । উপরের মেকফাইল দ্বারা ব্যবহৃত একটি ম্যানিফেস্ট ফাইল টেমপ্লেট।

      • res/ । সমস্ত টার্গেট অ্যাপে প্রয়োগ করার জন্য রানটাইম ওভারলে।

একক বিল্ড টার্গেটে তারা কতগুলি ব্র্যান্ড পরিচালনা করতে চায় তার উপর নির্ভর করে OEM-এর এই কাঠামোগুলির একটিরও বেশি থাকতে পারে (দেখুন একাধিক ব্র্যান্ড হ্যান্ডেল করুন )।

রানটাইম রিসোর্স ওভারলে

OEM ওভারলে ফোল্ডারের RRO ফোল্ডারে সমস্ত টার্গেট অ্যাপে প্রয়োগ করার জন্য সংস্থান থাকা উচিত। RRO-র যৌগিক সম্পদ ওভারলে করার ক্ষমতাকে প্রভাবিত করার সীমাবদ্ধতা রয়েছে। সংক্ষেপে, একটি RRO:

  • টার্গেট APK বা RRO-তে সংজ্ঞায়িত রিসোর্স শনাক্তকারীর উল্লেখ করা যাবে না । এর মানে হল যে RROগুলি নতুন শনাক্তকারী যেমন নতুন অঙ্কনযোগ্য, রঙ বা শৈলী যোগ করতে পারে না।

  • করতে পারা ফ্রেমওয়ার্কের মধ্যে সংজ্ঞায়িত সম্পদ শনাক্তকারীর উল্লেখ করুন, সেই সম্পদগুলিকে /frameworks/base/core/res বা বিল্ড-টাইম ওভারলে দ্বারা সংজ্ঞায়িত করা হয়েছে কিনা। এই শনাক্তকারীদের অবশ্যই android: name-space:

    • সর্বজনীন ডিভাইসডিফল্ট RRO-এর জন্য, android ব্যবহার করুন।
      উদাহরণস্বরূপ, @android:style/TextAppearance.DeviceDefault.Large

    • অন্য সকলের জন্য (অ-সর্বজনীন বা বিল্ড-টাইম ওভারলে এর মাধ্যমে যোগ করা সংস্থান), *android ব্যবহার করুন
      উদাহরণস্বরূপ, @*android/style:TextAppearance.OEM.Brand1.Title

সম্পদ ছাড়াও, RRO ফোল্ডারে থাকতে হবে:

  • AndroidManifest.xml । নীচের নমুনায়, RRO_PACKAGE_NAME এবং TARGET_PACKAGE_NAME হল মেকফাইলের স্থানধারক:

    <?xml version=“1.0” encoding=“utf-8”?>
    <manifest xmlns:android=“http://schemas.android.com/apk/res/android”
        package=“{{RRO_PACKAGE_NAME}}” />
        <application android:hasCode=“false” />
        <overlay android:priority=“10”
            android:targetPackage=“{{TARGET_PACKAGE_NAME}}”
            android:requiredSystemPropertyName=“ro.product.sku”
            android:requiredSystemPropertyValue=“<your-product-sku>” />
    </manifest>
    
  • Android.mk নিম্নলিখিত মেকফাইলের oem উপসর্গটিকে সংজ্ঞায়িত করে যা সমস্ত জেনারেট করা RRO-তে থাকবে।
      LOCAL_PATH := $(call my-dir)
      include $(CLEAR_VARS)
      CAR_UI_RRO_SET_NAME := oem
      CAR_UI_RESOURCE_DIR := $(LOCAL_PATH)/res
      CAR_UI_RRO_TARGETS := $(CAR_UI_RRO_PACKAGE_NAMES)
      include packages/apps/Car/libs/car-ui-lib/generate_rros.mk
      

RRO কনফিগার করুন

একটি নতুন কনফিগারেশন ফাইল সমর্থিত, overlayable.xml , যা আপনি অ্যাক্সেস নিয়ন্ত্রণ সংজ্ঞায়িত করতে ব্যবহার করতে পারেন। উদাহরণস্বরূপ, আপনি নির্দিষ্ট করতে পারেন কে সংস্থানগুলিকে ওভারলে করতে পারে সেইসাথে কোন সংস্থানগুলিকে ওভারলে করা যেতে পারে৷ ফলস্বরূপ, সংস্থানগুলিকে এখন বিভিন্ন উপায়ে গোষ্ঠীভুক্ত করা যেতে পারে যাতে সেগুলিকে বিভিন্ন RRO দ্বারা ওভারলেড করা যায়।

RRO অ্যাক্সেস নিয়ন্ত্রণ সেট আপ করতে:

  1. res/values ​​ফোল্ডারে, overlayable.xml তৈরি করুন।
  2. <overlayable> রিসোর্স ট্যাগ তৈরি করুন।
  3. <overlayable> ট্যাগের জন্য name বৈশিষ্ট্যটি সংজ্ঞায়িত করুন, যা প্যাকেজে অনন্য হতে হবে। প্রতিটি ওভারলে শুধুমাত্র একটি ওভারলেযোগ্য গোষ্ঠীকে লক্ষ্য করতে পারে।
  4. <overlayable> এর ভিতরে <policy> ট্যাগটি সংজ্ঞায়িত করুন।
  5. ওভারলেড করা যেতে পারে এমন সংস্থানগুলির গ্রুপগুলিকে সংজ্ঞায়িত করুন। যেমন:
      <resources>
          <overlayable name="OverlayableResources">
              <policy type="public">
                  <item type="string" name="app_title" />
              </policy>
          </overlayable>
      </resources>
      

আপনার RRO প্রকল্পে নিম্নলিখিত পরিবর্তনগুলি প্রয়োগ করতে:

  1. res/xml ফোল্ডারে, overlays.xml তৈরি করুন। overlay জন্য নীচের কোড নমুনা এন্ট্রি দেখুন.
  2. ওভাররাইড করা সম্পদ সংজ্ঞায়িত করুন.
  3. AndroidManifest.xml<overlay> ট্যাগে android:resourcesMap="@xml/overlays" যোগ করুন। উদাহরণস্বরূপ, নীচের কোড নমুনায়, <overlay> এর জন্য এন্ট্রি দেখুন।
  4. একটি স্ট্যাটিক ওভারলে এর জন্য android:isStatic=”true” সেট করুন। প্রতিটি ওভারলে ওভারলে করা যেতে পারে এমন গ্রুপগুলির মধ্যে শুধুমাত্র একটিকে লক্ষ্য করতে পারে।

নিম্নলিখিত উদাহরণ বিবেচনা করুন. প্রথম বিভাগটি AndroidManifest.xml এর অন্তর্গত যেখানে দ্বিতীয় বিভাগটি overlays.xml এর সাথে সম্পর্কিত।

  <manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.android.car.ui.rro"
      android:versionCode="1"
      android:versionName="1.0">
      <overlay android:targetName="OverlayableResources"
               android:resourcesMap="@xml/overlays"
               android:targetPackage="com.android.car.ui"
               android:priority="1"
               android:isStatic="false" />
  </manifest>
  <overlay>
      <item target="string/app_title" value="@ string/app_title" />
  </overlay>
  

একটি সতর্কতার সাথে, পূর্বে বিদ্যমান আরআরওগুলি Android 10-এ কাজ করে। সতর্কতা হল প্যাকেজম্যানেজারআরআরও-এর সাথে ইনস্টল করার জন্য, প্যাকেজগুলিকে হয় আগে থেকে ইনস্টল করতে হবে বা লক্ষ্য অ্যাপের মতো একই কী দিয়ে স্বাক্ষর করতে হবে। অ্যান্ড্রয়েড 10-এ, লেআউট ফাইলগুলি ওভারলেড করা যেতে পারে। যাইহোক, এটি করার জন্য findViewById() এর পরিবর্তে ভিউ পাওয়ার সময় requireViewById() ব্যবহার করতে হবে। অ্যান্ড্রয়েড 10-এ, লেআউট ওভারলে সমর্থন করার জন্য এই পরিবর্তনটি car-ui-lib-এ প্রয়োগ করা হয়েছে।

অ্যান্ড্রয়েডের পরবর্তী বড় রিলিজ আপনাকে একটি লেআউট ফাইল ওভারলে করতে এবং RRO প্যাকেজে নতুন সংস্থান সংজ্ঞায়িত করতে এবং অভ্যন্তরীণভাবে তাদের উল্লেখ করতে সক্ষম করবে।

OEM-নির্দিষ্ট সংস্থান যোগ করুন

RRO সীমাবদ্ধতাগুলি কাটিয়ে উঠতে যা OEM সংস্থানগুলিকে যুক্ত হতে বাধা দেয়:

  • বিল্ড-টাইম ওভারলে ব্যবহার করে ফ্রেমওয়ার্ক/বেস প্রসারিত করুন, যেকোনো প্রয়োজনীয় সংস্থান যোগ করুন।
  • *android: নেমস্পেসিং ব্যবহার করে OEM RROs থেকে এই সংস্থানগুলি দেখুন।

উদাহরণস্বরূপ, নিম্নলিখিতটি একটি OEM নির্দিষ্ট অঙ্কনযোগ্য যোগ করার এবং এটি একটি RRO-তে ব্যবহার করার একটি উপায়:

  • <path-to-OEM-overlays>

    • overlay/framework/base/core/res/res/drawable/

      • oem_background_drawable.xml

    • rro/res/values

      • drawables.xml

        <resources>
            <item type="drawable" name="car_ui_toolbar_background">
                @*android:drawable/oem_background_drawable
            </item>
        </resources>
        

একাধিক ব্র্যান্ড হ্যান্ডেল

RRO ম্যানিফেস্ট ফাইলগুলির একটি সিনট্যাক্স থাকে যাতে সেগুলিকে সিস্টেমের বৈশিষ্ট্যের উপর ভিত্তি করে শর্তসাপেক্ষে প্রয়োগ করা যায়৷ একটি একক সিস্টেম ইমেজে একাধিক ব্র্যান্ড পরিচালনা করতে, OEMগুলি এটিকে নিম্নরূপ ব্যবহার করতে পারে ( সাধারণ কাঠামো দেখুন)।

<?xml version=“1.0” encoding=“utf-8”?>
<manifest xmlns:android=“http://schemas.android.com/apk/res/android”
    package=“{{RRO_PACKAGE_NAME}}”/>
    <application android:hasCode=“false”/>
    <overlay android:priority=“10”
        android:targetPackage=“{{TARGET_PACKAGE_NAME}}”
        android:requiredSystemPropertyName=“ro.product.sku”
        android:requiredSystemPropertyValue=“<your-product-sku>”/>
</manifest>

android:requiredSystemPropertyName এবং android:requiredSystemPropertyValue এর জন্য সিনট্যাক্সের কারণে এই RRO সক্রিয় করা হবে শুধুমাত্র যদি সংশ্লিষ্ট সিস্টেম প্রপার্টি প্রদত্ত মানের সাথে মেলে। OEMগুলি তারপরে এই RROগুলির একাধিক সংজ্ঞায়িত করতে পারে, সেগুলির সবগুলিই স্থিতিশীলভাবে সক্ষম এবং একবারে শুধুমাত্র একটি সক্রিয় থাকে৷

একটি লক্ষ্যে কার UI লাইব্রেরি যোগ করুন

একটি Android টার্গেটে Car UI লাইব্রেরি অন্তর্ভুক্ত করতে, আপনাকে অবশ্যই নিম্নলিখিত কোড স্নিপেট অন্তর্ভুক্ত করতে হবে:

# Include build-time overlays
    PRODUCT_PACKAGE_OVERLAYS += \
      <path-to-oem-overlays>/overlay
    # Define package names to generate RROs for
    CAR_UI_RRO_PACKAGE_NAMES += \
      com.android.car.ui.paintbooth \
      com.android.car.media \
      com.android.car.dialer \
      com.android.car.linkviewer \
      com.android.car.settings \
      com.android.car.systemupdater \
      com.google.android.apps.automotive.inputmethod \
      com.google.android.apps.automotive.templates.host \
      ...
    # Include generated RROs
    PRODUCT_PACKAGES += \
      oem-com-android-car-ui-paintbooth \
      oem-com-android-car-media \
      oem-com-android-car-dialer \
      oem-com-android-car-linkviewer \
      oem-com-android-car-settings \
      oem-com-android-car-systemupdater \
      oem-com-google-android-apps-automotive-inputmethod \
      oem-com-google-android-apps-automotive-templates-host \
      ...
  • কারণ <path-to-OEM-overlays>/rro/Android.mk CAR_UI_RRO_PACKAGE_NAMES এ নাম দেওয়া প্রতিটি প্যাকেজের জন্য একটি করে RRO তৈরি করে।

  • PRODUCT_PACKAGES এ জেনারেট করা RROগুলি অন্তর্ভুক্ত করে৷

  • OEM-নির্দিষ্ট সংস্থান যোগ করতে PRODUCT_PACKAGE_OVERLAYS এ একটি বিল্ড-টাইম ওভারলে অন্তর্ভুক্ত করে৷

কোন প্যাকেজগুলি car-ui-lib সমর্থন করে তা জানতে, car-ui-lib ধারণকারী প্যাকেজগুলির তালিকা দেখুন।