تغییرات رفتار: همه برنامه ها

پلتفرم اندروید ۱۶ شامل تغییرات رفتاری است که ممکن است بر برنامه شما تأثیر بگذارد. تغییرات رفتاری زیر برای همه برنامه‌ها هنگام اجرا در اندروید ۱۶، صرف نظر از targetSdkVersion ، اعمال می‌شود. شما باید برنامه خود را آزمایش کنید و سپس در صورت لزوم، آن را برای پشتیبانی از این تغییرات، در صورت لزوم، اصلاح کنید.

حتماً فهرست تغییرات رفتاری که فقط بر برنامه‌های اندروید ۱۶ تأثیر می‌گذارند را نیز بررسی کنید.

عملکرد اصلی

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

بهینه‌سازی سهمیه‌بندی JobScheduler

از Android 16 شروع می‌کنیم، ما سهمیه زمان اجرای کار را به طور منظم و سریع بر اساس عوامل زیر تنظیم می‌کنیم:

  • برنامه در کدام سطل آماده به کار برنامه قرار دارد : در Android 16، سطل های آماده به کار فعال با یک سهمیه زمان اجرا سخاوتمندانه شروع به اجرا می کنند.
  • اگر کار در حالی که برنامه در بالاترین وضعیت است اجرا شود : در Android 16، Jobs زمانی که برنامه برای کاربر قابل مشاهده است شروع می شود و پس از نامرئی شدن برنامه ادامه می یابد، به سهمیه زمان اجرای کار پایبند خواهد بود.
  • اگر کار هنگام اجرای یک سرویس پیش‌زمینه اجرا می‌شود : در Android 16، کارهایی که همزمان با یک سرویس پیش‌زمینه اجرا می‌شوند، به سهمیه زمان اجرای کار پایبند هستند. اگر از کارهایی برای انتقال داده توسط کاربر استفاده می کنید، به جای آن از کارهای انتقال داده توسط کاربر استفاده کنید.

این تغییر بر وظایف برنامه ریزی شده با استفاده از WorkManager، JobScheduler و DownloadManager تأثیر می گذارد. برای رفع اشکال چرایی توقف کار، توصیه می‌کنیم با فراخوانی WorkInfo.getStopReason() ثبت کنید که چرا کارتان متوقف شده است (برای کارهای JobScheduler، با JobParameters.getStopReason() ) تماس بگیرید.

برای اطلاعات در مورد اینکه چگونه وضعیت برنامه شما بر منابعی که می‌تواند استفاده کند تأثیر می‌گذارد، به محدودیت‌های منابع مدیریت نیرو مراجعه کنید. برای اطلاعات بیشتر در مورد بهترین شیوه های باتری بهینه، به راهنمای بهینه سازی استفاده از باتری برای API های زمان بندی کار مراجعه کنید.

همچنین توصیه می‌کنیم از API جدید JobScheduler#getPendingJobReasonsHistory که در اندروید 16 معرفی شده است استفاده کنید تا بفهمید چرا یک کار اجرا نشده است.

تست کردن

برای آزمایش رفتار برنامه‌تان، می‌توانید تا زمانی که برنامه روی دستگاه Android 16 اجرا می‌شود، برخی بهینه‌سازی‌های سهمیه شغلی را لغو کنید.

برای غیرفعال کردن اجرای "نقطه بالا به سهمیه زمان اجرا پایبند خواهد بود"، دستور adb زیر را اجرا کنید:

adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_TOP_STARTED_JOBS APP_PACKAGE_NAME

برای غیرفعال کردن اجرای «کارهایی که همزمان با یک سرویس پیش‌زمینه اجرا می‌شوند، به سهمیه زمان اجرای کار پایبند هستند»، دستور adb زیر را اجرا کنید:

adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_FGS_JOBS APP_PACKAGE_NAME

برای آزمایش رفتار سطل آماده به کار برنامه خاص، می توانید با استفاده از دستور adb زیر، سطل استندبای برنامه برنامه خود را تنظیم کنید:

adb shell am set-standby-bucket APP_PACKAGE_NAME active|working_set|frequent|rare|restricted

