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 มีการเปลี่ยนแปลงลักษณะการทำงานต่อไปนี้ที่เกี่ยวข้องกับการใช้งานแอป
การปรับปรุงการใช้งานแอป UsageStats - <0x นอกจากนี้ Android 10 ยังติดตามการใช้งานแอปด่วนได้อย่างถูกต้อง
ระดับสีเทาต่อแอป - <0x0A
สถานะการรบกวนต่อแอป - <0
การระงับและการเล่น - <
การเปลี่ยนแปลงการเชื่อมต่อ 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 หากต้องการลักษณะการทำงานแบบเดิม
คุณต้องใช้รหัสดั้งเดิม