การเปลี่ยนแปลงลักษณะการทํางาน: แอปทั้งหมด

Android 10 มีการเปลี่ยนแปลงลักษณะการทำงานที่อาจส่งผลต่อแอป การเปลี่ยนแปลงที่แสดงในหน้านี้มีผลกับแอปของคุณขณะทำงาน ใน Android 10 ไม่ว่า targetSdkVersion ของแอปจะเป็นอะไรก็ตาม คุณควรทดสอบ แอปและแก้ไขตามที่จำเป็นเพื่อสนับสนุนการเปลี่ยนแปลงเหล่านี้อย่างถูกต้อง

หาก 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 อย่างไรก็ตาม เราเข้าใจว่าแอปบางแอปมี Use Case ที่ถูกต้องในการใช้อินเทอร์เฟซที่ไม่ใช่ SDK หากไม่พบทางเลือก ในการใช้อินเทอร์เฟซที่ไม่ใช่ SDK สำหรับฟีเจอร์ในแอป คุณควร ขอ API สาธารณะใหม่

ดูข้อมูลเพิ่มเติมได้ที่การอัปเดตข้อจำกัดของอินเทอร์เฟซที่ไม่ใช่ SDK ใน Android 10 และดูข้อจำกัดเกี่ยวกับอินเทอร์เฟซที่ไม่ใช่ SDK

การนำทางด้วยท่าทางสัมผัส

ตั้งแต่ Android 10 เป็นต้นไป ผู้ใช้จะเปิดใช้การไปยังส่วนต่างๆ ของอุปกรณ์ด้วยท่าทางสัมผัสได้ หากผู้ใช้เปิดใช้การนำทางด้วยท่าทางสัมผัส การเปลี่ยนแปลงนี้จะส่งผลต่อแอปทั้งหมดใน ไม่ว่าแอปจะกำหนดเป้าหมายเป็น API ระดับ 29 หรือไม่ก็ตาม เช่น หากผู้ใช้ปัดเข้ามา จากขอบของหน้าจอ ระบบจะตีความท่าทางสัมผัสนั้นเป็น "กลับ" การไปยังส่วนต่างๆ เว้นแต่ว่าแอปจะลบล้างท่าทางสัมผัสนั้นเป็นการเฉพาะสำหรับส่วนต่างๆ ของ หน้าจอ

หากต้องการให้แอปใช้งานร่วมกับการไปยังส่วนต่างๆ ด้วยท่าทางสัมผัสได้ คุณจะต้องขยายเนื้อหาแอปจากขอบหนึ่งไปอีกขอบหนึ่ง และจัดการท่าทางสัมผัสที่ขัดแย้งกันอย่างเหมาะสม สำหรับข้อมูล โปรดดูที่การนำทางด้วยท่าทางสัมผัส เอกสารประกอบ

NDK

Android 10 มีการเปลี่ยนแปลง NDK ต่อไปนี้

ออบเจ็กต์ที่แชร์ต้องไม่มีการย้ายตำแหน่งข้อความ

Android 6.0 (API ระดับ 23) ไม่ได้รับอนุญาตให้ใช้งาน ของการย้ายข้อความในออบเจ็กต์ที่แชร์ ต้องโหลดโค้ดตามที่เป็นอยู่และต้องไม่โหลดโค้ด แก้ไขได้ การเปลี่ยนแปลงนี้จะช่วยปรับปรุงเวลาในการโหลดของแอปและความปลอดภัย

SELinux บังคับใช้ข้อจำกัดนี้กับแอปที่กำหนดเป้าหมายเป็น Android 10 หรือสูงกว่า หากแอปเหล่านี้ยังคงใช้ออบเจ็กต์ที่แชร์ซึ่งมีการเปลี่ยนตำแหน่งข้อความอยู่ แอปมีความเสี่ยงสูงที่จะใช้งานไม่ได้

การเปลี่ยนแปลงไลบรารี Bionic และเส้นทางตัวลิงก์แบบไดนามิก

