Android 9 (API ระดับ 28) มีการเปลี่ยนแปลงหลายอย่างในระบบ Android
การเปลี่ยนแปลงลักษณะการทำงานต่อไปนี้จะมีผลเฉพาะกับแอปที่กำหนดเป้าหมายเป็น
API ระดับ 28 ขึ้นไป แอปที่ตั้งค่า targetSdkVersion เป็น API ระดับ 28 ขึ้นไปต้องแก้ไขแอปเพื่อรองรับลักษณะการทำงานเหล่านี้อย่างเหมาะสมในกรณีที่เกี่ยวข้องกับแอป
ดูการเปลี่ยนแปลงที่มีผลกับแอปทั้งหมดที่ทำงานบน Android 9 ไม่ว่าแอปจะกำหนดเป้าหมายเป็น API ระดับใดก็ตามได้ที่การเปลี่ยนแปลงลักษณะการทำงาน: แอปทั้งหมด
บริการที่ทำงานอยู่เบื้องหน้า
แอปที่กำหนดเป้าหมายเป็น Android 9 ขึ้นไปและใช้บริการที่ทำงานอยู่เบื้องหน้าต้องขอสิทธิ์
FOREGROUND_SERVICE
นี่คือสิทธิ์ปกติ
ระบบจึงให้สิทธิ์นี้แก่แอปที่ขอโดยอัตโนมัติ
หากแอปที่กำหนดเป้าหมายเป็น Android 9 ขึ้นไปพยายามสร้างบริการที่ทำงานอยู่เบื้องหน้าโดยไม่ขอ
FOREGROUND_SERVICE
ระบบจะแสดง SecurityException
การเปลี่ยนแปลงด้านความเป็นส่วนตัว
หากแอปกำหนดเป้าหมายเป็น Android 9 คุณควรคำนึงถึงการเปลี่ยนแปลงลักษณะการทำงานต่อไปนี้ การอัปเดตข้อมูลอนุกรมของอุปกรณ์และ DNS เหล่านี้ ช่วยเพิ่มความเป็นส่วนตัวของผู้ใช้
การเลิกใช้งานหมายเลขซีเรียลของบิลด์
ใน Android 9 Build.SERIAL จะ
ตั้งค่าเป็น "UNKNOWN" เสมอเพื่อปกป้องความเป็นส่วนตัวของผู้ใช้
หากแอปต้องเข้าถึงหมายเลขซีเรียลของฮาร์ดแวร์ของอุปกรณ์ คุณควรขอสิทธิ์
READ_PHONE_STATE
แทน แล้วเรียกใช้
getSerial()
ความเป็นส่วนตัวของ DNS
แอปที่กำหนดเป้าหมายเป็น Android 9 ควรใช้ API ของ DNS ส่วนตัว โดยเฉพาะอย่างยิ่ง แอปควรตรวจสอบว่าหากรีโซลเวอร์ของระบบใช้ DNS-over-TLS ไคลเอ็นต์ DNS ในตัวจะต้องใช้ DNS ที่เข้ารหัสไปยังชื่อโฮสต์เดียวกันกับระบบ หรือปิดใช้เพื่อใช้รีโซลเวอร์ของระบบ
การเปลี่ยนแปลงด้านความปลอดภัยของเฟรมเวิร์ก
Android 9 มีการเปลี่ยนแปลงลักษณะการทำงานหลายอย่างที่ช่วยปรับปรุงความปลอดภัยของแอป แต่การเปลี่ยนแปลงเหล่านี้จะมีผลก็ต่อเมื่อแอปกำหนดเป้าหมายเป็น API ระดับ 28 ขึ้นไป
เปิดใช้ TLS ของเครือข่ายโดยค่าเริ่มต้น
หากแอปกำหนดเป้าหมายเป็น Android 9 ขึ้นไป เมธอด
isCleartextTrafficPermitted()
จะแสดงผล false โดยค่าเริ่มต้น หากแอปต้องเปิดใช้ข้อความธรรมดาสำหรับโดเมนที่เฉพาะเจาะจง คุณต้องตั้งค่า cleartextTrafficPermitted เป็น true
อย่างชัดเจนสำหรับโดเมนเหล่านั้นในการกำหนดค่าความปลอดภัยของเครือข่ายของแอป
ไดเรกทอรีข้อมูลบนเว็บที่แยกตามกระบวนการ
เพื่อปรับปรุงความเสถียรของแอปและความสมบูรณ์ของข้อมูลใน Android 9 แอปจึงไม่สามารถ
แชร์ไดเรกทอรีข้อมูล WebView เดียว
ในหลายกระบวนการ โดยปกติแล้ว
ไดเรกทอรีข้อมูลดังกล่าวจะจัดเก็บคุกกี้ แคช HTTP และพื้นที่เก็บข้อมูลแบบถาวรและ
ชั่วคราวอื่นๆ ที่เกี่ยวข้องกับการท่องเว็บ
ในกรณีส่วนใหญ่ แอปควรใช้คลาสจากแพ็กเกจ
android.webkit เช่น WebView และ
CookieManager ในกระบวนการเดียวเท่านั้น เช่น คุณควรย้ายออบเจ็กต์ทั้งหมดที่ใช้ WebView
Activity ไปยังกระบวนการเดียวกัน คุณบังคับใช้กฎ "กระบวนการเดียวเท่านั้น" ได้อย่างเข้มงวดมากขึ้น
โดยการเรียกใช้
disableWebView() ใน
กระบวนการอื่นๆ ของแอป การเรียกนี้จะป้องกันไม่ให้มีการเริ่มต้น WebView
ในกระบวนการอื่นๆ เหล่านั้นโดยไม่ได้ตั้งใจ แม้ว่าจะมีการเรียกจากไลบรารีที่ขึ้นต่อกัน
ก็ตาม
หากแอปต้องใช้อินสแตนซ์ของ
WebView ในกระบวนการมากกว่า 1 รายการ
คุณต้องกำหนดคำต่อท้ายไดเรกทอรีข้อมูลที่ไม่ซ้ำกันสำหรับแต่ละกระบวนการโดยใช้วิธี
WebView.setDataDirectorySuffix()
ก่อนที่จะใช้อินสแตนซ์ของ WebView ในกระบวนการนั้น วิธีนี้
จะวางข้อมูลเว็บจากแต่ละกระบวนการไว้ในไดเรกทอรีของตัวเองภายในไดเรกทอรีข้อมูลของแอป
โดเมน SELinux ต่อแอป
แอปที่กำหนดเป้าหมายเป็น Android 9 ขึ้นไปจะแชร์ข้อมูลกับแอปอื่นๆ โดยใช้ สิทธิ์ Unix ที่เข้าถึงได้ทั่วโลกไม่ได้ การเปลี่ยนแปลงนี้ช่วยปรับปรุงความสมบูรณ์ของ Android Application Sandbox โดยเฉพาะข้อกำหนดที่ว่าแอปต้องเข้าถึง ข้อมูลส่วนตัวได้ เฉพาะแอปนั้นๆ
หากต้องการแชร์ไฟล์กับแอปอื่น ให้ใช้ผู้ให้บริการ เนื้อหา
การเปลี่ยนแปลงด้านการเชื่อมต่อ
การนับข้อมูลการเชื่อมต่อและหลายเส้นทาง
ภายในแอปที่กำหนดเป้าหมายเป็น Android 9 ขึ้นไป ระบบจะนับ
การรับส่งข้อมูลเครือข่ายในเครือข่าย
ที่ไม่ใช่ค่าเริ่มต้นปัจจุบัน เช่น การรับส่งข้อมูลเซลลูลาร์ขณะที่อุปกรณ์ใช้
Wi-Fi และมีเมธอดในคลาส
NetworkStatsManager
เพื่อค้นหาการรับส่งข้อมูลดังกล่าว
โดยเฉพาะอย่างยิ่ง
getMultipathPreference()
ตอนนี้จะแสดงค่าตามการเข้าชมเครือข่ายที่กล่าวถึงข้างต้น ตั้งแต่ Android 9 เป็นต้นไป เมธอดจะแสดงผล true สำหรับข้อมูลมือถือ แต่เมื่อมีการเข้าชมสะสมในวันหนึ่งๆ มากกว่าจำนวนหนึ่ง ระบบจะเริ่มแสดงผล false แอปที่ทำงานบน Android 9 ต้องเรียกใช้เมธอดและปฏิบัติตามคำแนะนำนี้
ตอนนี้คลาส ConnectivityManager.NetworkCallback
จะส่งข้อมูลเกี่ยวกับ VPN ไปยังแอปแล้ว การเปลี่ยนแปลงนี้ช่วยให้แอปรับฟังเหตุการณ์การเชื่อมต่อได้ง่ายขึ้นมาก
โดยไม่ต้องผสมการเรียกแบบซิงโครนัสและ
แบบอะซิงโครนัส และใช้ API ที่จำกัด นอกจากนี้ ยังหมายความว่า
การโอนข้อมูลจะทำงานตามที่คาดไว้เมื่ออุปกรณ์เชื่อมต่อกับเครือข่าย
Wi-Fi หลายเครือข่ายหรือเครือข่ายมือถือหลายเครือข่ายพร้อมกัน
การเลิกใช้งานไคลเอ็นต์ HTTP ของ Apache
ใน Android 6.0 เราได้นำการรองรับไคลเอ็นต์ HTTP ของ Apache ออก ตั้งแต่ Android 9 เป็นต้นไป ระบบจะนำไลบรารีดังกล่าวออกจาก bootclasspath และแอปจะเข้าถึงไม่ได้โดยค่าเริ่มต้น
หากต้องการใช้ไคลเอ็นต์ Apache HTTP ต่อไป แอปที่กำหนดเป้าหมายเป็น Android 9 ขึ้นไป
สามารถเพิ่มข้อมูลต่อไปนี้ลงใน AndroidManifest.xml ได้
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
แอปสามารถรวมorg.apache.httpเวอร์ชันของตนเองไว้ใน APK เพื่อใช้แทนการใช้ไลบรารี Apache ในรันไทม์ หากทำเช่นนี้
คุณต้องแพ็กเกจไลบรารีใหม่ (ด้วยยูทิลิตี เช่น Jar Jar) เพื่อหลีกเลี่ยงปัญหาความเข้ากันได้ของคลาส
กับคลาสที่ให้ไว้ในรันไทม์
การเปลี่ยนแปลง UI
ดูโฟกัส
มุมมองที่มีพื้นที่เป็น 0 (ความกว้างหรือความสูงเป็น 0) จะโฟกัสไม่ได้อีกต่อไป
นอกจากนี้ กิจกรรมต่างๆ จะไม่กำหนดโฟกัสเริ่มต้นโดยนัยใน โหมดแตะอีกต่อไป แต่คุณต้องขอโฟกัสเริ่มต้นอย่างชัดเจนหากต้องการ
การจัดการค่าเลขฐาน 16 ของ RGBA ใน CSS
แอปที่กำหนดเป้าหมายเป็น Android 9 ขึ้นไปต้องเปิดใช้ลักษณะการทำงานของ โมดูลสี CSS ระดับ 4 ฉบับร่างสำหรับการจัดการสี CSS ที่มีตัวเลขฐานสิบหก 4 และ 8 หลัก
Chrome รองรับโมดูลสี CSS ระดับ 4 ตั้งแต่เวอร์ชัน 52 แต่ปัจจุบัน WebView ปิดใช้ฟีเจอร์นี้ เนื่องจากพบว่าแอปพลิเคชัน Android ที่มีอยู่มีสีเลขฐานสิบหกแบบ 32 บิต ในการจัดเรียงของ Android (ARGB) ซึ่งจะทำให้เกิดข้อผิดพลาดในการแสดงผล
เช่น ปัจจุบันสี #80ff8080 จะแสดงใน WebView เป็นสีแดงอ่อนแบบทึบ (#ff8080) สำหรับแอปที่กำหนดเป้าหมายเป็น API ระดับ 27 หรือต่ำกว่า ระบบจะเพิกเฉยต่อ
คอมโพเนนต์นำ (ซึ่ง Android จะตีความเป็นคอมโพเนนต์อัลฟ่า)
ในขณะนี้ หากแอปกำหนดเป้าหมายเป็น API ระดับ 28 ขึ้นไป #80ff8080 จะ
ตีความเป็นสีเขียวอ่อนโปร่งแสง 50% (#80ff80)
การดมกลิ่นประเภท MIME สำหรับ URI ของไฟล์
Android เวอร์ชันก่อนหน้า Android 9 สามารถอนุมานประเภท MIME จากเนื้อหาของไฟล์ได้
ตั้งแต่ Android 9 (API ระดับ 28) เป็นต้นไป แอปต้องใช้
นามสกุลไฟล์ที่ถูกต้องเมื่อโหลด file: URI ใน
WebView
การใช้เนื้อหาไฟล์เพื่ออนุมานประเภท MIME อาจเป็นแหล่งที่มาของข้อบกพร่องด้านความปลอดภัย และโดยทั่วไปแล้วเบราว์เซอร์สมัยใหม่ไม่อนุญาตให้ทำเช่นนี้
หากไฟล์มีนามสกุลไฟล์ที่ระบบรู้จัก เช่น .html,
.txt, .js หรือ .css ระบบจะกำหนดประเภท MIME ตามนามสกุล
หากไฟล์ไม่มีนามสกุลหรือมีนามสกุลที่ไม่รู้จัก ประเภท MIME จะเป็นข้อความธรรมดา
เช่น URI อย่าง file:///sdcard/test.html จะแสดงเป็น HTML แต่ URI อย่าง file:///sdcard/test จะแสดงเป็นข้อความธรรมดา
แม้ว่าไฟล์จะมีข้อมูล HTML ก็ตาม
องค์ประกอบการเลื่อนเอกสาร
Android 9 จัดการกรณีที่องค์ประกอบรูทของเอกสารเป็นองค์ประกอบการเลื่อนได้อย่างถูกต้อง ในเวอร์ชันก่อนหน้า ตำแหน่งการเลื่อนจะตั้งค่าในองค์ประกอบ body และ องค์ประกอบรากจะมีค่าการเลื่อนเป็น 0 Android 9 เปิดใช้ลักษณะการทำงานที่เป็นไปตามมาตรฐานซึ่งองค์ประกอบการเลื่อนคือองค์ประกอบรูท
นอกจากนี้ การเข้าถึง document.body.scrollTop, document.body.scrollLeft,
document.documentElement.scrollTop หรือ document.documentElement.scrollLeft โดยตรง
จะทํางานแตกต่างกันไปตาม SDK เป้าหมาย หากต้องการเข้าถึงค่าการเลื่อน Viewport
ให้ใช้ document.scrollingElement หากมี
การแจ้งเตือนจากแอปที่ถูกระงับ
ก่อน Android 9 ระบบจะยกเลิกการแจ้งเตือนจากแอปที่ถูกระงับ ตั้งแต่ Android 9 เป็นต้นไป ระบบจะซ่อนการแจ้งเตือนจากแอปที่ถูกระงับจนกว่า แอปจะกลับมาทำงานอีกครั้ง