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

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

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

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

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

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

تحویل SDK با Bundletool

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

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

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

بارگذاری SDKها با کتابخانه کلاینت SDK Runtime

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

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

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

استخراج SDK از فایل‌ها

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

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

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

کلاس لودر برای کلاس‌های SDK

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

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

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

محیط SDK

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

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

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

SdkSandboxControllerCompat وقتی SDK در SDK Runtime بارگذاری می‌شود، آن را به 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 را در یک دایرکتوری خاص در دارایی‌های برنامه کپی می‌کند. کتابخانه SDKRuntime Client از یک classloader میانی برای هدایت تمام فراخوانی‌های مربوط به منابع جاوا به دایرکتوری ریشه جدید استفاده می‌کند.

دارایی‌های SDK

دارایی‌های SDK بدون نگاشت مجدد با دارایی‌های برنامه ادغام می‌شوند.

ذخیره‌سازی SDK

برای پشتیبانی از SDK Storage، کتابخانه 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 همراه را بارگذاری می‌کند، یک handshake با کتابخانه SDKRuntime Provider درون SDK انجام می‌دهد. در طول handshake، کتابخانه‌ها نسخه‌های خود را مبادله می‌کنند و رفتار را تنظیم می‌کنند تا APIهای غیرقابل دسترس را با مناسب‌ترین fallback (بدون عملیات یا exception) جایگزین کنند.

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

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

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

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

{% کلمه به کلمه %} {% فعل کمکی %} {% کلمه به کلمه %} {% فعل کمکی %}