בדומה לגרסאות קודמות, Android 16 כולל שינויים בהתנהגות שעשויים להשפיע על האפליקציה שלכם. שינויי ההתנהגות הבאים רלוונטיים רק לאפליקציות שמטרגטות את Android 16 ואילך. אם האפליקציה שלכם מטרגטת את Android מגרסה 16 ואילך, אתם צריכים לשנות את האפליקציה כדי שהיא תתמוך בהתנהגויות האלה, במקרים הרלוונטיים.
חשוב גם לבדוק את רשימת השינויים בהתנהגות שמשפיעים על כל האפליקציות שפועלות ב-Android 16, בלי קשר ל-targetSdkVersion של האפליקציה.
חוויית המשתמש וממשק המשתמש של המערכת
Android 16 (API ברמה 36) כוללת את השינויים הבאים, שנועדו ליצור חוויית משתמש עקבית ואינטואיטיבית יותר.
האפשרות להסיר את התצוגה מקצה לקצה תבוטל
האפשרות 'מקצה לקצה' נאכפת ב-Android 15 באפליקציות שמטרגטות ל-Android 15 (רמת API 35), אבל אפשר להשבית אותה באפליקציה על ידי הגדרת R.attr#windowOptOutEdgeToEdgeEnforcement ל-true. באפליקציות שמטרגטות ל-Android 16 (רמת API 36), R.attr#windowOptOutEdgeToEdgeEnforcement הוצא משימוש ומושבת, ולא ניתן לבטל את ההגדרה של תצוגה מקצה לקצה באפליקציה.
- אם האפליקציה מיועדת ל-Android 16 (רמת API 36) והיא פועלת במכשיר עם Android 15, הפונקציה
R.attr#windowOptOutEdgeToEdgeEnforcementממשיכה לפעול. - אם האפליקציה מטרגטת ל-Android 16 (רמת API 36) והיא פועלת במכשיר עם Android 16, התכונה
R.attr#windowOptOutEdgeToEdgeEnforcementמושבתת.
כדי לבדוק ב-Android 16, מוודאים שהאפליקציה תומכת בתצוגה מקצה לקצה ומסירים את השימוש ב-R.attr#windowOptOutEdgeToEdgeEnforcement כדי שהאפליקציה תתמוך בתצוגה מקצה לקצה גם במכשיר Android 15. הוראות לגבי תמיכה בתצוגה מקצה לקצה מופיעות במאמרים יצירת מסמכים ותצוגות.
כדי להשתמש בתכונה "חיזוי החזרה", צריך לבצע העברה או לבטל את ההסכמה
באפליקציות שמטרגטות ל-Android 16 (רמת API 36) ואילך ופועלות במכשיר עם Android 16 ואילך, מופעלות כברירת מחדל האנימציות של מערכת הניווט התחזיתי אחורה (חזרה למסך הבית, מעבר בין משימות ומעבר בין פעילויות).
בנוסף, לא מתבצעת קריאה ל-onBackPressed ולא מתבצעת יותר שליחה של KeyEvent.KEYCODE_BACK.
אם האפליקציה שלכם מיירטת את אירוע החזרה ואתם עדיין לא עברתם לניווט חזוי אחורה, עדכנו את האפליקציה כדי להשתמש בממשקי API נתמכים של ניווט אחורה, או השביתו את התכונה באופן זמני על ידי הגדרת המאפיין android:enableOnBackInvokedCallback לערך false בתג <application> או <activity> של קובץ AndroidManifest.xml של האפליקציה.
הוצאה משימוש והשבתה של ממשקי API אלגנטיים לגופנים
באפליקציות שמטרגטות ל-Android 15 (רמת API 35), מאפיין elegantTextHeight TextView מוגדר כ-true כברירת מחדל, והגופן הקומפקטי מוחלף בגופן קריא הרבה יותר. אפשר לשנות את ההגדרה הזו על ידי הגדרת המאפיין elegantTextHeight לערך false.
ב-Android 16, המאפיין elegantTextHeight הוצא משימוש. המערכת תתעלם מהמאפיין הזה ברגע שהאפליקציה תטרגט ל-Android 16. ממשקי ה-API האלה שולטים ב'גופנים של ממשק המשתמש', אבל הם יוצאים משימוש. לכן, צריך להתאים את הפריסות כדי להבטיח עיבוד עקבי של טקסט בעברית, בלאית, במיאנמר, בטמילית, בגוג'ראטית, בקנאדה, במלאיאלאם, באודיה, בטלוגו או בתאילנדית.
ההתנהגות של elegantTextHeight באפליקציות שמטרגטות ל-Android
14 (רמת API 34) ומטה, או באפליקציות שמטרגטות ל-Android 15 (רמת API 35) ששינו את ברירת המחדל על ידי הגדרת המאפיין elegantTextHeight ל-false.
התנהגות elegantTextHeight באפליקציות שמטרגטות ל-Android
16 (רמת API 36), או באפליקציות שמטרגטות ל-Android 15 (רמת API 35) שלא
ביטלו את ברירת המחדל על ידי הגדרת המאפיין elegantTextHeight לערך false.פונקציונליות עיקרית
Android 16 (API ברמה 36) כוללת את השינויים הבאים, שמשנים או מרחיבים יכולות ליבה שונות של מערכת Android.
אופטימיזציה של תזמון פעולה בקצב קבוע
לפני הטירגוט ל-Android 16, אם scheduleAtFixedRate החמיץ ביצוע של משימה כי הוא לא היה במחזור חיים תקין של תהליך, כל הביצועים שהוחמצו מתבצעים באופן מיידי כשהאפליקציה חוזרת למחזור חיים תקין.
כשמטרגטים ל-Android 16, פעולה אחת שהוחמצה של scheduleAtFixedRate תושלם באופן מיידי כשהאפליקציה תחזור למחזור חיים תקין. שינוי ההתנהגות הזה צפוי לשפר את ביצועי האפליקציה. כדאי לבדוק את ההתנהגות הזו באפליקציה כדי לראות אם היא מושפעת.
אפשר גם לבדוק באמצעות מסגרת התאימות לאפליקציות ולהפעיל את הדגל STPE_SKIP_MULTIPLE_MISSED_PERIODIC_TASKS compat.
גורמי צורה של מכשירים
Android 16 (API ברמה 36) כוללת את השינויים הבאים באפליקציות כשהן מוצגות במכשירים עם מסך גדול.
פריסות מותאמות
אפליקציות ל-Android פועלות עכשיו במגוון מכשירים (כמו טלפונים, טאבלטים, מכשירים מתקפלים, מחשבים, מכוניות וטלוויזיות) ובמצבי חלונות במסכים גדולים (כמו מסך מפוצל וחלונות במחשב). לכן, מפתחים צריכים ליצור אפליקציות ל-Android שמותאמות לכל גודל מסך וחלון, ללא קשר לכיוון המכשיר. פרדיגמות כמו הגבלת הכיוון והגבלת שינוי הגודל מגבילות מדי בעולם של היום, שבו משתמשים במספר מכשירים.
התעלמות מהגבלות על כיוון, שינוי גודל ויחס גובה-רוחב
באפליקציות שמטרגטות ל-Android 16 (רמת API 36), מערכת Android 16 כוללת שינויים באופן שבו המערכת מנהלת הגבלות על כיוון, שינוי גודל ויחס גובה-רוחב. ההגבלות לא חלות יותר על מסכים עם רוחב מינימלי של 600dp ומעלה. האפליקציות ממלאות גם את כל חלון התצוגה, ללא קשר ליחס הגובה-רוחב או לכיוון המועדף על המשתמש, ולא נעשה שימוש ב-pillarboxing.
השינוי הזה מציג התנהגות חדשה של הפלטפורמה. מערכת Android עוברת למודל שבו האפליקציות צריכות להתאים את עצמן לכיוונים שונים, לגדלים שונים של מסכים וליחסי גובה-רוחב שונים. הגבלות כמו כיוון קבוע או שינוי גודל מוגבל פוגעות ביכולת ההתאמה של האפליקציה, ולכן אנחנו ממליצים להפוך את האפליקציה לדינמית כדי לספק את חוויית המשתמש הטובה ביותר האפשרית.
אפשר גם לבדוק את ההתנהגות הזו באמצעות מסגרת התאימות של האפליקציה והפעלת דגל התאימות UNIVERSAL_RESIZABLE_BY_DEFAULT.
שינויי תוכנה נפוצים שעלולים לגרום לכשלים
התעלמות מהגבלות על כיוון, שינוי גודל ויחס גובה-רוחב עלולה להשפיע על ממשק המשתמש של האפליקציה במכשירים מסוימים, במיוחד על רכיבים שנועדו לפריסות קטנות שמוגבלות לכיוון לאורך: לדוגמה, בעיות כמו פריסות מתוחות ואנימציות ורכיבים מחוץ למסך. הנחות לגבי יחס הגובה-רוחב או האוריינטציה עלולות לגרום לבעיות חזותיות באפליקציה. מידע נוסף על דרכים להימנע מבעיות כאלה ולשפר את ההתנהגות ההסתגלותית של האפליקציה.
התרת סיבוב המכשיר גורמת ליצירה מחדש של יותר פעילויות, מה שעלול לגרום לאובדן מצב המשתמש אם הוא לא נשמר בצורה נכונה. במאמר שמירת מצבי ממשק משתמש מוסבר איך לשמור נכון את מצב ממשק המשתמש.
פרטי ההטמעה
תכונות המניפסט וממשקי ה-API של זמן הריצה הבאים מוזנחים במכשירים עם מסך גדול במצב מסך מלא ובמצב חלונות מרובים:
screenOrientationresizableActivityminAspectRatiomaxAspectRatiosetRequestedOrientation()getRequestedOrientation()
המערכת מתעלמת מהערכים הבאים של המאפיינים screenOrientation, setRequestedOrientation() ו-getRequestedOrientation():
portraitreversePortraitsensorPortraituserPortraitlandscapereverseLandscapesensorLandscapeuserLandscape
בנוגע לשינוי הגודל של התצוגה, אין השפעה לערכים android:resizeableActivity="false", android:minAspectRatio ו-android:maxAspectRatio.
באפליקציות שמיועדות ל-Android 16 (רמת API 36), המערכת מתעלמת כברירת מחדל מהגבלות על כיוון האפליקציה, שינוי הגודל ויחס הגובה-רוחב במסכים גדולים, אבל כל אפליקציה שלא מוכנה באופן מלא יכולה לבטל את ההתנהגות הזו באופן זמני (מה שגורם להצבת האפליקציה במצב תאימות, כמו בגרסאות קודמות).
חריגים
ההגבלות על כיוון, שינוי גודל ויחס גובה-רוחב ב-Android 16 לא חלות במצבים הבאים:
- משחקים (מבוססים על הדגל של
android:appCategory) - המשתמשים מביעים הסכמה מפורשת להתנהגות ברירת המחדל של האפליקציה בהגדרות יחס הגובה-רוחב של המכשיר
- מסכים שקטנים מ-
sw600dp
ביטול זמני של ההסכמה
כדי לבטל את ההסכמה לפעילות ספציפית, צריך להצהיר על מאפיין המניפסט PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY:
<activity ...>
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY" android:value="true" />
...
</activity>
אם יותר מדי חלקים באפליקציה לא מוכנים ל-Android 16, אפשר לבטל את ההסכמה באופן מלא על ידי החלת אותה מאפיין ברמת האפליקציה:
<application ...>
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY" android:value="true" />
</application>
בריאות וכושר
Android 16 (API ברמה 36) כוללת את השינויים הבאים שקשורים לנתוני בריאות וכושר.
הרשאות ל"בריאות וכושר"
באפליקציות שמטרגטות ל-Android 16 (API level 36) ומעלה,
BODY_SENSORS נעשה שימוש בהרשאות יותר מפורטות
בקטע android.permissions.health, שגם Health Connect משתמש בהן. החל מ-Android 16, כל API שבעבר דרש את ההרשאות BODY_SENSORS
או BODY_SENSORS_BACKGROUND דורש במקום זאת את ההרשאה התואמת android.permissions.health. השינוי הזה משפיע על סוגי הנתונים, ממשקי ה-API וסוגי השירותים שפועלים בחזית הבאים:
HEART_RATE_BPMמתוך Health Services ב-Wear OS-
Sensor.TYPE_HEART_RATEמ-Android Sensor Manager -
heartRateAccuracyו-heartRateBpmמ-ProtoLayoutב-Wear OS -
FOREGROUND_SERVICE_TYPE_HEALTHבמקוםBODY_SENSORS, כשנדרשת ההרשאהandroid.permission.health
אם האפליקציה שלכם משתמשת בממשקי ה-API האלה, היא צריכה לבקש את ההרשאות הגרנולריות המתאימות:
- למעקב אחר קצב הלב, רמת החמצן בדם או טמפרטורת העור בזמן השימוש:
צריך לבקש את ההרשאה הגרנולרית בקטע
android.permissions.health, כמוREAD_HEART_RATEבמקוםBODY_SENSORS. - לגישה לחיישנים ברקע: צריך להשתמש ב-request
READ_HEALTH_DATA_IN_BACKGROUNDבמקום ב-requestBODY_SENSORS_BACKGROUND.
ההרשאות האלה זהות להרשאות שנדרשות כדי לקרוא נתונים מ-Health Connect, מאגר הנתונים של Android לנתוני בריאות, כושר ורווחה.
באפליקציות לנייד.
אפליקציות לנייד שעוברות לשימוש ב-READ_HEART_RATE ובהרשאות גרנולריות אחרות צריכות גם להצהיר על פעילות כדי להציג את מדיניות הפרטיות של האפליקציה. זו אותה דרישה כמו ב-Health Connect.
קישוריות
Android 16 (API ברמה 36) כוללת את השינויים הבאים במערך Bluetooth כדי לשפר את הקישוריות למכשירים היקפיים.
כוונה חדשה לטיפול באובדן של קשר ובשינויים בהצפנה
כחלק משיפור הטיפול באירועים של אובדן קישור, ב-Android 16 נוספו גם 2 כוונות חדשות כדי לספק לאפליקציות מודעוּת רבה יותר לאובדן קישור ולשינויים בהצפנה.
אפליקציות שמטרגטות את Android 16 יכולות עכשיו:
- לקבל כוונה מסוג
ACTION_KEY_MISSINGכשמתגלה אובדן של אבטחה מרחוק, כדי לספק משוב מפורט יותר מהמשתמשים ולבצע פעולות מתאימות. - לקבל כוונה מסוג
ACTION_ENCRYPTION_CHANGEבכל פעם שסטטוס ההצפנה של הקישור משתנה. זה כולל שינוי בסטטוס ההצפנה, שינוי באלגוריתם ההצפנה ושינוי בגודל מפתח ההצפנה. אפליקציות צריכות להתייחס לאיחוד כמשוחזר אם הקישור מוצפן בהצלחה לאחר קבלת הכוונהACTION_ENCRYPTION_CHANGE.
התאמה להטמעות שונות של יצרני ציוד מקורי (OEM)
גרסת Android 16 כוללת את הכוונות החדשות האלה, אבל ההטמעה והשידור שלהן עשויים להשתנות בהתאם ליצרני המכשירים השונים (OEM). כדי לוודא שהאפליקציה מספקת חוויה עקבית ואמינה בכל המכשירים, המפתחים צריכים לתכנן את הטיפול באובדן הקשר כך שיתאים בצורה חלקה לשינויים הפוטנציאליים האלה.
מומלץ להשתמש בהתנהגויות הבאות באפליקציות:
אם המערכת משדרת את הכוונה
ACTION_KEY_MISSING:המערכת תנתק את הקישור של ACL (Asynchronous Connection-Less), אבל פרטי הקישור של המכשיר יישמרו (כפי שמתואר כאן).
האפליקציה צריכה להשתמש בכוונה הזו כאות הראשי לזיהוי אובדן החיבור, ולהנחות את המשתמש לאשר שהמכשיר המרוחק נמצא בטווח לפני שהוא מתחיל למחוק את המכשיר או לבצע התאמה מחדש.
אם מכשיר מתנתק אחרי קבלת
ACTION_KEY_MISSING, האפליקציה צריכה להיזהר לפני שתנסה להתחבר מחדש, כי יכול להיות שהמכשיר כבר לא מקושר למערכת.אם הכוונה
ACTION_KEY_MISSINGלא משודרת:הקישור ל-ACL יישאר מחובר, ופרטי הקישור של המכשיר יוסרו על ידי המערכת, בדומה להתנהגות ב-Android 15.
בתרחיש הזה, האפליקציה צריכה להמשיך להשתמש במנגנונים הקיימים לטיפול באובדן אבטחה, כמו בגרסאות קודמות של Android, כדי לזהות אירועי אובדן אבטחה ולנהל אותם.
דרך חדשה להסרת שיוך Bluetooth
כל האפליקציות שמטרגטות את Android 16 יכולות עכשיו לבטל את ההתאמה של מכשירי Bluetooth באמצעות API ציבורי ב-CompanionDeviceManager. אם מכשיר נלווה מנוהל כשיוך CDM, האפליקציה יכולה להפעיל הסרה של קישור Bluetooth באמצעות ה-API החדש removeBond(int) במכשיר המשויך. האפליקציה יכולה לעקוב אחרי השינויים במצב החיבור על ידי האזנה לאירוע השידור של מכשיר ה-Bluetooth ACTION_BOND_STATE_CHANGED.
אבטחה
Android 16 (API ברמה 36) כוללת את שינויי האבטחה הבאים.
נעילת גרסה של MediaStore
באפליקציות שמטרגטות ל-Android מגרסה 16 ואילך, הערך של MediaStore#getVersion() יהיה עכשיו ייחודי לכל אפליקציה. כך, מחריגים את המאפיינים המזהים ממחרוץ הגרסה כדי למנוע ניצול לרעה ושימוש בשיטות ליצירת טביעות אצבע. אפליקציות לא צריכות להניח דבר לגבי הפורמט של הגרסה הזו. האפליקציות כבר אמורות לטפל בשינויים בגרסאות כשמשתמשים ב-API הזה, וברוב המקרים לא צריך לשנות את ההתנהגות הנוכחית שלהן, אלא אם המפתח ניסה להסיק מידע נוסף מעבר להיקף המיועד של ה-API הזה.
כוונות בטוחות יותר
התכונה Safer Intents היא יוזמת אבטחה רב-שלבית שנועדה לשפר את האבטחה של מנגנון פתרון הכוונות ב-Android. המטרה היא להגן על אפליקציות מפני פעולות זדוניות על ידי הוספת בדיקות במהלך עיבוד הכוונות וסינון כוונות שלא עומדות בקריטריונים ספציפיים.
ב-Android 15 התכונה התמקדה באפליקציה השולחת, ועכשיו ב-Android 16, השליטה עוברת לאפליקציה המקבלת, ומאפשרת למפתחים להביע הסכמה לפתרון קפדני של כוונות באמצעות מניפסט האפליקציה שלהם.
אנחנו מטמיעים שני שינויים חשובים:
אובייקטים מסוג Intent מפורש חייבים להתאים למסנן ה-Intent של רכיב היעד: אם אובייקט Intent מכוון במפורש לרכיב מסוים, הוא צריך להתאים למסנן ה-Intent של הרכיב הזה.
אובייקטים מסוג Intent ללא פעולה לא יכולים להתאים למסנן Intent כלשהו: אובייקטים מסוג Intent שלא צוינה להם פעולה לא אמורים להיות מזוהים כמסנן Intent כלשהו.
השינויים האלה חלים רק כשמעורבות כמה אפליקציות, והם לא משפיעים על הטיפול ב-Intent באפליקציה אחת.
השפעה
התכונה היא אופציונלית, ולכן מפתחים צריכים להפעיל אותה באופן מפורש במניפסט האפליקציה כדי שהיא תיכנס לתוקף. כתוצאה מכך, ההשפעה של התכונה תוגבל לאפליקציות שהמפתחים שלהן:
- מכירים את התכונה 'כוונות בטוחות יותר' ואת היתרונות שלה.
- בוחרים באופן פעיל לשלב באפליקציות שלהם שיטות לטיפול בהצהרות כוונות בצורה מחמירה יותר.
הגישה הזו מאפשרת להפעיל את התכונה רק אם רוצים, וכך מצמצמת את הסיכון לשיבוש של אפליקציות קיימות שעשויות להסתמך על ההתנהגות הנוכחית של זיהוי כוונות, שהיא פחות מאובטחת.
יכול להיות שההשפעה הראשונית ב-Android 16 תהיה מוגבלת, אבל ליוזמת Safer Intents יש תוכנית להשפעה רחבה יותר בגרסאות עתידיות של Android. התוכנית היא שבסופו של דבר, התנהגות ברירת המחדל תהיה זיהוי כוונות מדויק.
התכונה Safer Intents (העברות Intent בטוחות יותר) יכולה לשפר באופן משמעותי את האבטחה של מערכת Android, כי היא מקשה על אפליקציות זדוניות לנצל פרצות במנגנון של פתרון Intent.
עם זאת, צריך לנהל את המעבר לביטול ההסכמה ולאכיפה המחייבת בזהירות כדי לטפל בבעיות תאימות אפשריות עם אפליקציות קיימות.
הטמעה
המפתחים צריכים להפעיל באופן מפורש התאמה מחמירה יותר של Intent באמצעות המאפיין intentMatchingFlags בקובץ המניפסט של האפליקציה.
הנה דוגמה למצב שבו התכונה מופעלת בהסכמה לכל האפליקציה,
אבל מושבתת או שבוטלה בהסכמה במקלט:
<application android:intentMatchingFlags="enforceIntentFilter">
<receiver android:name=".MyBroadcastReceiver" android:exported="true" android:intentMatchingFlags="none">
<intent-filter>
<action android:name="com.example.MY_CUSTOM_ACTION" />
</intent-filter>
<intent-filter>
<action android:name="com.example.MY_ANOTHER_CUSTOM_ACTION" />
</intent-filter>
</receiver>
</application>
מידע נוסף על הדגלים הנתמכים:
| שם ההתרעה | תיאור |
|---|---|
| enforceIntentFilter | התנאי הזה מחייב התאמה מדויקת יותר של כוונות נכנסות |
| ללא | השבתה של כל כללי ההתאמה המיוחדים לכוונות נכנסות. כשמציינים כמה דגלים, ערכים סותרים נפתרים על ידי מתן עדיפות לדגל 'none' |
| allowNullAction | הכלל הזה מרחיב את כללי ההתאמה כדי לאפשר התאמה של כוונות ללא פעולה. הדגל הזה משמש בשילוב עם enforceIntentFilter כדי להשיג התנהגות ספציפית |
בדיקה וניפוי באגים
כשהאכיפה פעילה, האפליקציות אמורות לפעול בצורה תקינה אם המתקשר של הכוונה מילא את הכוונה בצורה תקינה.
עם זאת, כוונות חסומות יפעילו הודעות אזהרה ביומן כמו
"Intent does not match component's intent filter:" ו-"Access blocked:"
עם התג "PackageManager."
המשמעות היא שיש בעיה פוטנציאלית שעלולה להשפיע על האפליקציה ונדרש טיפול בה.
מסנן Logcat:
tag=:PackageManager & (message:"Intent does not match component's intent filter:" | message: "Access blocked:")
סינון של קריאות מערכת ל-GPU
כדי להקשיח את פני השטח של Mali GPU, Mali GPU IOCTLs שהוצאו משימוש או שמיועדים אך ורק לפיתוח GPU נחסמו בגרסאות ייצור. בנוסף, פקודות IOCTL שמשמשות ליצירת פרופיל של GPU הוגבלו לתהליך המעטפת או לאפליקציות שניתנות לניפוי באגים. פרטים נוספים על המדיניות ברמת הפלטפורמה זמינים בעדכון בנושא SAC.
השינוי הזה מתבצע במכשירי Pixel עם מעבד גרפי Mali (Pixel 6-9). חברת Arm סיפקה סיווג רשמי של פקודות ה-IOCTL שלה בDocumentation/ioctl-categories.rst של גרסת r54p2 שלה. הרשימה הזו תמשיך להתעדכן בגרסאות עתידיות של מנהלי ההתקנים.
השינוי הזה לא משפיע על ממשקי API נתמכים של גרפיקה (כולל Vulkan ו-OpenGL), ולא צפוי להשפיע על מפתחים או על אפליקציות קיימות. השינוי לא ישפיע על כלי פרופיל של GPU, כמו Streamline Performance Analyzer ו-Android GPU Inspector.
בדיקה
אם מופיעה לכם דחייה של SELinux שדומה לזו שמופיעה בהמשך, סביר להניח שהשינוי הזה השפיע על האפליקציה שלכם:
06-30 10:47:18.617 20360 20360 W roidJUnitRunner: type=1400 audit(0.0:85): avc: denied { ioctl }
for path="/dev/mali0" dev="tmpfs" ino=1188 ioctlcmd=0x8023
scontext=u:r:untrusted_app_25:s0:c512,c768 tcontext=u:object_r:gpu_device:s0 tclass=chr_file
permissive=0 app=com.google.android.selinux.pts
אם האפליקציה שלכם צריכה להשתמש ב-IOCTLs חסומים, עליכם לדווח על באג ולהקצות אותו לכתובת android-partner-security@google.com.
שאלות נפוצות
האם השינוי הזה במדיניות חל על כל יצרני הציוד המקורי? השינוי הזה יהיה אופציונלי, אבל הוא יהיה זמין לכל יצרני הציוד המקורי שירצו להשתמש בשיטת האבטחה הזו. הוראות להטמעת השינוי מופיעות במסמכי ההטמעה.
האם חובה לבצע שינויים בבסיס הקוד של יצרן הציוד המקורי כדי להטמיע את התכונה הזו, או שהיא מגיעה עם גרסה חדשה של AOSP כברירת מחדל? השינוי ברמת הפלטפורמה יגיע עם מהדורת AOSP חדשה כברירת מחדל. ספקים יכולים להחיל את השינוי הזה על בסיס הקוד שלהם אם הם רוצים.
האם מערכות SoC אחראיות לעדכון רשימת ה-IOCTL? לדוגמה, אם במכשיר שלי נעשה שימוש ב-GPU מסוג ARM Mali, האם אצטרך לפנות אל ARM כדי לבצע שינויים כלשהם? מערכות SoC נפרדות צריכות לעדכן את רשימות ה-IOCTL שלהן לכל מכשיר עם פרסום מנהל ההתקן. לדוגמה, ARM תעדכן את רשימת ה-IOCTL שפורסמה שלה אחרי עדכוני מנהלי התקנים. עם זאת, יצרני ציוד מקורי (OEM) צריכים לוודא שהם משלבים את העדכונים ב-SEPolicy שלהם, ומוסיפים לרשימות את כל פקודות ה-IOCTL המותאמות אישית שנבחרו, לפי הצורך.
האם השינוי הזה חל אוטומטית על כל מכשירי Pixel שזמינים למכירה, או שנדרשת פעולה של המשתמש כדי להפעיל משהו וליישם את השינוי? השינוי הזה חל על כל מכשירי Pixel שזמינים כרגע לרכישה ומשתמשים במעבד גרפי מסוג Mali (מכשירי Pixel 6 עד Pixel 9). לא נדרשת פעולה מצד המשתמש כדי להחיל את השינוי הזה.
האם השימוש במדיניות הזו ישפיע על הביצועים של מנהל ההתקן של ליבת מערכת ההפעלה? המדיניות הזו נבדקה ב-GPU מסוג Mali באמצעות GFXBench, ולא נצפה שינוי מדיד בביצועי ה-GPU.
האם רשימת ה-IOCTL צריכה להיות תואמת לגרסאות הנוכחיות של מרחב המשתמש ושל מנהל ההתקן של ליבת המערכת? כן, צריך לסנכרן את רשימת ה-IOCTL המותרים עם ה-IOCTL שנתמכים על ידי מנהלי ההתקנים של מרחב המשתמש ושל ליבת מערכת ההפעלה. אם פקודות ה-IOCTL במרחב המשתמש או במנהל ההתקן של ליבת המערכת מעודכנות, צריך לעדכן את רשימת פקודות ה-IOCTL של SEPolicy כך שתתאים להן.
חברת ARM סיווגה את פקודות ה-IOCTL כ 'מוגבלות' או כ'מכשירים', אבל אנחנו רוצים להשתמש בחלק מהן בתרחישי שימוש בייצור, ו/או לדחות אחרות. יצרני ציוד מקורי (OEM) ומערכות על שבב (SoC) אחראים להחליט איך לסווג את פקודות ה-IOCTL שבהן הם משתמשים, על סמך ההגדרה של ספריות Mali במרחב המשתמשים שלהם. אפשר להשתמש ברשימה של ARM כדי לקבל החלטות לגביהם, אבל יכול להיות שתרחישי השימוש של כל יצרן ציוד מקורי או SoC יהיו שונים.
פרטיות
Android 16 (API ברמה 36) כוללת את השינויים הבאים שקשורים לפרטיות.
הרשאה לגישה לרשת המקומית
具有 INTERNET 权限的任何应用都可以访问局域网上的设备。
这使得应用可以轻松连接到本地设备,但也存在隐私影响,例如形成用户指纹,以及成为位置信息的代理。
本地网络保护项目旨在通过在新的运行时权限后限制对本地网络的访问,来保护用户的隐私。
发布计划
此变更将分别在 25Q2 和 26Q2 这两个版本之间部署。 开发者必须遵循 25Q2 的相关指南并分享反馈,因为这些保护措施将在后续 Android 版本中强制执行。此外,他们还需要按照以下指南更新依赖于隐式本地网络访问权限的场景,并为用户拒绝和撤消新权限做好准备。
影响
在当前阶段,LNP 是一项选择启用功能,这意味着只有选择启用的应用会受到影响。选择启用阶段的目标是让应用开发者了解应用的哪些部分依赖于隐式本地网络访问权限,以便他们可以为下一个版本做好权限保护准备。
如果应用使用以下方式访问用户的本地网络,则会受到影响:
- 在本地网络地址(例如 mDNS 或 SSDP 服务发现协议)上直接或通过库使用原始套接字
- 使用可访问本地网络的框架级类(例如 NsdManager)
向本地网络地址发送流量和从本地网络地址接收流量需要本地网络访问权限。下表列出了一些常见情况:
| 应用低级层网络操作 | 需要本地网络权限 |
|---|---|
| 建立出站 TCP 连接 | 是 |
| 接受传入的 TCP 连接 | 是 |
| 发送 UDP 单播、多播、广播 | 是 |
| 接收传入的 UDP 单播、多播、广播 | 是 |
这些限制是在网络堆栈深处实现的,因此适用于所有网络 API。这包括在原生代码或受管理代码中创建的套接字、Cronet 和 OkHttp 等网络库,以及基于这些库实现的任何 API。尝试解析本地网络上的服务(即带有 .local 后缀的服务)将需要本地网络权限。
上述规则的例外情况:
- 如果设备的 DNS 服务器位于本地网络上,则进出该服务器(位于端口 53)的流量不需要本地网络访问权限。
- 如果应用使用输出切换器作为其应用内选择器,则无需本地网络权限(更多指南将在 2025 年第 4 季度发布)。
开发者指南(选择启用)
如需选择启用本地网络限制,请执行以下操作:
- 将设备刷写到 25Q2 Beta 3 或更高版本的 build。
- 安装要测试的应用。
在 adb 中切换 Appcompat 标志:
adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>重启设备
现在,您的应用对本地网络的访问受到限制,任何访问本地网络的尝试都会导致套接字错误。如果您使用的 API 在应用进程之外执行本地网络操作(例如:NsdManager),在选择启用阶段,这些 API 不会受到影响。
如需恢复访问权限,您必须向应用授予 NEARBY_WIFI_DEVICES 权限。
- 确保应用在其清单中声明了
NEARBY_WIFI_DEVICES权限。 - 依次前往设置 > 应用 > [应用名称] > 权限 > 附近的设备 > 允许。
现在,应用对本地网络的访问权限应该已恢复,并且所有场景都应像选择启用应用之前一样正常运行。
本地网络保护功能开始强制执行后,应用的网络流量将受到以下影响。
| 权限 | 出站 LAN 请求 | 出站/入站互联网请求 | 入站 LAN 请求 |
|---|---|---|---|
| 已授予 | Works | Works | Works |
| 未授予 | 最差排行榜 | Works | 最差排行榜 |
使用以下命令切换关闭应用兼容性标志
adb shell am compat disable RESTRICT_LOCAL_NETWORK <package_name>
错误
每当调用套接字调用 send 或 send 变体向本地网络地址发送数据时,系统都会向该套接字返回因这些限制而产生的错误。
错误示例:
sendto failed: EPERM (Operation not permitted)
sendto failed: ECONNABORTED (Operation not permitted)
本地网络定义
此项目中的本地网络是指使用支持广播的网络接口(例如 Wi-Fi 或以太网)的 IP 网络,但不包括移动网络 (WWAN) 或 VPN 连接。
以下网络被视为本地网络:
IPv4:
- 169.254.0.0/16 // 链路本地
- 100.64.0.0/10 // CGNAT
- 10.0.0.0/8 // RFC1918
- 172.16.0.0/12 // RFC1918
- 192.168.0.0/16 // RFC1918
IPv6:
- 链路本地
- 直接连接的路线
- Thread 等桩网络
- 多个子网(待定)
此外,多播地址 (224.0.0.0/4、ff00::/8) 和 IPv4 广播地址 (255.255.255.255) 都归类为本地网络地址。
תמונות בבעלות האפליקציה
כשמוצגת בקשה להענקת הרשאות גישה לתמונות ולסרטונים מאפליקציה שתואמת ל-SDK מגרסה 36 ואילך במכשירים עם Android מגרסה 16 ואילך, משתמשים שבוחרים להגביל את הגישה למדיה שנבחרה יראו את כל התמונות שבבעלות האפליקציה שנבחרו מראש בבורר התמונות. המשתמשים יכולים לבטל את הבחירה של כל אחד מהפריטים שנבחרו מראש, וכך לבטל את הגישה של האפליקציה לתמונות ולסרטונים האלה.