تغییرات رفتاری: برنامه‌هایی که اندروید ۱۷ یا بالاتر را هدف قرار می‌دهند

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

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

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

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

ویجت محدودیت حافظه

از اندروید ۱۷ به بعد، برای برنامه‌هایی که اندروید ۱۷ (سطح API ۳۷) یا بالاتر را هدف قرار می‌دهند، سیستم یک محدودیت حافظه سختگیرانه (۱.۵ * عرض صفحه * ارتفاع صفحه * ۴) را برای استفاده ترکیبی از حافظه توسط Bitmapها و Iconهای موجود در بسته RemoteViews اعمال می‌کند. تجاوز از این محدودیت‌ها باعث ایجاد یک IllegalArgumentException مهلک شده و فرآیند برنامه را متوقف می‌کند.

برای اطلاعات بیشتر، به UpdateAppWidget مراجعه کنید.

قابلیت‌های اصلی

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

پیاده‌سازی جدید و بدون قفل MessageQueue

با شروع از اندروید ۱۷، برنامه‌هایی که اندروید ۱۷ (سطح API ۳۷) یا بالاتر را هدف قرار می‌دهند، یک پیاده‌سازی جدید و بدون قفل از android.os.MessageQueue دریافت می‌کنند. این پیاده‌سازی جدید عملکرد را بهبود می‌بخشد و فریم‌های از دست رفته را کاهش می‌دهد، اما ممکن است کلاینت‌هایی را که روی فیلدها و متدهای خصوصی MessageQueue تأمل می‌کنند، خراب کند.

برای اطلاعات بیشتر، از جمله استراتژی‌های کاهش، به راهنمای تغییر رفتار MessageQueue مراجعه کنید.

فیلدهای نهایی استاتیک اکنون غیرقابل تغییر هستند

Apps running on Android 17 or higher that target Android 17 (API level 37) or higher cannot change static final fields. If an app attempts to change a static final field by using reflection, it will cause an IllegalAccessException. Attempting to modify one of these fields through JNI APIs (such as SetStaticLongField()) will cause the app to crash.

دسترسی‌پذیری

اندروید ۱۷ تغییرات زیر را برای بهبود دسترسی ایجاد می‌کند.

پشتیبانی از قابلیت دسترسی برای تایپ پیچیده با صفحه کلید فیزیکی IME

این ویژگی، APIهای AccessibilityEvent و TextAttribute جدیدی را برای بهبود بازخورد گفتاری صفحه‌خوان برای ورودی زبان CJKV معرفی می‌کند. برنامه‌های CJKV IME اکنون می‌توانند نشان دهند که آیا یک کاندید تبدیل متن در طول ترکیب متن انتخاب شده است یا خیر. برنامه‌های دارای فیلد ویرایش می‌توانند هنگام ارسال رویدادهای دسترسی تغییر متن، انواع تغییر متن را مشخص کنند. به عنوان مثال، برنامه‌ها می‌توانند مشخص کنند که تغییر متن در طول ترکیب متن رخ داده است یا اینکه تغییر متن ناشی از یک commit است. انجام این کار، سرویس‌های دسترسی مانند صفحه‌خوان‌ها را قادر می‌سازد تا بازخورد دقیق‌تری را بر اساس ماهیت تغییر متن ارائه دهند.

پذیرش برنامه

  • برنامه‌های IME: هنگام تنظیم متن نوشتاری در فیلدهای ویرایش، IMEها می‌توانند از TextAttribute.Builder.setTextSuggestionSelected() برای نشان دادن اینکه آیا یک کاندید تبدیل خاص انتخاب شده است یا خیر، استفاده کنند.

  • برنامه‌هایی با فیلدهای ویرایش: برنامه‌هایی که یک InputConnection سفارشی دارند می‌توانند داده‌های انتخاب کاندید را با فراخوانی TextAttribute.isTextSuggestionSelected() بازیابی کنند. این برنامه‌ها سپس باید AccessibilityEvent.setTextChangeTypes() را هنگام ارسال رویدادهای TYPE_VIEW_TEXT_CHANGED فراخوانی کنند. برنامه‌هایی که اندروید ۱۷ (سطح API ۳۷) را هدف قرار می‌دهند و از TextView استاندارد استفاده می‌کنند، این ویژگی را به طور پیش‌فرض فعال خواهند داشت. (یعنی، TextView هنگام ارسال رویدادها به سرویس‌های دسترسی، بازیابی داده‌ها از IME و تنظیم انواع تغییر متن را مدیریت خواهد کرد).

  • سرویس‌های دسترسی‌پذیری: سرویس‌های دسترسی‌پذیری که رویدادهای TYPE_VIEW_TEXT_CHANGED را پردازش می‌کنند، می‌توانند AccessibilityEvent.getTextChangeTypes() را فراخوانی کنند تا ماهیت تغییر را شناسایی کرده و استراتژی‌های بازخورد خود را بر اساس آن تنظیم کنند.

