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

ב-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 אם חלק מהספריות הן של ספקי פתרונות חיצוניים.

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

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

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

  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.

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

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

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

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

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