برنامه ها را سفارشی کنید

اکنون که مؤلفه‌ها و منابع کتابخانه UI Car وارد برنامه‌ها شده‌اند، برای سفارشی‌سازی این برنامه‌ها، OEMها باید دو پوشش ارائه دهند:

  • همپوشانی Build-time منابع مورد نیاز برای پوشش منابع زمان اجرا (RRO) را اضافه می کند. این شامل:

    • قرعه کشی ها
    • سبک ها (به عنوان مثال، ظاهر متن)
    • منابع مشترک (به عنوان مثال، رنگ ها)
  • پوشه پوشش RRO حاوی منابعی است که برای تولید یک RRO در هر برنامه هدف استفاده می شود. این منابع فقط می توانند به موارد زیر اشاره کنند:

    • مقادیر تعریف شده در همان RRO (به عنوان مثال، برای یک رنگ این مقدار هگزادسیمال خواهد بود).
    • منابع فریمورک اندروید (به عنوان مثال @android:color/accent ).
    • منبعی که در همپوشانی زمان ساخت بالا تعریف شده است.

ساختار کلی

ساختار همپوشانی سفارشی سازی پیشنهادی به شرح زیر است:

  • <path-to-OEM-overlays>/

    • overlay/framework/base/core/res/ . منابع همپوشانی زمان ساخت

    • rro/

      • Android.mk . Makefile برای تولید RRO برای هر بسته هدف بر اساس منابع موجود در این پوشه استفاده می شود.

      • AndroidManifest.xml . یک الگوی فایل مانیفست که توسط makefile بالا استفاده می شود.

      • res/ . پوشش‌های زمان اجرا برای اعمال روی همه برنامه‌های هدف.

OEM ها ممکن است بیش از یکی از این ساختارها را داشته باشند، بسته به تعداد مارک هایی که می خواهند در یک هدف ساخت واحد مدیریت کنند (به Handle multiple brands مراجعه کنید).

همپوشانی منابع زمان اجرا

پوشه RRO در پوشه OEM overlay باید حاوی منابعی باشد که باید برای همه برنامه‌های هدف اعمال شود. RROها دارای محدودیت هایی هستند که بر توانایی آنها برای همپوشانی منابع ترکیبی تأثیر می گذارد. به طور خلاصه، یک RRO:

  • نمی توان به شناسه های منبع تعریف شده در APK هدف یا در خود RRO اشاره کرد. این بدان معناست که RRO ها نمی توانند شناسه های جدیدی مانند ترسیم، رنگ ها یا سبک های جدید اضافه کنند.

  • می تواند به شناسه های منبع تعریف شده در چارچوب مراجعه کنید، چه این منابع در /frameworks/base/core/res تعریف شده باشند یا با استفاده از یک پوشش زمان ساخت. این شناسه ها باید با استفاده از android: name-space:

    • برای RROهای DeviceDefault عمومی ، از 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 در makefile زیر پیشوندی را تعریف می کند که همه 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. ویژگی name برای تگ <overlayable> تعریف کنید، که باید در بسته منحصر به فرد باشد. هر همپوشانی می تواند تنها یک گروه قابل همپوشانی را هدف قرار دهد.
  4. تگ <policy> را در داخل <overlayable> تعریف کنید.
  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. android:resourcesMap="@xml/overlays" به تگ <overlay> در AndroidManifest.xml اضافه کنید. برای مثال، در نمونه کد زیر، ورودی <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>
  

با یک هشدار، RRO های قبلی موجود در Android 10 کار می کنند. نکته این است که برای نصب با PackageManagerRRO، بسته ها باید یا از قبل نصب شده باشند یا با همان کلید برنامه هدف امضا شده باشند. در اندروید 10، فایل های طرح بندی را می توان روی هم قرار داد. با این حال، انجام این کار مستلزم استفاده از requireViewById() در حین دریافت view به جای findViewById() است. در اندروید 10، این تغییر در car-ui-lib برای پشتیبانی از پوشش‌های طرح‌بندی اعمال شده است.

نسخه اصلی بعدی اندروید به شما این امکان را می دهد که یک فایل طرح بندی را پوشش دهید و منابع جدیدی را در بسته RRO تعریف کنید و به آنها به صورت داخلی مراجعه کنید.

منابع اختصاصی OEM را اضافه کنید

برای غلبه بر محدودیت های RRO که از اضافه شدن منابع OEM جلوگیری می کند:

  • چارچوب ها/پایه ها را با استفاده از همپوشانی زمان ساخت گسترش دهید و هر گونه منابع لازم را اضافه کنید.
  • به این منابع از RROهای OEM با استفاده از *android: namespacing مراجعه کنید.

به عنوان مثال، روش زیر برای اضافه کردن یک drawable خاص 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 ماشین را به یک هدف اضافه کنید

برای ادغام کتابخانه 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 یک RRO برای هر یک از بسته های نامگذاری شده در CAR_UI_RRO_PACKAGE_NAMES ایجاد کند.

  • شامل RROهای تولید شده در PRODUCT_PACKAGES است.

  • شامل یک پوشش زمان ساخت در PRODUCT_PACKAGE_OVERLAYS برای افزودن منابع خاص OEM.

برای اطلاع از اینکه کدام بسته‌ها از car-ui-lib پشتیبانی می‌کنند، به فهرست بسته‌های حاوی car-ui-lib مراجعه کنید.