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

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

اگر targetSdkVersion برنامه شما 29 یا بالاتر است، باید از تغییرات بیشتری نیز پشتیبانی کنید. برای جزئیات بیشتر، حتماً تغییرات رفتاری برای برنامه‌هایی که نسخه ۲۹ را هدف قرار می‌دهند را بخوانید.

توجه: علاوه‌بر تغییرات فهرست‌شده در این صفحه، Android 10 تعداد زیادی تغییرات و محدودیت‌های مبتنی بر حریم خصوصی را معرفی می‌کند، ازجمله موارد زیر:

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

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

محدودیت‌های میانای غیرکیت توسعه نرم‌افزار

برای کمک به اطمینان از پایداری و سازگاری برنامه، پلاتفرم شروع به محدود کردن میاناهای غیرکیت توسعه نرم‌افزار کرده است که برنامه‌تان می‌تواند در Android 9 (سطح میانای برنامه‌سازی کاربردی ۲۸) استفاده کند. Android 10 شامل فهرست‌های به‌روزشده‌ای از میاناهای غیرکیت توسعه نرم‌افزار محدودشده است که براساس همکاری با توسعه‌دهندگان Android و جدیدترین آزمایش‌های داخلی تهیه شده است. هدف ما این است که مطمئن شویم قبل‌از محدود کردن میاناهای غیرکیت توسعه نرم‌افزار، جایگزین‌های عمومی دردسترس باشند.

اگر Android نسخه ۱۰ (سطح میانای برنامه‌سازی کاربردی ۲۹) را هدف قرار ندهید، برخی‌از این تغییرات ممکن است فوراً بر شما تأثیر نگذارد. بااین‌حال، اگرچه درحال‌حاضر می‌توانید از برخی میاناهای غیرکیت توسعه نرم‌افزار استفاده کنید (بسته به سطح میانای برنامه‌سازی کاربردی هدف برنامه‌تان)، استفاده از هر روش یا فیلد غیرکیت توسعه نرم‌افزار همیشه خطر بالایی برای ازکار افتادن برنامه‌تان دارد.

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

برای کسب اطلاعات بیشتر، به‌روزرسانی‌های محدودیت‌های میانای غیرکیت توسعه نرم‌افزار در Android 10 و محدودیت‌های میاناهای غیرکیت توسعه نرم‌افزار را ببینید.

پیمایش اشاره‌ای

از Android 10، کاربران می‌توانند پیمایش اشاره‌ای را در سراسر دستگاه فعال کنند. اگر کاربر پیمایش اشاره‌ای را فعال کند، این امر بر همه برنامه‌های دستگاه تأثیر می‌گذارد، چه برنامه سطح میانای برنامه‌سازی کاربردی ۲۹ را هدف قرار دهد چه ندهد. برای مثال، اگر کاربر از لبه صفحه‌نمایش تند به داخل بکشد، سیستم این اشاره را به‌عنوان پیمایش «برگشت» تفسیر می‌کند، مگراینکه برنامه‌ای به‌طور خاص این اشاره را برای بخش‌هایی از صفحه‌نمایش لغو کند.

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

کیت توسعه بومی

Android 10 شامل تغییرات NDK زیر است.

اشیاء مشترک نمی‌توانند حاوی جابه‌جایی نوشتار باشند

Android 6.0 (سطح میانای برنامه‌سازی کاربردی ۲۳) استفاده از جابه‌جایی نوشتار در اشیای مشترک را غیرمجاز کرد. کد باید همان‌طور که هست بار شود و نباید اصلاح شود. این تغییر زمان بار کردن برنامه و امنیت را بهبود می‌بخشد.

SELinux این محدودیت را بر برنامه‌هایی که Android 10 یا بالاتر را هدف قرار می‌دهند اعمال می‌کند. اگر این برنامه‌ها به استفاده از اشیای مشترک حاوی جابه‌جایی نوشتار ادامه دهند، درمعرض خطر بالای خراب شدن قرار می‌گیرند.

تغییرات در کتابخانه‌های Bionic و مسیرهای پیونددهنده پویا

از Android نسخه ۱۰، چندین مسیر به‌جای فایل‌های معمولی، پیوندهای نمادین هستند. برنامه‌هایی که به مسیرهای فایل‌های معمولی متکی بوده‌اند ممکن است خراب شوند:

  • ‫/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

این تغییرات برای انواع ۶۴ بیتی فایل نیز اعمال می‌شود، lib/ با lib64/ جایگزین شده است.

