การเปลี่ยนแปลงลักษณะการทำงาน: แอปที่กำหนดเป้าหมายเป็น API เวอร์ชัน 29 ขึ้นไป

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 (ART) ไม่เรียกใช้ dex2oat จากแอปพลิเคชันแล้ว ขั้นตอนได้ การเปลี่ยนแปลงนี้หมายความว่า ART จะยอมรับเฉพาะไฟล์ OAT ที่ระบบสร้างขึ้นเท่านั้น

การบังคับใช้ความถูกต้องของ AOT ใน ART

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

  • ตัวโหลดคลาสที่กำหนดเอง นั่นคือตัวโหลดคลาสที่เขียนโดยแอป ซึ่งจะแตกต่างจากคลาส ตัวโหลดจากแพ็กเกจ dalvik.system ไม่ได้คอมไพล์ AOT เนื่องจาก ART ไม่ทราบเกี่ยวกับการใช้งานการค้นหาคลาสที่กําหนดเองที่รันไทม์
  • ไฟล์ dex รอง ซึ่งก็คือไฟล์ dex ที่โหลดด้วยตนเองโดยแอปที่ไม่ได้อยู่ใน APK หลัก - เป็น AOT ที่คอมไพล์ในเบื้องหลัง นั่นเป็นเพราะการใช้ครั้งแรก การคอมไพล์อาจแพงเกินไป ทำให้เกิดเวลาในการตอบสนองที่ไม่พึงประสงค์ โปรดทราบว่าสำหรับแอป เราขอแนะนำให้ใช้การแยกและเลิกใช้ไฟล์ Dex รอง
  • ไลบรารีที่ใช้ร่วมกันใน Android (รายการ <library> และ <uses-library> ในไฟล์ Manifest ของ Android) จะนำมาใช้งานโดยใช้ ลำดับชั้นของตัวโหลดคลาสมากกว่าลำดับชั้นที่ใช้ในแพลตฟอร์มเวอร์ชันก่อนหน้า

การเปลี่ยนแปลงสิทธิ์สำหรับ 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 มีเพียง กิจกรรมเดียวในระบบจะสามารถดำเนินการต่อได้ทีละ 1 ครั้ง กิจกรรมอื่นๆ ทั้งหมด กิจกรรมหยุดชั่วคราว

อย่าสับสนระหว่าง "โฟกัส" ที่มีข้อความ "เปิดใหม่ด้านบนสุด" กิจกรรม ระบบจะกำหนด ลำดับความสำคัญของกิจกรรมตาม z-order จะให้ลำดับความสำคัญที่สูงกว่ากับ กิจกรรมที่ผู้ใช้โต้ตอบด้วยครั้งล่าสุด ระบบอาจเพิ่มกิจกรรม กลับมาทำงานอีกครั้งด้านบน แต่ไม่มีโฟกัส (เช่น หากหน้าต่างแจ้งเตือน ขยาย)

ใน Android 10 (API ระดับ 29) ขึ้นไป คุณสามารถสมัครรับการเรียกกลับ onTopResumedActivityChanged() เพื่อรับการแจ้งเตือนเมื่อกิจกรรมได้รับหรือสูญเสียตำแหน่งที่กลับมาทำงานต่อสูงสุด สถานะนี้เทียบเท่ากับการกลับมาใช้งานอีกครั้งก่อน Android 10 และอาจเป็นประโยชน์ เป็นคำแนะนำว่าแอปของคุณใช้ทรัพยากรพิเศษหรือทรัพยากรเดี่ยวที่อาจจำเป็นต้องใช้ จะแชร์กับแอปอื่นๆ

ลักษณะการทำงานของ resizeableActivity แอตทริบิวต์ของไฟล์ Manifest ก็มีการเปลี่ยนแปลงด้วย หากแอปตั้งค่า resizeableActivity=false ใน Android 10 (API ระดับ 29) ขึ้นไป ระบบอาจให้โหมดความเข้ากันได้ เมื่อขนาดหน้าจอที่พร้อมใช้งานเปลี่ยนไป หรือหากแอปย้ายจากหน้าจอหนึ่งไปยัง อีกรายการ

แอปสามารถใช้ android:minAspectRatio ซึ่งเปิดตัวใน Android 10 เพื่อระบุหน้าจอ อัตราส่วนที่แอปของคุณรองรับด้วย

เครื่องมือจำลองของ Android Studio เริ่มตั้งแต่เวอร์ชัน 3.5 รวม 7.3 นิ้ว และ 8 นิ้ว อุปกรณ์เสมือนสำหรับการทดสอบโค้ดกับหน้าจอขนาดใหญ่ขึ้น

ดูข้อมูลเพิ่มเติมได้ที่ออกแบบแอปสำหรับอุปกรณ์แบบพับได้