برای درک سطل استندبای برنامه که برنامه شما در آن قرار دارد، می‌توانید با استفاده از دستور adb زیر، سطل استندبای برنامه برنامه خود را دریافت کنید:

adb shell am get-standby-bucket APP_PACKAGE_NAME

دلیل توقف مشاغل خالی رها شده

یک کار رها شده زمانی اتفاق می‌افتد که شی JobParameters مرتبط با کار زباله جمع‌آوری شده باشد، اما JobService#jobFinished(JobParameters, boolean) برای علامت دادن به اتمام کار فراخوانی نشده است. این نشان می‌دهد که کار ممکن است بدون اطلاع برنامه در حال اجرا و زمان‌بندی مجدد باشد.

برنامه‌هایی که به JobScheduler متکی هستند، ارجاع قوی به شی JobParameters ندارند، و به جای STOP_REASON_TIMEOUT ، به دلیل توقف کار جدید STOP_REASON_TIMEOUT_ABANDONED اعطا می‌شود.

اگر موارد مکرر دلیل توقف رها شده جدید وجود داشته باشد، سیستم اقدامات کاهشی را برای کاهش فراوانی کار انجام خواهد داد.

برنامه‌ها باید از دلیل توقف جدید برای شناسایی و کاهش مشاغل رها شده استفاده کنند.

اگر از WorkManager، AsyncTask یا DownloadManager استفاده می‌کنید، تحت تأثیر قرار نمی‌گیرید زیرا این APIها چرخه عمر کار را از طرف برنامه شما مدیریت می‌کنند.

JobInfo#setImportantWhileForeground کاملاً منسوخ شده است

JobInfo.Builder#setImportantWhileForeground(boolean) 方法用于在调度应用位于前台或暂时豁免于后台限制时指示作业的优先级。

自 Android 12(API 级别 31)起,此方法已废弃。从 Android 16 开始,它不再有效,系统会忽略调用此方法。

此功能移除也适用于 JobInfo#isImportantWhileForeground()。从 Android 16 开始,如果调用该方法,该方法会返回 false

محدوده اولویت پخش مرتب‌شده دیگر سراسری نیست

Android 应用可以为广播接收器定义优先级,以控制接收器接收和处理广播的顺序。对于清单声明的接收器,应用可以使用 android:priority 属性来定义优先级;对于上下文注册的接收器,应用可以使用 IntentFilter#setPriority() API 来定义优先级。发送广播时,系统会按接收器的优先级(从高到低)将其传送给接收器。

在 Android 16 中,无法保证使用 android:priority 属性或 IntentFilter#setPriority() 在不同进程中传送广播的顺序。广播优先级仅在同一应用进程内有效,而不会跨所有进程有效。

此外,广播优先级将自动限制在 (SYSTEM_LOW_PRIORITY + 1, SYSTEM_HIGH_PRIORITY - 1) 的范围内。只有系统组件才能将 SYSTEM_LOW_PRIORITYSYSTEM_HIGH_PRIORITY 设置为广播优先级。

如果您的应用执行以下任一操作,可能会受到影响:

  1. 您的应用声明了具有相同广播 intent 的多个进程,并且希望根据优先级以特定顺序接收这些 intent。
  2. 您的应用进程与其他进程交互,并期望以特定顺序接收广播 intent。

如果进程需要相互协调,则应使用其他协调渠道进行通信。

تغییرات داخلی ART