ตั้งแต่ 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 บิตของไฟล์ด้วย โดยจะใช้ lib64/ แทน lib/

สำหรับความเข้ากันได้ ลิงก์สัญลักษณ์จะมีให้ที่เส้นทางเดิม ตัวอย่างเช่น /system/lib/libc.so เป็นลิงก์สัญลักษณ์ไปยัง /apex/com.android.runtime/lib/bionic/libc.so สไตรค์ dlopen(“/system/lib/libc.so”) จะยังคงทำงานต่อไป แต่แอปจะพบว่า ความแตกต่างเมื่อพวกเขาพยายามตรวจสอบไลบรารีที่โหลดด้วยการอ่าน /proc/self/maps หรือคล้ายกัน ซึ่งผิดปกติ แต่เราพบว่า แอปบางอย่างทำแบบนั้นโดยเป็นส่วนหนึ่งของกระบวนการป้องกันการแฮ็ก หากใช่ พารามิเตอร์ ควรเพิ่มเส้นทาง /apex/… เป็นเส้นทางที่ถูกต้องสำหรับไฟล์ Bionic

ไบนารีของระบบ/ไลบรารีที่แมปกับหน่วยความจำแบบปฏิบัติการเท่านั้น

เริ่มต้นใน Android 10 กลุ่มไฟล์ปฏิบัติการของไบนารีของระบบ และไลบรารีถูกแมปลงในหน่วยความจำแบบปฏิบัติการเท่านั้น (ไม่สามารถอ่านได้) เป็นการปิดช่องโหว่ ที่ช่วยป้องกันการโจมตี การใช้โค้ดซ้ำได้ หากแอปทำการอ่านเป็นภาษา กลุ่มหน่วยความจำที่มีการทำเครื่องหมายเป็นดำเนินการเท่านั้น ไม่ว่าจะมาจากข้อบกพร่อง ช่องโหว่ หรือ การตรวจสอบหน่วยความจำโดยเจตนา – ระบบจะส่งสัญญาณ SIGSEGV ไปยังแอปของคุณ

คุณสามารถระบุว่าการทำงานลักษณะนี้ทำให้เกิดข้อขัดข้องหรือไม่ โดยการตรวจสอบ tombstone ใน /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 แสดงSSLHandshakeException ใน Android เวอร์ชันก่อนหน้า อินสแตนซ์เหล่านี้จะแสดงSSLProtocolException แทนใน Android 10 ขึ้นไป
  • ไม่รองรับโหมด 0-RTT

คุณสามารถโทรหา SSLContext ที่ปิดใช้ TLS 1.3 ได้หากต้องการ SSLContext.getInstance("TLSv1.2") นอกจากนี้ คุณยังสามารถเปิดหรือปิดใช้เวอร์ชันโปรโตคอลแบบต่อการเชื่อมต่อได้โดย กำลังโทรหา setEnabledProtocols() ในออบเจ็กต์ที่เหมาะสม

ใบรับรองที่ลงนามด้วย SHA-1 จะไม่ได้รับการเชื่อถือใน TLS

ใน Android 10 ใบรับรองที่ใช้อัลกอริทึมแฮช SHA-1 ไม่ได้รับการเชื่อถือในการเชื่อมต่อ TLS CA รูทไม่ได้ออกใบรับรองดังกล่าว มาตั้งแต่ปี 2016 และจะไม่ได้รับการเชื่อถือใน Chrome หรือเบราว์เซอร์หลักอื่นๆ อีกต่อไป

ความพยายามใดๆ ในการเชื่อมต่อจะล้มเหลวหากการเชื่อมต่อนั้นชี้ไปยังเว็บไซต์ที่แสดง ที่ใช้ 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 ดังต่อไปนี้ โดยตรงไม่มีการติดหนึบ:

หากแอปของคุณพึ่งพาการรับข้อมูลเหล่านี้ตอนลงทะเบียนเนื่องจาก ไม่เป็นแบบติดหนึบ ให้ใช้เมธอด get() ที่เหมาะสมในการเริ่มต้นเพื่อ รับข้อมูลแทน