برای سازگاری، پیوندهای نمادین در مسیرهای قدیمی ارائه شده‌اند. برای مثال، /system/lib/libc.so پیوند نمادین به /apex/com.android.runtime/lib/bionic/libc.so است. بنابراین dlopen(“/system/lib/libc.so”) همچنان کار می‌کند، اما برنامه‌ها هنگامی که واقعاً سعی می‌کنند کتابخانه‌های بارشده را با خواندن /proc/self/maps یا موارد مشابه بررسی کنند، متوجه تفاوت می‌شوند. این کار معمول نیست اما متوجه شده‌ایم که برخی‌از برنامه‌ها این کار را به‌عنوان بخشی از فرایند ضد هک خود انجام می‌دهند. اگر این‌طور است، مسیرهای /apex/… باید به‌عنوان مسیرهای معتبر برای فایل‌های Bionic اضافه شوند.

باینری‌ها/کتابخانه‌های سیستم به حافظه فقط اجرایی نگاشت شده‌اند

از Android 10، بخش‌های اجرایی کتابخانه‌ها و باینری‌های سیستم به‌عنوان تکنیک مقاوم‌سازی دربرابر حملات استفاده مجدد از کد، به‌صورت فقط اجرایی (غیرقابل خواندن) در حافظه نگاشت می‌شوند. اگر برنامه شما عملیات خواندن را در بخش‌هایی از حافظه که به‌عنوان «فقط اجرا» علامت‌گذاری شده‌اند انجام دهد (چه به‌دلیل اشکال، آسیب‌پذیری، یا بازرسی عمدی حافظه)، سیستم سیگنال SIGSEGV را به برنامه شما ارسال می‌کند.

با بررسی فایل سنگ قبر مربوطه در /data/tombstones/ می‌توانید تشخیص دهید که آیا این رفتار باعث خرابی شده است یا نه. خرابی مربوط به فقط اجرا حاوی پیام لغو زیر است:

Cause: execute-only (no-read) memory access error; likely due to data in .text.

برای حل این مشکل و انجام عملیاتی مانند بازرسی حافظه، می‌توان بخش‌های فقط-اجرا را با فراخوانی mprotect() به‌عنوان خواندن+اجرا علامت‌گذاری کرد. بااین‌حال، اکیداً توصیه می‌کنیم بعداز آن، تنظیم را به «فقط اجرا» برگردانید، زیرا این تنظیم اجازه دسترسی محافظت بهتری برای برنامه و کاربران شما فراهم می‌کند.

امنیت

Android 10 شامل تغییرات امنیتی زیر است.

TLS 1.3 به‌طور پیش‌فرض فعال است

در Android نسخه ۱۰ و بالاتر، «امنیت لایه انتقال» (TLS) نسخه ۱.۳ به‌طور پیش‌فرض برای همه اتصال‌های TLS فعال است. در اینجا چند جزئیات مهم درباره پیاده‌سازی TLS 1.3 ما آورده شده است:

  • مجموعه رمزهای TLS 1.3 را نمی‌توان سفارشی‌سازی کرد. مجموعه رمزهای پشتیبانی‌شده «امنیت لایه انتقال» نسخه ۱.۳ همیشه هنگام فعال بودن «امنیت لایه انتقال» نسخه ۱.۳ فعال هستند. هرگونه تلاش برای غیرفعال کردن آن‌ها با فراخوانی setEnabledCipherSuites() نادیده گرفته می‌شود.
  • وقتی TLS 1.3 مذاکره می‌شود، اشیاء HandshakeCompletedListener پیش‌از اضافه شدن جلسه‌ها به حافظه نهان جلسه فراخوانی می‌شوند. (در TLS 1.2 و دیگر نسخه‌های قبلی، این اشیاء پس‌از اضافه شدن جلسه‌ها به حافظه نهان جلسه فراخوانده می‌شوند.)
  • در برخی شرایط که نمونه‌های SSLEngine در نسخه‌های قبلی Android، SSLHandshakeException را برمی‌گردانند، این نمونه‌ها در Android 10 و بالاتر، SSLProtocolException را برمی‌گردانند.
  • حالت 0-RTT پشتیبانی نمی‌شود.

درصورت تمایل، می‌توانید با فراخوانی SSLContext.getInstance("TLSv1.2")، یک SSLContext دریافت کنید که TLS 1.3 در آن غیرفعال شده است. همچنین می‌توانید نسخه‌های پروتکل را به‌صورت اتصال‌به‌اتصال با فراخوانی setEnabledProtocols() در شیء مناسب فعال یا غیرفعال کنید.

