תאימות לאחור ל-SDK Runtime (זמן ריצה ל-SDK)

במסמך הזה מוצעת ספריית Jetpack חדשה כדי לעזור למפתחים לעבור לזמן הריצה ל-SDK. נסביר איך תהיה תמיכה בזמן הריצה ל-SDK בגרסאות קודמות של פלטפורמת Android (מ-build ועד לביצוע), ולאילו הבדלים או מגבלות בסביבת זמן הריצה המפתחים יכולים לצפות. הספרייה הזו מאפשרת למפתחים ליצור גרסה יחידה של האפליקציה או ה-SDK שלהם, שכוללת את האפשרות לרוץ במכשירים עם או בלי תמיכה בזמן ריצה ל-SDK.

אפשר להשיג תאימות לאחור באמצעות הרכיבים הבאים:

  • Android Gradle Plugin (AGP) + Bundletool יוצר גרסת אפליקציה למכשירים שאין להם תמיכה ב-SDK בזמן ריצה. לשם כך, אפשר לקבץ את זמן הריצה של ה-SDK ב-APK.

  • ספריית הלקוח של זמן הריצה ל-SDK (androidx.privacysandbox.sdkruntime:sdkruntime-client) טוענת את ה-SDK המצורף מנכסי אפליקציות ומדמה את זמן הריצה של ה-SDK במכשירים שאין בהם תמיכה בזמן הריצה ב-SDK.

  • הספרייה של ספקי זמן הריצה ל-SDK (androidx.privacysandbox.sdkruntime:sdkruntime-provider) מספקת API לערכות SDK שמאפשר טעינה מספריית הלקוח של זמן הריצה של ה-SDK.

העברת ערכות SDK באמצעות Bundletool

במכשירים עם תמיכה בזמן ריצה ל-SDK, ערכות SDK יסופקו ויותקנו כחבילות נפרדות.

כדי לתמוך בגרסאות פלטפורמה שאין בהן תמיכה בזמן ריצה ל-SDK, Bundletool יפתח גרסה אחת או יותר של קבוצת ה-APK של האפליקציה שכוללות את כל ערכות ה-SDK שהאפליקציה תלויה בהן. כל ערכת SDK ארוזה כפיצול APK נפרד. בנוסף, מתבצעות הטרנספורמציות הבאות:

  1. העתקת קובצי bytecode (DEX) של SDK לפיצול ה-SDK כנכסים.
  2. העתקת משאבי Java של SDK לפיצול ה-SDK כנכסים.
  3. מיפוי מחדש של משאבי SDK ומיזוג שלהם עם משאבי אפליקציות.
  4. יצירת הגדרות עבור ספריית הלקוח של זמן הריצה של ה-SDK.

טעינה של ערכות SDK באמצעות ספריית הלקוח של זמן הריצה של ה-SDK

ספריית הלקוח של זמן הריצה של ה-SDK מספקת ממשקי API שדומים לממשקי ה-API של הפלטפורמה, אבל תומכים בשני ה-SDK בסביבת זמן הריצה של ה-SDK ובערכות ה-SDK שכלולות באפליקציית הווריאנט.

כדי להשתמש בספריית הלקוח של זמן הריצה של ה-SDK, צריך להוסיף את התלות androidx.privacysandbox.sdkruntime:sdkruntime-client ולהשתמש ב-SdkSandboxManagerCompat במקום ב-SdkSandboxManager.

כשאפליקציה מנסה לטעון SDK, קודם כל הספרייה בודקת אם ה-SDK נכלל עם האפליקציה במהלך ה-build. אם הספרייה הייתה בחבילה, היא שולפת את ה-SDK מפיצול ה-SDK וטוענת אותה בתהליך האפליקציה. אם ה-SDK לא היה בחבילה עם האפליקציה, הספרייה מעניקה גישה ל-Platform API כדי לטעון את ה-SDK.

חילוץ SDK מנכסים

כשאפליקציה מנסה לטעון SDK חבילה, ספריית הלקוח של זמן הריצה של ה-SDK בודקת אם קובצי DEX של ה-SDK כבר חולצו לאחסון של המכשיר (code_cache), ואם לא, שולפת אותם מהנכסים.

הספרייה בדרך כלל מחלצת קבצים רק פעם אחת אחרי התקנה או עדכון של האפליקציה.

אם נפח האחסון הזמין קטן מהסף המותר (כרגע 100MB) ולא חולצו קובצי DEX, הספרייה תנסה לטעון את ה-SDK ישירות מהנכסים במכשירים נתמכים (API 27 ואילך). כתוצאה מכך נוצרת טביעת רגל זיכרון גדולה יותר.

הכלי להעלאת סיווגים למחלקות SDK

כדי למנוע התנגשויות בין ערכות SDK לבין מחלקות של אפליקציות, כל המחלקות של ה-SDK נטענות באמצעות הכלי לסיווג מחלקות נפרד, שאינו תלוי לחלוטין במעלה סיווג האפליקציות הראשי.

