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

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

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

عملکرد اصلی

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

محدودیت‌های حافظه برنامه

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

شما می‌توانید با فراخوانی getDescription در ApplicationExitInfo مشخص کنید که آیا session برنامه شما تحت تأثیر قرار گرفته است یا خیر؛ اگر برنامه شما تحت تأثیر قرار گرفته باشد، دلیل خروج REASON_OTHER خواهد بود و توضیحات شامل رشته "MemoryLimiter:AnonSwap" به همراه سایر اطلاعات خواهد بود. همچنین می‌توانید از پروفایلینگ مبتنی بر trigger با TRIGGER_TYPE_ANOMALY برای دریافت heap dumpهایی که هنگام رسیدن به محدودیت حافظه جمع‌آوری می‌شوند، استفاده کنید.

مستندات مدیریت حافظه برنامه شما اطلاعاتی را ارائه می‌دهد که به شما در تشخیص مشکلات حافظه برنامه و بهینه‌سازی مصرف منابع آن کمک می‌کند.

رفتار برنامه خود را تحت محدودیت‌های حافظه آزمایش کنید

شما می‌توانید از Android Debug Bridge ( adb ) برای تنظیم یا غیرفعال کردن محدودیت‌های حافظه در هر دستگاهی که آنها را اعمال می‌کند، استفاده کنید. دستور shell am سه زیردستور برای تنظیم محدودیت‌های حافظه ارائه می‌دهد. (این دستورات روی دستگاهی که محدودیت حافظه اعمال نمی‌کند، تأثیری ندارند.)

  • am memory-limiter ignore <uid>|none|all
  • am memory-limiter manual <pid> <limit>|max|none
  • am memory-limiter status
ignore

به محدودکننده حافظه دستور می‌دهد که برخی یا همه فرآیندها را نادیده بگیرد. ارسال یک UID (شناسه کاربری اندروید) به محدودکننده حافظه دستور می‌دهد که اجرای تمام فرآیندهای مرتبط با آن UID را نادیده بگیرد. همچنین می‌توانید all (همه برنامه‌ها را نادیده بگیرید) یا none (هیچ برنامه‌ای را نادیده نگیرید) را ارسال کنید. ارسال none هرگونه فراخوانی قبلی am memory-limiter ignore لغو می‌کند.

اگر به محدودکننده حافظه دستور دهید که یک UID را نادیده بگیرد، همچنان می‌توانید با فراخوانی تابع am memory-limiter manual یک محدودیت حافظه دستی را برای یک فرآیند درون برنامه اعمال کنید.

manual

به سیستم دستور می‌دهد که یک محدودیت حافظه را بر روی فرآیندی با PID (شناسه فرآیند) مشخص شده اعمال کند. محدودیت حافظه به صورت یک عدد صحیح مگابایت مشخص می‌شود؛ برای مثال، قرار دادن 30 مشخص می‌کند که فرآیند به ۳۰ مگابایت حافظه محدود است. قرار دادن max تمام محدودیت‌های حافظه روی آن فرآیند را حذف می‌کند. قرار دادن none هرگونه محدودیت دستی تعیین شده روی فرآیند را حذف می‌کند و محدودیت پیش‌فرض سیستم (در صورت وجود) را بازیابی می‌کند.

status

وضعیت فعلی محدودکننده حافظه را گزارش می‌دهد. این وضعیت شامل محدودیت‌های حافظه اعمال شده بر فرآیندهای قابل مشاهده و غیر قابل مشاهده است.

حریم خصوصی

اندروید ۱۷ شامل تغییرات زیر برای بهبود حریم خصوصی کاربران است.

محافظت از طریق OTP در پیامک

Beginning with Android 17, Android is expanding its protection for SMS messages containing one-time passwords (OTP).

In previous versions of Android, this protection was primarily focused on the SMS Retriever format. Delivery of messages containing an SMS retriever hash was delayed for most apps for three hours. However, certain apps (like the default SMS handler) were exempt from the delay, and the app that owned the hash was also exempted.

Beginning with Android 17, the protection is also applied to WebOTP format messages. If an app has permission to read SMS messages but is not the intended recipient of a WebOTP message (as determined by domain verification), the message is not accessible to the app until three hours after the message's receipt. This change is intended to improve user security by ensuring that only apps associated with the domain mentioned in the message can programmatically read the verification code.

During this three hour delay, the SMS_RECEIVED_ACTION broadcast is withheld and SMS provider database queries are filtered. The SMS message is available to these apps after the delay. This change applies to all apps, regardless of their target API level.

Certain apps such as the default SMS assistant app, connected device companion apps, etc., are exempted from this delay. All apps that rely on reading SMS messages for OTP extraction should transition to using SMS Retriever or SMS User Consent APIs to ensure continued functionality.

امنیت

اندروید ۱۷ شامل بهبودهای زیر در امنیت دستگاه و برنامه‌ها است.

