سازگاری به عقب برای زمان اجرا SDK

این سند یک کتابخانه جدید Jetpack را برای کمک به توسعه دهندگان در انتقال به SDK Runtime پیشنهاد می کند. توضیح می‌دهد که چگونه SDK Runtime برای نسخه‌های قبلی پلتفرم اندروید (از ساخت تا اجرا) پشتیبانی می‌شود و توسعه‌دهندگان محیط زمان اجرا چه تفاوت‌ها یا محدودیت‌هایی را انتظار دارند. این کتابخانه به توسعه دهندگان این امکان را می دهد که یک نسخه از برنامه یا SDK خود را ایجاد کنند که شامل قابلیت اجرا بر روی دستگاه هایی با یا بدون پشتیبانی از SDK Runtime است.

سازگاری Backwards از طریق اجزای زیر حاصل می شود:

  • افزونه Android Gradle (AGP) + Bundletool با جمع‌آوری SDK Runtime در APK، یک نوع برنامه برای دستگاه‌های بدون پشتیبانی از SDK Runtime می‌سازد.

  • کتابخانه سرویس گیرنده SDK Runtime ( androidx.privacysandbox.sdkruntime:sdkruntime-client ) SDK همراه را از دارایی‌های برنامه بارگیری می‌کند و زمان اجرا SDK را در دستگاه‌های بدون پشتیبانی SDK Runtime شبیه‌سازی می‌کند.

  • کتابخانه ارائه‌دهنده SDK Runtime ( androidx.privacysandbox.sdkruntime:sdkruntime-provider ) یک API برای SDK فراهم می‌کند تا امکان بارگیری از کتابخانه سرویس گیرنده SDK Runtime را فراهم کند.

تحویل SDK با Bundletool

در دستگاه‌هایی که از SDK Runtime پشتیبانی می‌کنند، SDK‌ها به عنوان بسته‌های جداگانه تحویل و نصب می‌شوند.

برای پشتیبانی از نسخه‌های پلتفرمی که فاقد پشتیبانی SDK Runtime هستند، Bundletool یک یا چند نوع از مجموعه APK برنامه را می‌سازد که شامل همه SDK‌هایی است که برنامه به آنها وابسته است. هر SDK به عنوان یک تقسیم APK جداگانه بسته بندی می شود. علاوه بر این، تبدیل های زیر انجام می شود:

  1. فایل های بایت کد SDK (DEX) را به عنوان دارایی در تقسیم SDK کپی کنید.
  2. منابع SDK Java را به عنوان دارایی در تقسیم SDK کپی کنید.
  3. منابع SDK را مجدداً نقشه برداری کنید و آنها را با منابع برنامه ادغام کنید.
  4. ایجاد تنظیمات برای کتابخانه سرویس گیرنده SDK Runtime.

SDK ها را با کتابخانه سرویس گیرنده SDK Runtime بارگیری کنید

کتابخانه سرویس گیرنده SDK Runtime API هایی را ارائه می دهد که شبیه به API های پلتفرم هستند، اما از هر دو SDK در محیط SDK Runtime و SDK های همراه با برنامه های مختلف پشتیبانی می کنند.

برای استفاده از کتابخانه سرویس گیرنده SDK Runtime، وابستگی androidx.privacysandbox.sdkruntime:sdkruntime-client را اضافه کنید و به جای SdkSandboxManager از SdkSandboxManagerCompat استفاده کنید.

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

یک SDK را از دارایی ها استخراج کنید

وقتی یک برنامه سعی می‌کند یک SDK همراه را بارگیری کند، کتابخانه سرویس گیرنده SDK Runtime بررسی می‌کند که آیا فایل‌های DEX SDK قبلاً در فضای ذخیره‌سازی دستگاه استخراج شده‌اند ( code_cache )، و اگر نه، آنها را از دارایی‌ها استخراج می‌کند.

کتابخانه معمولاً تنها یک بار پس از نصب یا به‌روزرسانی برنامه، فایل‌ها را استخراج می‌کند.

اگر فضای ذخیره سازی موجود کمتر از آستانه مجاز (در حال حاضر 100 مگابایت) باشد و هیچ فایل DEX استخراج نشود، کتابخانه سعی می کند SDK را مستقیماً از دارایی های دستگاه های پشتیبانی شده بارگیری کند (API 27+). این منجر به ردپای حافظه بزرگتر می شود.

Classloader برای کلاس های SDK

برای جلوگیری از تداخل بین SDK ها و کلاس های برنامه، همه کلاس های SDK با استفاده از یک کلاس لودر جداگانه کاملا مستقل از کلاس بارگذاری برنامه اصلی بارگیری می شوند.

در طراحی فعلی SDK Runtime، تمام ارتباطات بین یک برنامه و SDK با استفاده از تماس‌های Binder IPC انجام می‌شود. همان اشیاء SDK Binder برای SDK های همراه استفاده می شود، و سریال سازی تراکنش Binder به توسعه دهندگان برنامه اجازه می دهد تا اشیاء SDK Binder را به رابط های SDK Binder در سمت برنامه ارسال کنند.

برای سایر تعاملات داخلی (مانند مقداردهی اولیه یک SDK، ارائه یک API کنترلر به یک SDK، و غیره) کتابخانه از Reflection و Dynamic Proxies برای کار در کلاس بارگذارهای مختلف استفاده می کند.

محیط SDK

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

