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

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

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

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

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

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

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

ในกรณีส่วนใหญ่ แอปของคุณควรใช้คลาสจาก แพ็กเกจ android.webkit เช่น ในชื่อ WebView และ CookieManager รายการเดียว ขั้นตอนได้ เช่น ควรย้ายทั้งหมด Activity ออบเจ็กต์ที่ใช้ WebView เข้าสู่กระบวนการเดียวกัน คุณสามารถบังคับใช้ "กระบวนการเดียวเท่านั้น" อย่างเคร่งครัดยิ่งขึ้น กฎ โดยการโทร disableWebView() นิ้ว กระบวนการอื่นๆ ของแอป การเรียกนี้ป้องกันไม่ให้ WebView เริ่มต้น ในกระบวนการอื่นๆ เหล่านั้นโดยไม่ได้ตั้งใจ แม้ว่าจะถูกเรียกจาก ไลบรารี

หากแอปต้องใช้อินสแตนซ์ของ WebView มากกว่า 1 กระบวนการ คุณต้องกำหนดคำต่อท้ายไดเรกทอรีข้อมูลที่ไม่ซ้ำกันสำหรับแต่ละกระบวนการโดยใช้ฟังก์ชัน WebView.setDataDirectorySuffix() ก่อนใช้อินสแตนซ์ที่กำหนดของ WebView ในกระบวนการนั้น วิธีนี้ วางข้อมูลเว็บจากแต่ละกระบวนการไว้ในไดเรกทอรีของตนเองภายในข้อมูลของแอป ไดเรกทอรี

โดเมน SELinux ต่อแอป

แอปที่กำหนดเป้าหมายเป็น Android 9 ขึ้นไปไม่สามารถแชร์ข้อมูลกับแอปอื่นๆ โดยใช้ สิทธิ์ Unix ที่สามารถเข้าถึงได้ทั่วโลก การเปลี่ยนแปลงนี้จะช่วยเพิ่มความสมบูรณ์ของ Android Application Sandbox โดยเฉพาะอย่างยิ่งข้อกำหนดที่ว่า เข้าถึงข้อมูลส่วนตัวได้ จากแอปนั้นเท่านั้น

หากต้องการแชร์ไฟล์กับแอปอื่นๆ ให้ใช้เนื้อหา ผู้ให้ทุน

การเปลี่ยนแปลงการเชื่อมต่อ

การนับข้อมูลการเชื่อมต่อและหลายเส้นทาง

ภายในแอปที่กำหนดเป้าหมายเป็น Android 9 ขึ้นไป ระบบจะนับจำนวน การจราจรของข้อมูลในเครือข่าย ที่ไม่ใช่ค่าเริ่มต้นในปัจจุบัน เช่น การเข้าชมผ่านเครือข่ายมือถือขณะที่อุปกรณ์เปิดอยู่ Wi-Fi และให้บริการใน NetworkStatsManager ระดับการค้นหาสำหรับการเข้าชมนั้น

โดยเฉพาะอย่างยิ่ง getMultipathPreference() จะแสดงค่าตามการจราจรของข้อมูลในเครือข่ายที่กล่าวไว้ข้างต้น เริ่มต้นด้วย Android 9 เมธอดจะแสดง true สำหรับข้อมูลเซลล์ แต่เมื่อมีข้อมูลมากกว่าจำนวนเงินที่กำหนด มีการเข้าชมสะสมใน 1 วัน และจะเริ่มกลับมาอีก false แอปที่ทำงานอยู่ Android 9 ต้องเรียกใช้เมธอดและใช้คำแนะนำนี้

ConnectivityManager.NetworkCallback ตอนนี้คลาสจะส่งข้อมูลเกี่ยวกับ VPN ไปยังแอป การเปลี่ยนแปลงนี้ ทำให้ทุกอย่างง่ายขึ้น แอปสำหรับฟังเหตุการณ์การเชื่อมต่อโดยไม่ต้องผสมผสานแบบซิงโครนัสและ การเรียกแบบไม่พร้อมกันและการใช้ API ที่จำกัด และยังหมายความว่า การโอนข้อมูลจะทำงานตามที่คาดไว้เมื่อเชื่อมต่ออุปกรณ์กับ เครือข่าย Wi-Fi หรือเครือข่ายมือถือหลายเครือข่ายพร้อมกัน

การเลิกใช้งานไคลเอ็นต์ Apache HTTP

ด้วย Android 6.0 เราได้นำการรองรับไคลเอ็นต์ Apache HTTP ออก ตั้งแต่ Android 9 เป็นต้นไป ระบบจะนำไลบรารีดังกล่าวออกจาก Bootclasspath และใช้กับแอปไม่ได้โดยค่าเริ่มต้น

หากต้องการใช้ไคลเอ็นต์ 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) ได้อีกต่อไป

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

การจัดการค่าเลขฐานสิบหก RGBA ของ CSS

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

โมดูลสี CSS ระดับ 4 ได้รับการรองรับโดย Chrome ตั้งแต่รุ่น 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) ต้องใช้ แก้ไขนามสกุลไฟล์เมื่อโหลด URI file: ใน WebView

การใช้เนื้อหาของไฟล์เพื่ออนุมานประเภท MIME อาจเป็นข้อบกพร่องด้านความปลอดภัย และเบราว์เซอร์ที่ทันสมัยมักไม่อนุญาต

หากไฟล์มีนามสกุลไฟล์ที่รู้จัก เช่น .html .txt, .js หรือ .css ประเภท MIME จะกำหนดโดยส่วนขยาย หากไฟล์ไม่มีนามสกุลหรือนามสกุลที่ไม่รู้จัก ประเภท MIME จะเป็นแบบธรรมดา ข้อความ

ตัวอย่างเช่น URI เช่น file:///sdcard/test.html จะแสดงผลเป็น HTML แต่ URI เช่น file:///sdcard/test จะแสดงผลเป็นข้อความธรรมดา แม้ว่าไฟล์จะมีข้อมูล HTML ก็ตาม

องค์ประกอบการเลื่อนเอกสาร

Android 9 จะจัดการกรณีที่รูทเอกสารได้อย่างถูกต้อง คือเอลิเมนต์แบบเลื่อน เวอร์ชันก่อนหน้ามีการตั้งค่าตำแหน่งการเลื่อนในองค์ประกอบเนื้อหา และ องค์ประกอบรากมีค่าการเลื่อนเป็น 0 Android 9 จะเปิดใช้ ลักษณะการทำงานที่สอดคล้องกับมาตรฐานโดยที่องค์ประกอบแบบเลื่อนเป็นรูท

นอกจากนี้ การเข้าถึง document.body.scrollTop, document.body.scrollLeft โดยตรง document.documentElement.scrollTop หรือ document.documentElement.scrollLeft จะทำงานแตกต่างกันไปตาม SDK เป้าหมาย วิธีเข้าถึงการเลื่อนวิวพอร์ต ให้ใช้ document.scrollingElement หากมี

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

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