حریم خصوصی

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

ECH (سلام کلاینت رمزگذاری شده) فعال شد

اندروید ۱۷ پشتیبانی پلتفرم از Encrypted Client Hello (ECH) را معرفی می‌کند، یک افزونه TLS که با رمزگذاری Server Name Indication (SNI) در TLS handshake، حریم خصوصی کاربر را افزایش می‌دهد. این رمزگذاری به ناظران شبکه کمک می‌کند تا به راحتی دامنه خاصی را که برنامه شما به آن متصل می‌شود، شناسایی نکنند.

برای برنامه‌هایی که اندروید ۱۷ (سطح API ۳۷) یا بالاتر را هدف قرار می‌دهند، از ECH برای اتصالات TLS استفاده می‌شود. ECH فقط در صورتی فعال است که کتابخانه شبکه مورد استفاده برنامه (به عنوان مثال، HttpEngine، WebView یا OkHttp) از ECH پشتیبانی یکپارچه داشته باشد و سرور راه دور نیز از پروتکل ECH پشتیبانی کند. اگر ECH قابل مذاکره نباشد، کلاینت یک افزونه ECH با محتوای تصادفی ارسال می‌کند (مکانیسمی به نام ECH GREASE). برای جزئیات بیشتر در مورد نحوه عملکرد ECH GREASE به RFC 9849 مراجعه کنید.

برای اینکه برنامه‌ها بتوانند این رفتار را سفارشی کنند، اندروید ۱۷ یک عنصر جدید <domainEncryption> به فایل پیکربندی امنیت شبکه اضافه می‌کند. توسعه‌دهندگان می‌توانند از <domainEncryption> در تگ‌های <base-config> یا <domain-config> برای انتخاب حالت ECH (مثلاً "enabled" یا "disabled" ) به صورت سراسری یا برای هر دامنه استفاده کنند.

برای اطلاعات بیشتر، به مستندات Encrypted Client Hello مراجعه کنید.

مجوز شبکه محلی برای برنامه‌هایی که اندروید ۱۷ را هدف قرار می‌دهند، الزامی است

Android 17 introduces the ACCESS_LOCAL_NETWORK runtime permission to protect users from unauthorized local network access. Because this falls under the existing NEARBY_DEVICES permission group, users who have already granted other NEARBY_DEVICES permissions aren't prompted again. This new requirement prevents malicious apps from exploiting unrestricted local network access for covert user tracking and fingerprinting. By declaring and requesting this permission, your app can discover and connect to devices on the local area network (LAN), such as smart home devices or casting receivers.

Apps targeting Android 17 (API level 37) or higher now have two paths to maintain communication with LAN devices: Adopt system-mediated, privacy-preserving device pickers to skip the permission prompt, or explicitly request this new permission at runtime to maintain local network communication.

For more information, see the Local network permission documentation.

پنهان کردن رمزهای عبور از دستگاه‌های فیزیکی

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

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

اگر کاربر از صفحه لمسی دستگاه استفاده کند، سیستم تنظیم جدید show_passwords_touch را اعمال می‌کند.

محافظت OTP برای پیام‌های SMS استاندارد

با شروع اندروید ۱۷، اندروید محافظت از پیام‌های متنی OTP خود را گسترش می‌دهد تا برای پیام‌های متنی استاندارد (پیام‌های متنی حاوی OTP که از فرمت‌های WebOTP یا SMS Retriever استفاده نمی‌کنند) نیز اعمال شود. برای اکثر برنامه‌هایی که اندروید ۱۷ (سطح API ۳۷) یا بالاتر را هدف قرار می‌دهند، این پیام‌های متنی تا سه ساعت پس از دریافت در دسترس قرار نمی‌گیرند. این تأخیر برای جلوگیری از ربودن OTP در نظر گرفته شده است. در طول این تأخیر سه ساعته، پخش SMS_RECEIVED_ACTION متوقف می‌شود و پرس‌وجوهای پایگاه داده ارائه دهنده پیامک فیلتر می‌شوند. پیام متنی پس از تأخیر برای این برنامه‌ها در دسترس است.

