2018-03-11 Android WebView调试利器之 Chrome DevTools

前言

Android开发时不时需要与H5交互这个时候如果没有能调试的工具效率简直是极低,我们项目就有一个活动页面需要与H5交互,当时还不知道有这么一个调试工具的时候只能用alert()(关键是这个问题他在本地运行是ok的在服务器才有问题这种问题最不好定位如果有这么一个工具那简直是So Easy)。当我觉得效率这么低的情况下,我在想是不是应该会有调试工具呢?(因为IOS有)
所以我就直接查google文档以下是官方文档

setWebContentsDebuggingEnabled

Enables debugging of web contents (HTML / CSS / JavaScript) loaded into any WebViews of this application. This flag can be enabled in order to facilitate debugging of web layouts and JavaScript code running inside WebViews. Please refer to WebView documentation for the debugging guide. The default is false.

启用对加载到此应用程序的任何WebView中的Web内容(HTML / CSS / JavaScript)进行调试。 可以启用此标志,以便于在WebViews中运行的Web布局和JavaScript代码的调试。 有关调试指南,请参阅WebView文档。 默认值为false。

我们看到这里查不到具体的用法,不过上面可以看到请参阅WebView文档那么下一步就看WebView documentation for the debugging guide.
了解到Android4.4或更高版本可以使用DevTools 可以在原生 Android 应用中调试 WebView 内容。

webviewdebug.gif

配置 WebViews 进行调试

必须从您的应用中启用 WebView 调试。要启用 WebView 调试,请在 WebView 类上调用静态方法 setWebContentsDebuggingEnabled。

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

此设置适用于应用的所有 WebView。

在 DevTools 中打开 WebView

在google浏览器中输入以下地址
chrome://inspect 页面将显示您的设备上已启用调试的 WebView 列表

1501923431031.png

上图有一个WebView远程调试也就是我起的标题,下面有一个inspect点击就进入到调试页面了如下图

1501923226512.png

Sources区域
Sources选项选择后在预览页的右边有一个Sources显示区域我这里需要调试的代码都写在test.html里面的,如果你是写在js里面的这个区域同样会显示您的Js文件点击打开后就显示内容区域了。
现在我们就可以调试了
Console区域
可以看到打印的log和当前变量的值和Android一样可以输入一个对象名就可以看到具体的值了如图我输入了一个test出来了对应的标签
内容区域
test.html是我的内容区域
可能出现的问题
1.如果上面的调试代码也加了再输入chrome://inspect 还是看不到列表(当然前提是应用要打开到webview页面)有可能第一次需要翻墙因为我的墙一直是开的这个是同事发现的。
2.这里我用的是JsBridge用的时候可能会出现点击没有反应
原因是(应该是二者没同步导致的)JsBridge和Js通讯写在js文件中的需要将代码库的WebViewJavascriptBridge.js文件放在当前项目的assets下面

核心代码

Java

        //需要调试必要加入这一段代码否则在google浏览器里面看不到设备(如果是用的我这个库可以不用加因为库里面已经加了)
//        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
//            WebView.setWebContentsDebuggingEnabled(true);
//        }
 mWebView.loadUrl("file:///android_asset/test.html");
        findViewById(R.id.activity_tv).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //callHandler app调用h5

                mWebView.callHandler("getH5", "test", new CallBackFunction() {
                    @Override
                    public void onCallBack(String data) {
                        Toast.makeText(WebViewActivity.this,"apploadh5",Toast.LENGTH_LONG).show();
                    }
                });
            }
        });
        //registerHandler h5调用app
        mWebView.registerHandler("getApp", new BridgeHandler() {
            @Override
            public void handler(String data, CallBackFunction function) {
                function.onCallBack("0");
                Toast.makeText(WebViewActivity.this,data,Toast.LENGTH_LONG).show();
            }
        });

JavaScript
下面我把IOS和Android的初始化封装在一起了,这样就可以共用

<script type="text/javascript">
  var test = document.getElementById('test');
  var header = document.getElementById('header');

   var ua = navigator.userAgent.toUpperCase();
   var isIOS = ua.indexOf('IPHONE OS') != -1;//true ios设备
   var isAndroid = ua.indexOf('ANDROID') > -1 || ua.indexOf('ADR') > -1; //android终端
   function setupWebViewJavascriptBridge(callback) {
       if (window.WebViewJavascriptBridge) { return callback(WebViewJavascriptBridge); }else{
          document.addEventListener(
              'WebViewJavascriptBridgeReady'
              , function() {
                  callback(WebViewJavascriptBridge)
              },
              false
            );

       }
       if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); }
       window.WVJBCallbacks = [callback];
       var WVJBIframe = document.createElement('iframe');
       WVJBIframe.style.display = 'none';
       WVJBIframe.src = 'wvjbscheme://__BRIDGE_LOADED__';
       document.documentElement.appendChild(WVJBIframe);
       setTimeout(function() { document.documentElement.removeChild(WVJBIframe) }, 0);
   }

   setupWebViewJavascriptBridge(function(bridge) { //app-调用H5
       bridge.registerHandler("getH5",  //
            function(data, responseCallback) {
                 header.style.display="none";
            }
        );

      test.onclick= function() {
          //H5调用APP
          bridge.callHandler('getApp', {'param1':'object','param2':'test'},
              function(data) {
                header.style.display="block";
              }
          );
       }

   });
</script>

布局文件

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:id="@+id/activity_tv"
        android:layout_width="match_parent"
        android:gravity="center"
        android:layout_height="40dp"
        android:text="点我执行H5方法"
     />

    <com.github.lzyzsd.jsbridge.BridgeWebView
        android:id="@+id/webView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/activity_tv"
        />

</RelativeLayout>

总结

当我们开发的时候感觉还有优化空间,就应该想想肯定还有更好的方案。当你认为会有更好的方案替代它的时候我觉得你就可以把这个方案给实现出来。

代码地址
努力的人运气从来都不会差。
只有想不到的,没有做不到的!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容