ב-Android 7.0 נוספו מרחבי שמות לספריות נייטיב כדי להגביל את ה-API הפנימי הרשאות גישה לפתרון מצבים שבהם אפליקציות משתמשות בטעות בפלטפורמה של הספריות במקום שלהן. ראו שיפורים יציבות עם הגבלות סמל C/C++ פרטיות ב-Android 7.0 ב-Android פוסט בבלוג למפתחים בנושא שינויים ספציפיים לאפליקציה.
ארכיטקטורה
ב-Android מגרסה 7.0 ואילך, ספריות המערכת מופרדות מספריות האפליקציות.
מרחבי שמות של ספריות נייטיב מונעים מאפליקציות להשתמש בתוכן מקורי של פלטפורמה פרטית
ממשקי 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.מה קורה אם האפליקציה מקשרת לספריות מותאמות פרטיות. רשימת ספריות המקור של Android שזמינות לאפליקציות (שנקראות גם ספריות נייטיב ציבוריות) מפורטות בסעיף 3.1.1 של CDD. אפליקציות שמטרגטות ל-24 או מאוחר יותר, ולהשתמש בכל ספרייה שאינה ציבורית. ראו NDK פרטים נוספים זמינים באפליקציות שמקושרות לספריות פלטפורמה .
עדכון אפליקציות ליחסי התלות של ספריות המקור שלהן
באפליקציות שמטרגטות SDK בגרסה 31 (Android 12) ואילך
לציין במפורש את יחסי התלות של הספריות המשותפות המותאמות שלהם באמצעות
<uses-native-library>
בקובץ המניפסט של האפליקציה. אם חלק כלשהו של הבקשה
לא קיימת במכשיר, האפליקציה לא מותקנת. כשהאפליקציות מותקנות, הן
סופקו רק לספריות המקוריות המשותפות שהם ביקשו. המשמעות היא
אפליקציות לא יכולות לגשת לספריות משותפות מקוריות שאינן מופיעות בקובץ המניפסט של האפליקציה.