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

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 را پرتاب می کند. اگر به رفتار قدیمی نیاز دارید، باید از کد بومی استفاده کنید.

،

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

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

بافنده

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

زیپ

در Android 10 و بالاتر ، سازنده ZipFile که آرگومان های Type File ، int و Charset را در نظر می گیرد ، اگر پرونده ZIP عرضه شده حاوی هیچ پرونده ای نباشد ، ZipException پرتاب نمی کند.

ZipoutPutstream

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

تغییر دوربین

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

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

ردیابی استفاده از باتری

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

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

استهلاک پرتو اندرویدی

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

java.math.bigdecimal.striptrailingzeros () تغییر رفتار

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

java.util.regex.matcher و رفتار الگوی تغییر می کند

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

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

  • appendReplacement(StringBuffer, String) اکنون اگر String جایگزینی با یک پشتی تنها به پایان برسد ، غیرقانونی است که غیرقانونی است ، به جای IndexOutOfBoundsException یک IllegalArgumentException را پرتاب می کند. اگر String جایگزینی با یک $ به پایان برسد ، همین استثنا اکنون پرتاب می شود. پیش از این ، هیچ استثنائی در این سناریو پرتاب نشده بود.
  • در صورت پرتاب یک NullPointerException ، دیگر دوباره replaceFirst(null) reset() را بر روی Matcher نمی دهد. NullPointerException اکنون نیز در صورت عدم تطابق پرتاب می شود. پیش از این ، فقط وقتی مسابقه برگزار می شد ، پرتاب می شد.
  • start(int group) ، end(int group) و group(int group) اکنون اگر شاخص گروه از مرز خارج باشد ، IndexOutOfBoundsException عمومی تر را پرتاب می کند. پیش از این ، این روشها ArrayIndexOutOfBoundsException را پرتاب می کردند.

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

در Android 10 ، اگر یک GradientDrawable را در XML تعریف کنید و اندازه گیری زاویه ای را ارائه ندهید ، جهت گیری گرادیان به صورت پیش فرض به TOP_BOTTOM است. این یک تغییر در نسخه های قبلی اندروید است ، جایی که پیش فرض 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() قابل تغییر نیست. نسخه های قبلی اندروید Errno را که توسط truncate() برگشته است ، بلعیده است ، اما Android 10 IOException را پرتاب می کند. اگر به رفتار قدیمی احتیاج دارید ، باید از کد بومی استفاده کنید.

،

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

اگر TargetSdkversion برنامه شما 29 یا بالاتر است ، باید از تغییرات اضافی نیز پشتیبانی کنید. برای جزئیات بیشتر حتماً تغییرات رفتار را برای برنامه های هدفمند 29 بخوانید.

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

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

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

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

برای کمک به اطمینان از پایداری و سازگاری برنامه ، این پلتفرم شروع به محدود کردن کدام رابط غیر SDK می کند که برنامه شما می تواند در Android 9 استفاده کند (سطح API 28). Android 10 شامل لیست های به روز شده از رابط های غیر SDK محدود بر اساس همکاری با توسعه دهندگان Android و آخرین آزمایش داخلی است. هدف ما این است که اطمینان حاصل کنیم که گزینه های عمومی قبل از محدود کردن رابط های غیر SDK در دسترس است.

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

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

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

ناوبری اشاره

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

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

NDK

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

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

Android 6.0 (API سطح 23) استفاده از جابجایی متن در اشیاء مشترک را مجاز نکرد . کد باید به عنوان IS بارگیری شود و نباید اصلاح شود. این تغییر باعث افزایش زمان بار و امنیت برنامه می شود.

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

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

با شروع در Android 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/ .

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

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

با شروع در 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 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 در نسخه های قبلی Android SSLHandshakeException پرتاب می کنند ، این موارد به جای آن ، SSLProtocolException را در Android 10 و بالاتر پرتاب می کنند.
  • حالت 0-RTT پشتیبانی نمی شود.

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

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

در Android 10 ، گواهینامه هایی که از الگوریتم Hash SHA-1 استفاده می کنند به اتصالات TLS اعتماد ندارند. Root CA از سال 2016 چنین گواهینامه ای صادر نکرده است و دیگر به کروم یا سایر مرورگرهای اصلی اعتماد ندارند.

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

تغییر رفتار و پیشرفت رفتار Keychain

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

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

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

