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

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

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

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

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

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

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