מרחבי שמות לספריות ילידים

אנדרואיד 7.0 הציגה מרחבי שמות לספריות מקוריות כדי להגביל את הנראות הפנימית של API ולפתור מצבים שבהם אפליקציות משתמשות בטעות בספריות פלטפורמה במקום שלהן. עיין בפוסט שיפור היציבות עם מגבלות סמל C/C++ פרטיות בבלוג של מפתחי Android 7.0 Android לשינויים ספציפיים ליישום.

ארכיטקטורה

ב-Android 7.0 ומעלה, ספריות מערכת מופרדות מספריות אפליקציות.

מרחבי שמות לספריות מקוריות

איור 1. מרחבי שמות לספריות מקוריות

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

הוספת ספריות מקומיות נוספות

בנוסף לספריות מקוריות ציבוריות רגילות, ספקי סיליקון (החל מ-Android 7.0) ויצרני מכשירים (החל מ-Android 9) עשויים לבחור לספק ספריות מקוריות נוספות נגישות לאפליקציות על ידי הכנסתן תחת תיקיות הספרייה המתאימות ורישום מפורש שלהן ב-.txt קבצים.

תיקיות הספרייה הן:

  • /vendor/lib (עבור 32 סיביות) ו /vendor/lib64 (עבור 64 סיביות) עבור ספריות של ספקי סיליקון
  • /system/lib (עבור 32 סיביות) ו /system/lib64 (עבור 64 סיביות) עבור ספריות מיצרני מכשירים

קבצי ה-.txt הם:

  • /vendor/etc/public.libraries.txt עבור ספריות של ספקי סיליקון
  • /system/etc/public.libraries-COMPANYNAME.txt עבור ספריות מיצרני מכשירים, כאשר COMPANYNAME מתייחס לשם של היצרן (כגון awesome.company ). COMPANYNAME חייב להתאים ל- [A-Za-z0-9_.-]+ ; אותיות אלפא - נומריות, _, . (נקודה) ו-. אפשר להחזיק מספר קובצי txt כאלה במכשיר אם חלק מהספריות הן מספקי פתרונות חיצוניים.

ספריות מקוריות במחיצת system המפורסמות לציבור על ידי יצרני המכשיר חייבות להיקרא lib*COMPANYNAME.so , לדוגמה, libFoo.awesome.company.so . במילים אחרות, אסור לפרסם libFoo.so ללא סיומת שם החברה. COMPANYNAME בשם קובץ הספרייה חייב להתאים ל- COMPANYNAME בשם קובץ ה-txt שבו מופיע שם הספרייה.

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

החל מ-Android 8.0, לספריות ציבוריות של ספקים יש את ההגבלות הנוספות וההגדרות הנדרשות:

  1. הספרייה המקורית של הספק חייבת להיות מסומנת כהלכה כדי שתוכל להיות נגישה לאפליקציות. אם נדרשת גישה על ידי אפליקציות כלשהן (כולל יישומי צד שלישי), הספרייה חייבת להיות מתויגת כ- same_process_hal_file בקובץ file_contexts ספציפי לספק באופן הבא:
    /vendor/lib(64)?/libnative.so u:object_r:same_process_hal_file:s0
    כאשר libnative.so הוא שם הספרייה המקורית.
  2. הספרייה, באופן ישיר או טרנזיטיבי באמצעות התלות שלה, לא חייבת להיות תלויה בספריות מערכת מלבד ספריות VNDK-SP ו-LLNDK. אתר את רשימת הספריות VNDK-SP ו-LLNDK בכתובת development/vndk/tools/definition/tool/datasets/eligible-list-<version>-release.csv .

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

תכונה זו מופעלת רק עבור יישומים המתמקדים ב-SDK גרסה 24 ואילך; לתאימות לאחור, ראה טבלה 1. למה לצפות אם האפליקציה שלך מקשרת לספריות מקוריות פרטיות . רשימת הספריות המקוריות של אנדרואיד הנגישות לאפליקציות (המוכרות גם כספריות מקוריות ציבוריות) רשומה בסעיף CDD 3.1.1. יש לעדכן אפליקציות הממוקדות לגילאי 24 ומעלה ומשתמשות בספריות שאינן ציבוריות. ראה אפליקציות NDK המקשרות לספריות פלטפורמה לפרטים נוספים.

עדכון אפליקציות עבור התלות בספרייה המקורית שלהן

אפליקציות המתמקדות ב-SDK גרסה 31 (Android 12) ומעלה חייבות לציין במפורש את התלות המקורית של הספרייה המשותפת שלהן באמצעות התג <uses-native-library> במניפסט האפליקציה. אם חלק כלשהו מהספרייה המבוקשת אינו קיים במכשיר, האפליקציה לא מותקנת. כאשר האפליקציות מותקנות, הן מסופקות רק עם הספריות המשותפות המקוריות שביקשו. משמעות הדבר היא שאפליקציות אינן יכולות לגשת לספריות משותפות מקוריות שאינן מופיעות במניפסט האפליקציה.