移动端Web开发调试之Chrome远程调试(Remote Debugging)

2017-04-06 15:12:52

Chrome DevTools调试移动设备Brower Page Tabs/WebViews

 

安卓远程调试目前支持所有操作系统(Windows,Mac, Linux, and Chrome OS.)中调试,支持

● 调试站点的页面

● 调试安卓原生App中的WebView

● 实时将安卓设备的屏幕图像同步显示到开发机器。

● 通过端口转发(port forwarding)与虚拟主机映射(virtual host mapping)实现安卓移动设备与开发服务器进行交互调试。

 

调试要求:

● 开发环境安卓桌面版Chrome32+

● 一条USB数据线,连接电脑与移动设备,安装相应机型的USB驱动。驱动程序下载地址:http://developer.android.com/tools/extras/oem-usb.html

   如果电脑上安装有百度手机助手、360手机助手这类软件,一般连接后可以自动安装相应的USB驱动程序。

● 如果是调试网页,移动设备需要安装Chrome forAndroid ,且安卓系统须为Android 4.0+

● 对于APP WebView的调试,需要系统为Android 4.4+ 并且原生应用内的Webview须进行相应的调试声明配置。

说明:远程调试要求桌面版Chrome浏览器版本要高于安卓移动设备的Chrome版本号。有条件的最好使用Chrome 的金丝雀特别版Chrome Canary (Mac/Windows)或者Chrome桌面开发版Chrome Dev channel release (Linux)。

 

第一步:首先在移动设备上开启USB调试模式。方法:

● Android 3.2+,打开设置 – 应用程序 – 开发,在“USB调试”处打钩选上

● Android 4.0~ Android 4.1 ,打开设置-开发者选项-进入在“USB调试”处打钩选上。

● Android 4.2+,打开设置-关于手机-手机配置信息-连点“版本号”7次,返回上层就可以看到“开发者选项”显示出来了,在“USB调试”处打钩选上。

 

第二步:用USB数据线连接设备,驱动装好连接成功后,你可能会在设备上看到一个弹框请求允许使用这台计算机通过usb调试

 

 

 

 

勾选后点击“确定”。

第三步:在电脑上打开Chrome浏览器的菜单– 更多工具 – 检查设备(Chromemenu > More tools > Inspect Devices),或者直接在浏览器地址栏输入chrome://inspect 或者about:inspect

 

 

打开后DevTools后,确保打钩选中Discover USB devices

 

 

如果USB连接成功,这时候我们可以看到移动设备的型号和设备上运行的页面和允许调试的WebView列表。找到需要调试的目标页面,点击inspect即可打开DevTools,点击reload可重新加载当前的调试页面,点击focus tab可将标签页置顶,close为关闭当前页面。更可以通过在输入框中键入网址新开一个页面。

 

点击inspect打开DevTools后,你可以选中页面中的DOM元素,同时设备中对应元素也高亮显示,也可使用DevTools中的Inspect Element 选中目标元素,可以实时与移动设备页面交互,方便的定位问题所在,进行代码调试。

 

在输入框中输入一个新的网址,点击Opoen可打开你想要调试的新页面。

 

说明:由于Chrome版本不同,DevTools也可能有些差别,比如我的Chrome38.0.2125.104 m版竟然没有打开新页面的url输入框,升级到v39后恢复正常,知道原因的欢迎留言。

1. DevTools窗口使用F5快捷键(CMD+R for Mac)重新加载页面

2. 使用Network面板可以实时观察页面在手机实际网络环境中资源的加载情况。

3. Timeline面板可以用来分析页面渲染和CPU使用情况,通常情况下移动设备的性能会比电脑上要低一些。

4.  在DevTools的Console控制台中编写脚本执行,会同步表现在移动设备中检查的页面。

5. 如果要调试本地搭建的服务器程序,需要用到端口转发和虚拟主机映射,以使设备上可以呈现你本地环境下的页面内容。

 

调试WebView需要满足安卓系统版本为Android 4.4+已上。并且需要再你的APP内配置相应的代码,在WebView类中调用静态方法setWebContentsDebuggingEnabled,如下:

  1. if (Build.VERSION.SDK_INT >=Build.VERSION_CODES.KITKAT) {  

  2.   

  3.    WebView.setWebContentsDebuggingEnabled(true);  

  4.   

  5. }  

 

以上配置方法适用于安卓应用内所有的WebView情形。