گواهی‌های امضاشده با SHA-1 در TLS مورداعتماد نیستند

در Android 10، گواهینامه‌هایی که از الگوریتم درهم‌سازی SHA-1 استفاده می‌کنند در اتصال‌های TLS قابل‌اعتماد نیستند. «مرجع صدور گواهی» ریشه‌ای از سال ۲۰۱۶ چنین گواهی‌ای صادر نکرده است و دیگر در Chrome یا سایر مرورگرهای اصلی قابل‌اعتماد نیست.

اگر اتصال به سایتی باشد که گواهی‌نامه‌ای بااستفاده از SHA-1 ارائه می‌دهد، هرگونه تلاش برای اتصال ناموفق خواهد بود.

تغییرات و بهبودهای رفتار KeyChain

برخی‌از مرورگرها، مانند Google Chrome، به کاربران اجازه می‌دهند زمانی‌که سرور TLS پیام درخواست گواهینامه را به‌عنوان بخشی از دست‌دهی TLS ارسال می‌کند، گواهینامه‌ای را انتخاب کنند. از Android 10، اشیاء KeyChain هنگام فراخوانی KeyChain.choosePrivateKeyAlias() برای نمایش پیام‌واره انتخاب گواهینامه به کاربران، از صادرکنندگان و پارامترهای مشخصات کلید تبعیت می‌کنند. به‌ویژه، این پیام‌واره حاوی انتخاب‌هایی نیست که از مشخصات سرور پیروی نکنند.

اگر گواهینامه قابل‌انتخاب توسط کاربر دردسترس نباشد، مثلاً وقتی هیچ گواهینامه‌ای با مشخصات سرور مطابقت نداشته باشد یا هیچ گواهینامه‌ای در دستگاه نصب نشده باشد، پیام‌واره انتخاب گواهینامه اصلاً ظاهر نمی‌شود.

علاوه‌براین، در Android نسخه ۱۰ یا بالاتر، برای وارد کردن کلیدها یا گواهینامه‌های 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 نسخه ۱۰، پخش‌های زیر که مربوط به Wi-Fi Direct هستند، چسبنده نیستند:

اگر برنامه‌تان برای دریافت این همه‌فرستی‌ها در زمان ثبت‌نام به چسبنده بودن آن‌ها متکی بوده است، به‌جای آن از روش مناسب get() در زمان مقداردهی اولیه برای دریافت اطلاعات استفاده کنید.

قابلیت‌های Wi-Fi Aware

Android 10 پشتیبانی را برای تسهیل ایجاد سوکت TCP/UDP بااستفاده از مسیرهای داده Wi-Fi Aware اضافه می‌کند. برای ایجاد سوکت TCP/UDP که به ServerSocket متصل می‌شود، دستگاه کارخواه باید نشانی IPv6 و درگاه سرور را بداند. این مورد قبلاً باید به‌صورت خارج از باند، مثلاً بااستفاده از پیام‌رسانی لایه ۲ 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 در دستگاه‌های Go

برنامه‌هایی که در دستگاه‌های Android 10 (نسخه Go) اجرا می‌شوند نمی‌توانند اجازه SYSTEM_ALERT_WINDOW را دریافت کنند. دلیل این امر این است که ترسیم پنجره‌های هم‌پوشانی از حافظه بیش‌ازحد استفاده می‌کند، که به‌ویژه برای عملکرد دستگاه‌های Android با حافظه کم مضر است.

اگر برنامه‌ای که در دستگاه Go edition با Android نسخه ۹ یا پایین‌تر اجرا می‌شود اجازه SYSTEM_ALERT_WINDOW را دریافت کند، برنامه این اجازه را حفظ می‌کند حتی اگر دستگاه به Android نسخه ۱۰ ارتقا یابد. بااین‌حال، برنامه‌هایی که ازقبل این اجازه را ندارند، نمی‌توانند پس‌از ارتقای دستگاه آن را دریافت کنند.

