שינויים בהתנהגות: אפליקציות שמטרגטות ל-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 אלגנטיים לגופנים

Apps targeting Android 15 (API level 35) have the elegantTextHeight TextView attribute set to true by default, replacing the compact font with one that is much more readable. You could override this by setting the elegantTextHeight attribute to false.

Android 16 deprecates the elegantTextHeight attribute, and the attribute will be ignored once your app targets Android 16. The "UI fonts" controlled by these APIs are being discontinued, so you should adapt any layouts to ensure consistent and future proof text rendering in Arabic, Lao, Myanmar, Tamil, Gujarati, Kannada, Malayalam, Odia, Telugu or Thai.

elegantTextHeight behavior for apps targeting Android 14 (API level 34) and lower, or for apps targeting Android 15 (API level 35) that overrode the default by setting the elegantTextHeight attribute to false.
elegantTextHeight behavior for apps targeting Android 16 (API level 36), or for apps targeting Android 15 (API level 35) that didn't override the default by setting the elegantTextHeight attribute to false.

פונקציונליות עיקרית

‫Android 16 (‏API ברמה 36) כוללת את השינויים הבאים, שמשנים או מרחיבים יכולות ליבה שונות של מערכת Android.

אופטימיזציה של תזמון פעולה בקצב קבוע

Prior to targeting Android 16, when scheduleAtFixedRate missed a task execution due to being outside a valid process lifecycle, all missed executions immediately execute when the app returns to a valid lifecycle.

When targeting Android 16, at most one missed execution of scheduleAtFixedRate is immediately executed when the app returns to a valid lifecycle. This behavior change is expected to improve app performance. Test this behavior in your app to check if your app is impacted. You can also test by using the app compatibility framework and enabling the STPE_SKIP_MULTIPLE_MISSED_PERIODIC_TASKS compat flag.

גורמי צורה של מכשירים

‫Android 16 (‏API ברמה 36) כוללת את השינויים הבאים באפליקציות כשהן מוצגות במכשירים עם מסך גדול.

פריסות מותאמות

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

התעלמות מהגבלות על כיוון, שינוי גודל ויחס גובה-רוחב

באפליקציות שמטרגטות ל-Android 16 (רמת API 36), ההגבלות על כיוון, שינוי גודל ויחס גובה-רוחב לא חלות יותר על מסכים עם רוחב מינימלי של 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) כוללת את השינויים הבאים שקשורים לנתוני בריאות וכושר.

הרשאות ל"בריאות וכושר"

For apps targeting Android 16 (API level 36) or higher, BODY_SENSORS permissions use more granular permissions under android.permissions.health, which Health Connect also uses. As of Android 16, any API previously requiring BODY_SENSORS or BODY_SENSORS_BACKGROUND requires the corresponding android.permissions.health permission instead. This affects the following data types, APIs, and foreground service types:

If your app uses these APIs, it should request the respective granular permissions:

These permissions are the same as those that guard access to reading data from Health Connect, the Android datastore for health, fitness, and wellness data.

Mobile apps

Mobile apps migrating to use the READ_HEART_RATE and other granular permissions must also declare an activity to display the app's privacy policy. This is the same requirement as Health Connect.

קישוריות

‫Android 16 (‏API ברמה 36) כוללת את השינויים הבאים במערך Bluetooth כדי לשפר את הקישוריות למכשירים היקפיים.

כוונה חדשה לטיפול באובדן של קשר ובשינויים בהצפנה

As part of the Improved bond loss handling, Android 16 also introduces 2 new intents to provide apps with greater awareness of bond loss and encryption changes.

Apps targeting Android 16 can now:

  • Receive an ACTION_KEY_MISSING intent when remote bond loss is detected, allowing them to provide more informative user feedback and take appropriate actions.
  • Receive an ACTION_ENCRYPTION_CHANGE intent whenever encryption status of the link changes. This includes encryption status change, encryption algorithm change, and encryption key size change. Apps must consider the bond restored if the link is successfully encrypted upon receiving ACTION_ENCRYPTION_CHANGE intent later.

Adapting to varying OEM implementations

While Android 16 introduces these new intents, their implementation and broadcasting can vary across different device manufacturers (OEMs). To ensure your app provides a consistent and reliable experience across all devices, developers should design their bond loss handling to gracefully adapt to these potential variations.