سایر TL ها و رمزنگاری تغییر می کنند

چندین تغییر جزئی در کتابخانه های TLS و رمزنگاری رخ داده است که در Android 10 تأثیر می گذارد:

  • رمزهای AES/GCM/Nopadding و Chacha20/Poly1305/nopadding اندازه های بافر دقیق تری را از getOutputSize() باز می گردانند.
  • مجموعه Cipher 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

در Android 10 ، پخش های زیر مربوط به Wi-Fi Direct مهم نیست:

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

قابلیت های آگاهانه Wi-Fi

Android 10 برای سهولت در ایجاد سوکت TCP/UDP با استفاده از داده های آگاه Wi-Fi ، پشتیبانی می کند. برای ایجاد یک سوکت TCP/UDP که به یک ServerSocket متصل می شود ، دستگاه مشتری باید آدرس IPv6 و درگاه سرور را بشناسد. این قبلاً لازم بود به صورت خارج از باند ارتباط برقرار شود ، مانند استفاده از پیام رسانی BT یا Wi-Fi Layer 2 ، یا با استفاده از پروتکل های دیگر مانند MDN ، به صورت باند کشف شده است. با Android 10 ، اطلاعات را می توان به عنوان بخشی از راه اندازی شبکه ابلاغ کرد.

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

  • یک ServerSocket را اولیه کنید و پورت مورد استفاده را تنظیم یا بدست آورید.
  • اطلاعات بندر را به عنوان بخشی از درخواست شبکه Wi-Fi And مشخص کنید.

نمونه کد زیر نحوه مشخص کردن اطلاعات پورت را به عنوان بخشی از درخواست شبکه نشان می دهد:

کاتلین

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 را برای به دست آوردن 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 on go

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

اگر برنامه ای که روی دستگاه Go Edition اجرا می شود Android 9 یا Lower مجوز SYSTEM_ALERT_WINDOW را دریافت می کند ، برنامه حتی اگر دستگاه به Android 10 به روز شود ، اجازه را حفظ می کند. دستگاه به روز شده است.

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

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

دستگاه هایی که Android 10 یا بالاتر را اجرا می کنند ، اولین بار که برنامه های Android 5.1 (API سطح 22) یا پایین تر را هدف قرار می دهند ، به کاربران هشدار می دهند. اگر برنامه به کاربر نیاز داشته باشد که مجوز اعطا کند ، به کاربر نیز فرصتی داده می شود تا قبل از اجازه برنامه برای اولین بار مجوزهای برنامه را تنظیم کند.

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

SHA-2 CBC Cipher Suites برداشته شد

سوئیت های رمزنگاری 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 Preference ، بخشی از Android Jetpack استفاده کنند. برای کمک به منابع اضافی برای کمک به مهاجرت و توسعه ، راهنمای تنظیمات به روز شده را به همراه برنامه نمونه عمومی و مستندات مرجع ما بررسی کنید.

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

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

بافنده

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

زیپ

در Android 10 و بالاتر ، سازنده ZipFile که آرگومان های Type File ، int و Charset را در نظر می گیرد ، اگر پرونده ZIP عرضه شده حاوی هیچ پرونده ای نباشد ، ZipException پرتاب نمی کند.

ZipoutPutstream

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

تغییر دوربین

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

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

ردیابی استفاده از باتری

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

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

استهلاک پرتو اندرویدی

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

java.math.bigdecimal.striptrailingzeros () تغییر رفتار

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

java.util.regex.matcher و رفتار الگوی تغییر می کند

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

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

  • appendReplacement(StringBuffer, String) اکنون اگر String جایگزینی با یک پشتی تنها به پایان برسد ، غیرقانونی است که غیرقانونی است ، به جای IndexOutOfBoundsException یک IllegalArgumentException را پرتاب می کند. اگر String جایگزینی با یک $ به پایان برسد ، همین استثنا اکنون پرتاب می شود. پیش از این ، هیچ استثنائی در این سناریو پرتاب نشده بود.
  • در صورت پرتاب یک NullPointerException ، دیگر دوباره replaceFirst(null) reset() را بر روی Matcher نمی دهد. NullPointerException اکنون نیز در صورت عدم تطابق پرتاب می شود. پیش از این ، فقط وقتی مسابقه برگزار می شد ، پرتاب می شد.
  • start(int group) ، end(int group) و group(int group) اکنون اگر شاخص گروه از مرز خارج باشد ، IndexOutOfBoundsException عمومی تر را پرتاب می کند. پیش از این ، این روشها ArrayIndexOutOfBoundsException را پرتاب می کردند.

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

