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
ไบนารี/ไลบรารีของระบบที่แมปกับหน่วยความจำแบบ Execute-Only
ตั้งแต่ Android 10 เป็นต้นไป ระบบจะแมปส่วนที่เรียกใช้งานได้ของไบนารีและไลบรารีของระบบลงในหน่วยความจำแบบ Execute-Only (อ่านไม่ได้) เพื่อเป็นเทคนิคการเสริมความแข็งแกร่งในการป้องกันการโจมตีแบบ Code-Reuse หากแอปดำเนินการอ่านลงในส่วนหน่วยความจำที่ทำเครื่องหมายเป็น Execute-Only ไม่ว่าจะเป็นจากข้อบกพร่อง ช่องโหว่ หรือการตรวจสอบหน่วยความจำโดยเจตนา ระบบจะส่งสัญญาณ SIGSEGV ไปยังแอป
คุณสามารถระบุได้ว่าลักษณะการทำงานนี้ทำให้เกิดข้อขัดข้องหรือไม่โดยการตรวจสอบไฟล์ Tombstone ที่เกี่ยวข้องใน /data/tombstones/ ข้อขัดข้องที่เกี่ยวข้องกับ Execute-Only จะมีข้อความยกเลิกต่อไปนี้
Cause: execute-only (no-read) memory access error; likely due to data in .text.
หากต้องการหลีกเลี่ยงปัญหานี้เพื่อดำเนินการต่างๆ เช่น การตรวจสอบหน่วยความจำ คุณสามารถทำเครื่องหมายส่วน Execute-Only เป็น Read+Execute ได้โดยเรียกใช้ 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 และเวอร์ชันก่อนหน้าอื่นๆ ระบบจะเรียกใช้ออบเจ็กต์เหล่านี้ หลังจาก ที่เพิ่มเซสชันลงในแคชเซสชันแล้ว) - ในบางกรณีที่
SSLEngineอินสแตนซ์แสดงSSLHandshakeExceptionใน Android เวอร์ชันก่อนหน้า อินสแตนซ์เหล่านี้จะแสดงSSLProtocolExceptionแทน ใน Android 10 ขึ้นไป - ระบบไม่รองรับโหมด 0-RTT
หากต้องการ คุณสามารถรับ SSLContext ที่ปิดใช้ TLS 1.3 ได้โดยเรียกใช้
SSLContext.getInstance("TLSv1.2")
นอกจากนี้ คุณยังเปิดหรือปิดใช้โปรโตคอลเวอร์ชันต่างๆ ได้ตามการเชื่อมต่อแต่ละรายการโดย
เรียกใช้ setEnabledProtocols()
ในออบเจ็กต์ที่เหมาะสม
TLS ไม่เชื่อถือใบรับรองที่ลงชื่อด้วย SHA-1
ใน Android 10 การเชื่อมต่อ TLS ไม่เชื่อถือใบรับรองที่ใช้อัลกอริทึมแฮช SHA-1 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 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 Edition) จะไม่ได้รับสิทธิ์
SYSTEM_ALERT_WINDOW
เนื่องจากการวาดหน้าต่างซ้อนทับใช้หน่วยความจำมากเกินไป ซึ่งส่งผลเสียต่อประสิทธิภาพของอุปกรณ์ Android ที่มีหน่วยความจำน้อย
หากแอปที่ทำงานบนอุปกรณ์ Go Edition ที่ใช้ 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, ผู้ใช้จะเห็นคำเตือนเหล่านี้ก็ต่อเมื่อเรียกใช้แอปที่ไม่ได้อัปเดต เมื่อเร็วๆ นี้ สำหรับแอปที่เผยแพร่ผ่านสโตร์อื่นๆ ข้อกำหนดเกี่ยวกับ API เป้าหมายที่คล้ายกันจะมีผลบังคับใช้ในช่วงปี 2019 ดูข้อมูลเพิ่มเติมเกี่ยวกับข้อกำหนดเหล่านี้ได้ที่ การขยายข้อกำหนดเกี่ยวกับระดับ API เป้าหมายในปี 2019
นำชุดการเข้ารหัส SHA-2 CBC ออกแล้ว
เราได้นำชุดการเข้ารหัส SHA-2 CBC ต่อไปนี้ออกจากแพลตฟอร์ม
TLS_RSA_WITH_AES_128_CBC_SHA256TLS_RSA_WITH_AES_256_CBC_SHA256TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
ชุดการเข้ารหัสเหล่านี้มีความปลอดภัยน้อยกว่าชุดการเข้ารหัสที่คล้ายกันซึ่งใช้ GCM และเซิร์ฟเวอร์ส่วนใหญ่รองรับทั้ง GCM และ CBC ของชุดการเข้ารหัสเหล่านี้ หรือไม่รองรับทั้ง 2 อย่าง
การใช้งานแอป
Android 10 มีการเปลี่ยนแปลงลักษณะการทำงานต่อไปนี้ที่เกี่ยวข้องกับการใช้งานแอป
การปรับปรุงการใช้งานแอป UsageStats - Android 10 ติดตามการใช้งานแอปด้วย UsageStats ได้อย่างแม่นยำเมื่อใช้แอปในโหมดแยกหน้าจอหรือโหมดภาพซ้อนภาพ นอกจากนี้ Android 10 ยังติดตามการใช้งานแอปทันทีได้อย่างถูกต้องด้วย
ระดับสีเทาต่อแอป - Android 10 สามารถตั้งค่าโหมดการแสดงผลระดับสีเทาต่อแอปได้
สถานะการรบกวนต่อแอป - Android 10 สามารถตั้งค่าแอปบางแอปเป็น "สถานะการรบกวน" ได้อย่างเลือกสรร ซึ่งจะทำให้ระบบระงับการแจ้งเตือนของแอปเหล่านั้นและแอปเหล่านั้นจะไม่ปรากฏเป็นแอปที่แนะนำ
การระงับและการเล่น - ใน Android 10 แอปที่ถูกระงับจะไม่สามารถเล่นเสียงได้
การเปลี่ยนแปลงการเชื่อมต่อ HTTPS
หากแอปที่ทำงานบน Android 10 ส่ง null ไปยัง
setSSLSocketFactory(),
ระบบจะแสดง IllegalArgumentException
ในเวอร์ชันก่อนหน้า การส่ง null ไปยัง setSSLSocketFactory()
จะมีผลเหมือนกับการส่ง default
factoryปัจจุบัน
ไลบรารี android.preference เลิกใช้งานแล้ว
ไลบรารี android.preference เลิกใช้งานแล้วตั้งแต่ Android 10 เป็นต้นมา
นักพัฒนาแอปควรใช้ไลบรารี Preference ของ AndroidX ซึ่งเป็นส่วนหนึ่งของ Android
Jetpack แทน หากต้องการแหล่งข้อมูลเพิ่มเติมที่จะช่วยในการย้ายข้อมูลและการ
พัฒนา โปรดดูคู่มือ
การตั้งค่าที่อัปเดตแล้ว รวมถึงแอปตัวอย่างสาธารณะ
และ
เอกสารอ้างอิง
การเปลี่ยนแปลงไลบรารียูทิลิตีของไฟล์ ZIP
Android 10 มีการเปลี่ยนแปลงคลาสต่อไปนี้ในแพ็กเกจ java.util.zip ซึ่งจัดการไฟล์ ZIP การเปลี่ยนแปลงเหล่านี้ทำให้ลักษณะการทำงานของไลบรารีสอดคล้องกันมากขึ้นระหว่าง Android กับแพลตฟอร์มอื่นๆ ที่ใช้ java.util.zip
Inflater
ในเวอร์ชันก่อนหน้า เมธอดบางเมธอดในคลาส Inflater จะส่ง IllegalStateException หากมีการเรียกใช้หลังจากเรียกใช้ end()
แต่ใน Android 10 เมธอดเหล่านี้จะแสดง
NullPointerException แทน
ZipFile
ใน Android 10 ขึ้นไป คอนสตรักเตอร์ของ
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) นอกจากนี้ เรายังเลิกใช้งาน NFC API ที่เกี่ยวข้องหลายรายการด้วย 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 หากต้องการใช้ลักษณะการทำงานแบบเก่า คุณต้องใช้โค้ดแบบเนทีฟ