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

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

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

عملکرد اصلی

اندروید 16 شامل تغییرات زیر است که قابلیت‌های اصلی سیستم اندروید را تغییر داده یا گسترش می‌دهد.

بهینه سازی سهمیه 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) اهمیت یک کار را در زمانی که برنامه زمان‌بندی در پیش‌زمینه است یا به طور موقت از محدودیت‌های پس‌زمینه معاف است، نشان می‌دهد.

این روش از اندروید 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 به عنوان اولویت پخش خواهند بود.

اگر برنامه شما یکی از موارد زیر را انجام دهد ممکن است تحت تأثیر قرار گیرد:

  1. برنامه شما چندین فرآیند را با هدف پخش یکسان اعلام کرده است و انتظاراتی در مورد دریافت آن مقاصد با ترتیب خاصی بر اساس اولویت دارد.
  2. فرآیند درخواست شما با سایر فرآیندها در تعامل است و انتظاراتی در مورد دریافت هدف پخش با ترتیب خاصی دارد.

اگر فرآیندها نیاز به هماهنگی با یکدیگر دارند، باید با استفاده از کانال های هماهنگی دیگر ارتباط برقرار کنند.

تغییرات داخلی 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های عمومی را برای موارد استفاده جدید درخواست کنید.

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

اندروید 15 برای بهینه سازی عملکرد پلتفرم، پشتیبانی از صفحات حافظه 16 کیلوبایتی را معرفی کرد. Android 16 یک حالت سازگاری اضافه می کند که به برخی از برنامه های ساخته شده برای صفحات حافظه 4 کیلوبایتی اجازه می دهد روی دستگاهی که برای صفحات حافظه 16 کیلوبایتی پیکربندی شده است اجرا شوند.

اگر Android تشخیص دهد که برنامه شما دارای صفحات حافظه تراز شده 4 کیلوبایتی است، به طور خودکار از حالت سازگاری استفاده می کند و یک گفتگوی اعلان را به کاربر نمایش می دهد. تنظیم ویژگی android:pageSizeCompat در AndroidManifest.xml برای فعال کردن حالت سازگاری به عقب، از نمایش دیالوگ هنگام راه‌اندازی برنامه شما جلوگیری می‌کند. برای بهترین عملکرد، قابلیت اطمینان و پایداری، برنامه شما همچنان باید 16 کیلوبایت تراز باشد. برای جزئیات بیشتر، پست وبلاگ اخیر ما را در مورد به روز رسانی برنامه های خود برای پشتیبانی از صفحات حافظه 16 کیلوبایتی بررسی کنید.

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

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

اندروید 16 شامل تغییرات زیر است که برای ایجاد یک تجربه کاربری سازگارتر و بصری در نظر گرفته شده است.

منسوخ کردن اعلامیه‌های دسترسی مخل

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

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

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

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

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

این رفتار در تمام قسمت‌های سیستم که از انیمیشن‌های پیش‌بینی‌کننده پشتیبان پشتیبانی می‌کنند، اعمال می‌شود، از جمله انیمیشن‌های سیستم (بازگشت به خانه، کار متقابل و فعالیت متقابل).

انیمیشن های پشت پیش بینی در حالت ناوبری 3 دکمه.

عوامل شکل دستگاه

Android 16 شامل تغییرات زیر برای برنامه‌ها است که توسط صاحبان دستگاه‌های مجازی روی نمایشگرها نمایش داده می‌شوند.

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

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

صاحب دستگاه مجازی روی تلفن دستگاه مجازی ایجاد می کند که برنامه را به نمایش از راه دور می فرستد.

لغو هر برنامه

در دستگاه‌های دارای Android 16، دارندگان دستگاه‌های مجازی می‌توانند تنظیمات برنامه را روی دستگاه‌های مجازی انتخابی که دارندگان دستگاه مجازی مدیریت می‌کنند، لغو کنند. به عنوان مثال، برای بهبود طرح‌بندی برنامه، صاحب دستگاه مجازی می‌تواند جهت‌گیری، نسبت ابعاد و محدودیت‌های اندازه‌بندی مجدد را هنگام نمایش برنامه‌ها روی نمایشگر خارجی نادیده بگیرد.

تغییرات متداول شکستن

رفتار Android 16 ممکن است بر روی رابط کاربری برنامه شما بر روی فاکتورهای شکل صفحه نمایش بزرگ مانند صفحه نمایش ماشین یا کروم بوک تأثیر بگذارد، به ویژه طرح‌بندی‌هایی که برای نمایشگرهای کوچک در جهت عمودی طراحی شده‌اند. برای یادگیری نحوه تطبیق برنامه خود برای همه عوامل شکل دستگاه، به «درباره طرح‌بندی‌های تطبیقی» مراجعه کنید.

مراجع

پخش جریانی برنامه همراه

امنیت

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

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

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

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

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

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

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

برای برنامه‌هایی که با Android 16 SDK یا بالاتر کامپایل می‌شوند

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

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) }