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

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 ควรปฏิบัติตาม Private DNS API โดยเฉพาะอย่างยิ่ง แอปควรตรวจสอบว่าหากรีโซลเวอร์ของระบบใช้ DNS-over-TLS ไคลเอ็นต์ DNS ในตัวจะใช้ DNS ที่เข้ารหัสกับชื่อโฮสต์เดียวกับระบบ หรือปิดใช้เพื่อสนับสนุนรีโซลเวอร์ของระบบ

การเปลี่ยนแปลงด้านความปลอดภัยของเฟรมเวิร์ก

Android 9 มีการเปลี่ยนแปลงลักษณะการทำงานหลายอย่างที่ปรับปรุงความปลอดภัยของแอป แต่การเปลี่ยนแปลงเหล่านี้จะมีผลก็ต่อเมื่อแอปกำหนดเป้าหมายเป็น API ระดับ 28 ขึ้นไปเท่านั้น

TLS ของเครือข่ายเปิดใช้งานโดยค่าเริ่มต้น

หากแอปกำหนดเป้าหมายเป็น Android 9 ขึ้นไป isCleartextTrafficPermitted() เมธอดจะแสดง false โดยค่าเริ่มต้น หากแอปต้องเปิดใช้ข้อความธรรมดาสําหรับโดเมนที่เฉพาะเจาะจง คุณต้องตั้งค่า cleartextTrafficPermitted เป็น true อย่างชัดเจนสําหรับโดเมนเหล่านั้นในการกําหนดค่าความปลอดภัยของเครือข่ายของแอป

ไดเรกทอรีข้อมูลแบบเว็บที่แยกตามกระบวนการ

แอปไม่สามารถแชร์ไดเรกทอรีข้อมูล WebView รายการเดียวในกระบวนการหลายรายการเพื่อปรับปรุงความเสถียรของแอปและรักษาความสมบูรณ์ของข้อมูลใน Android 9 โดยทั่วไป ไดเรกทอรีข้อมูลดังกล่าวจะจัดเก็บคุกกี้ แคช HTTP และข้อมูลถาวรอื่นๆ ที่จัดเก็บข้อมูลชั่วคราวที่เกี่ยวข้องกับการท่องเว็บ

ในกรณีส่วนใหญ่ แอปของคุณควรใช้คลาสจาก แพ็กเกจ android.webkit เช่น ในชื่อ WebView และ CookieManager รายการเดียว ขั้นตอนได้ เช่น ควรย้ายทั้งหมด Activity ออบเจ็กต์ที่ใช้ WebView เข้าสู่กระบวนการเดียวกัน คุณสามารถบังคับใช้กฎ "1 กระบวนการเท่านั้น" อย่างเข้มงวดมากขึ้นได้ด้วยการเรียกใช้ 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 เป็นต้นไป ระบบจะนำไลบรารีดังกล่าวออกจากบูตคลาสพาธ และไม่พร้อมให้บริการแก่แอปโดยค่าเริ่มต้น

หากต้องการใช้ไคลเอ็นต์ Apache HTTP ต่อไป แอปที่กำหนดเป้าหมายเป็น Android 9 ขึ้นไป สามารถเพิ่มรายการต่อไปนี้ใน AndroidManifest.xml ได้

<uses-library android:name="org.apache.http.legacy" android:required="false"/>

นอกจากจะใช้ไลบรารี Apache แบบรันไทม์แล้ว แอปยังสามารถรวม เวอร์ชันของตัวเองของไลบรารี org.apache.http ใน APK ของตน หากทำเช่นนี้ คุณจะต้องแพ็กเกจไลบรารีอีกครั้ง (โดยใช้ยูทิลิตีอย่าง Jar Jar) เพื่อหลีกเลี่ยงปัญหาความเข้ากันได้ของคลาสกับคลาสที่ระบุไว้ในรันไทม์

การเปลี่ยนแปลง UI

ดูโฟกัส

มุมมองที่มีพื้นที่ 0 (ความกว้างหรือความสูงเป็น 0) จะโฟกัสไม่ได้อีกต่อไป

นอกจากนี้ กิจกรรมจะไม่กำหนดจุดโฟกัสเริ่มต้นใน โหมดสัมผัส แต่คุณจะต้องขอโฟกัสเริ่มต้นอย่างชัดเจนหากต้องการ

การจัดการค่าฐาน 16 ของ RGBA ใน CSS

แอปที่กำหนดเป้าหมายเป็น Android 9 ขึ้นไปต้องเปิดใช้ฉบับร่าง โมดูลสี CSS ระดับ 4 การจัดการสี CSS แบบ 4 และ 8 หลัก

Chrome รองรับข้อบังคับของสี CSS ระดับ 4 มาตั้งแต่รุ่น 52 แต่ปัจจุบัน WebView ปิดใช้ฟีเจอร์นี้เนื่องจากพบว่าแอปพลิเคชัน Android ที่มีอยู่มีสีฐาน 16 บิต 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 เป้าหมาย หากต้องการเข้าถึงค่าการเลื่อนในวิวพอร์ต ให้ใช้ document.scrollingElement หากมี

การแจ้งเตือนจากแอปที่ถูกระงับ

ก่อนหน้านี้ใน Android 9 ระบบจะยกเลิกการแจ้งเตือนจากแอปที่ถูกระงับ เริ่มตั้งแต่ Android 9 ระบบจะซ่อนการแจ้งเตือนจากแอปที่ถูกระงับจนกว่า แอปจะทำงานต่อ