اگر برنامه‌ای در دستگاه Go قصدی را با کنش ACTION_MANAGE_OVERLAY_PERMISSION ارسال کند، سیستم به‌طور خودکار درخواست را رد می‌کند و کاربر را به صفحه تنظیمات هدایت می‌کند که در آن گفته می‌شود این اجازه مجاز نیست زیرا دستگاه را کند می‌کند. اگر برنامه‌ای در دستگاه Go Settings.canDrawOverlays() را فراخوانی کند، این روش همیشه مقدار نادرست را برمی‌گرداند. مجدداً، این محدودیت‌ها برای برنامه‌هایی که قبل‌از ارتقای دستگاه به Android 10 اجازه SYSTEM_ALERT_WINDOW را دریافت کرده‌اند اعمال نمی‌شود.

هشدارهای مربوط به برنامه‌هایی که نسخه‌های قدیمی‌تر Android را هدف‌یابی می‌کنند

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

به‌دلیل الزامات میانای برنامه‌سازی کاربردی هدف Google Play، کاربر این هشدارها را فقط زمانی می‌بیند که برنامه‌ای را اجرا کند که اخیراً به‌روزرسانی نشده است. برای برنامه‌هایی که ازطریق فروشگاه‌های دیگر توزیع می‌شوند، الزامات مشابهی برای میانای برنامه‌سازی کاربردی هدف درطول سال ۲۰۱۹ اعمال می‌شود. برای کسب اطلاعات بیشتر درباره این الزامات، به گسترش الزامات سطح میانای برنامه‌سازی کاربردی هدف در سال ۲۰۱۹ مراجعه کنید.

مجموعه‌های رمز 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 این مجموعه‌های رمز پشتیبانی می‌کنند یا از هیچ‌کدام پشتیبانی نمی‌کنند.

مصرف داده این برنامه

Android 10 تغییرات رفتاری زیر را دررابطه‌با استفاده از برنامه معرفی می‌کند:

  • بهبودهای استفاده از برنامه UsageStats - Android 10 استفاده از برنامه را با UsageStats به‌طور دقیق ردیابی می‌کند، وقتی برنامه‌ها در حالت صفحهٔ دونیمه یا تصویردرتصویر استفاده می‌شوند. علاوه‌براین، Android 10 استفاده از برنامه فوری را به‌درستی ردیابی می‌کند.

  • سیاه‌وسفید کردن هر برنامه - Android 10 می‌تواند حالت نمایش سیاه‌وسفید را برای هر برنامه به‌طور جداگانه تنظیم کند.

  • وضعیت حواس‌پرتی برای هر برنامه - Android 10 می‌تواند به‌طور انتخابی برنامه‌ها را در «وضعیت حواس‌پرتی» قرار دهد که در آن اعلان‌های آن‌ها سرکوب می‌شود و به‌عنوان برنامه‌های پیشنهادی نشان داده نمی‌شوند.

  • تعلیق و بازپخش - در Android 10، برنامه‌های معلق نمی‌توانند صدا پخش کنند.

تغییرات اتصال HTTPS

اگر برنامه‌ای که Android 10 را اجرا می‌کند null را به setSSLSocketFactory() منتقل کند، IllegalArgumentException رخ می‌دهد. در نسخه‌های قبلی، ارسال null به setSSLSocketFactory() همان تأثیر ارسال به کارخانه پیش‌فرض فعلی را داشت.

کتابخانه android.preference منسوخ شده است

کتابخانه android.preference از Android 10 منسوخ شده است. توسعه‌دهندگان باید به‌جای آن از کتابخانه اولویت AndroidX، بخشی از Android Jetpack، استفاده کنند. برای منابع بیشتر جهت کمک به انتقال و توسعه، راهنمای تنظیمات به‌روزشده را به‌همراه برنامه نمونه عمومی و اسناد مرجع ما بررسی کنید.

تغییرات کتابخانه ابزار فایل ZIP

‫Android 10 تغییرات زیر را در کلاس‌های موجود در بسته java.util.zip که فایل‌های ZIP را مدیریت می‌کند معرفی می‌کند. این تغییرات باعث می‌شود رفتار کتابخانه بین Android و پلاتفرم‌های دیگری که از java.util.zip استفاده می‌کنند سازگارتر شود.

بادکننده

در نسخه‌های قبلی، برخی‌از روش‌ها در کلاس Inflater IllegalStateException را درصورت فراخوانی پس‌از تماس با end() ایجاد می‌کردند. در Android 10، این روش‌ها درعوض NullPointerException را برمی‌گردانند.

فایل فشرده

در Android نسخه ۱۰ و بالاتر، سازنده برای ZipFile که آرگومان‌های نوع File، int، و Charset را می‌گیرد، ZipException را درصورتی‌که فایل ZIP ارائه‌شده حاوی هیچ فایلی نباشد، ایجاد نمی‌کند.

