שינויים בהתנהגות: אפליקציות שמטרגטות ל-Android מגרסה 16 ואילך

בדומה לגרסאות קודמות, 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), מאפיין elegantTextHeightTextView מוגדר כ-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 בזמן הריצה מושבתים במכשירים עם מסך גדול במצב מסך מלא ובמצב מרובה חלונות:

המערכת מתעלמת מהערכים הבאים של screenOrientation, setRequestedOrientation() ו-getRequestedOrientation():

  • portrait
  • reversePortrait
  • sensorPortrait
  • userPortrait
  • landscape
  • reverseLandscape
  • sensorLandscape
  • userLandscape

לגבי שינוי הגודל של התצוגה, 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 וסוגי השירותים שפועלים בחזית הבאים:

אם האפליקציה שלכם משתמשת בממשקי ה-API האלה, היא צריכה לבקש את ההרשאות הגרנולריות המתאימות:

  • כדי לבקש הרשאה לניטור קצב הלב, רמת החמצן בדם או טמפרטורת העור בזמן השימוש במכשיר: צריך לבקש את ההרשאה הגרנולרית בקטע android.permissions.health, למשל READ_HEART_RATE במקום BODY_SENSORS.
  • כדי לקבל גישה לחיישנים ברקע: שולחים בקשה ל-READ_HEALTH_DATA_IN_BACKGROUND במקום ל-BODY_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, השליטה עוברת לאפליקציה המקבלת, ומאפשרת למפתחים להביע הסכמה לפתרון קפדני של כוונות באמצעות מניפסט האפליקציה שלהם.

אנחנו מטמיעים שני שינויים עיקריים:

  1. אובייקטים מסוג Intent מפורש צריכים להתאים למסנן ה-Intent של רכיב היעד: אם אובייקט Intent מכוון במפורש לרכיב, הוא צריך להתאים למסנן ה-Intent של הרכיב הזה.

  2. אובייקטים מסוג 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:")

פרטיות

‫Android 16 (רמת API 36) כולל את השינויים הבאים בנושא פרטיות.

הרשאה לגישה לרשת המקומית

כל אפליקציה שיש לה הרשאה INTERNET יכולה לגשת למכשירים ברשת המקומית. כך קל לאפליקציות להתחבר למכשירים מקומיים, אבל יש לכך גם השלכות על הפרטיות, כמו יצירת טביעת אצבע של המשתמש ושימוש ב-proxy למיקום.

מטרת הפרויקט Local Network Protections (הגנות על הרשת המקומית) היא להגן על פרטיות המשתמש באמצעות הגבלת הגישה לרשת המקומית מאחורי הרשאת זמן ריצה חדשה.

תוכנית ההשקה

השינוי הזה יוטמע בין שתי גרסאות, 25Q2 ו-TBD בהתאמה. חשוב מאוד שמפתחים יפעלו לפי ההנחיות האלה ב-25Q2 וישתפו משוב, כי אמצעי ההגנה האלה יאכפו בגרסת Android מאוחרת יותר. בנוסף, הם יצטרכו לעדכן תרחישים שתלויים בגישה מרומזת לרשת מקומית באמצעות ההנחיות הבאות, ולהתכונן לדחייה של המשתמשים ולביטול ההרשאה החדשה.

השפעה

בשלב הנוכחי, LNP היא תכונה אופציונלית, כלומר היא תשפיע רק על האפליקציות שהביעו הסכמה לשימוש בה. המטרה של שלב ההצטרפות היא לאפשר למפתחי אפליקציות להבין אילו חלקים באפליקציה שלהם תלויים בגישה מרומזת לרשת המקומית, כדי שיוכלו להתכונן להגנה באמצעות הרשאות בגרסה הבאה.

האפליקציות יושפעו אם הן ניגשות לרשת המקומית של המשתמש באמצעות:

  • שימוש ישיר או שימוש בספרייה של שקעים גולמיים בכתובות של רשת מקומית (למשל, פרוטוקול mDNS או פרוטוקול SSDP לזיהוי שירותים)
  • שימוש במחלקות ברמת המסגרת שיש להן גישה לרשת המקומית (למשל, NsdManager)

