Android 10 มีการเปลี่ยนแปลงลักษณะการทำงานที่อาจส่งผลต่อแอปของคุณ
การเปลี่ยนแปลงที่แสดงในหน้านี้จะมีผลกับแอปของคุณเมื่อเรียกใช้
ใน Android 10 ไม่ว่า targetSdkVersion ของแอปจะเป็นอย่างไร คุณควรทดสอบ
แอปและแก้ไขตามที่จำเป็นเพื่อรองรับการเปลี่ยนแปลงเหล่านี้อย่างเหมาะสม
หาก targetSdkVersion ของแอปเป็น 29 ขึ้นไป คุณจะต้อง
รองรับการเปลี่ยนแปลงเพิ่มเติมด้วย โปรดอ่านรายละเอียดในการเปลี่ยนแปลงลักษณะการทำงานของแอปที่กำหนดเป้าหมายเป็น API ระดับ 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/
เราจึงจัดเตรียม Symlink ไว้ที่เส้นทางเดิมเพื่อให้ใช้งานร่วมกันได้ เช่น
/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
การเปลี่ยนแปลงและการปรับปรุงลักษณะการทำงานของพวงกุญแจ
เบราว์เซอร์บางตัว เช่น 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
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 - <0x นอกจากนี้ Android 10 ยังติดตามการใช้งานแอปด่วนได้อย่างถูกต้อง
ระดับสีเทาต่อแอป - 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 ขึ้นไป ตัวสร้างสำหรับ
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 และกรณีการใช้งานต่างๆ เช่น การอ่านจากแท็กและการชำระเงิน จะยังคงทำงานได้ตามที่คาดไว้
การเปลี่ยนแปลงลักษณะการทำงานของ java.math.BigDecimal.stripTrailingZeros()
BigDecimal.stripTrailingZeros() จะไม่เก็บเลขศูนย์ต่อท้ายเป็นกรณีพิเศษอีกต่อไป หากค่าอินพุตเป็น 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 หากต้องการใช้ลักษณะการทำงานแบบเดิม
คุณต้องใช้โค้ดแบบเนทีฟ