ความสามารถของ Wi-Fi Aware

Android 10 เพิ่มการรองรับเพื่อสร้างซ็อกเก็ต TCP/UDP ได้ง่ายขึ้นโดยใช้เส้นทางข้อมูล Wi-Fi Aware หากต้องการสร้างซ็อกเก็ต TCP/UDP ที่เชื่อมต่อกับ ServerSocket ไคลเอ็นต์ อุปกรณ์จำเป็นต้องทราบที่อยู่ IPv6 และพอร์ตของเซิร์ฟเวอร์ ก่อนหน้านี้ ที่จำเป็นต่อการสื่อสารนอกย่านความถี่ เช่น โดยใช้เลเยอร์ BT หรือ Wi-Fi Aware การรับส่งข้อความ 2 รายการ หรือค้นพบในย่านความถี่โดยใช้โปรโตคอลอื่น เช่น mDNS ด้วย Android 10 อาจมีการสื่อสารข้อมูลโดยเป็นส่วนหนึ่งของการตั้งค่าเครือข่าย

เซิร์ฟเวอร์สามารถดำเนินการอย่างใดอย่างหนึ่งต่อไปนี้

  • เริ่มต้น ServerSocket และตั้งค่าหรือรับพอร์ตที่จะใช้งาน
  • ระบุข้อมูลพอร์ตให้เป็นส่วนหนึ่งของคำขอเครือข่าย Wi-Fi Aware

ตัวอย่างโค้ดต่อไปนี้แสดงวิธีระบุข้อมูลพอร์ตเป็นส่วนหนึ่งของ คำขอเครือข่าย:

Kotlin

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

Java

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 และ พอร์ตที่เซิร์ฟเวอร์ให้มา:

Kotlin

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)

Java

callback = new ConnectivityManager.NetworkCallback() {
  @Override
  public void onAvailable(Network network) {
    ...
  }
  @Override
  public void onLinkPropertiesChanged(Network network,
      LinkProperties linkProperties) {
    ...
  }
  @Override
  public void onCapabilitiesChanged(Network network,
      NetworkCapabilities networkCapabilities) {
    ...
    TransportInfo ti = networkCapabilities.getTransportInfo();
    if (ti instanceof WifiAwareNetworkInfo) {
       WifiAwareNetworkInfo info = (WifiAwareNetworkInfo) ti;
       Inet6Address peerAddress = info.getPeerIpv6Addr();
       int peerPort = info.getPort();
    }
  }
  @Override
  public void onLost(Network network) {
    ...
  }
};

connMgr.requestNetwork(networkRequest, callback);

SYSTEM_ALERT_WINDOW ในอุปกรณ์ Go

แอปที่ทํางานในอุปกรณ์ Android 10 (รุ่น Go) จะไม่ได้รับ SYSTEM_ALERT_WINDOW สิทธิ์ เพราะการวาดหน้าต่างที่วางซ้อนใช้หน่วยความจำมากเกินไป ซึ่งจะเป็นอันตรายต่อประสิทธิภาพของ Android ที่มีหน่วยความจำต่ำ อุปกรณ์

หากแอปทำงานในอุปกรณ์รุ่น Go ที่ใช้ Android 9 หรือต่ำกว่าได้รับ SYSTEM_ALERT_WINDOW แอปจะรักษาสิทธิ์ดังกล่าวไว้แม้ว่า อัปเกรดเป็น Android 10 แล้ว แต่แอปที่ยังไม่มี หลังจากอัปเกรดอุปกรณ์แล้ว ไม่สามารถให้สิทธิ์ได้

