ב-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, יש הגבלות נוספות על ספריות ציבוריות של ספקים, וצריך לבצע את ההגדרות הבאות:
- צריך לתת לספרייה המקורית של הספק תווית מתאימה כדי שהאפליקציות יוכלו לגשת אליה. אם נדרשת גישה על ידי אפליקציות כלשהן (כולל אפליקציות של צד שלישי), צריך להוסיף לספרייה את התווית
same_process_hal_file
בקובץfile_contexts
ספציפי לספק באופן הבא: כאשר/vendor/lib(64)?/libnative.so u:object_r:same_process_hal_file:s0
libnative.so
הוא השם של הספרייה המקורית. - הספרייה, באופן ישיר או באופן עקיף דרך התלויות שלה, לא יכולה להיות תלויה בספריות מערכת אחרות מלבד ספריות 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 המשותפות שהן ביקשו. המשמעות היא שאפליקציות לא יכולות לגשת לספריות משותפות מקוריות שלא מופיעות במניפסט האפליקציה.