طرح منسوخ‌شده‌ی usesClearTraffic

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

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

  • ویژگی usesCleartextTraffic را روی true تنظیم کنید.
  • استفاده از فایل پیکربندی شبکه

اگر حداقل سطح API برنامه شما ۲۴ یا بالاتر است، می‌توانید از یک فایل پیکربندی شبکه استفاده کنید و نیازی به تنظیم usesCleartextTraffic ندارید.

محدود کردن مجوزهای ضمنی URI

در حال حاضر، اگر یک برنامه، یک intent را با یک URI که دارای اکشن ACTION_SEND ، ACTION_SEND_MULTIPLE یا ACTION_IMAGE_CAPTURE است، اجرا کند، سیستم به طور خودکار مجوزهای خواندن و نوشتن URI را به برنامه هدف اعطا می‌کند. از اندروید ۱۸ به بعد، سیستم دیگر به طور خودکار این مجوزها را اعطا نمی‌کند. به همین دلیل، توصیه می‌کنیم که برنامه‌ها به جای تکیه بر سیستم برای اعطای مجوزهای URI مربوطه، آنها را صریحاً اعطا کنند.

برای تشخیص استفاده از این intentها در برنامه خود، StrictMode به همراه detectImplicitUriPermissionGrant() برای ایجاد یک تخلف استفاده کنید:

کاتلین

val policy = StrictMode.VmPolicy.Builder()
    .detectImplicitUriPermissionGrant()
    .penaltyLog()
    .build()
StrictMode.setVmPolicy(policy)

جاوا

StrictMode.VmPolicy policy = new StrictMode.VmPolicy.Builder()
    .detectImplicitUriPermissionGrant()
    .penaltyLog()
    .build();
StrictMode.setVmPolicy(policy);

از طرف دیگر، می‌توانید استثنائات ثبت‌شده حاوی پیام Please set the grant explicitly in the app که هنگام تنظیم ضمنی کمک‌هزینه توسط سیستم ظاهر می‌شود، رصد کنید. می‌توانید با استفاده از دستور adb زیر، این گزارش‌ها را رصد کنید:

adb logcat | grep "Please set the grant explicitly in the app"

برای اعطای صریح مجوزهای لازم، پرچم FLAG_GRANT_READ_URI_PERMISSION را به اینتنت‌های ACTION_SEND و ACTION_SEND_MULTIPLE اضافه کنید:

کاتلین

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)

جاوا

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

هر دو پرچم FLAG_GRANT_READ_URI_PERMISSION و FLAG_GRANT_WRITE_URI_PERMISSION را برای اهداف ACTION_IMAGE_CAPTURE وارد کنید:

کاتلین

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION)

جاوا

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

محدودیت‌های فروشگاه کلید در هر برنامه

برنامه‌ها باید از ایجاد تعداد بیش از حد کلید در Android Keystore خودداری کنند، زیرا این یک منبع مشترک برای همه برنامه‌های روی دستگاه است. از اندروید ۱۷ به بعد، سیستم محدودیتی را برای تعداد کلیدهایی که یک برنامه می‌تواند داشته باشد، اعمال می‌کند. این محدودیت برای برنامه‌های غیرسیستمی که اندروید ۱۷ (سطح API ۳۷) یا بالاتر را هدف قرار می‌دهند، ۵۰۰۰۰ کلید و برای سایر برنامه‌ها ۲۰۰۰۰۰ کلید است. برنامه‌های سیستمی صرف نظر از اینکه کدام سطح API را هدف قرار می‌دهند، محدودیت ۲۰۰۰۰۰ کلید دارند.

اگر برنامه‌ای سعی کند کلیدهایی فراتر از محدودیت ایجاد کند، ایجاد کلید با خطای KeyStoreException با شکست مواجه می‌شود. رشته پیام این استثنا حاوی اطلاعاتی در مورد محدودیت کلید است. اگر برنامه تابع getNumericErrorCode() را در مورد استثنا فراخوانی کند، مقدار بازگشتی به سطح API مورد نظر برنامه بستگی دارد:

  • برنامه‌هایی که اندروید ۱۷ (سطح API ۳۷) یا بالاتر را هدف قرار می‌دهند: getNumericErrorCode() مقدار جدید ERROR_TOO_MANY_KEYS را برمی‌گرداند.
  • همه برنامه‌های دیگر: getNumericErrorCode() ERROR_INCORRECT_USAGE را برمی‌گرداند.

مسدود کردن ترافیک loopback بین پروفایلی

从 Android 17 开始,默认情况下不再允许跨个人资料环回流量。同一个人资料内的环回流量不受影响。 此项变更适用于在 Android 17 或更高版本上运行的所有应用,无论应用以哪个 API 级别为目标平台。

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

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

بازیابی قابلیت مشاهده پیش‌فرض IME پس از چرخش

از اندروید ۱۷ به بعد، وقتی پیکربندی دستگاه تغییر می‌کند (مثلاً از طریق چرخش) و این تغییر توسط خود برنامه مدیریت نمی‌شود، قابلیت مشاهده IME قبلی بازیابی نمی‌شود.