בעיצוב הנוכחי של זמן הריצה ל-SDK, כל התקשורת בין האפליקציה לערכות ה-SDK מתבצעת באמצעות קריאות IPC של Binder. אותם אובייקטים של SDK Binder משמשים לערכות SDK מחבילה, והעריכה של טרנזקציות של Binder מאפשרת למפתחי אפליקציות להעביר אובייקטים של SDK של SDK ל-SDK Binder Interfaces בצד האפליקציה.

באינטראקציות פנימיות אחרות (כמו אתחול SDK, מתן בקר API ל-SDK וכו'), הספרייה משתמשת ב-Reflection ובשרתי proxy דינמיים כדי לעבוד עם כלים שונים לטעינת מחלקות.

סביבת ה-SDK

הספרייה SDKRuntime Provider מספקת ממשקי API למפתחי SDK. ממשקי ה-API האלה דומים לממשקי ה-API של הפלטפורמה, אבל הם מאפשרים טעינה של ערכות SDK גם על ידי סביבת זמן הריצה של ה-SDK וגם על ידי ספריית הלקוח SDKRuntime Client.

כדי להשתמש ב-SDK של הספרייה, צריך להוסיף את התלות androidx.privacysandbox.sdkruntime:sdkruntime-provider ולהרחיב את התלות ב-SandboxedSdkProviderCompat במקום SandboxedSdkProvider.

כמו כן, צריך להשתמש ב-SandboxedSdkProviderAdapter כספק ה-SDK, כדי לאפשר את הטעינה של הספק התואם בסביבת זמן הריצה של ה-SDK.

SdkSandboxControllerCompat מקצה את ה-SDK ל-Platform API כשה-SDK נטען בזמן הריצה של ה-SDK או מעניק גישה לספריית הלקוח SDKRuntime Client, כשה-SDK נטען כ-SDK בחבילה.

בערכות SDK בחבילה, הספרייה משנה את סביבת ה-SDK באופן שמדמה התנהגות שדומה לסביבת זמן הריצה של ה-SDK.

בקטעים הבאים מתוארות התנהגויות צפויות כשה-SDK נטען על ידי ספריית הלקוח של SDKRuntime Client.

משאבי SDK

יש תמיכה במשאבי SDK (רזולוציה/) כאשר ה-SDK נטען בתהליך האפליקציה. Bundletool ממזג את כל המשאבים של ערכות ה-SDK עם משאבי אפליקציות.

כדי למנוע התנגשויות, משאבי ה-SDK ממופים מחדש על ידי שינוי הקידומת packageId בכל מזהי המשאבים.

כשה-SDK נטען על ידי ספריית הלקוח SDKRuntime, packageId מתעדכן בזמן הריצה כדי לאפשר טיפול במשאבים שמופו מחדש באמצעות מחלקה R.

משאבי Java

משאבי Java נתמכים כאשר ה-SDK נטען בתהליך האפליקציה. Bundletool מעתיק את כל משאבי ה-SDK של Java לספרייה מיוחדת בנכסי אפליקציות. ספריית הלקוח SDKRuntime משתמשת בטוען מחלקה ביניים כדי להפנות את כל הקריאות שקשורות למשאבי Java לספריית הבסיס החדשה.

נכסי SDK

נכסי ה-SDK ממוזגים עם נכסי אפליקציה בלי מיפוי מחדש.

אחסון SDK

כדי לתמוך ב-SDK Storage, ספריית הלקוח בזמן ריצה של ה-SDK יוצרת ספריית בסיס ייעודית לכל ערכת 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 מספקת את ההטמעה של SdkSandboxControllerCompat לערכות SDK שכלולות בחבילה שנטענות בתהליך האפליקציה.

אם ספריית הלקוח לא תומכת בממשקי API (לדוגמה, באמצעות SDK שנוצר עם גרסה של הספרייה עדכנית יותר מגרסת האפליקציה), ייעשה שימוש בחלופה המתאימה ביותר (ללא הפעלה או חריגה).

ניהול גרסאות

כשספריית לקוח SDKRuntime טוענת SDK חבילה, מתבצעת לחיצת יד בספרייה של SDKRuntime Provider ב-SDK. במהלך לחיצת היד, הספריות מחליפות את הגרסאות שלהן ומתאימים את ההתנהגות כך שתחליף ממשקי API לא זמינים בחלופה המתאימה ביותר (ללא תפעול או יוצא מן הכלל).

מומלץ מאוד להשתמש בגרסה העדכנית ביותר של הספרייה גם למפתחים של אפליקציות וגם למפתחי SDK, אחרת יכול להיות שפונקציונליות שדורשת תמיכה בשני החלקים לא תהיה זמינה.

כל גרסה של ספריית הלקוח SDKRuntime Client יכולה לטעון SDK עם כל גרסה של הספרייה SDKRuntime Provider, ולהפך.

בעתיד, הגרסה הזו תשתנה לגרסה המינימלית של ספריית הלקוח שנדרשת כדי לטעון את ה-SDK עם גרסה מסוימת של ספריית הספקים.

כך תצמצם את הפרגמנטציה ותעזור להבטיח שתהיה תמיכה ברוב ממשקי ה-API אם ה-SDK שכלול בחבילת ה-SDK נטען בהצלחה.