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

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

ארכיטקטורה

ב-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.

החל מ-Android 15, אפשר להציב ספריות ציבוריות של ספקים ב-APEX של ספקים. כשמצרפים אותן לחבילת APEX של ספק, צריך לציין את הספריות במאפיין provideNativeLibs במניפסט של APEX.

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

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

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

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