We recommend the following app behaviors:

  • If the ACTION_KEY_MISSING intent is broadcast:

    The ACL (Asynchronous Connection-Less) link will be disconnected by the system, but the bond information for the device will be retained (as described here).

    Your app should use this intent as the primary signal for bond loss detection and guiding the user to confirm the remote device is in range before initiating device forgetting or re-pairing.

    If a device disconnects after ACTION_KEY_MISSING is received, your app should be cautious about reconnecting, as the device may no longer be bonded with the system.

  • If the ACTION_KEY_MISSING intent is NOT broadcast:

    The ACL link will remain connected, and the bond information for the device will be removed by the system, same to behavior in Android 15.

    In this scenario, your app should continue its existing bond loss handling mechanisms as in previous Android releases, to detect and manage bond loss events.

דרך חדשה להסרת שיוך Bluetooth

All apps targeting Android 16 are now able to unpair bluetooth devices using a public API in CompanionDeviceManager. If a companion device is being managed as a CDM association, then the app can trigger bluetooth bond removal by using the new removeBond(int) API on the associated device. The app can monitor the bond state changes by listening to the bluetooth device broadcast event ACTION_BOND_STATE_CHANGED.

אבטחה

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

נעילת גרסה של MediaStore

For apps targeting Android 16 or higher, MediaStore#getVersion() will now be unique to each app. This eliminates identifying properties from the version string to prevent abuse and usage for fingerprinting techniques. Apps shouldn't make any assumptions around the format of this version. Apps should already handle version changes when using this API and in most cases shouldn't need to change their current behavior, unless the developer has attempted to infer additional information that is beyond the intended scope of this 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:")

סינון של קריאות מערכת (syscall) ב-GPU

To harden the Mali GPU surface, Mali GPU IOCTLs that have been deprecated or are intended solely for GPU development have been blocked in production builds. Additionally, IOCTLs used for GPU profiling have been restricted to the shell process or debuggable applications. Refer to the SAC update for more details on the platform-level policy.

This change takes place on Pixel devices using the Mali GPU (Pixel 6-9). Arm has provided official categorization of their IOCTLs in Documentation/ioctl-categories.rst of their r54p2 release. This list will continue to be maintained in future driver releases.

This change does not impact supported graphics APIs (including Vulkan and OpenGL), and is not expected to impact developers or existing applications. GPU profiling tools such as the Streamline Performance Analyzer and the Android GPU Inspector won't be affected.

Testing

If you see a SELinux denial similar to the following, it is likely your application has been impacted by this change:

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

If your application needs to use blocked IOCTLs, please file a bug and assign it to android-partner-security@google.com.

FAQ

  1. Does this policy change apply to all OEMs? This change will be opt-in, but available to any OEMs who would like to use this hardening method. Instructions for implementing the change can be found in the implementation documentation.

  2. Is it mandatory to make changes in the OEM codebase to implement this, or does it come with a new AOSP release by default? The platform-level change will come with a new AOSP release by default. Vendors may opt-in to this change in their codebase if they would like to apply it.

  3. Are SoCs responsible for keeping the IOCTL list up to date? For example, if my device uses an ARM Mali GPU, would I need to reach out to ARM for any of the changes? Individual SoCs must update their IOCTL lists per device upon driver release. For example, ARM will update their published IOCTL list upon driver updates. However, OEMs should make sure that they incorporate the updates in their SEPolicy, and add any selected custom IOCTLs to the lists as needed.

  4. Does this change apply to all Pixel in-market devices automatically, or is a user action required to toggle something to apply this change? This change applies to all Pixel in-market devices using the Mali GPU (Pixel 6-9). No user action is required to apply this change.

  5. Will use of this policy impact the performance of the kernel driver? This policy was tested on the Mali GPU using GFXBench, and no measurable change to GPU performance was observed.

  6. Is it necessary for the IOCTL list to align with the current userspace and kernel driver versions? Yes, the list of allowed IOCTLs must be synchronized with the IOCTLs supported by both the userspace and kernel drivers. If the IOCTLs in the user space or kernel driver are updated, the SEPolicy IOCTL list must be updated to match.

  7. ARM has categorized IOCTLs as 'restricted' / 'instrumentation', but we want to use some of them in production use-cases, and/or deny others. Individual OEMs/SoCs are responsible for deciding on how to categorize the IOCTLs they use, based on the configuration of their userspace Mali libraries. ARM's list can be used to help decide on these, but each OEM/SoC's use-case may be different.

פרטיות

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

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

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

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

תוכנית ההשקה

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

השפעה

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

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

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

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

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

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

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

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

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

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

  1. מבצעים פלאשינג למכשיר לגרסה עם 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 或更高版本的设备上提示用户授予照片和视频权限时,如果用户选择限制对所选媒体的访问权限,则会在照片选择器中看到该应用拥有的所有照片。用户可以取消选择任何这些预选项,这会撤消该应用对这些照片和视频的访问权限。