در Android 10 ، اگر یک GradientDrawable را در XML تعریف کنید و اندازه گیری زاویه ای را ارائه ندهید ، جهت گیری گرادیان به صورت پیش فرض به TOP_BOTTOM است. این یک تغییر در نسخه های قبلی اندروید است ، جایی که پیش فرض 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() قابل تغییر نیست. نسخه های قبلی اندروید Errno را که توسط truncate() برگشته است ، بلعیده است ، اما Android 10 IOException را پرتاب می کند. اگر به رفتار قدیمی احتیاج دارید ، باید از کد بومی استفاده کنید.

،

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

اگر TargetSdkversion برنامه شما 29 یا بالاتر است ، باید از تغییرات اضافی نیز پشتیبانی کنید. برای جزئیات بیشتر حتماً تغییرات رفتار را برای برنامه های هدفمند 29 بخوانید.

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

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

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

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

برای کمک به اطمینان از پایداری و سازگاری برنامه ، این پلتفرم شروع به محدود کردن کدام رابط غیر SDK می کند که برنامه شما می تواند در Android 9 استفاده کند (سطح API 28). Android 10 شامل لیست های به روز شده از رابط های غیر SDK محدود بر اساس همکاری با توسعه دهندگان Android و آخرین آزمایش داخلی است. هدف ما این است که اطمینان حاصل کنیم که گزینه های عمومی قبل از محدود کردن رابط های غیر SDK در دسترس است.

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

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

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

ناوبری اشاره

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

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

NDK

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

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

Android 6.0 (API سطح 23) استفاده از جابجایی متن در اشیاء مشترک را مجاز نکرد . کد باید به عنوان IS بارگیری شود و نباید اصلاح شود. این تغییر باعث افزایش زمان بار و امنیت برنامه می شود.

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

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

با شروع در Android 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/ .

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

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

با شروع در 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 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 در نسخه های قبلی Android SSLHandshakeException پرتاب می کنند ، این موارد به جای آن ، SSLProtocolException را در Android 10 و بالاتر پرتاب می کنند.
  • حالت 0-RTT پشتیبانی نمی شود.

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

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

در Android 10 ، گواهینامه هایی که از الگوریتم Hash SHA-1 استفاده می کنند به اتصالات TLS اعتماد ندارند. Root CA از سال 2016 چنین گواهینامه ای صادر نکرده است و دیگر به کروم یا سایر مرورگرهای اصلی اعتماد ندارند.

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

تغییر رفتار و پیشرفت رفتار Keychain

برخی از مرورگرها ، مانند Google Chrome ، به کاربران این امکان را می دهند که وقتی یک سرور TLS یک پیام درخواست گواهی نامه را به عنوان بخشی از یک دست دستی TLS ارسال می کند ، گواهی را انتخاب کنند. As of Android 10, KeyChain objects honor the issuers and key specification parameters when calling KeyChain.choosePrivateKeyAlias() to show users a certificate selection prompt. In particular, this prompt doesn't contain choices that don't adhere to server specifications.

If there are no user-selectable certificates available, as is the case when no certificates match the server specification or a device doesn't have any certificates installed, the certificate selection prompt doesn't appear at all.

In addition, it isn't necessary on Android 10 or higher to have a device screen lock to import keys or CA certificates into a KeyChain object.

Other TLS and cryptography changes

There have been several minor changes in the TLS and cryptography libraries that take effect on Android 10:

  • The AES/GCM/NoPadding and ChaCha20/Poly1305/NoPadding ciphers return more accurate buffer sizes from getOutputSize() .
  • The TLS_FALLBACK_SCSV cipher suite is omitted from connection attempts with a max protocol of TLS 1.2 or above. Because of improvements in TLS server implementations, we don't recommend attempting TLS-external fallback. Instead, we recommend relying on TLS version negotiation.
  • ChaCha20-Poly1305 is an alias for ChaCha20/Poly1305/NoPadding.
  • Hostnames with trailing dots aren't considered valid SNI hostnames.
  • The supported_signature_algorithms extension in CertificateRequest is respected when choosing a signing key for certificate responses.
  • Opaque signing keys, such as those from Android Keystore, can be used with RSA-PSS signatures in TLS.