Android 16 شامل آخرین به‌روزرسانی‌های Android Runtime (ART) است که عملکرد Android Runtime (ART's) را بهبود می‌بخشد و از ویژگی‌های اضافی جاوا پشتیبانی می‌کند. از طریق به‌روزرسانی‌های سیستم Google Play، این بهبودها برای بیش از یک میلیارد دستگاه دارای Android 12 (سطح API 31) و بالاتر نیز در دسترس است.

با انتشار این تغییرات، کتابخانه‌ها و کد برنامه‌هایی که به ساختارهای داخلی ART متکی هستند ممکن است در دستگاه‌های دارای Android 16 به درستی کار نکنند، همراه با نسخه‌های قبلی اندروید که ماژول ART را از طریق به‌روزرسانی‌های سیستم Google Play به‌روزرسانی می‌کنند.

اتکا به ساختارهای داخلی (مانند رابط‌های غیر SDK ) همیشه می‌تواند منجر به مشکلات سازگاری شود، اما بسیار مهم است که از تکیه بر کد (یا کتابخانه‌های حاوی کد) که از ساختارهای داخلی ART استفاده می‌کنند، اجتناب کنید، زیرا تغییرات ART به پلتفرم مرتبط نیست. نسخه ای که دستگاه در حال اجرا است و آنها از طریق به روز رسانی سیستم Google Play به بیش از یک میلیارد دستگاه می روند.

همه برنامه‌نویس‌ها باید با آزمایش کامل برنامه‌هایشان در Android 16 بررسی کنند که آیا برنامه‌شان تحت تأثیر قرار گرفته است یا خیر. علاوه بر این، مسائل شناخته‌شده را بررسی کنید تا ببینید آیا برنامه شما به کتابخانه‌هایی وابسته است که ما شناسایی کرده‌ایم که به ساختارهای ART داخلی متکی هستند یا خیر. اگر کد برنامه یا وابستگی‌های کتابخانه‌ای دارید که تحت تأثیر قرار گرفته‌اند، در صورت امکان به دنبال جایگزین‌های API عمومی باشید و با ایجاد یک درخواست ویژگی در ردیاب مشکل ما، APIهای عمومی را برای موارد استفاده جدید درخواست کنید.

حالت سازگاری با اندازه صفحه ۱۶ کیلوبایت

Android 15 引入了对 16 KB 内存页面的支持,以优化平台性能。Android 16 添加了兼容模式,让一些针对 4 KB 内存页面构建的应用可以在配置为 16 KB 内存页面的设备上运行。

当您的应用在搭载 Android 16 或更高版本的设备上运行时,如果 Android 检测到您的应用具有 4 KB 对齐的内存页面,则会自动使用兼容模式并向用户显示通知对话框。在 AndroidManifest.xml 中设置 android:pageSizeCompat 属性以启用向后兼容模式,将会阻止应用启动时显示对话框。如需使用 android:pageSizeCompat 属性,请使用 Android 16 SDK 编译您的应用。

为了实现最佳性能、可靠性和稳定性,应用仍应以 16 KB 对齐。如需了解详情,请参阅我们近期发布的博文,了解如何更新应用以支持 16 KB 的内存页面。

兼容模式对话框:当系统检测到 4 KB 对齐的应用在 16 KB 对齐的情况下可以更高效地运行时,系统会显示此对话框。

تجربه کاربری و رابط کاربری سیستم

اندروید ۱۶ (سطح API ۳۶) شامل تغییرات زیر است که برای ایجاد یک تجربه کاربری سازگارتر و شهودی‌تر در نظر گرفته شده‌اند.

بی‌اعتبار کردن اعلان‌های اختلال در دسترسی‌پذیری

Android 16 اعلامیه‌های دسترس‌پذیری را که با استفاده از announceForAccessibility یا ارسال رویدادهای دسترس‌پذیری TYPE_ANNOUNCEMENT مشخص می‌شود، منسوخ می‌کند. اینها می‌توانند تجربیات کاربری متناقضی را برای کاربران TalkBack و صفحه‌خوان Android ایجاد کنند، و جایگزین‌ها بهتر طیف وسیع‌تری از نیازهای کاربر را در انواع فناوری‌های کمکی Android برآورده می‌کنند.

نمونه هایی از جایگزین ها:

اسناد مرجع برای announceForAccessibility API منسوخ شده شامل جزئیات بیشتری در مورد جایگزین های پیشنهادی است.

پشتیبانی از ناوبری سه دکمه‌ای

Android 16 为已正确迁移到预测性返回的应用的三按钮导航栏引入了预测性返回支持。长按返回按钮会启动预测性返回动画,让您预览返回滑动手势会打开的界面。

此行为适用于系统中支持预测性返回动画的所有区域,包括系统动画(返回主屏幕、跨任务和跨 activity)。

“三按钮”导航模式下的预测性返回动画。

آیکون‌های برنامه با تم خودکار

با شروع Android 16 QPR 2، Android به طور خودکار تم ها را روی نمادهای برنامه اعمال می کند تا یک تجربه منسجم از صفحه اصلی ایجاد کند. اگر برنامه ای نماد برنامه مضمون خود را ارائه نکند، این اتفاق می افتد. برنامه‌ها می‌توانند طراحی نماد برنامه مضمون خود را با قرار دادن یک لایه تک رنگ در نماد تطبیقی خود و پیش‌نمایش اینکه نماد برنامه آن‌ها در Android Studio چگونه به نظر می‌رسد، کنترل کنند.

فاکتورهای شکل دستگاه

اندروید ۱۶ (سطح API ۳۶) شامل تغییرات زیر برای برنامه‌ها هنگام نمایش روی نمایشگرها توسط دارندگان دستگاه‌های مجازی است.

مالک دستگاه مجازی لغو می‌کند

虚拟设备所有者是创建和管理虚拟设备的受信任应用或特权应用。虚拟设备所有者在虚拟设备上运行应用,然后将应用投影到远程设备的显示屏上,例如个人电脑、虚拟现实设备或车载信息娱乐系统。虚拟设备所有者位于本地设备上,例如手机。

手机上的虚拟设备所有者创建将应用投影到远程显示屏的虚拟设备。

按应用替换项

在搭载 Android 16(API 级别 36)的设备上,虚拟设备所有者可以替换其管理的特定虚拟设备上的应用设置。例如,为了改进应用布局,虚拟设备所有者在将应用投影到外部显示屏上时,可以忽略屏幕方向、宽高比和可调整大小性限制。

常见的重大更改

Android 16 的行为可能会影响应用在汽车显示屏或 Chromebook 等大屏幕设备上的界面,尤其是那些专为竖屏小显示屏设计的布局。如需了解如何让应用适应所有设备类型,请参阅自适应布局简介

参考文档

配套应用串流

امنیت

اندروید ۱۶ (سطح API ۳۶) شامل تغییراتی است که امنیت سیستم را ارتقا می‌دهد تا به محافظت از برنامه‌ها و کاربران در برابر برنامه‌های مخرب کمک کند.

امنیت بهبود یافته در برابر حملات تغییر مسیر Intent

اندروید ۱۶ امنیت پیش‌فرض را در برابر حملات عمومی تغییر مسیر Intent فراهم می‌کند، با حداقل سازگاری و تغییرات مورد نیاز توسعه‌دهنده.

ما در حال معرفی راه‌حل‌های امنیتی پیش‌فرض برای مقابله با سوءاستفاده‌های تغییر مسیر Intent هستیم. در بیشتر موارد، برنامه‌هایی که از Intentها استفاده می‌کنند، معمولاً هیچ مشکل سازگاری را تجربه نمی‌کنند؛ ما در طول فرآیند توسعه خود معیارهایی را جمع‌آوری کرده‌ایم تا نظارت کنیم که کدام برنامه‌ها ممکن است دچار مشکل شوند.

تغییر مسیر هدف در اندروید زمانی اتفاق می‌افتد که یک مهاجم بتواند تا حدی یا کاملاً محتوای یک هدف مورد استفاده برای راه‌اندازی یک مؤلفه جدید را در چارچوب یک برنامه آسیب‌پذیر کنترل کند، در حالی که برنامه قربانی یک هدف فرعی غیرقابل اعتماد را در یک فیلد اضافی از یک هدف ("سطح بالا") راه‌اندازی می‌کند. این می‌تواند منجر به راه‌اندازی مؤلفه‌های خصوصی توسط برنامه مهاجم در چارچوب برنامه قربانی، راه‌اندازی اقدامات دارای امتیاز یا دسترسی به URI به داده‌های حساس شود که به طور بالقوه منجر به سرقت داده‌ها و اجرای کد دلخواه می‌شود.

انصراف از مدیریت تغییر مسیر Intent

اندروید ۱۶ یک API جدید معرفی می‌کند که به برنامه‌ها اجازه می‌دهد از محافظت‌های امنیتی هنگام راه‌اندازی صرف‌نظر کنند. این ممکن است در موارد خاصی که رفتار امنیتی پیش‌فرض با موارد استفاده مشروع برنامه تداخل دارد، ضروری باشد.

برای کامپایل برنامه‌های کاربردی روی اندروید ۱۶ (سطح API ۳۶) SDK یا بالاتر

شما می‌توانید مستقیماً از متد removeLaunchSecurityProtection() روی شیء Intent استفاده کنید.

val i = intent
val iSublevel: Intent? = i.getParcelableExtra("sub_intent")
iSublevel?.removeLaunchSecurityProtection() // Opt out from hardening
iSublevel?.let { startActivity(it) }
برای برنامه‌هایی که برای اندروید ۱۵ (سطح API ۳۵) یا پایین‌تر کامپایل می‌شوند

اگرچه توصیه نمی‌شود، می‌توانید از reflection برای دسترسی به متد removeLaunchSecurityProtection() استفاده کنید.

val i = intent
val iSublevel: Intent? = i.getParcelableExtra("sub_intent", Intent::class.java)
try {
    val removeLaunchSecurityProtection = Intent::class.java.getDeclaredMethod("removeLaunchSecurityProtection")
    removeLaunchSecurityProtection.invoke(iSublevel)
} catch (e: Exception) {
    // Handle the exception, e.g., log it
} // Opt-out from the security hardening using reflection
iSublevel?.let { startActivity(it) }

برنامه‌های همراه دیگر از زمان‌های کشف مطلع نمی‌شوند

اندروید 16 رفتار جدیدی را در جریان جفت شدن دستگاه همراه معرفی می کند تا از حریم خصوصی مکان کاربر در برابر برنامه های مخرب محافظت کند. همه برنامه‌های همراهی که در Android 16 اجرا می‌شوند، دیگر مستقیماً با استفاده از RESULT_DISCOVERY_TIMEOUT از مهلت زمانی کشف مطلع نمی‌شوند. در عوض، کاربر از رویدادهای وقفه با یک گفتگوی بصری مطلع می شود. هنگامی که کاربر گفتگو را رد می کند، برنامه از شکست ارتباط با RESULT_USER_REJECTED آگاه می شود.

مدت زمان جستجو نیز از 20 ثانیه اولیه افزایش یافته است و کاربر در هر نقطه از جستجو می تواند کشف دستگاه را متوقف کند. اگر حداقل یک دستگاه در 20 ثانیه اول شروع جستجو کشف شود، CDM جستجو برای دستگاه های اضافی را متوقف می کند.

اتصال

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

بهبود مدیریت ضرر اوراق قرضه

با شروع اندروید 16، پشته بلوتوث برای بهبود امنیت و تجربه کاربری در هنگام شناسایی از دست دادن اوراق قرضه از راه دور، به روز شده است. قبلاً، سیستم به طور خودکار پیوند را حذف می کرد و یک فرآیند جفت سازی جدید را آغاز می کرد که می تواند منجر به جفت شدن مجدد ناخواسته شود. ما در بسیاری از موارد دیده‌ایم که اپلیکیشن‌ها از رویداد از دست دادن اوراق قرضه به روشی ثابت مراقبت نمی‌کنند.

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

،

با شروع اندروید 16، پشته بلوتوث برای بهبود امنیت و تجربه کاربری در هنگام شناسایی از دست دادن اوراق قرضه از راه دور، به روز شده است. قبلاً، سیستم به طور خودکار پیوند را حذف می کرد و یک فرآیند جفت سازی جدید را آغاز می کرد که می تواند منجر به جفت شدن مجدد ناخواسته شود. ما در بسیاری از موارد دیده‌ایم که اپلیکیشن‌ها از رویداد از دست دادن اوراق قرضه به روشی ثابت مراقبت نمی‌کنند.

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

،

با شروع اندروید 16، پشته بلوتوث برای بهبود امنیت و تجربه کاربری در هنگام شناسایی از دست دادن اوراق قرضه از راه دور، به روز شده است. قبلاً، سیستم به طور خودکار پیوند را حذف می کرد و یک فرآیند جفت سازی جدید را آغاز می کرد که می تواند منجر به جفت شدن مجدد ناخواسته شود. ما در بسیاری از موارد دیده‌ایم که اپلیکیشن‌ها از رویداد از دست دادن اوراق قرضه به روشی ثابت مراقبت نمی‌کنند.

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