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

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

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

عملکرد اصلی

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

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

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

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

وظیفه LeakCanary در پروفایلر اندروید استودیو.

برای کمک به شما در یافتن نشتی‌های حافظه، اندروید استودیو پاندا ادغام LeakCanary را مستقیماً در Android Studio Profiler به عنوان یک وظیفه اختصاصی اضافه می‌کند، که در IDE زمینه‌سازی شده و کاملاً با کد منبع شما یکپارچه شده است.

حریم خصوصی

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

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

从 Android 17 开始,Android 将扩大对包含一次性密码 (OTP) 的短信的保护范围。

在之前的 Android 版本中,此保护主要侧重于 SMS Retriever 格式。对于大多数应用,包含 SMS Retriever 哈希的消息的递送延迟了 3 小时。不过,某些特定应用(例如默认短信处理程序)不受此延迟的影响,拥有哈希的应用也不受此延迟的影响。

从 Android 17 开始,此保护也适用于 WebOTP 格式的消息。如果应用有权读取短信,但不是 WebOTP 消息的预期接收者(由网域验证确定),则该应用在收到消息后 3 小时内无法访问该消息。此变更旨在提高用户安全性,确保只有与消息中提及的网域关联的应用才能以程序化方式读取验证码。

在这 3 小时的延迟期间,系统会保留 SMS_RECEIVED_ACTION 广播,并过滤 短信提供商 数据库查询。延迟结束后,这些应用即可使用短信。此变更适用于 所有应用,无论其目标 API 级别如何。

某些应用(例如默认短信辅助应用、已连接设备配套应用等)不受此延迟的影响。所有依赖于读取短信 来提取 动态密码 的应用都应过渡到使用 SMS RetrieverSMS User Consent API,以确保功能持续可用。

امنیت

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

从 Android 17 开始,当设备的配置发生变化(例如,通过旋转)且应用本身未处理此变化时,系统不会恢复之前的 IME 可见性。

如果应用经历了它无法处理的配置更改,并且应用需要在更改后显示键盘,您必须明确请求此行为。您可以通过以下方式之一提出此要求:

  • android:windowSoftInputMode 属性设置为 stateAlwaysVisible
  • 在 activity 的 onCreate() 方法中以编程方式请求显示软键盘,或添加 onConfigurationChanged() 方法。

ورودی انسانی

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

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

从 Android 17 开始,如果应用使用 View.requestPointerCapture() 请求捕获指针,并且用户使用触控板,系统会识别用户触摸操作产生的指针移动和滚动手势,并以与捕获的鼠标产生的指针和滚轮移动相同的方式将这些信息报告给应用。在大多数情况下,这使得支持捕获鼠标的应用无需为触控板添加特殊的处理逻辑。如需了解详情,请参阅 View.POINTER_CAPTURE_MODE_RELATIVE 的文档。

之前,系统不会尝试识别触控板的手势,而是以类似于触摸屏触摸的格式将原始的绝对手指位置传递给应用。如果应用仍需要此绝对数据,则应改为使用 View.POINTER_CAPTURE_MODE_ABSOLUTE 调用新的 View.requestPointerCapture(int) 方法。

رسانه

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

سخت شدن صدای پس‌زمینه

从 Android 17 开始,音频框架会对后台音频互动(包括音频播放、音频焦点请求和音量更改 API)强制执行限制,以确保这些更改是由用户有意发起的。

如果应用尝试在应用未处于有效生命周期时调用音频 API,则音频播放和音量更改 API 会以静默方式失败,而不会抛出异常或提供失败消息。音频焦点 API 会失败,并返回结果代码 AUDIOFOCUS_REQUEST_FAILED

如需了解详情(包括缓解措施),请参阅后台音频安全加固

اتصال

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

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

Android 17 引入了自主重新配对功能,这是一项系统级增强功能,旨在自动解决蓝牙配对信息丢失问题。

以前,如果配对信息丢失,用户必须手动前往“设置”取消配对,然后重新配对外围设备。此功能以 Android 16 的安全改进为基础,允许系统在后台重新建立配对信息,而无需用户手动前往“设置”取消配对并重新配对外围设备。

虽然大多数应用不需要更改代码,但开发者应注意蓝牙堆栈中的以下行为变更:

  • 新的配对上下文ACTION_PAIRING_REQUEST 现在包含 EXTRA_PAIRING_CONTEXT extra,允许应用区分 标准配对请求和自主系统发起的重新配对尝试。
  • 有条件的密钥更新:只有在重新配对成功且新连接达到或超过之前配对信息的安全级别时,才会替换现有安全密钥。
  • 修改后的 intent 时间:现在,只有在自主重新配对尝试失败时,才会广播 ACTION_KEY_MISSING intent。如果系统在后台成功恢复配对信息,则可以减少应用中不必要的错误处理。
  • 用户通知:系统通过新的界面通知和对话框管理重新配对。系统会提示用户确认重新配对尝试,以确保用户了解重新连接。

外围设备制造商和配套应用开发者应验证硬件和应用是否能妥善处理配对信息转换。如需测试此行为,请使用以下任一方法模拟远程配对信息丢失:

  • 从外围设备中手动移除配对信息
  • 在“设置”>“已连接的设备”中手动取消配对设备