مانند نسخههای قبلی، اندروید ۱۷ شامل تغییرات رفتاری است که ممکن است بر برنامه شما تأثیر بگذارد. تغییرات رفتاری زیر منحصراً برای برنامههایی اعمال میشود که اندروید ۱۷ یا بالاتر را هدف قرار میدهند. اگر برنامه شما اندروید ۱۷ یا بالاتر را هدف قرار میدهد، باید برنامه خود را برای پشتیبانی از این رفتارها، در صورت لزوم، اصلاح کنید.
حتماً فهرست تغییرات رفتاری که صرف نظر از targetSdkVersion برنامه شما، بر همه برنامههای در حال اجرا در اندروید ۱۷ تأثیر میگذارند را نیز بررسی کنید.
عملکرد اصلی
اندروید ۱۷ شامل تغییرات زیر است که قابلیتهای اصلی مختلف سیستم اندروید را اصلاح یا گسترش میدهد.
پیادهسازی جدید و بدون قفل MessageQueue
با شروع از اندروید ۱۷، برنامههایی که اندروید ۱۷ (سطح API ۳۷) یا بالاتر را هدف قرار میدهند، یک پیادهسازی جدید و بدون قفل از android.os.MessageQueue دریافت میکنند. این پیادهسازی جدید عملکرد را بهبود میبخشد و فریمهای از دست رفته را کاهش میدهد، اما ممکن است کلاینتهایی را که روی فیلدها و متدهای خصوصی MessageQueue تأمل میکنند، خراب کند.
برای اطلاعات بیشتر، از جمله استراتژیهای کاهش، به راهنمای تغییر رفتار MessageQueue مراجعه کنید.
فیلدهای نهایی استاتیک اکنون غیرقابل تغییر هستند
برنامههایی که روی اندروید ۱۷ یا بالاتر اجرا میشوند و اندروید ۱۷ (سطح API ۳۷) یا بالاتر را هدف قرار میدهند، نمیتوانند فیلدهای static final را تغییر دهند. اگر برنامهای سعی کند با استفاده از reflection یک فیلد static final تغییر دهد، باعث ایجاد خطای IllegalAccessException میشود. تلاش برای تغییر یکی از این فیلدها از طریق APIهای JNI (مانند SetStaticLongField() ) باعث خرابی برنامه خواهد شد.
دسترسیپذیری
اندروید ۱۷ تغییرات زیر را برای بهبود دسترسی ایجاد میکند.
پشتیبانی از قابلیت دسترسی برای تایپ پیچیده با صفحه کلید فیزیکی IME
This feature introduces new AccessibilityEvent and TextAttribute
APIs to enhance screen reader spoken feedback for CJKV language input. CJKV IME
apps can now signal whether a text conversion candidate has been selected during
text composition. Apps with edit fields can specify text change types when
sending text changed accessibility events.
For example, apps can specify that a text change occurred during text
composition, or that a text change resulted from a commit.
Doing this enables accessibility
services such as screen readers to deliver more precise feedback based on the
nature of the text modification.
App adoption
IME Apps: When setting composing text in edit fields, IMEs can use
TextAttribute.Builder.setTextSuggestionSelected()to indicate whether a specific conversion candidate was selected.Apps with Edit Fields: Apps that maintain a custom
InputConnectioncan retrieve candidate selection data by callingTextAttribute.isTextSuggestionSelected(). These apps should then callAccessibilityEvent.setTextChangeTypes()when dispatchingTYPE_VIEW_TEXT_CHANGEDevents. Apps targeting Android 17 (API level 37) that use the standardTextViewwill have this feature enabled by default. (That is,TextViewwill handle retrieving data from the IME and setting text change types when sending events to accessibility services).Accessibility Services: Accessibility services that process
TYPE_VIEW_TEXT_CHANGEDevents can callAccessibilityEvent.getTextChangeTypes()to identify the nature of the modification and adjust their feedback strategies accordingly.
حریم خصوصی
اندروید ۱۷ شامل تغییرات زیر برای بهبود حریم خصوصی کاربران است.
ECH (سلام کلاینت رمزگذاری شده) فعال شد
Android 17 introduces platform support for Encrypted Client Hello (ECH), a TLS extension that enhances user privacy by encrypting the Server Name Indication (SNI) in the TLS handshake. This encryption helps prevent network observers from easily identifying the specific domain your app is connecting to.
For apps targeting Android 17 (API level 37) or higher, ECH is used for TLS connections. ECH is active only if the networking library used by the app (for example, HttpEngine, WebView, or OkHttp) has integrated ECH support and the remote server also supports the ECH protocol. If ECH cannot be negotiated, the client sends an ECH extension with randomized contents (a mechanism called ECH GREASE). See RFC 9849 for more details on how ECH GREASE works.
To allow apps to customize this behavior, Android 17 adds a new
<domainEncryption> element to the Network Security Configuration file.
Developers can use <domainEncryption> within <base-config> or
<domain-config> tags to select an ECH mode (for example,
"enabled" or "disabled") on a global or per-domain basis.
For more information, see the Encrypted Client Hello documentation.
مجوز شبکه محلی برای برنامههایی که اندروید ۱۷ را هدف قرار میدهند، الزامی است
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.
پنهان کردن رمزهای عبور از دستگاههای فیزیکی
If an app targets Android 17 (API level 37) or higher and the user is using
a physical input device (for example, an external keyboard), the Android
operating system applies the new show_passwords_physical setting to all
characters in the password field. By default, that setting hides all password
characters.
The Android system shows the last-typed password character to help the user see if they mistyped the password. However, this is much less necessary with larger external keyboards. In addition, devices with external keyboards often have larger displays, which increases the danger of someone seeing the typed password.
If the user is using the device's touchscreen, the system applies the new
show_passwords_touch setting.
محافظت OTP برای پیامهای SMS استاندارد
با شروع اندروید ۱۷، اندروید محافظت از پیامهای متنی OTP خود را گسترش میدهد تا برای پیامهای متنی استاندارد (پیامهای متنی حاوی OTP که از فرمتهای WebOTP یا SMS Retriever استفاده نمیکنند) نیز اعمال شود. برای اکثر برنامههایی که اندروید ۱۷ (سطح API ۳۷) یا بالاتر را هدف قرار میدهند، این پیامهای متنی تا سه ساعت پس از دریافت در دسترس قرار نمیگیرند. این تأخیر برای جلوگیری از ربودن OTP در نظر گرفته شده است. در طول این تأخیر سه ساعته، پخش SMS_RECEIVED_ACTION متوقف میشود و پرسوجوهای پایگاه داده ارائه دهنده پیامک فیلتر میشوند. پیام متنی پس از تأخیر برای این برنامهها در دسترس است.
برخی از برنامهها مانند برنامه دستیار پیامک پیشفرض، برنامههای همراه دستگاههای متصل و غیره، از این تأخیر معاف هستند. همه برنامههایی که برای استخراج OTP به خواندن پیامهای پیامکی متکی هستند، باید برای اطمینان از عملکرد مداوم، به استفاده از SMS Retriever یا APIهای رضایت کاربر SMS روی آورند.
امنیت
اندروید ۱۷ بهبودهای زیر را در امنیت دستگاه و برنامهها ایجاد میکند.
امنیت فعالیت
در اندروید ۱۷، این پلتفرم به سمت معماری «امن به طور پیشفرض» تغییر جهت داده و مجموعهای از پیشرفتها را معرفی میکند که برای کاهش سوءاستفادههای شدید مانند فیشینگ، ربودن تعامل و حملات تصادفی طراحی شدهاند. این بهروزرسانی از توسعهدهندگان میخواهد که به صراحت استانداردهای امنیتی جدید را برای حفظ سازگاری برنامه و حفاظت از کاربر بپذیرند.
تأثیرات کلیدی برای توسعهدهندگان شامل موارد زیر است:
- مقاومسازی BAL و بهبود انتخاب: ما با گسترش محافظتها به
IntentSender، محدودیتهای راهاندازی فعالیت پسزمینه (BAL) را اصلاح میکنیم. توسعهدهندگان باید از ثابت قدیمیMODE_BACKGROUND_ACTIVITY_START_ALLOWEDفاصله بگیرند. در عوض، باید کنترلهای جزئیتری مانندMODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLEرا اتخاذ کنید که شروع فعالیت را به سناریوهایی محدود میکند که برنامه فراخوانی قابل مشاهده است و به طور قابل توجهی سطح حمله را کاهش میدهد. - ابزارهای پذیرش: توسعهدهندگان باید از حالت strict mode و بررسیهای بهروز شدهی lint برای شناسایی الگوهای قدیمی و اطمینان از آمادگی برای الزامات SDK هدف در آینده استفاده کنند.
فعال کردن 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
For apps targeting Android 17 (API level Android 17 (API level 37)) and
higher, Contacts Provider 2 (CP2) enforces strict SQL query validation when
the ContactsContract.Data table is accessed without
READ_CONTACTS permission.
With this change, if an app doesn't have READ_CONTACTS
permission, StrictColumns and
StrictGrammar options are set when querying
the ContactsContract.Data table. If a query
uses a pattern that isn't compatible with these, it will be
rejected and cause an exception to be thrown.
رسانه
اندروید ۱۷ شامل تغییرات زیر در رفتار رسانهای است.
تقویت صدای پسزمینه
با شروع اندروید ۱۷، چارچوب صوتی محدودیتهایی را در تعاملات صوتی پسزمینه از جمله پخش صدا، درخواستهای فوکوس صدا و 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 را بررسی کنند. این امر تضمین میکند که حلقه هنگام قطع شدن دستگاه از راه دور یا بسته شدن سوکت، به درستی خاتمه مییابد. برای نمونهای از پیادهسازی توصیهشده، به قطعه کد موجود در راهنمای انتقال دادههای بلوتوث مراجعه کنید.