پلاتفرم 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) اهمیت یک کار را در زمانی که برنامه زمانبندی در پیشزمینه است یا به طور موقت از محدودیتهای پسزمینه معاف است، نشان میدهد.
این روش از اندروید 12 (سطح API 31) منسوخ شده است. با شروع اندروید 16، دیگر به طور موثر عمل نمی کند و فراخوانی این روش نادیده گرفته می شود.
این حذف عملکرد برای JobInfo#isImportantWhileForeground() نیز اعمال می شود. با شروع در اندروید 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 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 的内存页面。
تجربه کاربری و واسط کاربر سیستم
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 的应用不会遇到任何兼容性问题;我们在整个开发过程中收集了指标,以监控哪些应用可能会遇到中断。
当攻击者部分或完全控制用于在存在漏洞的应用上下文中启动新组件的 intent 内容,而受害者应用在(“顶级”)intent 的 extra 字段中启动不受信任的子级 intent 时,Android 中就会出现 intent 重定向问题。这可能会导致攻击者应用在受害者应用的上下文中启动私有组件、触发特权操作或获取对敏感数据的 URI 访问权限,从而可能导致数据窃取和任意代码执行。
停用 intent 重定向处理
Android 16 引入了一个新 API,允许应用选择停用启动安全保护。在默认安全行为干扰合法应用用例的特定情况下,可能需要这样做。
对于针对 Android 16(API 级别 36)SDK 或更高版本进行编译的应用
您可以直接对 Intent 对象使用 removeLaunchSecurityProtection() 方法。
val i = intent
val iSublevel: Intent? = i.getParcelableExtra("sub_intent")
iSublevel?.removeLaunchSecurityProtection() // Opt out from hardening
iSublevel?.let { startActivity(it) }
对于针对 Android 15(API 级别 35)或更低版本进行编译的应用
虽然不建议这样做,但您可以使用反射来访问 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 مدیریت از دست دادن اوراق قرضه را در سیستم بهبود بخشید. اگر دستگاه بلوتوثی که قبلاً متصل شده بود، پس از اتصال مجدد تأیید اعتبار نشد، سیستم پیوند را قطع میکند، اطلاعات پیوند محلی را حفظ میکند و یک گفتگوی سیستمی را نمایش میدهد که کاربران را از گم شدن پیوند مطلع میکند و آنها را برای جفت کردن مجدد راهنمایی میکند.