پلاتفرم Android 16 شامل تغییرات رفتاری است که ممکن است بر برنامه شما تأثیر بگذارد.
تغییرات رفتاری زیر برای همه برنامهها هنگام اجرا در Android 16 اعمال میشود،
صرفنظر از targetSdkVersion. باید برنامهتان را آزمایش کنید و سپس درصورت لزوم آن را اصلاح کنید تا از این تغییرات پشتیبانی کند.
حتماً فهرست تغییرات رفتاری را که فقط بر برنامههایی که Android 16 را هدف قرار میدهند تأثیر میگذارند نیز مرور کنید.
عملکرد اصلی
Android 16 (سطح API ۳۶) شامل تغییرات زیر است که قابلیتهای اصلی مختلف سیستم Android را اصلاح یا گسترش میدهد.
بهینهسازیهای سهمیه 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_ABANDONED,而不是 STOP_REASON_TIMEOUT。
如果新的作业被废弃停止原因频繁出现,系统会采取缓解措施来降低作业频率。
应用应使用新的停止原因来检测和减少被废弃的作业。
如果您使用的是 WorkManager、AsyncTask 或 DownloadManager,则不会受到影响,因为这些 API 会代表您的应用管理作业生命周期。
منسوخ کردن کامل JobInfo#setImportantWhileForeground
JobInfo.Builder#setImportantWhileForeground(boolean) 方法用于在调度应用位于前台或暂时豁免于后台限制时指示作业的优先级。
自 Android 12(API 级别 31)起,此方法已废弃。从 Android 16 开始,它不再有效,系统会忽略调用此方法。
此功能移除也适用于 JobInfo#isImportantWhileForeground()。从 Android 16 开始,如果调用该方法,该方法会返回 false。
دامنه اولویت همهفرستی مرتبشده دیگر سراسری نیست
برنامههای اندرویدی مجاز به تعریف اولویتها در گیرندههای پخش برای کنترل ترتیب دریافت و پردازش پخش توسط گیرندهها هستند. برای گیرندههای اعلامشده با مانیفست، برنامهها میتوانند از ویژگی android:priority برای تعریف اولویت و برای گیرندههای ثبت شده در متن، برنامهها میتوانند از API IntentFilter#setPriority() برای تعریف اولویت استفاده کنند. هنگامی که یک پخش ارسال می شود، سیستم آن را به ترتیب اولویت، از بالاترین به پایین ترین، به گیرنده ها تحویل می دهد.
در Android 16، سفارش تحویل پخش با استفاده از ویژگی android:priority یا IntentFilter#setPriority() در فرآیندهای مختلف تضمین نمی شود. اولویتهای پخش فقط در همان فرآیند درخواست رعایت میشوند و نه در همه فرآیندها.
همچنین، اولویتهای پخش بهطور خودکار به محدوده ( SYSTEM_LOW_PRIORITY + 1، SYSTEM_HIGH_PRIORITY - 1) محدود میشوند. فقط اجزای سیستم مجاز به تنظیم SYSTEM_LOW_PRIORITY ، SYSTEM_HIGH_PRIORITY به عنوان اولویت پخش خواهند بود.
اگر برنامه شما یکی از موارد زیر را انجام دهد ممکن است تحت تأثیر قرار گیرد:
- برنامه شما چندین فرآیند را با هدف پخش یکسان اعلام کرده است و انتظاراتی در مورد دریافت آن مقاصد با ترتیب خاصی بر اساس اولویت دارد.
- فرآیند درخواست شما با سایر فرآیندها در تعامل است و انتظاراتی در مورد دریافت هدف پخش با ترتیب خاصی دارد.
اگر فرآیندها نیاز به هماهنگی با یکدیگر دارند، باید با استفاده از کانال های هماهنگی دیگر ارتباط برقرار کنند.
تغییرات داخلی ART
Android 16 包含 Android 运行时 (ART) 的最新更新,这些更新可提升 Android 运行时 (ART) 的性能,并支持更多 Java 功能。通过 Google Play 系统更新,搭载 Android 12(API 级别 31)及更高版本的 10 亿多部设备也将受益于这些改进。
发布这些变更后,依赖于 ART 内部结构的库和应用代码在搭载 Android 16 的设备以及通过 Google Play 系统更新来更新 ART 模块的较低 Android 版本上可能无法正常运行。
依赖于内部结构(例如非 SDK 接口)始终会导致兼容性问题,但避免依赖于利用内部 ART 结构的代码(或包含代码的库)尤为重要,因为 ART 更改与设备所运行的平台版本无关,并且会通过 Google Play 系统更新推送到超过 10 亿部设备。
所有开发者都应在 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 的内存页面。
تجربه کاربری و واسط کاربر سیستم
Android 16 (سطح API ۳۶) شامل تغییرات زیر است که هدف از آنها ایجاد تجربه کاربری یکپارچهتر و شهودیتر است.
منسوخ کردن اعلامیههای دسترسپذیری مختلکننده
Android 16 اعلامیههای دسترسپذیری را که با استفاده از announceForAccessibility یا ارسال رویدادهای دسترسپذیری TYPE_ANNOUNCEMENT مشخص میشود، منسوخ میکند. اینها میتوانند تجربیات کاربری متناقضی را برای کاربران TalkBack و صفحهخوان Android ایجاد کنند، و جایگزینها بهتر طیف وسیعتری از نیازهای کاربر را در انواع فناوریهای کمکی Android برآورده میکنند.
نمونه هایی از جایگزین ها:
- برای تغییرات مهم رابط کاربری مانند تغییرات پنجره، از
Activity.setTitle(CharSequence)وsetAccessibilityPaneTitle(java.lang.CharSequence)استفاده کنید. در Compose، ازModifier.semantics { paneTitle = "paneTitle" }استفاده کنید - برای اطلاع کاربر از تغییرات در رابط کاربری حیاتی، از
setAccessibilityLiveRegion(int)استفاده کنید. در Compose، ازModifier.semantics { liveRegion = LiveRegionMode.[Polite|Assertive]}استفاده کنید. از این موارد باید به اندازه کافی استفاده شود زیرا ممکن است هر بار که یک View به روز می شود، اعلان ایجاد کند. - برای اطلاع دادن به کاربران در مورد خطاها،
AccessibilityEventاز نوعAccessibilityEvent#CONTENT_CHANGE_TYPE_ERRORارسال کنید وAccessibilityNodeInfo#setError(CharSequence)تنظیم کنید، یاTextView#setError(CharSequence)استفاده کنید.
اسناد مرجع برای announceForAccessibility API منسوخ شده شامل جزئیات بیشتری در مورد جایگزین های پیشنهادی است.
پشتیبانی از پیمایش ۳دکمهای
Android 16 پشتیبانی پیشبینیکننده را برای پیمایش 3 دکمهای برای برنامههایی که به درستی به بازگشت پیشبینی مهاجرت کردهاند، به ارمغان میآورد. با فشار دادن طولانی دکمه برگشت، یک انیمیشن پیشبینیکننده به عقب آغاز میشود و به شما پیشنمایشی از جایی که سوایپ به عقب شما را میبرد میدهد.
این رفتار در تمام قسمتهای سیستم که از انیمیشنهای پیشبینیکننده پشتیبان پشتیبانی میکنند، اعمال میشود، از جمله انیمیشنهای سیستم (بازگشت به خانه، کار متقابل و فعالیت متقابل).
نمادهای برنامه هماهنگ با زمینه خودکار
با شروع Android 16 QPR 2، Android به طور خودکار تم ها را روی نمادهای برنامه اعمال می کند تا یک تجربه منسجم از صفحه اصلی ایجاد کند. اگر برنامه ای نماد برنامه مضمون خود را ارائه نکند، این اتفاق می افتد. برنامهها میتوانند طراحی نماد برنامه مضمون خود را با قرار دادن یک لایه تک رنگ در نماد تطبیقی خود و پیشنمایش اینکه نماد برنامه آنها در Android Studio چگونه به نظر میرسد، کنترل کنند.
ضریبهای شکل دستگاه
Android 16 (سطح میانای برنامهسازی کاربردی ۳۶) شامل تغییرات زیر برای برنامهها است وقتی توسط مالکان دستگاه مجازی روی نمایشگرها فرافکنی میشوند.
لغو کردنهای مالک دستگاه مجازی
虚拟设备所有者是创建和管理虚拟设备的可信或特权应用。虚拟设备所有者在虚拟设备上运行应用,然后将应用投影到远程设备的显示屏上,例如个人电脑、虚拟现实设备或车载信息娱乐系统。虚拟设备所有者位于本地设备(例如手机)上。
按应用替换项
在搭载 Android 16(API 级别 36)的设备上,虚拟设备所有者可以替换其管理的特定虚拟设备上的应用设置。例如,为了改进应用布局,虚拟设备所有者可以在将应用投影到外接显示屏时忽略屏幕方向、宽高比和可调整大小限制。
常见破坏性更改
Android 16 行为可能会影响应用在汽车显示屏或 Chromebook 等大屏设备上的界面,尤其是专为纵向小屏幕设计的布局。如需了解如何使应用适应所有设备外形规格,请参阅自适应布局简介。
参考
امنیت
Android 16 (سطح API ۳۶) شامل تغییراتی است که امنیت سیستم را ارتقا میدهد تا به محافظت از برنامهها و کاربران دربرابر برنامههای مخرب کمک کند.
بهبود امنیت دربرابر حملات تغییر مسیر Intent
Android 16 امنیت پیشفرضی دربرابر حملات کلی تغییر مسیر Intent ارائه میدهد که به حداقل سازگاری و تغییرات توسعهدهنده نیاز دارد.
درحال معرفی راهحلهای تقویت امنیتی بهطور پیشفرض برای
بهرهجوییهای تغییرمسیر Intent هستیم. در بیشتر موارد، برنامههایی که از هدفها استفاده میکنند معمولاً هیچ مشکل سازگاریای را تجربه نخواهند کرد؛ ما درطول فرایند توسعه خود سنجههایی را جمعآوری کردهایم تا نظارت کنیم کدام برنامهها ممکن است دچار خرابی شوند.
تغییر مسیر Intent در Android زمانی رخ میدهد که مهاجم بتواند بهطور کامل یا جزئی محتوای Intent مورداستفاده برای راهاندازی مؤلفه جدیدی را در بافت برنامه آسیبپذیر کنترل کند، درحالیکه برنامه قربانی Intent سطح فرعی غیرقابلاعتمادی را در فیلد extras یک Intent («سطح بالا») راهاندازی میکند. این امر میتواند منجر به این شود که برنامه مهاجم مؤلفههای خصوصی را در زمینه برنامه قربانی راهاندازی کند، کنشهای ممتاز را راهاندازی کند، یا دسترسی URI به دادههای حساس بهدست آورد، که بهطور بالقوه منجر به سرقت دادهها و اجرای کد اختیاری میشود.
انصراف از مدیریت تغییر مسیر Intent
Android 16 میانای برنامهسازی کاربردی جدیدی معرفی میکند که به برنامهها اجازه میدهد از محافظتهای امنیتی راهاندازی انصراف دهند. این کار ممکن است در موارد خاصی که رفتار امنیتی پیشفرض با موارد استفاده قانونی برنامه تداخل دارد، ضروری باشد.
برای برنامههایی که با کیت توسعه نرمافزار Android 16 (سطح میانای برنامهسازی کاربردی ۳۶) یا بالاتر کامپایل میشوند
میتوانید مستقیماً از روش removeLaunchSecurityProtection() در شیء Intent استفاده کنید.
val i = intent
val iSublevel: Intent? = i.getParcelableExtra("sub_intent")
iSublevel?.removeLaunchSecurityProtection() // Opt out from hardening
iSublevel?.let { startActivity(it) }
برای برنامههایی که با Android 15 (سطح میانای برنامهسازی کاربردی ۳۵) یا پایینتر ترجمه میشوند
اگرچه توصیه نمیشود، میتوانید از بازتاب برای دسترسی به
روش 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 جستجو برای دستگاه های اضافی را متوقف می کند.
اتصالپذیری
Android 16 (سطح API ۳۶) شامل تغییرات زیر در پشته بلوتوث است تا اتصالپذیری با دستگاههای جانبی را بهبود بخشد.
مدیریت بهبودیافته قطع اتصال
با شروع اندروید 16، پشته بلوتوث برای بهبود امنیت و تجربه کاربری در هنگام شناسایی از دست دادن اوراق قرضه از راه دور، به روز شده است. قبلاً، سیستم به طور خودکار پیوند را حذف می کرد و یک فرآیند جفت سازی جدید را آغاز می کرد که می تواند منجر به جفت شدن مجدد ناخواسته شود. ما در بسیاری از موارد دیدهایم که اپلیکیشنها از رویداد از دست دادن اوراق قرضه به روشی ثابت مراقبت نمیکنند.
برای یکسان سازی این تجربه، اندروید 16 مدیریت از دست دادن اوراق قرضه را برای سیستم بهبود بخشید. اگر دستگاه بلوتوثی که قبلاً متصل شده بود، پس از اتصال مجدد تأیید اعتبار نشد، سیستم پیوند را قطع میکند، اطلاعات پیوند محلی را حفظ میکند و یک گفتگوی سیستمی را نمایش میدهد که کاربران را از گم شدن پیوند مطلع میکند و آنها را برای جفت کردن مجدد راهنمایی میکند.
،با شروع اندروید 16، پشته بلوتوث برای بهبود امنیت و تجربه کاربری در هنگام شناسایی از دست دادن اوراق قرضه از راه دور، به روز شده است. قبلاً، سیستم به طور خودکار پیوند را حذف می کرد و یک فرآیند جفت سازی جدید را آغاز می کرد که می تواند منجر به جفت شدن مجدد ناخواسته شود. ما در بسیاری از موارد دیدهایم که اپلیکیشنها از رویداد از دست دادن اوراق قرضه به روشی ثابت مراقبت نمیکنند.
برای یکسان سازی این تجربه، اندروید 16 مدیریت از دست دادن اوراق قرضه را برای سیستم بهبود بخشید. اگر دستگاه بلوتوثی که قبلاً متصل شده بود، پس از اتصال مجدد تأیید اعتبار نشد، سیستم پیوند را قطع میکند، اطلاعات پیوند محلی را حفظ میکند و یک گفتگوی سیستمی را نمایش میدهد که کاربران را از گم شدن پیوند مطلع میکند و آنها را برای جفت کردن مجدد راهنمایی میکند.
،با شروع اندروید 16، پشته بلوتوث برای بهبود امنیت و تجربه کاربری در هنگام شناسایی از دست دادن اوراق قرضه از راه دور، به روز شده است. قبلاً، سیستم به طور خودکار پیوند را حذف می کرد و یک فرآیند جفت سازی جدید را آغاز می کرد که می تواند منجر به جفت شدن مجدد ناخواسته شود. ما در بسیاری از موارد دیدهایم که اپلیکیشنها از رویداد از دست دادن اوراق قرضه به روشی ثابت مراقبت نمیکنند.
برای یکسان سازی این تجربه، اندروید 16 مدیریت از دست دادن اوراق قرضه را در سیستم بهبود بخشید. اگر دستگاه بلوتوثی که قبلاً متصل شده بود، پس از اتصال مجدد تأیید اعتبار نشد، سیستم پیوند را قطع میکند، اطلاعات پیوند محلی را حفظ میکند و یک گفتگوی سیستمی را نمایش میدهد که کاربران را از گم شدن پیوند مطلع میکند و آنها را برای جفت کردن مجدد راهنمایی میکند.