คู่มือนี้อธิบายถึงประโยชน์ของไลบรารี Jetpack Webkit อธิบายวิธีการทำงาน และวิธีที่คุณสามารถนำไปใช้ในโปรเจ็กต์
ภาพรวม
WebView เป็นส่วนสำคัญของการพัฒนา Android แต่บางครั้งก็จัดการได้ยากเนื่องจากฟีเจอร์ต่างๆ ไม่สอดคล้องกันในระบบปฏิบัติการ Android เวอร์ชันต่างๆ Android OS แต่ละเวอร์ชันมีชุด WebView API ที่กำหนดไว้ เนื่องจาก Android มีการเผยแพร่ในอัตราที่ช้ากว่า WebView ดังนั้น Android API จึงอาจไม่ครอบคลุมฟีเจอร์ WebView ที่มีทั้งหมด ซึ่งทำให้การเปิดตัวฟีเจอร์ช้าลงและค่าใช้จ่ายในการทดสอบเพิ่มขึ้น
Jetpack Webkit แก้ปัญหาเหล่านี้ด้วยการทำหน้าที่เป็นเลเยอร์ความเข้ากันได้และใช้ประโยชน์จาก WebView APK ที่อัปเดตล่าสุดในอุปกรณ์ของผู้ใช้ นอกจากนี้ยังมี API ใหม่และทันสมัยที่พร้อมใช้งานในไลบรารีนี้เท่านั้น
เหตุผลที่ควรใช้ Jetpack Webkit
นอกเหนือจากการมอบความเข้ากันได้ข้ามเวอร์ชันแล้ว Jetpack Webkit ยังมี API ใหม่และทันสมัยที่ช่วยลดความซับซ้อนในการพัฒนาและปรับปรุงฟังก์ชันการทำงานของแอปได้ด้วย ดังนี้
เปิดใช้การตรวจสอบสิทธิ์แบบใหม่: WebView สามารถจัดการมาตรฐานการตรวจสอบสิทธิ์ผ่านเว็บแบบใหม่ เช่น WebAuthn ได้อย่างราบรื่น ซึ่งช่วยให้ลงชื่อเข้าใช้ด้วยพาสคีย์ได้ ไลบรารี
androidx.webkitช่วยให้คุณควบคุมการผสานรวมนี้ได้อย่างเต็มที่ โดยใช้วิธีWebSettingsCompat.setWebAuthenticationSupportซึ่ง คุณสามารถใช้เพื่อกำหนดระดับการสนับสนุนที่แอปต้องการได้ปรับปรุงประสิทธิภาพ: ปรับแต่งประสิทธิภาพของ WebView โดยใช้ API เช่น เช่น
setBackForwardCacheEnabledหรือลดเวลาในการตอบสนองของการนำทางโดยใช้ API การโหลดแบบคาดเดา เช่นprefetchUrlAsyncและprerenderUrlAsyncดูข้อมูลเพิ่มเติมได้ที่การโหลดแบบคาดเดาใน WebViewเพิ่มความเสถียร: กู้คืนกระบวนการแสดงผลที่หยุดทำงานหรือไม่ตอบสนอง โดยไม่ทำให้เกิดข้อขัดข้อง ดูข้อมูลเพิ่มเติมได้ที่
WebViewRenderProcess#terminateควบคุมข้อมูลการท่องเว็บได้อย่างละเอียด: หากต้องการลบข้อมูลการท่องเว็บที่ WebView จัดเก็บไว้ สำหรับต้นทางที่เฉพาะเจาะจง ให้ใช้คลาส
WebStorageCompatมอบการนำทางหน้าเว็บที่ปรับปรุงแล้ว: แทนที่
WebView.loadUrlด้วยWebViewCompat.navigateเพื่อการควบคุมการนำทางอย่างละเอียด การแทนที่รายการประวัติ การรองรับส่วนหัวของสถานะที่บันทึกไว้ และการติดตามวงจรที่สัมพันธ์กัน โดยใช้NavigationListenerดูข้อมูลเพิ่มเติมได้ที่ การนำทางหน้าเว็บที่ปรับปรุงแล้ว ด้วย WebViewCompat.navigateเพิ่มประสิทธิภาพการจัดการสถานะ: ป้องกัน
TransactionTooLargeExceptionโดยการกำหนดขีดจำกัดไบต์สูงสุดระหว่างการซีเรียลไลซ์สถานะ ดูข้อมูลเพิ่มเติมได้ที่ จัดการสถานะ WebView อย่างมีประสิทธิภาพ
ทำความเข้าใจคอมโพเนนต์ต่างๆ
หากต้องการใช้ Jetpack Webkit อย่างมีประสิทธิภาพ คุณต้องทำความเข้าใจความสัมพันธ์ระหว่างคอมโพเนนต์ต่อไปนี้
Android System WebView: เป็นเอนจินการแสดงผลที่อิงตาม Chromium ซึ่ง Google อัปเดตเป็นประจำผ่าน Google Play Store ในอัตราเดียวกับ Chrome โดยมีฟีเจอร์ที่ทันสมัยที่สุดและมีโค้ดการใช้งานพื้นฐานสำหรับ WebView API ทั้งหมด
Framework API (
android.webkit): เป็น API ที่กำหนดไว้สำหรับ Android OS เวอร์ชันที่เฉพาะเจาะจง ตัวอย่างเช่น แอปใน Android 10 จะเข้าถึงได้เฉพาะ API ที่พร้อมใช้งานเมื่อมีการเผยแพร่เวอร์ชันนั้น ดังนั้นจึงไม่สามารถใช้ฟีเจอร์ใหม่ที่เพิ่มลงใน WebView APK ในการอัปเดตล่าสุดได้ ตัวอย่างเช่น หากต้องการ จัดการตัวแสดงผลที่ไม่ตอบสนองด้วยWebView#getWebViewRenderProcess()คุณจะเรียกใช้ฟังก์ชันนี้ได้ใน Android 10 ขึ้นไปเท่านั้นไลบรารี Jetpack Webkit (
androidx.webkit): เป็นไลบรารีขนาดเล็กที่รวมอยู่ในแอปพลิเคชัน ไลบรารีนี้ทำหน้าที่เป็นสะพานที่เรียกใช้ WebView APK แทนที่จะเรียกใช้ API ที่กำหนดไว้ในแพลตฟอร์ม Android ซึ่งมี OS เวอร์ชันที่กำหนดไว้ วิธีนี้จะช่วยให้แอปพลิเคชันใช้ฟีเจอร์ WebView ล่าสุดได้แม้ว่าจะติดตั้งในอุปกรณ์ที่ใช้ OS เวอร์ชันเก่า เช่น Android 10 ตัวอย่างเช่น,WebViewCompat.getWebViewRenderProcess()ทำงานคล้ายกับ Framework API ยกเว้นว่าฟังก์ชันนี้ยังเรียกใช้ได้ใน OS ทุกเวอร์ชันก่อน Android 10
หาก API พร้อมใช้งานทั้งใน Framework และ Jetpack Webkit เราขอแนะนำให้คุณเลือกเวอร์ชัน Jetpack Webkit ซึ่งจะช่วยให้มั่นใจได้ถึงลักษณะการทำงานและความเข้ากันได้ที่สอดคล้องกันในอุปกรณ์ที่หลากหลายที่สุด
การโต้ตอบระหว่าง Jetpack Webkit กับ APK
API ใน Jetpack Webkit มีการใช้งาน 2 ส่วน ดังนี้
Static Jetpack Webkit: ไลบรารี Static Jetpack Webkit มี โค้ดส่วนน้อยที่รับผิดชอบในการใช้งาน API
WebView APK: WebView APK มีโค้ดส่วนใหญ่
แอปของคุณจะเรียกใช้ Jetpack Webkit API ซึ่งจะเรียกใช้ WebView APK
แม้ว่าคุณจะควบคุมเวอร์ชัน Jetpack Webkit ในแอปได้ แต่คุณก็ไม่สามารถควบคุมการอัปเดต WebView APK ในอุปกรณ์ของผู้ใช้ได้ โดยทั่วไป ผู้ใช้ส่วนใหญ่จะมี WebView APK เวอร์ชันล่าสุด แต่แอปของคุณยังคงต้องระมัดระวังไม่ให้เรียกใช้ API ที่ WebView APK เวอร์ชันนั้นไม่รองรับ
นอกจากนี้ Jetpack Webkit ยังช่วยลดความซับซ้อนในการตรวจสอบเวอร์ชัน WebView ด้วยตนเอง
หากต้องการตรวจสอบว่าฟีเจอร์พร้อมใช้งานหรือไม่ ให้ตรวจสอบค่าคงที่ของฟีเจอร์นั้น เช่น
เช่น, WebViewFeature.WEB_AUTHENTICATION.
วิธีการทำงานร่วมกัน
Jetpack Webkit ช่วยลดช่องว่างระหว่าง Static Framework API กับ WebView APK ที่อัปเดตบ่อยๆ เมื่อคุณใช้ Jetpack Webkit API กับรูปแบบการตรวจหาฟีเจอร์ ไลบรารีจะตรวจสอบว่า WebView APK ที่ติดตั้งในอุปกรณ์ของผู้ใช้รองรับฟีเจอร์นั้นหรือไม่ ซึ่งมีประโยชน์ตรงที่คุณไม่จำเป็นต้องตรวจสอบเวอร์ชันระบบปฏิบัติการ Android (Framework)
หาก WebView APK เป็นเวอร์ชันที่ใหม่พอ ไลบรารีจะเรียกใช้ฟีเจอร์นั้น หากไม่ใช่ ไลบรารีจะรายงานว่าฟีเจอร์ไม่พร้อมใช้งาน ซึ่งจะป้องกันไม่ให้แอปขัดข้องและช่วยให้คุณจัดการสถานการณ์ได้อย่างราบรื่น
เปรียบเทียบ Jetpack Webkit กับ Framework API
ส่วนนี้จะเปรียบเทียบวิธีการใช้งานที่มีและไม่มีไลบรารี Jetpack Webkit
เปิดใช้การตรวจสอบสิทธิ์แบบใหม่ (WebAuthn)
ไม่มี Jetpack Webkit
ทำไม่ได้ผ่าน Framework API
มี Jetpack Webkit
ใช้ประโยชน์จาก WebViewFeature.WEB_AUTHENTICATION สำหรับการตรวจสอบความเข้ากันได้
if (WebViewFeature.isFeatureSupported(WebViewFeature.WEB_AUTHENTICATION)) {
WebSettingsCompat.setWebAuthenticationSupport(
webView.settings,
WebSettingsCompat.WEB_AUTHENTICATION_SUPPORT_FOR_APP
)
}
ลบข้อมูลสำหรับต้นทาง (พื้นที่เก็บข้อมูลเฉพาะเว็บไซต์)
ไม่มี Jetpack Webkit
ไม่มี API โดยตรงเพื่อล้างข้อมูลต้นทางที่เฉพาะเจาะจง มักจะต้องล้างข้อมูลทั้งหมด
มี Jetpack Webkit
ใช้ API ความเข้ากันได้เพื่อลบข้อมูลอย่างแม่นยำ คุณสามารถใช้ตัวเลือกใดตัวเลือกหนึ่งต่อไปนี้
WebStorageCompat.getInstance().deleteBrowsingData()
หรือ
WebStorageCompat.getInstance().deleteBrowsingDataForSite()
รับเวอร์ชัน WebView
ไม่มี Jetpack Webkit
ใช้คลาส Framework มาตรฐาน
val webViewPackage = WebView.getCurrentWebViewPackage()
มี Jetpack Webkit
ใช้เลเยอร์ความเข้ากันได้เพื่อการดึงข้อมูลที่ปลอดภัยยิ่งขึ้น
val webViewPackage = WebViewCompat.getCurrentWebViewPackage()
จัดการตัวแสดงผลที่ไม่ตอบสนอง (ไคลเอ็นต์ตัวแสดงผล)
ไม่มี Jetpack Webkit
ใช้วิธี Framework มาตรฐาน
webView.setWebViewRenderProcessClient(myClient)
มี Jetpack Webkit
ใช้ WebViewCompat และการตรวจสอบฟีเจอร์เพื่อตั้งค่าไคลเอ็นต์
if (WebViewFeature.isFeatureSupported(WebViewFeature.WEB_VIEW_RENDERER_CLIENT_BASIC_USAGE)) {
WebViewCompat.setWebViewRenderProcessClient(webView, myClient)
}
ดูคำแนะนำเกี่ยวกับการใช้กลยุทธ์การกู้คืนข้อขัดข้องได้ที่ จัดการการสิ้นสุด WebView ดูรายละเอียด API ได้ที่ androidx.webkit
เอกสารอ้างอิง
จัดการสถานะที่บันทึกไว้และขนาดธุรกรรม
API WebViewCompat.saveState ช่วยให้คุณบังคับใช้ขีดจำกัดไบต์และตัดประวัติการนำทางไปข้างหน้าออกระหว่างการซีเรียลไลซ์ ซึ่งจะป้องกันข้อขัดข้อง TransactionTooLargeException ขณะที่ยังคงเก็บรักษาประวัติการนำทางที่สำคัญไว้
ไม่มี Jetpack Webkit
ใช้วิธี Framework มาตรฐาน ซึ่งจะซีเรียลไลซ์สแต็กการนำทางทั้งหมดโดยไม่มีขีดจำกัดขนาด และอาจทริกเกอร์ TransactionTooLargeException หากเพย์โหลดเกินขีดจำกัดการทำธุรกรรม 1 MB ของ Android
webView.saveState(outState)
มี Jetpack Webkit
ใช้ WebViewCompat เพื่อบังคับใช้ขีดจำกัดไบต์สูงสุดหรือนำรายการการนำทางไปข้างหน้าออก ซึ่งจะป้องกันการล้นธุรกรรม
WebViewCompat.saveState(webView, outState, maxSizeBytes)
ดูข้อมูลเพิ่มเติมได้ที่ จัดการสถานะ WebView อย่างมีประสิทธิภาพ
นำทางหน้าเว็บและติดตามวงจร
หากต้องการนำทางหน้าเว็บที่รองรับการแทนที่รายการประวัติ การรองรับส่วนหัวของสถานะที่บันทึกไว้ และการเรียกกลับวงจรที่สัมพันธ์กัน ให้ใช้ WebViewCompat.navigate แทน WebView.loadUrl
ไม่มี Jetpack Webkit
ใช้ WebView.loadUrl ซึ่งไม่รองรับการแทนที่รายการประวัติหรือการติดตาม Lifecycle Callback ที่สัมพันธ์กัน
webView.loadUrl("https://www.example.com")
มี Jetpack Webkit
ใช้ WebViewCompat.navigate กับ NavigationParameters เพื่อแทนที่รายการประวัติ เก็บรักษาส่วนหัวที่กำหนดเองในสถานะที่บันทึกไว้ และติดตามสถานะการนำทาง
if (WebViewFeature.isFeatureSupported(WebViewFeature.WEBVIEW_NAVIGATE_EXPERIMENTAL_V1)) {
val params = NavigationParameters.Builder()
.setShouldReplaceCurrentEntry(true)
.build()
val navigation = WebViewCompat.navigate(webView, "https://www.example.com", params)
} else {
webView.loadUrl("https://www.example.com")
}
ดูข้อมูลเพิ่มเติมเกี่ยวกับการติดตามการนำทางและการกำหนดค่าพารามิเตอร์ได้ที่ การนำทางหน้าเว็บที่ปรับปรุงแล้วด้วย WebViewCompat.navigate
ผสานรวม Jetpack Webkit เข้ากับโค้ด
การใช้ Jetpack Webkit จะเพิ่มขีดความสามารถของคลาส WebView มาตรฐาน แต่ไม่ได้แทนที่คลาส WebView เดิมทั้งหมด
คุณยังคงใช้คลาส android.webkit.WebView ได้ คุณสามารถเพิ่มคลาสนี้ลงในเลย์เอาต์ XML และรับการอ้างอิงถึงอินสแตนซ์ในโค้ด หากต้องการเข้าถึงฟีเจอร์ Framework มาตรฐาน คุณยังคงเรียกใช้เมธอดในอินสแตนซ์ WebView หรือออบเจ็กต์การตั้งค่าได้โดยตรง
หากต้องการเข้าถึงฟีเจอร์ที่ทันสมัย คุณต้องใช้เมธอดตัวช่วยแบบคงที่ที่ Jetpack Webkit มีให้ เช่น WebViewCompat และ WebSettingsCompat โดยส่งอินสแตนซ์ WebView ที่มีอยู่ไปยังเมธอดเหล่านี้
Kotlin
import android.webkit.WebView
import androidx.webkit.WebSettingsCompat
import androidx.webkit.WebViewFeature
// You still get your WebView instance the standard way.
val webView: WebView = findViewById(R.id.my_webview)
// To enable a modern feature, you pass that instance to a Jetpack Webkit helper.
if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) {
WebSettingsCompat.setForceDark(webView.settings, WebSettingsCompat.FORCE_DARK_ON)
}
Java
import android.webkit.WebView;
import androidx.webkit.WebSettingsCompat;
import androidx.webkit.WebViewFeature;
// You still get your WebView instance the standard way.
WebView webView = findViewById(R.id.my_webview);
// To enable a modern feature, you pass that instance to a Jetpack Webkit helper.
if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) {
WebSettingsCompat.setForceDark(webView.settings, WebSettingsCompat.FORCE_DARK_ON);
}
ใช้ Jetpack Webkit
หากต้องการใช้ Jetpack Webkit ให้ทำตามขั้นตอนต่อไปนี้
ขั้นตอนที่ 1: เพิ่มทรัพยากร Dependency
ในไฟล์ build.gradle.kts หรือ build.gradle ของโมดูล ให้ใส่ทรัพยากร Dependency ต่อไปนี้เพื่อเพิ่ม Jetpack Webkit:
ดึงดูด
dependencies { implementation "androidx.webkit:webkit:1.16.0" }
Kotlin
dependencies { implementation("androidx.webkit:webkit:1.16.0") }
Jetpack Webkit มี Wrapper ขนาดเล็ก ดังนั้นจึงส่งผลกระทบต่อขนาดแอปพลิเคชันน้อยมาก
ขั้นตอนที่ 2: ใช้รูปแบบการตรวจหาฟีเจอร์
ใช้การตรวจสอบฟีเจอร์เพื่อป้องกันข้อขัดข้องเมื่อเรียกใช้ API ที่ไม่พร้อมใช้งาน เราขอแนะนำให้ใส่การเรียกใช้ API แต่ละรายการไว้ในการตรวจสอบฟีเจอร์ และอาจพิจารณาตรรกะการทำงานสำรองไว้ในกรณีที่ API ไม่พร้อมใช้งาน
เราขอแนะนำรูปแบบต่อไปนี้สำหรับการใช้ WebView API ที่ทันสมัย
Kotlin
import android.webkit.WebView
import androidx.webkit.WebSettingsCompat
import androidx.webkit.WebViewFeature
val webView: WebView = findViewById(R.id.my_webview)
// Before you use a modern API, first check if it is supported.
if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) {
// If the check passes, it is safe to call the API.
WebSettingsCompat.setForceDark(webView.settings, WebSettingsCompat.FORCE_DARK_ON)
} else {
// Optionally, provide a fallback for older WebView versions.
}
Java
import android.webkit.WebView;
import androidx.webkit.WebSettingsCompat;
import androidx.webkit.WebViewFeature;
WebView webView = findViewById(R.id.my_webview);
// Before you use a modern API, first check if it is supported.
if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) {
// If the check passes, it is safe to call the API.
WebSettingsCompat.setForceDark(webView.getSettings(), WebSettingsCompat.FORCE_DARK_ON);
} else {
// Optionally, provide a fallback for older WebView versions.
}
รูปแบบนี้ช่วยให้มั่นใจได้ว่าแอปพลิเคชันจะมีความเสถียร เนื่องจากการตรวจสอบฟีเจอร์จะทำงานก่อน แอปพลิเคชันจึงไม่ขัดข้องหากฟีเจอร์ไม่พร้อมใช้งาน ค่าใช้จ่ายด้านประสิทธิภาพของการตรวจสอบ WebViewFeature#isFeatureSupported นั้น
น้อยมาก