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

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

ארכיטקטורה

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

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

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

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

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

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

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

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

קבצי .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. מה לצפות אם האפליקציה שלך לקישור כנגד ספריות מקומיות פרטיות . רשימת הספריות המקוריות של אנדרואיד הנגישות לאפליקציות (הידועות גם בשם ספריות מקוריות ציבוריות) מופיעה בסעיף 3.1.1 CDD. יש לעדכן אפליקציות הממוקדות ל -24 ומעלה ומשתמשות בספריות שאינן ציבוריות. ראה NDK Apps קישור לספריות פלטפורמה לקבלת פרטים נוספים.

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

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