Wi-Fi Direct broadcasts

On Android 10, the following broadcasts related to Wi-Fi Direct aren't sticky:

If your app has relied on receiving these broadcasts at registration because they had been sticky, use the appropriate get() method at initialization to obtain the information instead.

Wi-Fi Aware capabilities

Android 10 adds support to ease TCP/UDP Socket creation using Wi-Fi Aware datapaths. To create a TCP/UDP socket connecting to a ServerSocket , the client device needs to know the IPv6 address and port of the server. This previously needed to be communicated out-of-band, such as by using BT or Wi-Fi Aware layer 2 messaging, or discovered in-band using other protocols, such as mDNS. With Android 10, the information can be communicated as part of the network setup.

The server can do either of the following:

  • Initialize a ServerSocket and either set or obtain the port to be used.
  • Specify the port information as part of the Wi-Fi Aware network request.

The following code sample shows how to specify port information as part of the network request:

کاتلین

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();

The client then performs a Wi-Fi Aware network request to obtain the IPv6 and the port supplied by the server:

کاتلین


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 on Go devices

Apps running on Android 10 (Go edition) devices cannot receive the SYSTEM_ALERT_WINDOW permission. This is because drawing overlay windows uses excessive memory, which is particularly harmful to the performance of low-memory Android devices.

If an app running on a Go edition device running Android 9 or lower receives the SYSTEM_ALERT_WINDOW permission, the app retains the permission even if the device is upgraded to Android 10. However, apps which do not already have that permission cannot be granted it after the device is upgraded.

If an app on a Go device sends an intent with the action ACTION_MANAGE_OVERLAY_PERMISSION , the system automatically denies the request, and takes the user to a Settings screen which says that the permission isn't allowed because it slows the device. If an app on a Go device calls Settings.canDrawOverlays() , the method always returns false. Again, these restrictions do not apply to apps which received the SYSTEM_ALERT_WINDOW permission before the device was upgraded to Android 10.

Warnings for apps targeting older Android versions

Devices running Android 10 or higher warn users the first time they run any app that targets Android 5.1 (API level 22) or lower. If the app requires the user to grant permissions, the user is also given an opportunity to adjust the app's permissions before the app is allowed to run for the first time.

Due to Google Play's target API requirements , a user sees these warnings only when they run an app that hasn't been updated recently. For apps that are distributed through other stores, similar target API requirements are taking effect during 2019. For more information about these requirements, see Expanding target API level requirements in 2019 .

SHA-2 CBC cipher suites removed

The following SHA-2 CBC cipher suites have been removed from the platform:

  • 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

These cipher suites are less secure than the similar cipher suites that use GCM, and most servers either support both the GCM and CBC variants of these cipher suites or support neither of them.

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

Android 10 introduces the following behavior changes related to app usage:

  • UsageStats app usage improvements - Android 10 accurately tracks app usage with UsageStats when apps are used in split-screen or picture-in-picture mode. Additionally, Android 10 correctly tracks instant app usage.

  • Per-app grayscale - Android 10 can set a grayscale display mode on a per-app basis.

  • Per-app distraction state - Android 10 can selectively set apps to a "distraction state" where their notifications are suppressed and they do not appear as suggested apps.

  • Suspension and playback - In Android 10, suspended apps are not able to play audio.

HTTPS connection changes

If an app running Android 10 passes null into setSSLSocketFactory() , an IllegalArgumentException occurs. In previous versions, passing null into setSSLSocketFactory() had the same effect as passing in the current default factory .

android.preference library is deprecated

The android.preference library is deprecated as of Android 10. Developers should instead use the AndroidX preference library, part of Android Jetpack . For additional resources to aid in migration and development, check out the updated Settings Guide along with our public sample app and reference documentation .

ZIP file utility library changes

Android 10 introduces the following changes to classes in the java.util.zip package, which handles ZIP files. These changes make the library's behavior more consistent between Android and other platforms that use java.util.zip .

Inflater

In previous versions, some methods in the Inflater class threw an IllegalStateException if they were invoked after a call to end() . In Android 10, these methods throw a NullPointerException instead.

ZipFile

In Android 10 and higher, the constructor for ZipFile that takes arguments of type File , int , and Charset doesn't throw a ZipException if the supplied ZIP file doesn't contain any files.

