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

پلتفرم اندروید ۱۷ شامل تغییرات رفتاری است که ممکن است بر برنامه شما تأثیر بگذارد. تغییرات رفتاری زیر برای همه برنامه‌ها هنگام اجرا در اندروید ۱۷، صرف نظر از 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 در پیامک

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

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

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

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

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

امنیت

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

طرح منسوخ‌شده‌ی 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 بین پروفایلی

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

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

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

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

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

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

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

ورودی انسانی

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

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

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

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

رسانه

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

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

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

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

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

اتصال

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

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

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

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

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

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

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

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