安卓WebView是否可调试并不取决于应用中manifest的标志变量debuggable,如果你想只在debuggable为true时候允许WebView远程调试,请使用以下代码段:

  1. if (Build.VERSION.SDK_INT>= Build.VERSION_CODES.KITKAT) {  

  2.   

  3.     if (0 != (getApplicationInfo().flags &=ApplicationInfo.FLAG_DEBUGGABLE))  

  4.   

  5.     { WebView.setWebContentsDebuggingEnabled(true);}  

  6.   

  7.   }  

 

WebView的可用列表如下:

 

所列信息其中包括页面的title,url地址,页面尺寸大小及其相对于设备屏幕的相对位置。

 

实时屏幕投影(Live screencasting)

 

调试移动设备时视线在两个设备的屏幕之间来回切换太不方便了,screencast实现了移动设备屏幕与开发环境DevTools的同步,你可以通过screencast与移动设备上的内容进行交互式的操作。

 

Screencast只呈现页面的内容,而不显示工具条地址栏、设备键盘等其他设备接口,这些在Screencase中表现为透明部分。

 

Android 4.4,是由Google公司制作和研发的代号为KitKat的手机操作系统,于北京时间2013年9月4日凌晨对外公布了该Android新版本的名称,为Android 4.4(代号 KitKat 奇巧)。据悉,该代号来自雀巢的KitKat巧克力。对于KitKat 4.4.3,screencast不仅可以在Tab网页实现,在WebView上也可以同步交互操作。

 

点击 DevTools右上角的Screencast图标,可以开启Screencast视图,移动设备屏幕会实时展现在左侧的Screencast面板中。

 

 

 

Chrome32+版本的DevTools对连接的设备支持native USB debugging。而版本号稍低的一些则需要通过安装ADB或ADB plugin调试移动设备上的Chrome网页。由于之前一直是使用ADB plugin方式调试,如今一番折腾发现高版本更为方便实用的特性,由于网上的资料比较零散,关键的东西都没有提及,坑也不少,这也正是写此文的缘由。

 

曾经靠安装Android SDK套件,需要执行类似 adb forward tcp:9001 localabstract:chrome_devtools_remote 这样的命令,才能开始调试,现在我们完可以摆脱这些繁琐的命令了。

开发机器安装ADB plugin是Chrome 28+之后的方式,区别于以前需要安装整个Android SDK套件,同时移动设备要安装Chrome for Android 28+。ADB扩展程序安装成功后,Chrome菜单旁边会出现一个灰色的Android启动图标。

点击Android的图标,然后单击ADB开始。一旦ADB已经开始,菜单图标变成绿色,并显示当前连接的设备的数量,如果有连接设备的话。

 

点击View inspection Targets打开:列表中会显示每个连接的设备及其选项卡页面。查找要调试的页面,并点击页面链接URL旁边的inspect启动DevTools调试窗口。 

 

使用用DevTools特别重要的一点是:如果你点击inspect打开的DevTools窗口一片空白,且刷新无效时,那极有可能是由于被墙的缘故,你可以尝试appspot.com是否可以ping的通,如果无法ping通,那你现在就先FQ吧(goagent 或红杏都不错,将appspot.com加入白名单),当然你还需要有google账户。

 

补充说明一下,如果接上USB数据线后,没有显示任何连接的设备,请按照以下步骤排查:

● 检查您的设备连接到USB,检查USB数据线。

● 确保您的设备发出ADB设备命令列为可用。如果没有,检查是否有您的设备上是否启用USB调试。

● 若是Windows系统,检查你的USB驱动是否安装正确。参考http://developer.android.com/tools/extras/oem-usb.html

● 桌面Chrome浏览器打开 chrome://inspect检查Discover USB devices是否选中

● 确保桌面浏览器版本要高于移动设备的Chrome版本号

● 如果Chrome for Android版本较低,请检查移动设备上Chrome浏览器设置,确保设置中启用USB调试。高版本中无此设置项,无须设置。

● 如果依然无法显示,尝试重新拔插USB数据线。

 

 

端口转发(Port forwarding)

 

你的手机和开发机器有时会处于两个不同的网络(如本地服务器和线上服务器两个不同的网络环境),手机上可能获取不到开发环境的页面内容。况且,有时候你的开发环境处于公司出于安全原因管控限制下的网络中。

 

Chrome For Android中的端口转发解决了这一困难,在手机上测试你开发的网站瞬间变得容易。它的工作原理是在移动设备上创建一个监听TCP端口,该端口映射到开发机器特定的TCP端口,两个端口通过USB线路通信,所以这种连接并不依赖于所处网络环境的配置。

 