ZipOutputStream

In Android 10 and higher, the finish() method in ZipOutputStream doesn't throw a ZipException if it tries to write an output stream for a ZIP file that doesn't contain any files.

Camera changes

Many camera-using apps assume that if the device is in a portrait configuration, then the physical device is also in the portrait orientation, as described in Camera orientation . This was a safe assumption in the past, but that has changed with the expansion of available form factors, such as foldables. That assumption on these devices can lead to either incorrectly rotated or scaled (or both) display of the camera viewfinder.

Applications that target API level 24 or above should explicitly set android:resizeableActivity and provide necessary functionality to handle multi-window operation.

Battery usage tracking

Beginning with Android 10, SystemHealthManager resets its battery usage statistics whenever the device is unplugged after a major charging event . Broadly speaking, a major charging event is either: The device has been fully charged, or the device has gone from mostly depleted to mostly charged.

Before Android 10, the battery usage statistics reset whenever the device was unplugged, no matter how little change there had been to the battery level.

Android Beam deprecation

In Android 10 we're officially deprecating Android Beam, an older feature for initiating data sharing across devices through Near Field Communication (NFC). We're also deprecating several of the related NFC APIs. Android Beam remains optionally available to device-maker partners who want to use it, but it's no longer in active development. Android will continue to support other NFC capabilities and APIs, however, and use-cases like reading from tags and payments will continue to work as expected.

java.math.BigDecimal.stripTrailingZeros() behavior change

BigDecimal.stripTrailingZeros() no longer preserves trailing zeroes as a special case if the input value is zero.

java.util.regex.Matcher and Pattern behavior changes

The result of split() was changed to no longer start with an empty String ("") when there is a zero-width match at the start of the input. This also affects String.split() . For example, "x".split("") now returns {"x"} whereas it used to return {"", "x"} on older versions of Android. "aardvark".split("(?=a)" now returns {"a", "ardv", "ark"} rather than {"", "a", "ardv", "ark"} .

Exception behavior for invalid arguments has also been improved:

  • appendReplacement(StringBuffer, String) now throws an IllegalArgumentException instead of IndexOutOfBoundsException if the replacement String ends with a lone backslash, which is illegal. The same exception is now thrown if the replacement String ends with a $ . Previously, no exception was thrown in this scenario.
  • replaceFirst(null) no longer calls reset() on the Matcher if it throws a NullPointerException . NullPointerException is now also thrown when there is no match. Previously, it was thrown only when there was a match.
  • start(int group) , end(int group) and group(int group) now throw a more general IndexOutOfBoundsException if the group index is out of bounds. Previously, these methods threw ArrayIndexOutOfBoundsException .

Default angle for GradientDrawable is now TOP_BOTTOM

In Android 10, if you define a GradientDrawable in XML and do not provide an angle measurement, the gradient orientation defaults to TOP_BOTTOM . This is a change from previous versions of Android, where the default was LEFT_RIGHT .

As a workaround, if you update to the most recent version of AAPT2 , the tool sets an angle measurement of 0 for legacy apps if no angle measurement is specified.

Logging for serialized objects using default SUID

Beginning with Android 7.0 (API level 24), the platform made a fix to the default serialVersionUID for serializable objects . This fix did not affect apps that targeted API level 23 or lower.

Beginning with Android 10, if an app targets API level 23 or lower and relies on the old, incorrect, default serialVersionUID , the system logs a warning and suggests a code fix.

Specifically, the system logs a warning if all of the following are true:

  • The app targets API level 23 or lower.
  • A class is serialized.
  • The serialized class uses the default serialVersionUID , instead of explicitly setting a serialVersionUID .
  • The default serialVersionUID is different than the serialVersionUID would be if the app targeted API level 24 or higher.

This warning is logged once for each affected class. The warning message includes a suggested fix, which is to explicitly set the serialVersionUID to the default value that would be calculated if the app targeted API level 24 or higher. By using that fix, you can ensure that if an object from that class is serialized on an app that targets API level 23 or lower, the object will be correctly read by apps that target 24 or higher, and vice versa.

java.io.FileChannel.map() changes

Starting in Android 10, FileChannel.map() isn't supported for non-standard files, like /dev/zero , whose size cannot be changed using truncate() . Previous versions of Android swallowed the errno returned by truncate() , but Android 10 throws an IOException. If you need the old behavior, you must use native code.