หากแอปในอุปกรณ์ Go ส่ง Intent ที่มีการดำเนินการ ACTION_MANAGE_OVERLAY_PERMISSION ระบบจะปฏิเสธคำขอโดยอัตโนมัติ และนําผู้ใช้ไปยังหน้าจอการตั้งค่าซึ่งระบุว่าไม่อนุญาตสิทธิ์เนื่องจากทำให้อุปกรณ์ช้าลง หากแอปในอุปกรณ์ Go เรียกใช้ Settings.canDrawOverlays() เมธอดจะแสดงผลลัพธ์เป็นเท็จเสมอ ขอย้ำอีกครั้งว่าข้อจำกัดเหล่านี้ไม่มีผลกับแอป ซึ่งได้รับสิทธิ์SYSTEM_ALERT_WINDOWก่อนใช้งานอุปกรณ์ อัปเกรดเป็น Android 10 แล้ว

คำเตือนสำหรับแอปที่กำหนดเป้าหมายเป็น Android เวอร์ชันเก่า

อุปกรณ์ที่ใช้ Android 10 ขึ้นไปจะเตือนผู้ใช้เป็นครั้งแรก ใช้แอปที่กำหนดเป้าหมายเป็น Android 5.1 (API ระดับ 22) หรือต่ำกว่า หากแอป กำหนดให้ผู้ใช้ให้สิทธิ์ ผู้ใช้จะได้รับโอกาสด้วย เพื่อปรับสิทธิ์ของแอปก่อนที่แอปจะได้รับอนุญาตให้ทำงานเป็น

เนื่องจาก API เป้าหมายของ Google Play ข้อกำหนด ผู้ใช้จะเห็นคำเตือนเหล่านี้เฉพาะเมื่อเรียกใช้แอปที่ยังไม่ได้อัปเดต เมื่อไม่นานมานี้ สำหรับแอปที่จัดจำหน่ายผ่าน Store อื่นๆ API เป้าหมายที่คล้ายกัน ซึ่งจะมีผลบังคับใช้ในปี 2019 สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ โปรดดูการขยายข้อกำหนดระดับ API เป้าหมายใน 2019

นำชุดการเข้ารหัส CBC SHA-2 ออกแล้ว

ระบบได้นำชุดการเข้ารหัส 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 ติดตามการใช้ Instant App อย่างถูกต้อง

  • โทนสีเทาสำหรับแต่ละแอป - Android 10 สามารถตั้งค่าโหมดการแสดงผลโทนสีเทาสำหรับแต่ละแอปได้

  • สถานะการรบกวนของแต่ละแอป - Android 10 สามารถตั้งค่าแอปเป็น "สถานะการรบกวน" ได้โดยที่ระบบจะระงับการแจ้งเตือนของแอปนั้นและไม่แสดงแอปเป็นแอปที่แนะนำ

  • การระงับและการเล่น - ใน Android 10 แอปที่ถูกระงับจะเล่นเสียงไม่ได้

การเปลี่ยนแปลงการเชื่อมต่อ HTTPS

หากแอปที่ใช้ Android 10 ส่ง null เข้า setSSLSocketFactory() IllegalArgumentException เกิดขึ้น ในเวอร์ชันก่อนหน้า การส่ง null ไปยัง setSSLSocketFactory() จะมีผลเหมือนกับการส่งในค่าเริ่มต้นปัจจุบัน โรงงาน

เลิกใช้งานไลบรารี android.preference แล้ว

ไลบรารี android.preference เลิกใช้งานแล้วใน Android 10 นักพัฒนาซอฟต์แวร์ควรใช้ไลบรารีค่ากำหนด AndroidX ซึ่งเป็นส่วนหนึ่งของ Android Jetpack สำหรับแหล่งข้อมูลเพิ่มเติมเพื่อช่วยในการย้ายข้อมูลและ สำหรับการพัฒนา โปรดดูการตั้งค่าที่อัปเดต คำแนะนำและตัวอย่างสาธารณะของเรา แอป และเอกสารอ้างอิง

การเปลี่ยนแปลงในไลบรารียูทิลิตีของไฟล์ ZIP

