WebKit:给旧平台带回新 WebView 能力 · AndroidX 源码指南
AAndroidX 源码指南
Web 与外部内容
Web 与外部内容 · androidx.browser

WebKit:给旧平台带回新 WebView 能力Browser 1.11.0-alpha01

WebViewFeature 特性探测、WebViewCompat、多 Profile、投机加载与消息通信。

最后更新 2026-08-01

复制即用:特性探测

if (WebViewFeature.isFeatureSupported(WebViewFeature.SAFE_BROWSING_ENABLE)) {
    WebViewCompat.startSafeBrowsing(context, callback);
}

androidx.webkit 不提供渲染引擎,把较新的 android.webkit 能力以静态方法带回旧平台。核心:WebViewCompat(静态方法)+ WebViewFeature(特性常量 + 探测)。

特性探测是使用前提

if (WebViewFeature.isFeatureSupported(WebViewFeature.MULTI_PROFILE)) {
    // 才调用 Profile 相关 API
}

常见特性:VISUAL_STATE_CALLBACKOFF_SCREEN_PRERASTERSAFE_BROWSING_ENABLEWEB_MESSAGE_LISTENERMULTI_PROFILESERVICE_WORKER_BASIC_USAGE

必须逐个探测再调用——跳过探测在低版本 WebView 上没效果或直接失败。

应用内消息通信

// 创建通道
WebMessagePortCompat[] ports = WebViewCompat.createWebMessageChannel(webView);
WebMessagePortCompat pagePort = ports[0];
WebMessagePortCompat appPort = ports[1];

// 应用侧接收
appPort.setWebMessageCallback(new WebMessagePortCompat.WebMessageCallbackCompat() {
    @Override
    public void onMessage(WebMessagePortCompat port, WebMessageCompat message) {
        String data = message.getData();
        // 处理页面发来的消息
    }
});

// 发给页面(把 pagePort 暴露给页面 JS)
WebViewCompat.postWebMessage(webView, new WebMessageCompat("hello"), Uri.parse("*"));

页面侧 JS:

// 页面通过 WebMessageChannel 接收
window.channel.onmessage = (event) => {
    // event.data
};

多 Profile

if (WebViewFeature.isFeatureSupported(WebViewFeature.MULTI_PROFILE)) {
    ProfileStore store = ProfileStore.getInstance();
    Profile profile = store.getOrCreateProfile("work-profile");
    WebView webView = profile.createWebView(context);
    // 该 WebView 使用独立存储(cookies、cache)
}
  • 多 Profile 允许不同存储空间。
  • 为多用户场景设计(工作/个人分离);单页面应用一般用不到。

投机加载(Prefetch/Prerender)

if (WebViewFeature.isFeatureSupported(WebViewFeature.PREFETCH_SUPPORT)) {
    PrefetchParameters params = new PrefetchParameters.Builder(
        Uri.parse("https://example.com/page")
    ).build();
    PrefetchCache.prefetch(params, executor, callback);
}

提前预取页面,进入时更快。受设备和网络条件影响。

常见陷阱

  • 不探测直接用:低版本静默失败。
  • 消息端口泄漏:通道用完要关闭端口。
  • 多 Profile 未探测:不支持设备崩溃。
  • WebView 渲染仍靠系统:WebKit 只是兼容层。
  • 混淆删除 compat 类:ProGuard 保留 androidx.webkit 类。

复制即用

public class WebContainer {

    public static void setup(WebView webView, WebViewClient client) {
        webView.setWebViewClient(client);
        if (WebViewFeature.isFeatureSupported(WebViewFeature.WEB_MESSAGE_LISTENER)) {
            webView.addWebMessageListener("androidBridge", null,
                new WebMessageListener() {
                    @Override
                    public void onPostMessage(WebView view, WebMessageCompat message, Uri sourceOrigin,
                        boolean isMainFrame, JavaScriptReplyProxy replyProxy) {
                        // 页面调用 androidBridge.postMessage(...)
                    }
                });
        }
    }
}

要点

  • WebViewFeature.isFeatureSupported 是起点;特性逐个探测。
  • WebViewCompat 提供 createWebMessageChannel / postWebMessage / startSafeBrowsing 等。
  • 多 Profile、投机加载为高级场景;单页应用用不到。
  • WebKit 是兼容层,渲染靠系统 WebView。

相关页面