在进入正题前必须要提前说明搭建本地服务器需要注意的一些点。安装本地服务器,这里安装的是wamp集成包。一键安装完成后,需要修改Apache的一些设置。

 

1. 打开Apache安装目录下的配置文件httpd.conf增加监听多个端口。

 

  1. # Listen: Allows you to bindApache to specific IP addresses and/or  

  2. # ports, instead of the default. See also the <VirtualHost>  

  3. # directive.  

  4. #  

  5. # Change this to Listen on specific IP addresses as shown below to  

  6. # prevent Apache from glomming onto all bound IP addresses.  

  7. #  

  8. #Listen 12.34.56.78:80  

  9. Listen 80  

  10. Listen 8888  

  11.   

  12. Listen 8999  

  13. Listen 1818  

 

开启Apache服务后可通过命令netstat –n –a查看所配置的端口是否开启。

如果你本地环境也开启了IIS服务,为了避免二者都是用80端口发生冲突,可以按照上述方法修改Apache的默认端口。修改设置完成后别忘了重启Apache服务。

如何改变IIS端口:若保留Apache服务与IIS服务同时运行,不想改变Apache默认80端口,那么只能改变IIS端口,方法如下:开始->运行->输入:inetmgr->Internet信息服务->本地计算机->网站->右键“默认网站”->属性->选择“网站”标签->修改TCP端口即可。最后重新启动IIS服务。

 

2. 在httpd.conf文件中开启虚拟主机配置

 

  1. # Virtual hosts  

  2.   

  3. #Includeconf/extra/httpd-vhosts.conf  

将第二行前的#号去掉,即是为了允许加载扩展配置。

 

1.  Apache服务器默认的路径为安装目录下的htdocs,如果想改变默认目录,可以修改httpd.conf文件下的DocumentRoot和Directory,修改两者路径到你指定的目录即可。

  1. #  

  2.   

  3. # DocumentRoot: The directoryout 

  • 2020-03-18 21:30:57

    基于OpenLayers实现地理围栏 谷歌百度高德地图都可以

    前言.因为项目有点特殊,需要接入谷歌地图实现地理围栏,因为谷歌地图的地理围栏接口相关接口并不完善,于是就换了一个思路,利用OpenLayers来实现地理围栏 openlayers 中文地址 http://weilin.me/ol3-primer/ch02/index.html 作者:zcty0701 链接:https://www.jianshu.com/p/60e88ee1e843 来源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 2020-03-19 17:12:40

    百度地图放大覆盖物消失

    产生问题的原因是因为我们用的普通的点数组生成的多边形,我们应该用百度的点数组生成就没问题了。

  • 2020-03-19 19:15:47

    vue中methods watch和compute的区别和联系

    首先要说,methods,watch和computed都是以函数为基础的,但各自却都不同 而从作用机制和性质上看,methods和watch/computed不太一样,所以我接下来的介绍主要有两个对比: 1.methods和(watch/computed)的对比

  • 2020-03-19 19:50:31

    用vue做的跟随鼠标移动的div

    随鼠标移动的动画效果,之前一直使用angular和react,没怎么接触过vue,先做一个vue的简单例子,然后再整合。

  • 2020-03-20 13:35:55

    随便想到,群聊天的数据库简单设计

    拆分成两个表,一个是消息的流水表,一个是每个人的配置表。 记录每个群下面的这个用户的最后读取的消息last_msg_id,然后在计算消息未读数据。 这样优化之后数据将减少好多,数量是 m+n条数据。不在是成倍增长了。

  • 2020-03-20 13:39:50

    类似与微信朋友圈功能数据库如何实现

    每次发圈子的时候,给关注我的每个uuid,发一个内容id。 大概表的设计就是 uuid,idlist 这样的,idlist是按照时间顺序的。 然后定期删除idlist过多的老圈子。

  • 2020-03-21 00:11:38

    Android卡片布局(圆角阴影)的几种实现及分析

    在开发中,为了界面美观,圆角view和阴影效果是开发中经常遇到的UI场景,比如银行卡效果,卡片式itemView布局,Banner图等,开发中我们通过各种方式实现了这种效果,但是哪种方案最好呢,接下来本文将比较几种常见的圆角阴影布局实现,并从内存占用角度分析它们的优缺点.

  • 2020-03-21 12:05:24

    android 自定义组件,使用AttributeSet

    首先要在res/values目录下建立一个attrs.xml(名字可以自己定义)的文件,并在此文件中增加对控件的属性的定义.其xml文件如下所示: