تغییرات رفتار: برنامه هایی که اندروید 16 یا بالاتر را هدف قرار می دهند

مانند نسخه های قبلی، اندروید 16 شامل تغییرات رفتاری است که ممکن است بر برنامه شما تأثیر بگذارد. تغییرات رفتاری زیر منحصراً برای برنامه‌هایی اعمال می‌شود که اندروید 16 یا بالاتر را هدف قرار می‌دهند. اگر برنامه شما اندروید 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 或更高版本的设备上运行的应用,预测性返回系统动画(返回主屏幕、跨任务和跨 activity)默认处于启用状态。此外,系统不再调用 onBackPressed,也不再调度 KeyEvent.KEYCODE_BACK

如果您的应用会拦截返回事件,但您尚未迁移到预测性返回,请更新应用以使用受支持的返回导航 API,或者暂时选择停用,方法是在应用的 AndroidManifest.xml 文件的 <application><activity> 标记中将 android:enableOnBackInvokedCallback 属性设置为 false

“返回主页”预测性返回动画。
预测性跨 activity 动画。
预测性跨任务动画。

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.

عملکرد اصلی

اندروید 16 (سطح API 36) شامل تغییرات زیر است که قابلیت‌های هسته‌ای مختلف سیستم اندروید را اصلاح یا گسترش می‌دهد.

بهینه سازی زمان بندی کار با نرخ ثابت

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) شامل تغییرات زیر برای برنامه‌ها هنگام نمایش در دستگاه‌های صفحه بزرگ است.

طرح‌بندی‌های تطبیقی

With Android apps now running on a variety of devices (such as phones, tablets, foldables, desktops, cars, and TVs) and windowing modes on large screens (such as split screen and desktop windowing), developers should build Android apps that adapt to any screen and window size, regardless of device orientation. Paradigms like restricting orientation and resizability are too restrictive in today's multidevice world.

Ignore orientation, resizability, and aspect ratio restrictions

For apps targeting Android 16 (API level 36), Android 16 includes changes to how the system manages orientation, resizability, and aspect ratio restrictions. On displays with smallest width >= 600dp, the restrictions no longer apply. Apps also fill the entire display window, regardless of aspect ratio or a user's preferred orientation, and pillarboxing isn't used.

This change introduces a new standard platform behavior. Android is moving toward a model where apps are expected to adapt to various orientations, display sizes, and aspect ratios. Restrictions like fixed orientation or limited resizability hinder app adaptability, so we recommend making your app adaptive to deliver the best possible user experience.

You can also test this behavior by using the app compatibility framework and enabling the UNIVERSAL_RESIZABLE_BY_DEFAULT compat flag.

Common breaking changes

Ignoring orientation, resizability, and aspect ratio restrictions might impact your app's UI on some devices, especially elements that were designed for small layouts locked in portrait orientation: for example, issues like stretched layouts and off-screen animations and components. Any assumptions about aspect ratio or orientation can cause visual issues with your app. Learn more about how to avoid them and improve your app's adaptive behaviour.

Allowing device rotation results in more activity re-creation, which can result in losing user state if not properly preserved. Learn how to correctly save UI state in Save UI states.

Implementation details

The following manifest attributes and runtime APIs are ignored across large screen devices in full-screen and multi-window modes:

The following values for screenOrientation, setRequestedOrientation(), and getRequestedOrientation() are ignored:

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

Regarding display resizability, android:resizeableActivity="false", android:minAspectRatio, and android:maxAspectRatio have no effect.

For apps targeting Android 16 (API level 36), app orientation, resizability, and aspect ratio constraints are ignored on large screens by default, but every app that isn't fully ready can temporarily override this behavior by opting out (which results in the previous behavior of being placed in compatibility mode).

Exceptions

The Android 16 orientation, resizability, and aspect ratio restrictions don't apply in the following situations:

  • Games (based on the android:appCategory flag)
  • Users explicitly opting in to the app's default behavior in aspect ratio settings of the device
  • Screens that are smaller than sw600dp

Opt out temporarily

To opt out a specific activity, declare the PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY manifest property:

<activity ...>
  <property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY" android:value="true" />
  ...
</activity>

If too many parts of your app aren't ready for Android 16, you can opt out completely by applying the same property at the application level:

<application ...>
  <property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY" android:value="true" />
</application>

سلامتی و تناسب اندام

