Android 10 มีการเปลี่ยนแปลงลักษณะการทำงานของระบบที่อัปเดตแล้ว ซึ่งอาจส่งผลต่อแอปของคุณ
การเปลี่ยนแปลงที่ระบุไว้ในหน้านี้มีผลเฉพาะกับแอปที่กำหนดเป้าหมายเป็น
API 29 ขึ้นไป หากแอปตั้งค่า targetSdkVersion
เป็น "29" หรือสูงกว่า คุณควรแก้ไขแอปให้รองรับลักษณะการทำงานเหล่านี้อย่างเหมาะสม (หากเกี่ยวข้อง)
อย่าลืมตรวจสอบรายการการเปลี่ยนแปลงลักษณะการทำงานที่มีผลกับแอปทั้งหมด ที่ทำงานบน Android 10 ด้วย
หมายเหตุ: นอกจากการเปลี่ยนแปลงที่แสดงในหน้านี้แล้ว Android 10 ยังมีการเปลี่ยนแปลงและข้อจํากัดด้านความเป็นส่วนตัวอีกมากมาย ซึ่งรวมถึง รายการต่อไปนี้
- พื้นที่เก็บข้อมูลที่กำหนดขอบเขต
- สิทธิ์เข้าถึงหมายเลขซีเรียลของอุปกรณ์ USB
- ความสามารถในการเปิด ปิด และกำหนดค่า Wi-Fi
- สิทธิ์เข้าถึงตำแหน่งสำหรับ API การเชื่อมต่อ
การเปลี่ยนแปลงเหล่านี้ซึ่งส่งผลต่อแอปที่กำหนดเป้าหมายเป็น API ระดับ 29 ขึ้นไป ช่วยเพิ่มความเป็นส่วนตัวของผู้ใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีรองรับการเปลี่ยนแปลงเหล่านี้ได้ที่หน้าการเปลี่ยนแปลงด้านความเป็นส่วนตัว
การอัปเดตข้อจำกัดเกี่ยวกับอินเทอร์เฟซที่ไม่ใช่ 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
ความทรงจำที่แชร์
Ashmem ได้เปลี่ยนรูปแบบของแผนที่ Dalvik ใน /proc/<pid>/maps ซึ่งส่งผลต่อแอปที่แยกวิเคราะห์ไฟล์แผนที่โดยตรง นักพัฒนาแอปพลิเคชันควร ทดสอบรูปแบบ /proc/<pid>/maps ในอุปกรณ์ที่ใช้ Android 10 ขึ้นไป และแยกวิเคราะห์ตามนั้นหากแอปขึ้นอยู่กับ รูปแบบแผนที่ Dalvik
แอปที่กำหนดเป้าหมายเป็น Android 10 จะใช้ ashmem
(/dev/ashmem) โดยตรงไม่ได้ แต่ต้องเข้าถึงหน่วยความจำที่ใช้ร่วมกันผ่านคลาส ASharedMemory
ของ NDK แทน
นอกจากนี้ แอปยังไม่สามารถสร้าง IOCTL โดยตรงไปยังตัวอธิบายไฟล์ ashmem ที่มีอยู่
และต้องใช้คลาส ASharedMemory
ของ NDK หรือ Android Java
API แทนเพื่อสร้างรีเจียนหน่วยความจำที่ใช้ร่วมกัน การเปลี่ยนแปลงนี้จะช่วยเพิ่มความปลอดภัยและความเสถียรเมื่อทำงานกับหน่วยความจำที่ใช้ร่วมกัน ซึ่งจะช่วยปรับปรุงประสิทธิภาพและความปลอดภัยของ Android โดยรวม
นำสิทธิ์ในการเรียกใช้สำหรับไดเรกทอรีหน้าแรกของแอปออกแล้ว
การดำเนินการไฟล์จากไดเรกทอรีหลักของแอปที่เขียนได้ถือเป็นการละเมิด W^X แอปควรโหลดเฉพาะโค้ดไบนารีที่ฝังอยู่ในไฟล์ APK ของแอป
แอปที่ไม่น่าเชื่อถือซึ่งกำหนดเป้าหมายเป็น Android 10 จะเรียกใช้ execve()
โดยตรงในไฟล์ภายในไดเรกทอรีหลักของแอปไม่ได้
นอกจากนี้ แอปที่กำหนดเป้าหมายเป็น Android 10 จะแก้ไขโค้ดที่เรียกใช้งานได้ในหน่วยความจำจากไฟล์ที่เปิดด้วย dlopen()
และคาดหวังให้ระบบเขียนการเปลี่ยนแปลงเหล่านั้นลงในดิสก์ไม่ได้ เนื่องจากไลบรารีไม่สามารถแมป PROT_EXEC
ผ่านตัวอธิบายไฟล์ที่เขียนได้ ซึ่งรวมถึงไฟล์ออบเจ็กต์ที่แชร์ (.so
) ที่มีการย้ายข้อความ
รันไทม์ Android ยอมรับเฉพาะไฟล์ OAT ที่ระบบสร้างขึ้น
Android Runtime (ART) จะไม่เรียกใช้ dex2oat
จากกระบวนการของแอปพลิเคชันอีกต่อไป
การเปลี่ยนแปลงนี้หมายความว่า ART จะยอมรับเฉพาะไฟล์ OAT ที่ระบบสร้างขึ้นเท่านั้น
การบังคับใช้ความถูกต้องของ AOT ใน ART
ในอดีต การคอมไพล์ล่วงหน้า (AOT) ที่ดำเนินการโดย Android Runtime (ART) อาจทำให้เกิดข้อขัดข้องขณะรันไทม์หากสภาพแวดล้อม classpath ไม่เหมือนกันในเวลาคอมไพล์และรันไทม์ Android 10 ขึ้นไป กำหนดให้บริบทสภาพแวดล้อมเหล่านี้ต้องเหมือนกันเสมอ ซึ่งส่งผลให้เกิด การเปลี่ยนแปลงพฤติกรรมต่อไปนี้
- ตัวโหลดคลาสที่กำหนดเอง ซึ่งก็คือตัวโหลดคลาสที่แอปเขียนขึ้น ไม่เหมือนตัวโหลดคลาสจากแพ็กเกจ
dalvik.system
จะไม่ได้รับการคอมไพล์ AOT เนื่องจาก ART ไม่สามารถทราบเกี่ยวกับการติดตั้งใช้งานการค้นหาคลาสที่กำหนดเองในขณะรันไทม์ - ไฟล์ DEX รอง ซึ่งก็คือไฟล์ DEX ที่แอปโหลดด้วยตนเองซึ่งไม่ได้อยู่ใน APK หลัก จะได้รับการคอมไพล์ AOT ในเบื้องหลัง เนื่องจากการคอมไพล์ครั้งแรกอาจมีค่าใช้จ่ายสูงเกินไป ซึ่งจะทำให้เกิดเวลาในการตอบสนองที่ไม่ต้องการก่อนการดำเนินการ โปรดทราบว่าสำหรับแอป เราขอแนะนำให้ใช้การแยกและเลิกใช้ไฟล์ Dex รอง
- ไลบรารีที่ใช้ร่วมกันใน Android (รายการ <library> และ <uses-library> ในไฟล์ Manifest ของ Android) จะได้รับการติดตั้งใช้งานโดยใช้ลำดับชั้นของ Class Loader ที่แตกต่างจากที่ใช้ในแพลตฟอร์มเวอร์ชันก่อนหน้า
การเปลี่ยนแปลงสิทธิ์สำหรับ Intent แบบเต็มหน้าจอ
แอปที่กำหนดเป้าหมายเป็น Android 10 ขึ้นไปและใช้การแจ้งเตือนที่มี Intent เต็มหน้าจอต้องขอสิทธิ์
USE_FULL_SCREEN_INTENT
ในไฟล์ Manifest ของแอป สิทธิ์นี้เป็นสิทธิ์ปกติ ดังนั้นระบบจะ
ให้สิทธิ์แก่แอปที่ขอโดยอัตโนมัติ
หากแอปที่กำหนดเป้าหมายเป็น Android 10 ขึ้นไปพยายามสร้าง การแจ้งเตือนด้วย Intent แบบเต็มหน้าจอโดยไม่ได้ขอ สิทธิ์ที่จำเป็น ระบบจะละเว้น Intent แบบเต็มหน้าจอและแสดงข้อความบันทึกต่อไปนี้
Package your-package-name: Use of fullScreenIntent requires the USE_FULL_SCREEN_INTENT permission
การรองรับอุปกรณ์แบบพับได้
Android 10 มีการเปลี่ยนแปลงที่รองรับอุปกรณ์แบบพับได้และอุปกรณ์หน้าจอขนาดใหญ่
เมื่อแอปทำงานบน Android 10 เมธอด
onResume()
และ
onPause()
จะทำงาน
แตกต่างกัน เมื่อแอปหลายแอปปรากฏพร้อมกันในโหมดหลายหน้าต่างหรือโหมดหลายจอแสดงผล กิจกรรมที่เน้นได้ทั้งหมดที่อยู่ด้านบนในสแต็กที่มองเห็นได้จะอยู่ในสถานะ "กลับมาทำงานต่อ" แต่จะมีเพียงกิจกรรมเดียวเท่านั้นที่เรียกว่ากิจกรรม "กลับมาทำงานต่อที่อยู่ด้านบนสุด" ที่มีโฟกัสจริงๆ เมื่อเรียกใช้ในเวอร์ชันที่เก่ากว่า Android 10 จะมีเพียง
กิจกรรมเดียวในระบบที่สามารถกลับมาทำงานต่อได้ในแต่ละครั้ง ส่วนกิจกรรมอื่นๆ ที่มองเห็นได้
จะหยุดชั่วคราว
อย่าสับสนระหว่าง "โฟกัส" กับกิจกรรม "กลับมาทำงานต่อที่อยู่ด้านบนสุด" ระบบจะกําหนดลําดับความสําคัญให้กับกิจกรรมตามลําดับ Z เพื่อให้ลําดับความสําคัญสูงกว่าแก่กิจกรรมที่ผู้ใช้โต้ตอบด้วยล่าสุด กิจกรรมอาจ กลับมาทำงานต่อได้ แต่ไม่มีโฟกัส (เช่น หากมีการขยายเฉดสีการแจ้งเตือน)
ใน Android 10 (API ระดับ 29) ขึ้นไป คุณสามารถสมัครใช้บริการการเรียกกลับ
onTopResumedActivityChanged()
เพื่อรับการแจ้งเตือนเมื่อกิจกรรมได้รับหรือสูญเสียตำแหน่งที่กลับมาทำงานต่อที่ด้านบนสุด
ซึ่งเทียบเท่ากับสถานะที่กลับมาทำงานต่อก่อน Android 10 และอาจเป็นประโยชน์
ในฐานะคำแนะนำหากแอปใช้ทรัพยากรแบบเอกสิทธิ์หรือแบบซิงเกิลตันที่อาจต้อง
แชร์กับแอปอื่นๆ
นอกจากนี้ ลักษณะการทำงานของแอตทริบิวต์ไฟล์ Manifest ของ
resizeableActivity
ก็เปลี่ยนไปด้วย หากแอปตั้งค่า
resizeableActivity=false
ใน Android 10 (API ระดับ 29) ขึ้นไป ระบบอาจเปลี่ยนแอปเป็นโหมดความเข้ากันได้
เมื่อขนาดหน้าจอที่ใช้ได้เปลี่ยนแปลง หรือหากแอปย้ายจากหน้าจอหนึ่งไปยัง
อีกหน้าจอหนึ่ง
แอปสามารถใช้แอตทริบิวต์
android:minAspectRatio
ซึ่งเปิดตัวใน Android 10 เพื่อระบุสัดส่วนหน้าจอที่แอปของคุณรองรับ
ตั้งแต่เวอร์ชัน 3.5 เป็นต้นไป เครื่องมือจำลองของ Android Studio จะมีอุปกรณ์เสมือนขนาด 7.3 นิ้วและ 8 นิ้วสำหรับทดสอบโค้ดกับหน้าจอขนาดใหญ่ขึ้น
ดูข้อมูลเพิ่มเติมได้ที่ออกแบบแอปสำหรับอุปกรณ์พับได้