برخی از برنامه‌ها مانند برنامه دستیار پیامک پیش‌فرض، برنامه‌های همراه دستگاه‌های متصل و غیره، از این تأخیر معاف هستند. همه برنامه‌هایی که برای استخراج OTP به خواندن پیام‌های پیامکی متکی هستند، باید برای اطمینان از عملکرد مداوم، به استفاده از SMS Retriever یا APIهای رضایت کاربر SMS روی آورند.

امنیت

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

امنیت فعالیت

In Android 17, the platform continues its shift toward a "secure-by-default" architecture, introducing a suite of enhancements designed to mitigate high-severity exploits such as phishing, interaction hijacking, and confused deputy attacks. This update requires developers to explicitly opt in to new security standards to maintain app compatibility and user protection.

Key impacts for developers include:

  • BAL hardening & improved opt-in: We are refining Background Activity Launch (BAL) restrictions by extending protections to IntentSender. Developers must migrate away from the legacy MODE_BACKGROUND_ACTIVITY_START_ALLOWED constant. Instead, you should adopt granular controls like MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE, which restricts activity starts to scenarios where the calling app is visible, significantly reducing the attack surface.
  • Adoption tools: Developers should utilize strict mode and updated lint checks to identify legacy patterns and ensure readiness for future target SDK requirements.

فعال کردن CT به صورت پیش‌فرض

If an app targets Android 17 (API level 37) or higher, certificate transparency (CT) is enabled by default. (On Android 16, CT is available but apps had to opt in.)

DCL بومی امن‌تر—C

اگر برنامه شما اندروید ۱۷ (سطح API ۳۷) یا بالاتر را هدف قرار می‌دهد، محافظت Safer Dynamic Code Loading (DCL) که در اندروید ۱۴ برای فایل‌های DEX و JAR معرفی شد، اکنون به کتابخانه‌های بومی نیز گسترش می‌یابد.

تمام فایل‌های بومی که با استفاده از System.load() بارگذاری می‌شوند، باید به صورت فقط خواندنی علامت‌گذاری شوند. در غیر این صورت، سیستم UnsatisfiedLinkError را نمایش می‌دهد.

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

محدود کردن فیلدهای PII در نمای داده CP2

برای برنامه‌هایی که اندروید ۱۷ (سطح API اندروید ۱۷ (سطح API ۳۷)) و بالاتر را هدف قرار می‌دهند، ارائه‌دهنده مخاطبین ۲ (CP2) ستون‌های خاصی را که حاوی اطلاعات شخصی قابل شناسایی (PII) هستند، از نمای داده محدود می‌کند. وقتی این تغییر فعال می‌شود، این ستون‌ها برای افزایش حریم خصوصی کاربر از نمای داده حذف می‌شوند. ستون‌های محدود شده عبارتند از:

برنامه‌هایی که از این ستون‌ها از ContactsContract.Data استفاده می‌کنند، می‌توانند با اتصال به RAW_CONTACT_ID ، آنها را از ContactsContract.RawContacts استخراج کنند.

اعمال بررسی‌های سختگیرانه SQL در CP2

برای برنامه‌هایی که اندروید ۱۷ (اندروید سطح API ۱۷ (سطح API ۳۷)) و بالاتر را هدف قرار می‌دهند، Contacts Provider 2 (CP2) اعتبارسنجی دقیق کوئری SQL را هنگام دسترسی به جدول ContactsContract.Data بدون مجوز READ_CONTACTS اعمال می‌کند.

با این تغییر، اگر برنامه‌ای مجوز READ_CONTACTS نداشته باشد، گزینه‌های StrictColumns و StrictGrammar هنگام پرس‌وجو از جدول ContactsContract.Data تنظیم می‌شوند. اگر پرس‌وجو از الگویی استفاده کند که با این موارد سازگار نباشد، رد شده و باعث ایجاد استثنا می‌شود.

هوش

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

منسوخ شدن setContentCaptureEnabled

