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

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 บิตด้วย โดยจะแทนที่ lib/ ด้วย lib64/

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

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

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

คุณระบุได้ว่าลักษณะการทำงานนี้ทำให้เกิดข้อขัดข้องหรือไม่โดยตรวจสอบไฟล์ tombstone ที่เกี่ยวข้องใน /data/tombstones/ ข้อขัดข้องที่เกี่ยวข้องกับการดำเนินการเท่านั้น จะมีข้อความยกเลิกต่อไปนี้

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

หากต้องการหลีกเลี่ยงปัญหานี้เพื่อดำเนินการต่างๆ เช่น การตรวจสอบหน่วยความจำ คุณสามารถทำเครื่องหมายส่วนที่ดำเนินการได้อย่างเดียวเป็นอ่าน+ดำเนินการได้โดยการเรียกใช้ mprotect() อย่างไรก็ตาม เราขอแนะนำเป็นอย่างยิ่งให้เปลี่ยนกลับไปเป็น execute-only หลังจากนั้น เนื่องจาก การตั้งค่าสิทธิ์การเข้าถึงนี้จะช่วยปกป้องแอปและผู้ใช้ได้ดียิ่งขึ้น

ความปลอดภัย

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

การเปลี่ยนแปลงและการปรับปรุงลักษณะการทำงานของพวงกุญแจ

เบราว์เซอร์บางตัว เช่น 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

Android 10 เพิ่มการรองรับเพื่ออำนวยความสะดวกในการสร้างซ็อกเก็ต TCP/UDP โดยใช้เส้นทางข้อมูล Wi-Fi Aware หากต้องการสร้างซ็อกเก็ต TCP/UDP ที่เชื่อมต่อกับ ServerSocket อุปกรณ์ไคลเอ็นต์ ต้องทราบที่อยู่ IPv6 และพอร์ตของเซิร์ฟเวอร์ ก่อนหน้านี้ต้องมีการสื่อสารนอกแบนด์ เช่น การใช้การรับส่งข้อความเลเยอร์ 2 ของ BT หรือ Wi-Fi Aware หรือค้นพบในแบนด์โดยใช้โปรโตคอลอื่นๆ เช่น 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 Edition ที่ใช้ Android 9 หรือต่ำกว่าได้รับSYSTEM_ALERT_WINDOWสิทธิ์ แอปจะยังคงมีสิทธิ์ดังกล่าวแม้ว่าจะอัปเกรดอุปกรณ์เป็น Android 10 แล้วก็ตาม อย่างไรก็ตาม แอปที่ยังไม่มีสิทธิ์ดังกล่าวจะไม่ได้รับสิทธิ์หลังจากอัปเกรดอุปกรณ์แล้ว

หากแอปในอุปกรณ์ Go ส่ง Intent ที่มี Action 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

นำชุดการเข้ารหัส 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 ของชุดการเข้ารหัสเหล่านี้ หรือไม่รองรับทั้ง 2 ตัวแปร

การใช้งานแอป

Android 10 มีการเปลี่ยนแปลงลักษณะการทำงานต่อไปนี้ที่เกี่ยวข้องกับการใช้งานแอป

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

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

เลิกใช้งานไลบรารี 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 แทน

ZipFile

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

ZipOutputStream

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

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

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

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

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

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

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

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

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

การเปลี่ยนแปลงลักษณะการทำงานของ java.math.BigDecimal.stripTrailingZeros()

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

การเปลี่ยนแปลงลักษณะการทำงานของ java.util.regex.Matcher และ Pattern

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

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

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