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

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

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

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

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

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

محدودیت‌های رابط کاربری غیر SDK

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

اگر اندروید ۱۰ (سطح API 29) را هدف قرار نمی‌دهید، ممکن است برخی از این تغییرات بلافاصله شما را تحت تأثیر قرار ندهند. با این حال، اگرچه در حال حاضر می‌توانید از برخی رابط‌های غیر SDK ( بسته به سطح API هدف برنامه خود ) استفاده کنید، استفاده از هر روش یا فیلد غیر SDK همیشه خطر بالای خرابی برنامه شما را به همراه دارد.

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

برای کسب اطلاعات بیشتر، به به‌روزرسانی‌های محدودیت‌های رابط‌های غیر SDK در اندروید ۱۰ و محدودیت‌های رابط‌های غیر SDK مراجعه کنید.

پیمایش با اشاره

از اندروید ۱۰ به بعد، کاربران می‌توانند ناوبری حرکتی را در سراسر دستگاه فعال کنند. اگر کاربری ناوبری حرکتی را فعال کند، این امر بر تمام برنامه‌های موجود در دستگاه تأثیر می‌گذارد، چه برنامه سطح API 29 را هدف قرار دهد و چه ندهد. به عنوان مثال، اگر کاربر از لبه صفحه نمایش به داخل بکشد، سیستم آن ژست را به عنوان ناوبری برگشت تفسیر می‌کند، مگر اینکه برنامه‌ای به طور خاص آن ژست را برای بخش‌هایی از صفحه نمایش لغو کند .

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

ان دی کی

اندروید ۱۰ شامل تغییرات NDK زیر است.

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

اندروید ۶.۰ (سطح API ۲۳) استفاده از جابجایی متن در اشیاء مشترک را ممنوع کرد . کد باید به همان صورت که هست بارگذاری شود و نباید تغییر کند. این تغییر زمان بارگذاری برنامه و امنیت را بهبود می‌بخشد.

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

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

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

  • /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 اضافه شوند.

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

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

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

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

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

امنیت

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

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

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

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

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

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

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

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

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

برخی از مرورگرها، مانند گوگل کروم، به کاربران اجازه می‌دهند وقتی سرور TLS به عنوان بخشی از یک TLS handshake، پیام درخواست گواهی ارسال می‌کند، یک گواهی انتخاب کنند. از اندروید ۱۰، اشیاء KeyChain هنگام فراخوانی KeyChain.choosePrivateKeyAlias() برای نمایش اعلان انتخاب گواهی به کاربران، به صادرکنندگان و پارامترهای مشخصات کلید احترام می‌گذارند. به طور خاص، این اعلان شامل گزینه‌هایی نیست که با مشخصات سرور مطابقت نداشته باشند.

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

علاوه بر این، در اندروید ۱۰ یا بالاتر، برای وارد کردن کلیدها یا گواهی‌های CA به یک شیء KeyChain ، نیازی به قفل صفحه نمایش دستگاه نیست.

سایر تغییرات TLS و رمزنگاری

چندین تغییر جزئی در کتابخانه‌های TLS و رمزنگاری وجود دارد که در اندروید ۱۰ اعمال می‌شوند:

  • رمزهای AES/GCM/NoPadding و ChaCha20/Poly1305/NoPadding اندازه‌های بافر دقیق‌تری را از getOutputSize() برمی‌گردانند.
  • مجموعه رمز TLS_FALLBACK_SCSV از تلاش‌های اتصال با حداکثر پروتکل TLS 1.2 یا بالاتر حذف می‌شود. به دلیل بهبودهایی که در پیاده‌سازی‌های سرور TLS ایجاد شده است، استفاده از TLS-external fallback را توصیه نمی‌کنیم. در عوض، توصیه می‌کنیم به مذاکره نسخه TLS تکیه کنید.
  • ChaCha20-Poly1305 یک نام مستعار برای ChaCha20/Poly1305/NoPadding است.
  • نام‌های میزبان با نقطه‌های انتهایی، نام‌های میزبان معتبر SNI محسوب نمی‌شوند.
  • افزونه supported_signature_algorithms در CertificateRequest هنگام انتخاب کلید امضا برای پاسخ‌های گواهی، رعایت می‌شود.
  • کلیدهای امضای غیرشفاف، مانند کلیدهای موجود در Android Keystore، می‌توانند با امضاهای RSA-PSS در TLS استفاده شوند.

پخش‌های Wi-Fi Direct

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

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

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

