برنامه های افزودنی SDK

ماژول افزونه‌های SDK سطح SDK برنامه افزودنی دستگاه را تعیین می‌کند و APIهایی را برای برنامه‌ها فراهم می‌کند تا سطح SDK برنامه افزودنی را پرس و جو کنند. این ماژول قابل به‌روزرسانی است، به این معنی که می‌تواند به‌روزرسانی‌های عملکرد را خارج از چرخه انتشار عادی اندروید دریافت کند.

برنامه های افزودنی SDK مسئول موارد زیر است:

  • تصمیم گیری در مورد سطح SDK برنامه افزودنی دستگاه.
  • ارائه API برای برنامه‌ها برای درخواست سطح SDK برنامه‌های افزودنی.
  • (شروع اندروید 12) تعیین مقادیر متغیرهای محیطی BOOTCLASSPATH ، DEX2OATBOOTCLASSPATH ، و SYSTEMSERVERCLASSPATH .

فرمت ماژول

ماژول افزونه‌های SDK ( com.android.sdkext ) در قالب APEX است و برای دستگاه‌هایی که Android 11 یا بالاتر دارند در دسترس است.

قالب بسته

ماژول SDK Extensions ( com.google.android.sdkext ) در قالب APEX است و شامل اجزای زیر است:

  • (شروع اندروید 12) bin/derive_classpath : یک باینری بومی که در مراحل اولیه بوت دستگاه اجرا می شود. فایل‌های پیکربندی مسیر کلاس را از سیستم و سایر ماژول‌ها می‌خواند، آنها را ادغام می‌کند و تعریف متغیرهای محیطی CLASSPATH را تعریف می‌کند.

  • bin/derive_sdk : یک باینری بومی که در اوایل فرآیند راه‌اندازی دستگاه اجرا می‌شود و متادیتای ماژول‌های دیگر را می‌خواند تا ویژگی‌های سیستم مربوط به پسوند SDK را تنظیم کند (به عنوان مثال build.version.extensions.r ).

  • javalib/framework-sdkextension.jar : این فایل در مسیر bootclasspath قرار دارد که API ها را در معرض برنامه ها قرار می دهد تا سطح SDK برنامه افزودنی را پرس و جو کنند.

استخراج سطح SDK پسوند

برنامه derive_sdk ابرداده های ذخیره شده به عنوان فایل های پروتوباف باینری را در مسیر فرعی etc/sdkinfo.binarypb در داخل هر ماژول APEX می خواند. برای جزئیات بیشتر در مورد ساختار پروتوباف، به فایل protobuf مراجعه کنید.

خواندن سطح SDK برنامه افزودنی

ماژول SDK Extensions یک کلاس جاوا SdkExtensions را در بسته android.os.ext نمایش می دهد. از روش getExtensionVersion(int) برای خواندن نسخه یک برنامه افزودنی SDK استفاده کنید (به عنوان مثال، getExtensionVersion(Build.VERSION_CODES.R) ).

استخراج مسیرهای کلاس

سرویس derive_classpath فایل های پیکربندی فردی را در /system/etc/classpaths/ و /apex/*/etc/classpaths/ می خواند و ادغام می کند. هر پیکربندی پیام protobuf را از classpaths.proto در قالب پروتو باینری ذخیره می کند. الگوریتم ادغام دقیقی که ترتیب ورودی های classpath را تعیین می کند در derive_classpath.cpp شرح داده شده است و ممکن است در طول زمان تغییر کند.