برای اینکه بتوانید از SDK کتابخانه استفاده کنید، باید وابستگی androidx.privacysandbox.sdkruntime:sdkruntime-provider اضافه کنید و SandboxedSdkProviderCompat به جای SandboxedSdkProvider گسترش دهید.

همچنین باید از SandboxedSdkProviderAdapter به عنوان ارائه‌دهنده SDK استفاده کنید تا به ارائه‌دهنده compat اجازه دهید در محیط SDK Runtime بارگذاری شود.

SdkSandboxControllerCompat هنگامی که SDK در زمان اجرای SDK بارگیری می شود به API پلتفرم تفویض می کند یا زمانی که SDK به عنوان یک SDK همراه بارگیری می شود به کتابخانه SDKRuntime Client واگذار می شود.

برای SDK های همراه، کتابخانه محیط SDK را به گونه ای تغییر می دهد که رفتاری شبیه به محیط SDK Runtime را تقلید می کند.

بخش‌های بعدی رفتارهای مورد انتظار را هنگام بارگیری SDK توسط کتابخانه SDKRuntime Client توضیح می‌دهند.

منابع SDK

منابع SDK (res/) هنگامی که SDK در فرآیند برنامه بارگیری می شود پشتیبانی می شود. Bundletool همه منابع SDK را با منابع برنامه ادغام می کند.

برای جلوگیری از تداخل، منابع SDK با تغییر پیشوند packageId در همه شناسه‌های منبع، دوباره نقشه‌برداری می‌شوند.

هنگامی که SDK توسط کتابخانه SDKRuntime Client بارگیری می شود، packageId در زمان اجرا به روز می شود تا امکان آدرس دهی منابع بازسازی شده با استفاده از کلاس R را فراهم کند.

منابع جاوا

منابع جاوا هنگامی که SDK در فرآیند برنامه بارگیری می شود پشتیبانی می شود. Bundletool تمام منابع SDK Java را در یک فهرست ویژه در دارایی های برنامه کپی می کند. کتابخانه SDKRuntime Client از یک کلاس لودر میانی برای هدایت همه تماس های مرتبط با منابع جاوا به دایرکتوری ریشه جدید استفاده می کند.

دارایی های SDK

دارایی های SDK بدون نقشه برداری مجدد با دارایی های برنامه ادغام می شوند.

ذخیره سازی SDK

برای پشتیبانی از حافظه SDK، کتابخانه SDK Runtime Client یک دایرکتوری ریشه اختصاصی برای هر SDK همراه در حافظه برنامه ایجاد می کند و زمینه خاصی را فراهم می کند که از این دایرکتوری به عنوان ریشه ذخیره سازی استفاده می کند.

این زمینه را می توان از SandboxedSdkProviderCompat#getContext بازیابی کرد.

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

  • getDataDir
  • getCacheDir
  • getCodeCacheDir
  • getNoBackupFilesDir
  • getDir
  • getFilesDir
  • openFileInput
  • openFileOutput
  • deleteFile
  • getFileStreamPath
  • fileList
  • getDatabasePath
  • openOrCreateDatabase
  • moveDatabaseFrom - فقط بین زمینه های SDK
  • deleteDatabase
  • databaseList
  • getSharedPreferences
  • moveSharedPreferencesFrom - فقط بین زمینه های SDK
  • deleteSharedPreferences

با فراخوانی createDeviceProtectedStorageContext() در آن زمینه می توان یک زمینه ذخیره سازی محافظت شده از دستگاه ایجاد کرد.

SdkSandboxControllerCompat

کتابخانه SDKRuntime Client پیاده سازی SdkSandboxControllerCompat را برای SDK های همراه بارگیری شده در فرآیند برنامه فراهم می کند.

اگر API ها توسط کتابخانه سرویس گیرنده پشتیبانی نمی شوند (مثلاً با یک SDK ساخته شده با نسخه ای از کتابخانه جدیدتر از نسخه برنامه)، مناسب ترین نسخه بازگشتی استفاده می شود (بدون عملیات یا استثنا).

نسخه سازی

هنگامی که کتابخانه SDKRuntime Client یک SDK همراه را بارگیری می کند، با کتابخانه ارائه دهنده SDKRuntime در داخل SDK دست دادن انجام می دهد. در حین دست دادن، کتابخانه‌ها نسخه‌های خود را مبادله می‌کنند و رفتار را طوری تنظیم می‌کنند که APIهای غیرقابل دسترس را با مناسب‌ترین حالت بازگشتی (بدون عملیات یا استثنا) جایگزین کنند.

استفاده از جدیدترین نسخه کتابخانه هم برای برنامه‌نویسان و هم برای برنامه‌نویسان SDK بسیار توصیه می‌شود، در غیر این صورت عملکردی که نیاز به پشتیبانی در هر دو بخش دارد ممکن است در دسترس نباشد.

هر نسخه ای از کتابخانه SDKRuntime Client می تواند یک SDK را با هر نسخه ای از کتابخانه ارائه دهنده SDKRuntime بارگیری کند و برعکس.

در آینده این نسخه به حداقل نسخه کتابخانه مشتری مورد نیاز برای بارگیری SDK با نسخه خاصی از کتابخانه ارائه دهنده تغییر خواهد کرد.

این قطعه قطعه شدن را به حداقل می رساند و کمک می کند تا اطمینان حاصل شود که در صورت بارگیری موفقیت آمیز SDK همراه، اکثر API ها پشتیبانی می شوند.

{% کلمه به کلمه %} {% آخر کلمه %} {% کلمه به کلمه %} {% آخر کلمه %}