Android 10 มีการเปิดตัวการเปลี่ยนแปลงต่อไปนี้ในคลาสของแพ็กเกจ java.util.zip ซึ่งจัดการไฟล์ ZIP การเปลี่ยนแปลงเหล่านี้ทำให้การทำงานของไลบรารีมีลักษณะการทำงานมากขึ้น สอดคล้องกันระหว่าง Android และแพลตฟอร์มอื่นๆ ที่ใช้ java.util.zip

แบบเป่าลม

ในเวอร์ชันก่อนหน้า บางเมธอดในคลาส Inflater มี IllegalStateException หากมีคุณสมบัติดังนี้ มีการเรียกหลังจากโทรหา end() ใน Android 10 วิธีการเหล่านี้จะส่ง NullPointerException แทน

ไฟล์ ZIP

ใน Android 10 ขึ้นไป เครื่องมือสร้างสำหรับ ZipFile ที่รับอาร์กิวเมนต์ประเภท File, int และ Charset จะไม่ส่ง ZipException หากไฟล์ ZIP ที่ให้ไว้ ไม่มีไฟล์ใดๆ

สตรีมเอาต์พุต Zip

ใน Android 10 ขึ้นไป เมธอด finish() ใน ZipOutputStream จะไม่แสดงข้อผิดพลาด ZipException หากพยายามเขียนสตรีมเอาต์พุตสำหรับไฟล์ ZIP ที่ไม่มีไฟล์ใดๆ

การเปลี่ยนแปลงกล้อง

แอปที่ใช้กล้องหลายแอปคิดว่าหากอุปกรณ์อยู่ในแนวตั้ง อุปกรณ์จริงก็จะอยู่ในแนวตั้งด้วยตามที่อธิบายไว้ใน การวางแนวกล้อง นี่เป็นสมมติฐานที่ปลอดภัยในอดีต แต่ก็มี เปลี่ยนไปตามการขยายของอุปกรณ์รูปแบบที่ใช้งานได้ เช่น อุปกรณ์แบบพับได้ นั่น สมมติฐานในอุปกรณ์เหล่านี้อาจทำให้เกิดการหมุนหรือปรับขนาดอย่างไม่ถูกต้อง (หรือ ทั้งสองแบบ) ในช่องมองภาพของกล้อง

แอปพลิเคชันที่กำหนดเป้าหมายเป็น API ระดับ 24 ขึ้นไปควรตั้งค่าอย่างชัดแจ้ง android:resizeableActivity และจัดเตรียมฟังก์ชันที่จำเป็นในการจัดการ การใช้งานหลายหน้าต่าง

การติดตามการใช้งานแบตเตอรี่

เริ่มต้นด้วย Android 10 รีเซ็ต SystemHealthManager สถิติการใช้งานแบตเตอรี่เมื่อใดก็ตามที่ถอดปลั๊กอุปกรณ์หลังจากหลัก เหตุการณ์การชาร์จ พูดกว้างๆ ก็คือ เหตุการณ์การชาร์จที่สำคัญคือ อุปกรณ์ ชาร์จเต็มแล้ว หรืออุปกรณ์เริ่มหมดเป็นปกติแล้ว ชาร์จแล้ว

ก่อน Android 10 ระบบจะรีเซ็ตสถิติการใช้งานแบตเตอรี่ทุกครั้งที่อุปกรณ์ ถอดปลั๊กไว้ ไม่ว่าระดับแบตเตอรี่จะมีการเปลี่ยนแปลงเพียงเล็กน้อยก็ตาม

การเลิกใช้งาน Android Beam

ใน Android 10 เรากำลังเลิกใช้งาน Androidบีม ซึ่งเป็นฟีเจอร์เก่าสำหรับ เริ่มการแชร์ข้อมูลระหว่างอุปกรณ์ผ่าน Near Field Communication (NFC) นอกจากนี้ เรายังจะเลิกใช้งาน NFC API ที่เกี่ยวข้องหลายรายการด้วย Androidบีมยังคงอยู่ พาร์ทเนอร์ผู้ผลิตอุปกรณ์ (ไม่บังคับ) ที่ต้องการใช้ แต่ไม่ได้ ใช้เวลาพัฒนานานขึ้น Android จะยังรองรับ NFC อื่นๆ ต่อไป ความสามารถและ API และกรณีการใช้งาน เช่น การอ่านจากแท็กและ การชำระเงินจะทำงานต่อไปตามที่คาดไว้