כדי להעביר תנועה אל כתובת ברשת מקומית וממנה, צריך הרשאת גישה לרשת מקומית. בטבלה הבאה מפורטים כמה מקרים נפוצים:

פעולה ברשת ברמה נמוכה באפליקציה נדרשת הרשאה לגישה לרשת המקומית
יצירת חיבור TCP יוצא כן
אישור חיבורי TCP נכנסים כן
שליחת שידור יחיד, שידור לקבוצה או שידור לכולם באמצעות UDP כן
קבלת שידור יחיד, שידור מרובה או שידור לכל כתובת ב-UDP כן

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

חריגים לכללים שלמעלה:

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

הנחיות למפתחים (אופציונלי)

כדי להפעיל הגבלות על הרשת המקומית:

  1. מבצעים Flash למכשיר לגרסה עם 25Q2 Beta 3 ואילך.
  2. מתקינים את האפליקציה שרוצים לבדוק.
  3. החלפת מצב הדגל Appcompat ב-adb:

    adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>
    
  4. הפעלה מחדש של המכשיר

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

כדי לשחזר את הגישה, צריך לתת לאפליקציה הרשאה לNEARBY_WIFI_DEVICES.

  1. מוודאים שהאפליקציה מצהירה על ההרשאה NEARBY_WIFI_DEVICES במניפסט שלה.
  2. עוברים אל הגדרות > אפליקציות > [שם האפליקציה] > הרשאות > מכשירים בקרבת מקום > אישור.

עכשיו הגישה של האפליקציה לרשת המקומית אמורה להיות משוחזרת, וכל התרחישים אמורים לפעול כמו לפני שהאפליקציה נכללה בהסכמה.

אחרי שהאכיפה של ההגנה על הרשת המקומית תתחיל, כך תושפע תנועת הרשת של האפליקציה.

הרשאה בקשה יוצאת ב-LAN בקשה יוצאת/נכנסת לאינטרנט בקשה נכנסת ב-LAN
הוענקה Microsoft Works Microsoft Works Microsoft Works
לא הוענקה גישה פספוסים Microsoft Works פספוסים

כדי להשבית את הדגל App-Compat, משתמשים בפקודה הבאה

adb shell am compat disable RESTRICT_LOCAL_NETWORK <package_name>

שגיאות

שגיאות שנובעות מהמגבלות האלה יוחזרו לשקע הקורא בכל פעם שהוא מפעיל שליחה או גרסה של שליחה לכתובת ברשת מקומית.

דוגמאות לשגיאות:

sendto failed: EPERM (Operation not permitted)

sendto failed: ECONNABORTED (Operation not permitted)

הגדרה של רשת מקומית

רשת מקומית בפרויקט הזה היא רשת IP שמשתמשת בממשק רשת עם יכולת שידור, כמו Wi-Fi או Ethernet, אבל לא כוללת חיבורים סלולריים (WWAN) או חיבורי VPN.

הערוצים הבאים נחשבים לערוצים מקומיים:

IPv4:

  • ‫169.254.0.0/16 // Link Local
  • ‪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:

  • קישור מקומי
  • מסלולים שמקושרים ישירות
  • רשתות Stub כמו Thread
  • Multiple-subnets (TBD)

בנוסף, גם כתובות מולטיקאסט (224.0.0.0/4, ff00::/8) וגם כתובת ה-IPv4 לשידור (255.255.255.255) מסווגות ככתובות של רשת מקומית.

תמונות בבעלות האפליקציה

כשמוצגת בקשה להענקת הרשאות גישה לתמונות ולסרטונים מאפליקציה שתואמת ל-SDK מגרסה 36 ואילך במכשירים עם Android מגרסה 16 ואילך, משתמשים שבוחרים להגביל את הגישה למדיה שנבחרה יראו את כל התמונות שבבעלות האפליקציה שנבחרו מראש בבורר התמונות. המשתמשים יכולים לבטל את הבחירה של כל אחד מהפריטים שנבחרו מראש, וכך לבטל את הגישה של האפליקציה לתמונות ולסרטונים האלה.