اندروید 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.

قابلیت اتصال

اندروید 16 (سطح API 36) شامل تغییرات زیر در پشته بلوتوث برای بهبود اتصال با دستگاه های جانبی است.

اهداف جدید برای مدیریت از دست دادن اوراق قرضه و تغییرات رمزگذاری

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.

روشی جدید برای حذف باند بلوتوث

همه برنامه‌هایی که اندروید 16 را هدف قرار می‌دهند، اکنون می‌توانند با استفاده از یک API عمومی در CompanionDeviceManager ، دستگاه‌های بلوتوث را لغو جفت کنند. اگر یک دستگاه همراه به عنوان یک انجمن CDM مدیریت می‌شود، برنامه می‌تواند با استفاده از API جدید removeBond(int) در دستگاه مرتبط، حذف پیوند بلوتوث را آغاز کند. این برنامه می‌تواند با گوش دادن به رویداد پخش دستگاه بلوتوث ACTION_BOND_STATE_CHANGED تغییرات وضعیت پیوند را کنترل کند.

امنیت

اندروید 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.

مقاصد امن تر

“更安全的 intent”功能是一项多阶段安全计划,旨在提升 Android 的 intent 解析机制的安全性。目标是在 intent 处理期间添加检查,并过滤不符合特定条件的 intent,从而保护应用免受恶意操作的侵害。

Android 15 中,该功能侧重于发送应用,现在在 Android 16 中,控制权转移到了接收应用,允许开发者使用其应用清单选择启用严格的 intent 解析。

我们正在实施两项关键变更:

  1. 显式 intent 必须与目标组件的 intent 过滤器相匹配:如果 intent 显式定位到某个组件,则应与该组件的 intent 过滤器相匹配。

  2. 没有操作的 intent 无法匹配任何 intent 过滤器:未指定操作的 intent 不应解析为任何 intent 过滤器。

这些变更仅在涉及多个应用时适用,不会影响单个应用内的 intent 处理。

影响

选择启用性质意味着,开发者必须在应用清单中明确启用它,才能使其生效。 因此,此功能的影响将仅限于以下应用(开发者):

  • 了解“更安全的 intent”功能及其优势。
  • 主动选择在应用中采用更严格的 intent 处理实践。

这种选择性采用的方法可最大限度地降低破坏可能依赖于当前不太安全的 intent 解析行为的现有应用的风险。

虽然在 Android 16 中,初始影响可能有限,但“更安全的 intent”计划的路线图显示,未来 Android 版本中会产生更广泛的影响。我们计划最终将严格的 intent 解析设为默认行为。

“更安全的 intent”功能可让恶意应用更难利用 intent 解析机制中的漏洞,从而显著提升 Android 生态系统的安全性。

不过,向选择退出和强制执行的过渡必须谨慎管理,以解决现有应用的潜在兼容性问题。

实现

开发者需要在应用清单中使用 intentMatchingFlags 属性明确启用更严格的 intent 匹配。 以下示例展示了如何为整个应用选择启用该功能,但在接收器上停用/选择停用该功能:

<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 对传入的 intent 强制执行更严格的匹配
none 停用针对传入 intent 的所有特殊匹配规则。指定多个标志时,系统会优先考虑“无”标志,以解决值冲突问题
allowNullAction 放宽了匹配规则,允许匹配没有操作的 intent。此标志与“enforceIntentFilter”结合使用可实现特定行为

测试和调试

在强制执行处于有效状态时,如果 intent 调用方已正确填充 intent,应用应能正常运行。 不过,被屏蔽的 intent 会触发警告日志消息(例如 "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:")

حریم خصوصی

اندروید 16 (سطح API 36) شامل تغییرات حریم خصوصی زیر است.

مجوز شبکه محلی

دستگاه های موجود در شبکه LAN توسط هر برنامه ای که مجوز INTERNET را داشته باشد قابل دسترسی است. این امر اتصال برنامه‌ها به دستگاه‌های محلی را آسان می‌کند، اما پیامدهای حفظ حریم خصوصی مانند تشکیل اثر انگشت کاربر و پروکسی بودن مکان را نیز دارد.

پروژه Local Network Protections با هدف حفاظت از حریم خصوصی کاربر با دسترسی به شبکه محلی در پشت مجوز زمان اجرا جدید.

طرح انتشار