java.math.Bigdecimal.stripTrailingZeros() การเปลี่ยนแปลงพฤติกรรม

BigDecimal.stripTrailingZeros() จะไม่เก็บค่า 0 ต่อท้ายไว้เป็นกรณีพิเศษอีกต่อไปหากค่าอินพุตเป็น 0

java.util.regex.Matcher และรูปแบบการเปลี่ยนแปลง

ผลลัพธ์ของ split() มีการเปลี่ยนแปลงเพื่อไม่ให้ขึ้นต้นด้วย Stringเปล่า ("") อีกต่อไปเมื่อมีรายการที่ตรงกันแบบความกว้างเป็น 0 ที่จุดเริ่มต้นของอินพุต ยัง ส่งผลต่อ String.split() ตัวอย่างเช่น ตอนนี้ "x".split("") จะแสดงผลเป็น {"x"} แต่ก่อนหน้านี้จะแสดงผลเป็น {"", "x"} ใน Android เวอร์ชันเก่า ตอนนี้ "aardvark".split("(?=a)" แสดงผล {"a", "ardv", "ark"} แทนที่จะเป็น {"", "a", "ardv", "ark"}

ปรับปรุงลักษณะการทำงานของข้อยกเว้นสำหรับอาร์กิวเมนต์ที่ไม่ถูกต้องด้วยแล้ว ดังนี้

  • ตอนนี้ appendReplacement(StringBuffer, String) ขว้างลูกแล้ว IllegalArgumentException แทนที่จะเป็น IndexOutOfBoundsException หาก การแทนที่ String จะลงท้ายด้วยแบ็กสแลชเดี่ยว ซึ่งผิดกฎหมาย จะมีการส่งข้อยกเว้นเดียวกันนี้หาก String ทดแทนลงท้ายด้วย $ ก่อนหน้านี้ สถานการณ์นี้จะไม่มีข้อยกเว้น
  • replaceFirst(null) จะไม่โทรหา reset() ใน Matcher อีกต่อไปหากส่ง NullPointerException ในขณะนี้ มีการส่ง 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 ขึ้นไป

ระบบจะบันทึกคำเตือนนี้ 1 ครั้งสำหรับแต่ละชั้นเรียนที่ได้รับผลกระทบ ข้อความเตือนจะมีการแก้ไขที่แนะนำ คือ serialVersionUID เป็นค่าเริ่มต้นที่จะคำนวณหาก แอปกำหนดเป้าหมายเป็น API ระดับ 24 ขึ้นไป เมื่อใช้การแก้ไขนี้ คุณจะมั่นใจได้ว่าหากออบเจ็กต์จากคลาสดังกล่าวได้รับการจัดรูปแบบเป็นอนุกรมในแอปที่กำหนดเป้าหมายเป็น API ระดับ 23 หรือต่ำกว่า แอปที่กำหนดเป้าหมายเป็น 24 ขึ้นไปจะอ่านออบเจ็กต์ดังกล่าวได้อย่างถูกต้อง และในทางกลับกัน

การเปลี่ยนแปลง java.io.FileChannel.map()

ตั้งแต่ Android 10 เป็นต้นไป ระบบจะไม่รองรับ FileChannel.map() สำหรับ ไฟล์ที่ไม่ใช่แบบมาตรฐาน เช่น /dev/zero ซึ่งจะเปลี่ยนขนาดโดยใช้ไม่ได้ truncate() ก่อนหน้า เวอร์ชัน Android กลืนข้อผิดพลาดที่แสดงผลโดย truncate() แต่ Android 10 จะมี IOException หากต้องการลักษณะการทำงานแบบเก่า คุณต้องใช้สคริปต์เนทีฟ