ZipOutputStream

در Android نسخه ۱۰ و بالاتر، روش finish() در ZipOutputStream ZipException را درصورت تلاش برای نوشتن جریان خروجی برای فایل ZIP که حاوی هیچ فایلی نیست، ایجاد نمی‌کند.

تغییرات دوربین

بسیاری از برنامه‌هایی که از دوربین استفاده می‌کنند فرض می‌کنند که اگر دستگاه در پیکربندی عمودی باشد، دستگاه فیزیکی نیز در جهت عمودی است، همان‌طور که در جهت دوربین شرح داده شده است. این فرض در گذشته درست بود، اما با گسترش ابعاد فیزیکی دردسترس، مانند دستگاه‌های تاشو، این موضوع تغییر کرده است. این فرض در این دستگاه‌ها می‌تواند منجر به نمایش نادرست چرخش یا مقیاس (یا هر دو) نمایاب دوربین شود.

برنامه‌هایی که سطح میانای برنامه‌سازی کاربردی ۲۴ یا بالاتر را هدف قرار می‌دهند باید به‌طور صریح android:resizeableActivity را تنظیم کنند و عملکرد لازم را برای مدیریت عملیات چندپنجره‌ای ارائه دهند.

ردگیری مصرف باتری

از Android 10 به بعد، SystemHealthManager آمار مصرف باتری را هروقت دستگاه پس‌از رویداد شارژ عمده از برق جدا شود بازنشانی می‌کند. به‌طور کلی، رویداد شارژ عمده یکی از این دو حالت است: دستگاه کاملاً شارژ شده باشد، یا دستگاه از حالت تقریباً خالی به حالت تقریباً شارژشده رسیده باشد.

قبل‌از Android 10، آمار مصرف باتری هروقت دستگاه از برق جدا می‌شد بازنشانی می‌شد، مهم نبود که سطح باتری چقدر تغییر کرده است.

منسوخ شدن Android Beam

در Android 10، ما رسماً Android Beam را منسوخ می‌کنیم، ویژگی قدیمی‌تری برای شروع هم‌رسانی داده در دستگاه‌ها ازطریق «ارتباط حوزه نزدیک» (NFC). همچنین چندین میانای برنامه‌سازی کاربردی NFC مرتبط را منسوخ می‌کنیم. Android Beam همچنان به‌صورت اختیاری برای شرکای سازنده دستگاه که می‌خواهند از آن استفاده کنند دردسترس است، اما دیگر به‌طور فعال توسعه داده نمی‌شود. بااین‌حال، Android همچنان از دیگر قابلیت‌ها و میاناهای برنامه‌سازی کاربردی NFC پشتیبانی خواهد کرد و موارد استفاده‌ای مثل خواندن از برچسب‌ها و پرداخت‌ها همچنان طبق انتظار کار خواهند کرد.

تغییر رفتار java.math.BigDecimal.stripTrailingZeros()‎

BigDecimal.stripTrailingZeros() دیگر صفرهای انتهایی را به‌عنوان یک مورد خاص درصورتی‌که مقدار ورودی صفر باشد حفظ نمی‌کند.

تغییرات رفتار java.util.regex.Matcher و Pattern