این تغییر به ترتیب بین دو نسخه 25Q2 و TBD اعمال خواهد شد. ضروری است که توسعه دهندگان این دستورالعمل را برای 25Q2 دنبال کنند و بازخورد خود را به اشتراک بگذارند زیرا این حفاظت ها در نسخه بعدی اندروید اعمال خواهند شد . علاوه بر این، آنها باید سناریوهایی را که به دسترسی ضمنی شبکه محلی وابسته هستند با استفاده از راهنمایی زیر به روز کنند و برای رد کاربر و لغو مجوز جدید آماده شوند.

تاثیر

در مرحله فعلی، LNP یک ویژگی Opt-in است که به این معنی است که فقط برنامه هایی که شرکت می کنند تحت تأثیر قرار می گیرند. هدف مرحله انتخاب کردن این است که توسعه دهندگان برنامه بفهمند کدام بخش از برنامه آنها به دسترسی ضمنی شبکه محلی وابسته است به طوری که می توانند برای محافظت از آنها برای نسخه بعدی آماده شوند.

اگر برنامه‌ها با استفاده از موارد زیر به شبکه محلی کاربر دسترسی پیدا کنند تحت تأثیر قرار می‌گیرند.

  • استفاده مستقیم یا کتابخانه ای از سوکت های خام در آدرس های شبکه محلی (مثلاً پروتکل کشف سرویس mDNS یا SSDP)
  • استفاده از کلاس های سطح چارچوب که به شبکه محلی دسترسی دارند (مانند NsdManager)

ترافیک به و از یک آدرس شبکه محلی نیاز به مجوز دسترسی به شبکه محلی دارد. جدول زیر برخی از موارد رایج را فهرست می کند:

برنامه عملیات شبکه سطح پایین مجوز شبکه محلی مورد نیاز است
ایجاد یک اتصال TCP خروجی بله
پذیرش اتصالات TCP ورودی بله
ارسال UDP تک پخشی، چندپخشی، پخش بله
دریافت یک UDP دریافتی unicast، multicast، پخش بله

این محدودیت‌ها در اعماق پشته شبکه پیاده‌سازی می‌شوند و بنابراین برای همه APIهای شبکه اعمال می‌شوند. این شامل سوکت های ایجاد شده در کدهای بومی یا مدیریت شده، کتابخانه های شبکه مانند Cronet و OkHttp و هر APIهایی است که در بالای آن ها پیاده سازی شده اند. تلاش برای حل و فصل سرویس‌ها در شبکه محلی (یعنی آنهایی که پسوند .local دارند) به مجوز شبکه محلی نیاز دارد.

استثنائات قوانین فوق:

  • اگر سرور DNS دستگاه در یک شبکه محلی است، ترافیک به یا از آن (در پورت 53) نیازی به مجوز دسترسی به شبکه محلی ندارد.
  • برنامه‌هایی که از Output Switcher به‌عنوان انتخابگر درون‌برنامه خود استفاده می‌کنند، نیازی به مجوزهای شبکه محلی ندارند (راهنمایی‌های بیشتری در Q4 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. به Settings > Apps > [Application Name] > Permissions > Nearby devices > Allow بروید .

اکنون دسترسی برنامه شما به شبکه محلی باید بازیابی شود و همه سناریوهای شما باید مانند قبل از انتخاب برنامه کار کنند.

هنگامی که اجرای حفاظت از شبکه محلی آغاز شد، در اینجا نحوه تأثیرگذاری بر ترافیک شبکه برنامه آمده است.

اجازه درخواست LAN خروجی درخواست اینترنت خروجی/ورودی درخواست LAN ورودی
داده شده است کار می کند کار می کند کار می کند
داده نشده است شکست می خورد کار می کند شکست می خورد

از دستور زیر برای خاموش کردن پرچم 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 // پیوند محلی
  • 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
  • زیرشبکه های چندگانه (TBD)

علاوه بر این، هر دو آدرس چندپخشی (224.0.0.0/4، ff00::/8) و آدرس پخش IPv4 (255.255.255.255) به عنوان آدرس های شبکه محلی طبقه بندی می شوند.

عکس های متعلق به برنامه

When prompted for photo and video permissions by an app targeting SDK 36 or higher on devices running Android 16 or higher, users who choose to limit access to selected media will see any photos owned by the app pre-selected in the photo picker. Users can deselect any of these pre-selected items, which will revoke the app's access to those photos and videos.