قابلیت ضبط محتوا (Content Capture) به طور پیش‌فرض در برخی دستگاه‌ها فعال است تا به ویژگی‌های هوش مصنوعی روی دستگاه اجازه دهد محتوای صفحه نمایش را برای تجربیات هوشمند تجزیه و تحلیل کنند.

از اندروید ۱۷ به بعد، متد API مربوط به ContentCaptureManager.setContentCaptureEnabled(boolean) منسوخ شده است. برای برنامه‌هایی که اندروید ۱۷ (سطح API ۳۷) یا بالاتر را هدف قرار می‌دهند، فراخوانی setContentCaptureEnabled(false) دیگر ضبط محتوا را غیرفعال نمی‌کند.

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

برای غیرفعال کردن ضبط محتوا، پرچم FLAG_SECURE را همانطور که در مثال زیر نشان داده شده است، روی پنجره خود تنظیم کنید:

کاتلین

window.setFlags(
    WindowManager.LayoutParams.FLAG_SECURE,
    WindowManager.LayoutParams.FLAG_SECURE
)

جاوا

getWindow().setFlags(
    WindowManager.LayoutParams.FLAG_SECURE,
    WindowManager.LayoutParams.FLAG_SECURE
);

برای جزئیات بیشتر، به مستندات مرجع WindowManager.LayoutParams.FLAG_SECURE مراجعه کنید.

رسانه

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

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

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

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

  • سرویس پیش‌زمینه باید قابلیت‌های «هنگام استفاده» (WIU) را داشته باشد.
  • برنامه باید مجوز دقیق آلارم را داشته باشد و با جریان‌های صوتی USAGE_ALARM در تعامل باشد.

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

فاکتورهای شکل دستگاه

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

تغییرات API پلتفرم برای نادیده گرفتن محدودیت‌های جهت‌گیری، تغییر اندازه و نسبت ابعاد در صفحات نمایش بزرگ (sw>=600dp)

ما در اندروید ۱۶ تغییراتی در API پلتفرم ایجاد کردیم تا محدودیت‌های جهت‌گیری، نسبت ابعاد و قابلیت تغییر اندازه در صفحه نمایش‌های بزرگ (sw >= 600dp) برای برنامه‌هایی که سطح API ۳۶ یا بالاتر را هدف قرار می‌دهند، نادیده گرفته شود . توسعه‌دهندگان می‌توانند با SDK ۳۶ از این تغییرات انصراف دهند، اما این انصراف دیگر برای برنامه‌هایی که اندروید ۱۷ (سطح API ۳۷) یا بالاتر را هدف قرار می‌دهند، در دسترس نخواهد بود.

برای اطلاعات بیشتر، به بخش «محدودیت‌های جهت‌گیری و تغییر اندازه نادیده گرفته می‌شوند» مراجعه کنید.

اتصال

اندروید ۱۷ تغییر زیر را برای بهبود سازگاری و همسویی با رفتار استاندارد Java InputStream برای سوکت‌های بلوتوث RFCOMM معرفی می‌کند.

رفتار خواندن() ثابت BluetoothSocket برای RFCOMM

برای برنامه‌هایی که اندروید ۱۷ (سطح API ۳۷) را هدف قرار می‌دهند، متد read() از InputStream که از یک BluetoothSocket مبتنی بر RFCOMM گرفته شده است، اکنون هنگام بسته شدن سوکت یا قطع اتصال، -1 را برمی‌گرداند.

این تغییر، رفتار سوکت RFCOMM را با سوکت‌های LE CoC سازگار می‌کند و با مستندات استاندارد InputStream.read() همسو می‌شود، که بیان می‌کند هنگام رسیدن به انتهای جریان، -1 بازگردانده می‌شود.

برنامه‌هایی که صرفاً برای خروج از حلقه خواندن به دریافت یک IOException متکی هستند، ممکن است تحت تأثیر این تغییر قرار گیرند و باید حلقه‌های خواندن BluetoothSocket را به‌روزرسانی کنند تا به طور صریح مقدار بازگشتی -1 را بررسی کنند. این امر تضمین می‌کند که حلقه هنگام قطع شدن دستگاه از راه دور یا بسته شدن سوکت، به درستی خاتمه می‌یابد. برای نمونه‌ای از پیاده‌سازی توصیه‌شده، به قطعه کد موجود در راهنمای انتقال داده‌های بلوتوث مراجعه کنید.