نتیجه split() تغییر کرد تا دیگر با String خالی («») شروع نشود، وقتی‌که تطابق با عرض صفر در ابتدای ورودی وجود دارد. این موضوع بر String.split() نیز تأثیر می‌گذارد. برای مثال، "x".split("") اکنون {"x"} را برمی‌گرداند درحالی‌که قبلاً در نسخه‌های قدیمی‌تر Android،‏ {"", "x"} را برمی‌گرداند. "aardvark".split("(?=a)" اکنون {"a", "ardv", "ark"} را به‌جای {"", "a", "ardv", "ark"} برمی‌گرداند.

رفتار استثنا برای متغیرهای مستقل نامعتبر نیز بهبود یافته است:

  • appendReplacement(StringBuffer, String) اکنون IllegalArgumentException را به‌جای IndexOutOfBoundsException برمی‌گرداند اگر جایگزین String با یک واکج‌خط تنها تمام شود که غیرمجاز است. اکنون اگر String جایگزین با $ تمام شود، همان استثنا ایجاد می‌شود. قبلاً در این سناریو هیچ استثنایی ایجاد نمی‌شد.
  • ‫replaceFirst(null) دیگر reset() را در Matcher فراخوانی نمی‌کند اگر NullPointerException را برگرداند. NullPointerException is now also thrown when there is no match. قبلاً فقط زمانی که مطابقت وجود داشت، این خطا ایجاد می‌شد.
  • ‫start(int group)،‏ end(int group)، و group(int group) اکنون درصورتی‌که نمایه گروه خارج از محدوده باشد، IndexOutOfBoundsException عمومی‌تری را برمی‌گردانند. قبلاً این روش‌ها ArrayIndexOutOfBoundsException را برمی‌گرداندند.

زاویه پیش‌فرض برای GradientDrawable اکنون TOP_BOTTOM است

در Android 10، اگر GradientDrawable را در XML تعریف کنید و اندازه‌گیری زاویه را ارائه ندهید، جهت گرادیان به‌طور پیش‌فرض روی TOP_BOTTOM تنظیم می‌شود. این مورد نسبت‌به نسخه‌های قبلی Android تغییر کرده است، که در آن‌ها پیش‌فرض LEFT_RIGHT بود.

به‌عنوان راه‌حل، اگر به جدیدترین نسخه AAPT2 به‌روزرسانی کنید، اگر اندازه‌گیری زاویه مشخص نشده باشد، این ابزار اندازه‌گیری زاویه را برای برنامه‌های قدیمی روی ۰ تنظیم می‌کند.

ثبت گزارش برای اشیای سریالی‌شده بااستفاده از SUID پیش‌فرض

از Android نسخه ۷.۰ (سطح میانای برنامه‌سازی کاربردی ۲۴)، پلاتفرم اصلاحیه‌ای برای serialVersionUID پیش‌فرض برای اشیاء سریال‌سازی‌شده ارائه کرد. این اصلاحیه برنامه‌هایی را که سطح میانای برنامه‌سازی کاربردی هدف آن‌ها ۲۳ یا پایین‌تر بود تحت‌تأثیر قرار نداد.

از Android 10، اگر برنامه‌ای سطح میانای برنامه‌سازی کاربردی ۲۳ یا پایین‌تر را هدف قرار دهد و به serialVersionUID پیش‌فرض قدیمی، نادرست، و پیش‌فرض متکی باشد، سیستم هشداری را ثبت می‌کند و اصلاح کد را پیشنهاد می‌دهد.

به‌طور مشخص، اگر همه موارد زیر درست باشد، سیستم هشدار ثبت می‌کند:

  • برنامه سطح میانای برنامه‌سازی کاربردی ۲۳ یا پایین‌تر را هدف‌یابی می‌کند.
  • کلاس سریالی شده است.
  • کلاس سریالی‌شده به‌جای تنظیم صریح serialVersionUID، از serialVersionUID پیش‌فرض استفاده می‌کند.
  • serialVersionUID پیش‌فرض با serialVersionUID متفاوت است اگر برنامه سطح میانای برنامه‌سازی کاربردی ۲۴ یا بالاتر را هدف قرار دهد.

این هشدار یک‌بار برای هر کلاس تحت‌تأثیر قرارگرفته ثبت می‌شود. پیام هشدار شامل یک اصلاح پیشنهادی است که به‌طور صریح serialVersionUID را روی مقدار پیش‌فرضی تنظیم می‌کند که اگر برنامه سطح میانای برنامه‌سازی کاربردی ۲۴ یا بالاتر را هدف قرار دهد، محاسبه می‌شود. بااستفاده از آن اصلاح، می‌توانید مطمئن شوید که اگر شیئی از آن کلاس در برنامه‌ای که سطح میانای برنامه‌سازی کاربردی ۲۳ یا پایین‌تر را هدف قرار می‌دهد سریال‌سازی شود، آن شیء به‌درستی توسط برنامه‌هایی که ۲۴ یا بالاتر را هدف قرار می‌دهند خوانده می‌شود، و برعکس.

تغییرات java.io.FileChannel.map()‎

از Android 10، FileChannel.map() برای فایل‌های غیراستاندارد، مثل /dev/zero، که اندازه آن‌ها بااستفاده از truncate() قابل‌تغییر نیست، پشتیبانی نمی‌شود. نسخه‌های قبلی Android، errno برگردانده‌شده توسط truncate() را می‌بلعیدند، اما Android 10 یک IOException را برمی‌گرداند. اگر به رفتار قدیمی نیاز دارید، باید از کد بومی استفاده کنید.