اندروید ۱۰ پشتیبانی را برای سهولت ایجاد سوکت TCP/UDP با استفاده از مسیرهای داده Wi-Fi Aware اضافه می‌کند. برای ایجاد یک سوکت TCP/UDP که به یک ServerSocket متصل می‌شود، دستگاه کلاینت باید آدرس IPv6 و پورت سرور را بداند. این امر قبلاً باید به صورت خارج از باند، مانند استفاده از پیام‌رسانی لایه ۲ BT یا Wi-Fi Aware، یا به صورت درون باند با استفاده از پروتکل‌های دیگر مانند mDNS، انجام می‌شد. با اندروید ۱۰، این اطلاعات می‌توانند به عنوان بخشی از تنظیمات شبکه، ارسال شوند.

سرور می‌تواند یکی از دو کار زیر را انجام دهد:

  • یک 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

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

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

اگر برنامه‌ای در دستگاه Go یک intent با اکشن ACTION_MANAGE_OVERLAY_PERMISSION ارسال کند، سیستم به طور خودکار درخواست را رد می‌کند و کاربر را به صفحه تنظیمات می‌برد که می‌گوید مجوز مجاز نیست زیرا دستگاه را کند می‌کند. اگر برنامه‌ای در دستگاه Go تابع Settings.canDrawOverlays() را فراخوانی کند، این متد همیشه مقدار false را برمی‌گرداند. باز هم، این محدودیت‌ها برای برنامه‌هایی که مجوز SYSTEM_ALERT_WINDOW را قبل از ارتقاء دستگاه به اندروید ۱۰ دریافت کرده‌اند، اعمال نمی‌شود.

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

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

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

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

استفاده از برنامه

اندروید ۱۰ تغییرات رفتاری زیر را در رابطه با استفاده از برنامه‌ها معرفی می‌کند:

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

  • مقیاس خاکستری برای هر برنامه - اندروید ۱۰ می‌تواند حالت نمایش مقیاس خاکستری را برای هر برنامه تنظیم کند.

  • حالت حواس‌پرتی به ازای هر برنامه - اندروید ۱۰ می‌تواند به صورت انتخابی برنامه‌ها را در حالت «حواس‌پرتی» قرار دهد که در آن اعلان‌های آنها خاموش شده و به عنوان برنامه‌های پیشنهادی ظاهر نمی‌شوند.

  • تعلیق و پخش - در اندروید ۱۰، برنامه‌های تعلیق‌شده قادر به پخش صدا نیستند.

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

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

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

کتابخانه android.preference از اندروید ۱۰ منسوخ شده است. توسعه‌دهندگان باید در عوض از کتابخانه AndroidX preferences، بخشی از Android Jetpack ، استفاده کنند. برای منابع بیشتر جهت کمک به مهاجرت و توسعه، راهنمای تنظیمات به‌روزرسانی‌شده را به همراه برنامه نمونه عمومی و مستندات مرجع ما بررسی کنید.

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

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

بادکننده

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

فایل زیپ

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

جریان خروجی زیپ

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

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

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

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

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

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

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

منسوخ شدن اندروید بیم

در اندروید ۱۰، ما رسماً Android Beam، یک ویژگی قدیمی‌تر برای شروع اشتراک‌گذاری داده‌ها بین دستگاه‌ها از طریق ارتباط میدان نزدیک (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) اکنون اگر String جایگزین با یک بک‌اسلش تنها تمام شود، به جای IndexOutOfBoundsException ، یک IllegalArgumentException صادر می‌کند که غیرقانونی است. اکنون اگر String جایگزین با یک $ تمام شود، همان استثنا صادر می‌شود. پیش از این، در این سناریو هیچ استثنایی صادر نمی‌شد.
  • اگر Matcher خطای NullPointerException را صادر کند، دیگر replaceFirst(null) تابع reset() را روی آن فراخوانی نمی‌کند. اکنون NullPointerException در صورت عدم تطابق نیز صادر می‌شود. پیش از این، فقط در صورت وجود تطابق، صادر می‌شد.
  • start(int group) ، end(int group) و group(int group) اکنون در صورت خارج شدن اندیس گروه از محدوده، خطای IndexOutOfBoundsException عمومی‌تری را صادر می‌کنند. پیش از این، این متدها خطای ArrayIndexOutOfBoundsException صادر می‌کردند.

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

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

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

ثبت وقایع برای اشیاء سریالی شده با استفاده از SUID پیش‌فرض

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

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

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

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

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

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

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