Skip to content

Android WebView 架构与分析


webview 与 hybrid 开发


native 原生开发中的组件


hybrid 混合开发 webview 代码示例

/**
 * Sample creating 1 webviews.
 */
public class WebView1 extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {;
        setContentView(R.layout.webview_1);

        WebView wv = (WebView) findViewById(R.id.wv1);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            WebView.setWebContentsDebuggingEnabled(true);
        }
        wv.getSettings().setBuiltInZoomControls(true);
        wv.getSettings().setJavaScriptEnabled(false);
        wv.setWebViewClient(new WebViewClient());
        wv.loadUrl("file:///android_asset/html/index.html");
        super.onCreate(savedInstanceState);
    }
}


hybrid 混合开发中的 app webview 组件


hybrid 混合开发中的 app webview 控件


微信小程序主流架构基于 webview 开发


支付宝小程序基于 webview 开发


web 应用中的浏览器 webview 组件


web 应用中的浏览器 webview 控件


native 视角下的 webview 控件

  • uiautomator 框架把 webview 组件“翻译”成了原生组件
  • uiautomatorviewer、appium desktop、weditor 等都可以分析
  • uiautomatorviewer 对 java 版本有要求,需要 1.8.0_60 以下的版本
  • uiautomatorviewer 首次分析 webview 组件时需多刷新一次
  • 控件转换
  • html 控件尽量用原生控件表达,比如文本转 TextView,图片转 Image
  • 无适合原生控件表达的 html 控件用 android.view.View 表达
  • 属性转换
  • html 控件中的属性用原生控件表达,根据不同的版本转换为 resource-id content-desc text
  • native 无法表达的 html 属性会丢失,比如 class href src 等属性

转换示例


webview 组件的真正分析方法

  • uiautomatorviewer 的分析是不完整的
  • 浏览器分析工具可以分析 webview 控件完整信息


webview 调试开关

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    WebView.setWebContentsDebuggingEnabled(true);
}

//适合正式上线的app,至于debug开启的时候,才开启webview的调试
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    if (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE))
    { WebView.setWebContentsDebuggingEnabled(true); }
}

各平台 webview 组件的调试开关

平台 webview 组件调试开关 应用 webview 组件调试开关 可调试
as 模拟器 android 6.0 默认开启 ✅ 可调试
as 模拟器 android 7.0 及以上默认关闭 关闭
as 模拟器 android 7.0 及以上默认关闭 开启 ✅ 可调试
真机默认关闭 开启 ✅ 可调试
真机默认关闭 关闭
微信小程序内核 某些老版本默认开启 ✅ 可调试
微信小程序内核 默认关闭

强行打开 webview 调试开关的办法

  • root 手机修改 webview 内核 xposed
  • 使用沙箱,hook webview 组件的调用 virtualapp
  • 自己编译 android 系统

因为这些方法不常用且有各种局限,所以使用不多,仅限于安全领域研究。使用最多的办法是通过后门开启调试开关


webview 正确分析方法

  • 打开 webview 调试开关
  • 打开带有 webview 的页面
  • 打开浏览器的分析工具
  • chrome://inspect
  • [推荐] edge://inspect
  • firefox about:debugging


直接调试浏览器中的 web app


真机上调试小程序


调试雪球 webview 组件

  • 需要在 Android 6.0 模拟器上
  • 真机上需要开启 webview 调试开关的特定版本




总结

  • 了解 webview 原理
  • 掌握 webview 分析方法
  • 了解 webview 基本属性
  • 为自动化测试做铺垫