اگر برنامه شما دچار تغییر پیکربندی شود که قادر به مدیریت آن نباشد و برنامه نیاز داشته باشد که صفحه‌کلید پس از تغییر قابل مشاهده باشد، باید صریحاً این درخواست را ارائه دهید. می‌توانید این درخواست را به یکی از روش‌های زیر انجام دهید:

  • ویژگی android:windowSoftInputMode را روی stateAlwaysVisible تنظیم کنید.
  • به صورت برنامه‌نویسی، صفحه‌کلید نرم‌افزاری را در متد onCreate() مربوط به activity خود درخواست کنید، یا متد onConfigurationChanged() را اضافه کنید.

ورودی انسانی

اندروید ۱۷ شامل تغییرات زیر است که بر نحوه تعامل برنامه‌ها با دستگاه‌های ورودی انسان مانند صفحه‌کلید و تاچ‌پد تأثیر می‌گذارد.

تاچ‌پدها به طور پیش‌فرض رویدادهای نسبی را هنگام گرفتن اشاره‌گر نمایش می‌دهند

Beginning with Android 17, if an app requests pointer capture using View.requestPointerCapture() and the user uses a touchpad, the system recognizes pointer movement and scrolling gestures from the user's touches and reports them to the app in the same way as pointer and scroll wheel movements from a captured mouse. In most cases, this removes the need for apps that support captured mice to add special handling logic for touchpads. For more details, see the documentation for View.POINTER_CAPTURE_MODE_RELATIVE.

Previously, the system did not attempt to recognize gestures from the touchpad, and instead delivered the raw, absolute finger locations to the app in a similar format to touchscreen touches. If an app still requires this absolute data, it should call the new View.requestPointerCapture(int) method with View.POINTER_CAPTURE_MODE_ABSOLUTE instead.

رسانه

اندروید ۱۷ شامل تغییرات زیر در رفتار رسانه‌ای است.

تقویت صدای پس‌زمینه

با شروع اندروید ۱۷، چارچوب صوتی محدودیت‌هایی را در تعاملات صوتی پس‌زمینه از جمله پخش صدا، درخواست‌های فوکوس صدا و APIهای تغییر صدا اعمال می‌کند تا اطمینان حاصل شود که این تغییرات عمداً توسط کاربر آغاز می‌شوند.

اگر برنامه سعی کند APIهای صوتی را در حالی که برنامه در چرخه حیات معتبری نیست، فراخوانی کند، APIهای پخش صدا و تغییر صدا بدون ایجاد استثنا یا ارائه پیام خطا، بی‌صدا با شکست مواجه می‌شوند. API فوکوس صوتی با کد نتیجه AUDIOFOCUS_REQUEST_FAILED با شکست مواجه می‌شود.

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

اتصال

اندروید ۱۷ شامل تغییرات زیر برای بهبود اتصال دستگاه است.

جفت‌سازی مجدد خودکار برای از دست رفتن اتصال بلوتوث

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

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

اگرچه اکثر برنامه‌ها نیازی به تغییر کد ندارند، توسعه‌دهندگان باید از تغییرات رفتاری زیر در پشته بلوتوث آگاه باشند:

  • زمینه جفت‌سازی جدید: ACTION_PAIRING_REQUEST اکنون شامل EXTRA_PAIRING_CONTEXT اضافی است که به برنامه‌ها اجازه می‌دهد بین یک درخواست جفت‌سازی استاندارد و یک تلاش جفت‌سازی مجدد خودکار توسط سیستم، تمایز قائل شوند.
  • به‌روزرسانی‌های مشروط کلید: کلیدهای امنیتی موجود تنها در صورتی جایگزین می‌شوند که جفت‌سازی مجدد موفقیت‌آمیز باشد و اتصال جدید سطح امنیتی پیوند قبلی را برآورده کند یا از آن فراتر رود.
  • زمان‌بندی اینتنت اصلاح‌شده: اینتنت ACTION_KEY_MISSING اکنون فقط در صورتی پخش می‌شود که تلاش برای جفت‌سازی مجدد خودکار با شکست مواجه شود. این امر در صورتی که سیستم با موفقیت پیوند را در پس‌زمینه بازیابی کند، مدیریت خطاهای غیرضروری در برنامه را کاهش می‌دهد.
  • اعلان کاربر: سیستم، جفت‌سازی مجدد را از طریق اعلان‌ها و پنجره‌های محاوره‌ای جدید رابط کاربری مدیریت می‌کند. از کاربران خواسته می‌شود تا تلاش برای جفت‌سازی مجدد را تأیید کنند تا از اتصال مجدد مطلع شوند.

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

  • اطلاعات مربوط به پیوند را به صورت دستی از دستگاه جانبی حذف کنید
  • اتصال دستگاه را به صورت دستی از طریق تنظیمات > دستگاه‌های متصل قطع کنید