Android 10 شامل تغییرات رفتاری است که ممکن است بر برنامه شما تأثیر بگذارد. تغییرات فهرست شده در این صفحه، بدون در نظر گرفتن targetSdkVersion
برنامه، هنگام اجرا در Android 10، روی برنامه شما اعمال می شود. شما باید برنامه خود را آزمایش کنید و در صورت نیاز آن را تغییر دهید تا از این تغییرات به درستی پشتیبانی شود.
اگر targetSdkVersion برنامه شما 29
یا بالاتر است، باید از تغییرات اضافی نیز پشتیبانی کنید. برای جزئیات، حتماً تغییرات رفتاری برنامههایی را که 29 را هدف قرار میدهند، بخوانید.
توجه: علاوه بر تغییرات ذکر شده در این صفحه، اندروید 10 تعداد زیادی تغییرات و محدودیتهای مبتنی بر حریم خصوصی را معرفی میکند، از جمله موارد زیر:
- دسترسی پس زمینه به مکان دستگاه
- فعالیت پس زمینه شروع می شود
- اطلاعات وابستگی مخاطبین
- تصادفی سازی آدرس MAC
- فراداده دوربین
- مدل مجوزها
این تغییرات بر همه برنامه ها تأثیر می گذارد و حریم خصوصی کاربران را افزایش می دهد. برای کسب اطلاعات بیشتر در مورد نحوه پشتیبانی از این تغییرات، به صفحه تغییرات حریم خصوصی مراجعه کنید.
محدودیت های رابط غیر SDK
برای کمک به اطمینان از ثبات و سازگاری برنامه، پلتفرم شروع به محدود کردن رابطهای غیر SDK کرد که برنامه شما میتواند در Android 9 استفاده کند (سطح API 28). Android 10 شامل لیست های به روز شده از رابط های غیر SDK محدود شده بر اساس همکاری با توسعه دهندگان اندروید و آخرین آزمایش داخلی است. هدف ما این است که قبل از اینکه رابطهای غیر SDK را محدود کنیم، مطمئن شویم که جایگزینهای عمومی در دسترس هستند.
اگر اندروید 10 (سطح API 29) را هدف قرار نمی دهید، ممکن است برخی از این تغییرات فوراً روی شما تأثیر نگذارند. با این حال، در حالی که در حال حاضر میتوانید از برخی رابطهای غیر SDK ( بسته به سطح API هدف برنامهتان ) استفاده کنید، استفاده از هر روش یا فیلد غیر SDK همیشه خطر شکستن برنامه شما را بالا میبرد.
اگر مطمئن نیستید که برنامه شما از رابط های غیر SDK استفاده می کند، می توانید برنامه خود را آزمایش کنید تا متوجه شوید. اگر برنامه شما به رابطهای غیر SDK متکی است، باید برنامهریزی برای انتقال به جایگزینهای SDK را شروع کنید. با این وجود، میدانیم که برخی از برنامهها دارای موارد استفاده معتبر برای استفاده از رابطهای غیر SDK هستند. اگر نمی توانید جایگزینی برای استفاده از یک رابط غیر SDK برای یک ویژگی در برنامه خود پیدا کنید، باید یک API عمومی جدید درخواست کنید .
برای کسب اطلاعات بیشتر، به بهروزرسانیهای محدودیتهای رابط غیر SDK در Android 10 و محدودیتهای رابطهای غیر SDK را ببینید.
ناوبری اشاره
با شروع اندروید 10، کاربران میتوانند ناوبری اشارهای را در سراسر دستگاه فعال کنند. اگر کاربر ناوبری اشارهای را فعال کند، این روی همه برنامههای روی دستگاه تأثیر میگذارد، خواه این برنامه سطح 29 API را هدف قرار دهد یا نه. مگر اینکه برنامه ای به طور خاص آن حرکت را برای بخش هایی از صفحه لغو کند .
برای سازگار کردن برنامه خود با پیمایش اشاره ای، باید محتوای برنامه را از لبه به لبه گسترش دهید و حرکات متضاد را به درستی مدیریت کنید. برای اطلاعات، به مستندات پیمایش ژست مراجعه کنید.
NDK
اندروید 10 شامل تغییرات NDK زیر است.
اشیاء مشترک نمی توانند شامل جابجایی متن باشند
Android 6.0 (سطح API 23) استفاده از جابجایی متن در اشیاء مشترک را ممنوع کرد . کد باید همانطور که هست بارگیری شود و نباید اصلاح شود. این تغییر زمان بارگذاری و امنیت برنامه را بهبود می بخشد.
SELinux این محدودیت را برای برنامه هایی که اندروید 10 یا بالاتر را هدف قرار می دهند اعمال می کند. اگر این برنامهها به استفاده از اشیاء به اشتراکگذاشتهشده که حاوی جابجایی متن هستند ادامه دهند، در معرض خطر شکستگی قرار دارند.
تغییرات در کتابخانه های Bionic و مسیرهای پیوند دهنده پویا
در اندروید 10، چندین مسیر به جای فایلهای معمولی، پیوندهای نمادین هستند. برنامههایی که به مسیرهایی که فایلهای معمولی هستند تکیه کردهاند ممکن است خراب شوند:
-
/system/lib/libc.so
->/apex/com.android.runtime/lib/bionic/libc.so
-
/system/lib/libm.so
->/apex/com.android.runtime/lib/bionic/libm.so
-
/system/lib/libdl.so
->/apex/com.android.runtime/lib/bionic/libdl.so
-
/system/bin/linker
->/apex/com.android.runtime/bin/linker
این تغییرات برای انواع 64 بیتی فایل نیز اعمال می شود و lib/
با lib64/
جایگزین شده است.
برای سازگاری، سیملینک ها در مسیرهای قدیمی ارائه می شوند. برای مثال، /system/lib/libc.so
یک پیوند نمادین به /apex/com.android.runtime/lib/bionic/libc.so
است. بنابراین dlopen(“/system/lib/libc.so”)
به کار خود ادامه میدهد، اما برنامهها زمانی تفاوت را پیدا میکنند که واقعاً سعی کنند کتابخانههای بارگذاری شده را با خواندن /proc/self/maps
یا موارد مشابه بررسی کنند، که معمول نیست اما ما دریافتهام که برخی از برنامهها این کار را به عنوان بخشی از فرآیند ضد هک خود انجام میدهند. اگر چنین است، مسیرهای /apex/…
باید به عنوان مسیرهای معتبر برای فایلهای Bionic اضافه شوند.
باینری ها/کتابخانه های سیستم نگاشت شده به حافظه اجرائی
با شروع در اندروید 10، بخشهای اجرایی از باینریها و کتابخانههای سیستم به عنوان یک تکنیک سختسازی در برابر حملات استفاده مجدد از کد، فقط در حافظه اجرا میشوند (غیرقابل خواندن). اگر برنامه شما عملیات خواندن را در بخشهای حافظه که بهعنوان «فقط اجرا» علامتگذاری شدهاند - از اشکال، آسیبپذیری یا بازرسی عمدی حافظه - انجام میدهد، سیستم یک سیگنال SIGSEGV
را به برنامه شما ارسال میکند.
با بررسی فایل سنگ قبر مربوطه در /data/tombstones/
می توانید تشخیص دهید که آیا این رفتار باعث خرابی شده است یا خیر. یک خرابی مربوط به فقط اجرا حاوی پیام لغو زیر است:
Cause: execute-only (no-read) memory access error; likely due to data in .text.
برای حل این مشکل و انجام عملیاتی مانند بازرسی حافظه، میتوان با فراخوانی mprotect()
بخشهای فقط اجرا را بهعنوان read+execute علامتگذاری کرد. با این حال، اکیداً توصیه میکنیم آن را به حالت اجرا برگردانید، زیرا این تنظیم مجوز دسترسی محافظت بهتری را برای برنامه و کاربران شما فراهم میکند.
امنیت
اندروید 10 شامل تغییرات امنیتی زیر است.
TLS 1.3 به طور پیش فرض فعال است
در Android 10 و بالاتر، TLS 1.3 به طور پیش فرض برای همه اتصالات TLS فعال است. در اینجا چند جزئیات مهم در مورد اجرای TLS 1.3 ما آورده شده است:
- مجموعه رمز TLS 1.3 را نمی توان سفارشی کرد. مجموعه رمزهای پشتیبانی شده TLS 1.3 همیشه در صورت فعال بودن TLS 1.3 فعال می شوند. هرگونه تلاش برای غیرفعال کردن آنها با فراخوانی
setEnabledCipherSuites()
نادیده گرفته می شود. - هنگامی که TLS 1.3 مورد مذاکره قرار می گیرد، اشیاء
HandshakeCompletedListener
قبل از افزودن جلسات به حافظه پنهان جلسه فراخوانی می شوند. (در TLS 1.2 و سایر نسخه های قبلی، این اشیاء پس از اضافه شدن جلسات به حافظه پنهان جلسه فراخوانی می شوند.) - در برخی شرایط که نمونههای
SSLEngine
یکSSLHandshakeException
در نسخههای قبلی Android پرتاب میکنند، این نمونهها یکSSLProtocolException
را به جای آن در Android 10 و بالاتر میفرستند. - حالت 0-RTT پشتیبانی نمی شود.
در صورت تمایل، می توانید با تماس با SSLContext.getInstance("TLSv1.2")
یک SSLContext
با TLS 1.3 غیرفعال دریافت کنید. همچنین می توانید با فراخوانی setEnabledProtocols()
بر روی یک شی مناسب، نسخه های پروتکل را بر اساس هر اتصال فعال یا غیرفعال کنید.
گواهینامه های امضا شده با SHA-1 در TLS قابل اعتماد نیستند
در Android 10، گواهیهایی که از الگوریتم هش SHA-1 استفاده میکنند، در اتصالات TLS قابل اعتماد نیستند. روت CA از سال 2016 چنین گواهی صادر نکرده است و دیگر در کروم یا سایر مرورگرهای اصلی قابل اعتماد نیست.
اگر اتصال به سایتی باشد که گواهی را با استفاده از SHA-1 ارائه می دهد، هرگونه تلاش برای اتصال با شکست مواجه می شود.
تغییرات و بهبود رفتار KeyChain
برخی از مرورگرها، مانند Google Chrome، زمانی که سرور TLS پیام درخواست گواهی را به عنوان بخشی از یک دست دادن TLS ارسال میکند، به کاربران اجازه میدهند گواهی را انتخاب کنند. از Android 10، اشیاء KeyChain
هنگام فراخوانی KeyChain.choosePrivateKeyAlias()
به صادرکنندگان و پارامترهای مشخصات کلیدی احترام میگذارند تا یک درخواست انتخاب گواهی را به کاربران نشان دهند. به طور خاص، این اعلان حاوی گزینههایی نیست که با مشخصات سرور مطابقت ندارند.
اگر گواهیهای قابل انتخاب توسط کاربر در دسترس نباشد، مانند زمانی که هیچ گواهینامهای با مشخصات سرور مطابقت ندارد یا دستگاهی هیچ گواهینامهای نصب نکرده است، اعلان انتخاب گواهی اصلا ظاهر نمیشود.
علاوه بر این، در Android 10 یا بالاتر، نیازی به قفل صفحه دستگاه برای وارد کردن کلیدها یا گواهیهای CA به یک شی KeyChain
نیست.
سایر تغییرات TLS و رمزنگاری
چندین تغییر جزئی در کتابخانههای TLS و رمزنگاری وجود دارد که در Android 10 اعمال میشوند:
- رمزهای AES/GCM/NoPadding و ChaCha20/Poly1305/NoPadding اندازههای بافر دقیقتری را از
getOutputSize()
برمیگردانند. - مجموعه رمز
TLS_FALLBACK_SCSV
از تلاشهای اتصال با حداکثر پروتکل TLS 1.2 یا بالاتر حذف شده است. به دلیل پیشرفتهایی که در اجرای سرور TLS انجام شده است، توصیه نمیکنیم که به عقبگرد خارجی TLS بپردازید. درعوض، توصیه میکنیم به مذاکره نسخه TLS تکیه کنید. - ChaCha20-Poly1305 نام مستعار ChaCha20/Poly1305/NoPadding است.
- نامهای میزبان با نقاط انتهایی، نام میزبان SNI معتبر در نظر گرفته نمیشوند.
- پسوند supported_signature_algorithms در
CertificateRequest
هنگام انتخاب کلید امضا برای پاسخهای گواهی رعایت میشود. - کلیدهای امضای غیرشفاف، مانند کلیدهای Android Keystore، می توانند با امضاهای RSA-PSS در TLS استفاده شوند.
Wi-Fi Direct پخش می شود
در Android 10، پخشهای زیر مرتبط با Wi-Fi Direct چسبنده نیستند:
اگر برنامه شما متکی به دریافت این پخشها در هنگام ثبت نام بوده است، بهجای آن از روش get()
مناسب در زمان اولیه برای به دست آوردن اطلاعات استفاده کنید.
قابلیت های Wi-Fi Aware
اندروید 10 برای سهولت ایجاد سوکت TCP/UDP با استفاده از مسیرهای داده Wi-Fi Aware، پشتیبانی اضافه میکند. برای ایجاد یک سوکت TCP/UDP که به یک ServerSocket
متصل می شود، دستگاه سرویس گیرنده باید آدرس IPv6 و پورت سرور را بداند. قبلاً باید خارج از باند ارتباط برقرار میشد، مانند استفاده از پیامرسانی لایه 2 BT یا Wi-Fi Aware، یا با استفاده از پروتکلهای دیگر، مانند mDNS، درون باند کشف میشد. با Android 10، اطلاعات را می توان به عنوان بخشی از راه اندازی شبکه منتقل کرد.
سرور می تواند یکی از کارهای زیر را انجام دهد:
- یک
ServerSocket
را راه اندازی کنید و پورت مورد استفاده را تنظیم یا بدست آورید. - اطلاعات پورت را به عنوان بخشی از درخواست شبکه Wi-Fi Aware مشخص کنید.
نمونه کد زیر نحوه تعیین اطلاعات پورت را به عنوان بخشی از درخواست شبکه نشان می دهد:
کاتلین
val ss = ServerSocket() val ns = WifiAwareNetworkSpecifier.Builder(discoverySession, peerHandle) .setPskPassphrase("some-password") .setPort(ss.localPort) .build() val myNetworkRequest = NetworkRequest.Builder() .addTransportType(NetworkCapabilities.TRANSPORT_WIFI_AWARE) .setNetworkSpecifier(ns) .build()
جاوا
ServerSocket ss = new ServerSocket(); WifiAwareNetworkSpecifier ns = new WifiAwareNetworkSpecifier .Builder(discoverySession, peerHandle) .setPskPassphrase(“some-password”) .setPort(ss.getLocalPort()) .build(); NetworkRequest myNetworkRequest = new NetworkRequest.Builder() .addTransportType(NetworkCapabilities.TRANSPORT_WIFI_AWARE) .setNetworkSpecifier(ns) .build();
سپس مشتری یک درخواست شبکه Wi-Fi Aware را برای دریافت IPv6 و پورت ارائه شده توسط سرور انجام می دهد:
کاتلین
val callback = object : ConnectivityManager.NetworkCallback() { override fun onAvailable(network: Network) { ... } override fun onLinkPropertiesChanged(network: Network, linkProperties: LinkProperties) { ... } override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities) { ... val ti = networkCapabilities.transportInfo if (ti is WifiAwareNetworkInfo) { val peerAddress = ti.peerIpv6Addr val peerPort = ti.port } } override fun onLost(network: Network) { ... } }; connMgr.requestNetwork(networkRequest, callback)
جاوا
callback = new ConnectivityManager.NetworkCallback() { @Override public void onAvailable(Network network) { ... } @Override public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) { ... } @Override public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) { ... TransportInfo ti = networkCapabilities.getTransportInfo(); if (ti instanceof WifiAwareNetworkInfo) { WifiAwareNetworkInfo info = (WifiAwareNetworkInfo) ti; Inet6Address peerAddress = info.getPeerIpv6Addr(); int peerPort = info.getPort(); } } @Override public void onLost(Network network) { ... } }; connMgr.requestNetwork(networkRequest, callback);
SYSTEM_ALERT_WINDOW در دستگاههای برو
برنامههای در حال اجرا در دستگاههای Android 10 (نسخه Go) نمیتوانند مجوز SYSTEM_ALERT_WINDOW
را دریافت کنند. این به این دلیل است که ترسیم پنجره های همپوشانی از حافظه بیش از حد استفاده می کند که به ویژه برای عملکرد دستگاه های اندرویدی با حافظه کم مضر است.
اگر برنامهای که روی دستگاه نسخه Go دارای Android 9 یا پایینتر اجرا میشود، مجوز SYSTEM_ALERT_WINDOW
را دریافت کند، برنامه حتی اگر دستگاه به Android 10 ارتقا یافته باشد، این مجوز را حفظ میکند. با این حال، برنامههایی که قبلاً این مجوز را ندارند، پس از دستگاه ارتقا یافته است
اگر برنامهای در دستگاه Go یک هدف با عمل ACTION_MANAGE_OVERLAY_PERMISSION
ارسال کند، سیستم بهطور خودکار درخواست را رد میکند و کاربر را به صفحه تنظیمات میبرد که میگوید مجوز مجاز نیست زیرا سرعت دستگاه را کاهش میدهد. اگر یک برنامه در دستگاه Go، Settings.canDrawOverlays()
را فراخوانی کند، روش همیشه false را برمیگرداند. باز هم، این محدودیتها برای برنامههایی اعمال نمیشود که مجوز SYSTEM_ALERT_WINDOW
را قبل از ارتقای دستگاه به Android 10 دریافت کردهاند.
هشدار برای برنامه هایی که نسخه های قدیمی اندروید را هدف قرار می دهند
دستگاههایی که دارای Android 10 یا بالاتر هستند، اولین باری که برنامهای را اجرا میکنند که Android 5.1 (سطح API 22) یا پایینتر را هدف قرار میدهد، به کاربران هشدار میدهند. اگر برنامه از کاربر بخواهد مجوزها را اعطا کند، به کاربر فرصتی داده میشود تا قبل از اینکه برنامه برای اولین بار اجرا شود، مجوزهای برنامه را تنظیم کند.
با توجه به الزامات API هدف Google Play ، یک کاربر این هشدارها را فقط زمانی می بیند که برنامه ای را اجرا کند که اخیراً به روز نشده است. برای برنامههایی که از طریق فروشگاههای دیگر توزیع میشوند، الزامات API هدف مشابه در سال 2019 اعمال میشوند. برای اطلاعات بیشتر درباره این الزامات، به گسترش الزامات سطح API هدف در سال 2019 مراجعه کنید.
مجموعه رمز SHA-2 CBC حذف شد
مجموعههای رمز SHA-2 CBC زیر از پلتفرم حذف شدهاند:
-
TLS_RSA_WITH_AES_128_CBC_SHA256
-
TLS_RSA_WITH_AES_256_CBC_SHA256
-
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
-
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
-
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
-
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
این مجموعههای رمزی نسبت به مجموعههای رمز مشابهی که از GCM استفاده میکنند، امنیت کمتری دارند و بیشتر سرورها یا از هر دو نوع GCM و CBC این مجموعههای رمز پشتیبانی میکنند یا از هیچ یک از آنها پشتیبانی نمیکنند.
استفاده از برنامه
اندروید 10 تغییرات رفتاری زیر را در رابطه با استفاده از برنامه معرفی می کند:
بهبود استفاده از برنامه UsageStats - Android 10 به طور دقیق استفاده از برنامه را با UsageStats هنگامی که برنامه ها در حالت تقسیم صفحه یا تصویر در تصویر استفاده می شوند، ردیابی می کند. علاوه بر این، اندروید 10 به درستی استفاده از برنامه های فوری را ردیابی می کند.
مقیاس خاکستری برای هر برنامه - اندروید 10 می تواند حالت نمایش مقیاس خاکستری را بر اساس هر برنامه تنظیم کند.
وضعیت حواسپرتی هر برنامه - اندروید 10 میتواند برنامهها را بهطور انتخابی روی «وضعیت حواسپرتی» تنظیم کند که در آن اعلانهای آنها سرکوب میشوند و به عنوان برنامههای پیشنهادی ظاهر نمیشوند.
تعلیق و پخش - در اندروید 10، برنامه های معلق قادر به پخش صدا نیستند.
اتصال HTTPS تغییر می کند
اگر برنامهای که اندروید 10 را اجرا میکند به setSSLSocketFactory()
null
شود، یک IllegalArgumentException
رخ میدهد. در نسخههای قبلی، ارسال null
به setSSLSocketFactory()
تأثیری مشابه ارسال در کارخانه پیشفرض فعلی داشت.
کتابخانه android.preference منسوخ شده است
کتابخانه android.preference
از Android 10 منسوخ شده است. توسعه دهندگان باید در عوض از کتابخانه ترجیحی AndroidX، بخشی از Android Jetpack استفاده کنند. برای منابع اضافی برای کمک به مهاجرت و توسعه، راهنمای تنظیمات به روز شده را همراه با برنامه نمونه عمومی و اسناد مرجع ما بررسی کنید.
تغییر کتابخانه ابزار فایل ZIP
اندروید 10 تغییرات زیر را در کلاسهای بسته java.util.zip
که فایلهای ZIP را مدیریت میکند، معرفی میکند. این تغییرات رفتار کتابخانه را بین Android و سایر پلتفرمهایی که از java.util.zip
استفاده میکنند سازگارتر میکند.
باد کننده
در نسخههای قبلی، برخی از متدها در کلاس Inflater
اگر پس از فراخوانی end()
فراخوانی میشدند، یک IllegalStateException
ایجاد میکردند. در اندروید 10، این روش ها به جای آن یک NullPointerException
می اندازند.
ZipFile
در اندروید 10 و بالاتر، سازنده ZipFile
که آرگومانهایی از نوع File
، int
و Charset
میگیرد، اگر فایل ZIP ارائهشده حاوی هیچ فایلی نباشد، یک ZipException
نمیفرستد.
ZipOutputStream
در اندروید 10 و بالاتر، متد finish()
در ZipOutputStream
اگر بخواهد یک جریان خروجی برای فایل ZIP که حاوی هیچ فایلی نیست بنویسد، یک ZipException
ایجاد نمی کند.
دوربین تغییر می کند
بسیاری از برنامههای استفادهکننده از دوربین تصور میکنند که اگر دستگاه در پیکربندی پرتره است، دستگاه فیزیکی نیز در جهت عمودی است، همانطور که در جهتگیری دوربین توضیح داده شد. این یک فرض مطمئن در گذشته بود، اما با گسترش عوامل شکل موجود، مانند تاشوها، تغییر کرده است. این فرض در این دستگاهها میتواند منجر به چرخش نادرست یا کوچکشده (یا هر دو) نمایشگر منظره یاب دوربین شود.
برنامههایی که سطح API 24 یا بالاتر را هدف قرار میدهند باید android:resizeableActivity
به صراحت تنظیم کنند و عملکردهای لازم را برای مدیریت عملیات چند پنجره ای ارائه دهند.
ردیابی مصرف باتری
با شروع Android 10، SystemHealthManager
هر زمان که دستگاه پس از یک رویداد مهم شارژ قطع شود، آمار مصرف باتری خود را بازنشانی میکند. به طور کلی، یک رویداد مهم شارژ این است: دستگاه به طور کامل شارژ شده است، یا دستگاه از حالت کاملاً تخلیه شده به حالت بیشتر شارژ شده است.
قبل از اندروید 10، هر زمان که دستگاه از برق جدا میشد، آمار مصرف باتری بازنشانی میشد، صرفنظر از اینکه چقدر تغییری در سطح باتری ایجاد شده بود.
منسوخ شدن پرتو Android
در اندروید 10 ما رسماً Android Beam را منسوخ میکنیم، ویژگی قدیمیتری برای شروع اشتراکگذاری دادهها در دستگاهها از طریق Near Field Communication (NFC). ما همچنین چندین API NFC مرتبط را منسوخ میکنیم. Android Beam به صورت اختیاری در دسترس شرکای سازنده دستگاهی است که میخواهند از آن استفاده کنند، اما دیگر در حال توسعه فعال نیست. با این حال، اندروید از دیگر قابلیتها و APIهای NFC پشتیبانی میکند و موارد استفاده مانند خواندن برچسبها و پرداختها همانطور که انتظار میرود به کار خود ادامه میدهند.
تغییر رفتار java.math.BigDecimal.stripTrailingZeros().
اگر مقدار ورودی صفر باشد BigDecimal.stripTrailingZeros()
دیگر صفرهای انتهایی را به عنوان یک مورد خاص حفظ نمی کند.
تغییر رفتار java.util.regex.Matcher و Pattern
نتیجه split()
به گونه ای تغییر کرد که دیگر با یک String
خالی ("") شروع نمی شود، زمانی که یک مطابقت با عرض صفر در ابتدای ورودی وجود دارد. این همچنین بر String.split()
تأثیر می گذارد. به عنوان مثال، "x".split("")
اکنون {"x"}
را برمی گرداند در حالی که قبلاً در نسخه های قدیمی اندروید {"", "x"}
را برمی گرداند. "aardvark".split("(?=a)"
اکنون {"a", "ardv", "ark"}
را به جای {"", "a", "ardv", "ark"}
برمی گرداند.
رفتار استثنایی برای آرگومان های نامعتبر نیز بهبود یافته است:
-
appendReplacement(StringBuffer, String)
اکنون یکIllegalArgumentException
به جایIndexOutOfBoundsException
می اندازد اگرString
جایگزین با یک بک اسلش تک ختم شود که غیرقانونی است. اگرString
جایگزین با یک$
خاتمه یابد، همان استثنا وجود دارد. قبلاً هیچ استثنایی در این سناریو وجود نداشت. -
replaceFirst(null)
اگر یکNullPointerException
پرتاب کند، دیگرreset()
درMatcher
فراخوانی نمی کند.NullPointerException
اکنون نیز زمانی که هیچ تطابقی وجود ندارد پرتاب می شود. قبلا فقط زمانی پرتاب می شد که مسابقه ای بود. -
start(int group)
،end(int group)
وgroup(int group)
اکنون اگر نمایه گروه خارج از محدوده باشد، یکIndexOutOfBoundsException
کلی تر می اندازند. قبلاً، این روش هاArrayIndexOutOfBoundsException
را پرتاب می کردند.
زاویه پیشفرض برای GradientDrawable اکنون TOP_BOTTOM است
در Android 10، اگر GradientDrawable
را در XML تعریف کنید و اندازهگیری زاویه ارائه نکنید، جهت گرادیان پیشفرض TOP_BOTTOM
است. این تغییری نسبت به نسخههای قبلی Android است که پیشفرض LEFT_RIGHT
بود.
به عنوان یک راه حل، اگر به جدیدترین نسخه AAPT2 به روز رسانی کنید، ابزار اندازه گیری زاویه 0 را برای برنامه های قدیمی تعیین می کند اگر اندازه گیری زاویه مشخص نشده باشد.
ثبت اشیاء سریالی شده با استفاده از SUID پیش فرض
با شروع Android 7.0 (سطح API 24)، این پلتفرم اصلاحاتی را در serialVersionUID
پیشفرض برای اشیاء قابل سریالسازی انجام داد. این اصلاح روی برنامههایی که سطح API 23 یا پایینتر را هدف قرار میدهند، تأثیری نداشت.
با شروع Android 10، اگر برنامهای سطح API 23 یا پایینتر را هدف قرار دهد و به سریال قدیمی، نادرست و پیشفرض serialVersionUID
متکی باشد، سیستم یک هشدار ثبت میکند و یک اصلاح کد پیشنهاد میکند.
به طور خاص، اگر همه موارد زیر درست باشد، سیستم یک هشدار ثبت می کند:
- این برنامه سطح API 23 یا پایینتر را هدف قرار میدهد.
- یک کلاس سریالی می شود.
- کلاس سریال شده به جای تنظیم صریح
serialVersionUID
serialVersionUID
فرض استفاده می کند. -
serialVersionUID
پیشفرض باserialVersionUID
متفاوت است اگر برنامه سطح API 24 یا بالاتر را هدف قرار دهد.
این هشدار یک بار برای هر کلاس آسیب دیده ثبت می شود. پیام اخطار شامل یک راه حل پیشنهادی است، یعنی تنظیم صریح serialVersionUID
روی مقدار پیشفرض که اگر برنامه سطح API 24 یا بالاتر را هدف قرار دهد، محاسبه میشود. با استفاده از این اصلاح، میتوانید اطمینان حاصل کنید که اگر یک شی از آن کلاس در برنامهای که سطح API 23 یا پایینتر را هدف قرار میدهد سریال شود، آن شی توسط برنامههایی که 24 یا بالاتر را هدف میگیرند به درستی خوانده میشود و بالعکس.
java.io.FileChannel.map () تغییر می کند
از Android 10، FileChannel.map()
برای فایلهای غیر استاندارد مانند /dev/zero
پشتیبانی نمیشود، که اندازه آن با استفاده از truncate()
قابل تغییر نیست. نسخه های قبلی اندروید خطای بازگردانده شده توسط truncate()
را بلعیدند، اما اندروید 10 یک IOException را پرتاب می کند. اگر به رفتار قدیمی نیاز دارید، باید از کد بومی استفاده کنید.