מרחבי שמות לספריות נייטיב

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

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

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