Android WebView 研究笔记

栏目: IOS · Android · 发布时间: 6年前

内容简介:记录一下省的忘记了,遍看源码,边猜测,边实验目前Android WebView支持主要还是靠ChromeDriver来实现的。Chromedriver貌似一定要ADB才行。其中用到了命令有

记录一下省的忘记了,遍看源码,边猜测,边实验

chromedriver用了哪些命令和资源

目前Android WebView支持主要还是靠ChromeDriver来实现的。

Chromedriver貌似一定要ADB才行。其中用到了命令有 ps , grep , adb forward , am start 等等

来源: https://github.com/bayandin/chromedriver/blob/907b958e09dbfdafb13e9257b181009d0ab43b4a/chrome/adb_impl.cc

既然还用到了 adb forward .. localabstract , 先打开一个带webview的app(这里用了微信)

查看下有哪些服务监听了localabstract

$ cat /proc/net/unix | grep @
0000000000000000: 00000002 00000000 00010000 0001 01 32803 @bthcitraffic
0000000000000000: 00000002 00000000 00010000 0001 01 3789231 @chrome_devtools_remote
0000000000000000: 00000002 00000000 00010000 0001 01 32963 @/data/misc/bluedroid/.a2dp_ctrl
0000000000000000: 00000002 00000000 00010000 0001 01    76 @time_genoff
0000000000000000: 00000002 00000000 00010000 0001 01    88 @android:debuggerd
0000000000000000: 00000002 00000000 00010000 0001 01 4640516 @webview_devtools_remote_13680
0000000000000000: 00000002 00000000 00010000 0001 01 17596 @jdwp-control
0000000000000000: 00000003 00000000 00000000 0001 03 4453235 @jdwp-control
0000000000000000: 00000003 00000000 00000000 0001 03 4250761 @jdwp-control

其中 @ 符号代码监听的本地Unix socket

这里看到有两个 @chrome_devtools_remote@webview_devtools_remote_13680 比较吸引人。

chrome_devtools_remote 应该对应的是浏览器。

webview_devtools_remote_13680 对应的应该是应用内的WebView,根据源码感觉这个13680应该是个pid

odin:/ $ ps | grep 13680
USER      PID   PPID  VSIZE  RSS   WCHAN              PC  NAME
u0_a280   13680 591   2522104 168072 SyS_epoll_ 0000000000 S com.tencent.mm:tools

com.tencent.mm 这个应该就是微信了。

先把这个forward到本地

$ adb forward tcp:5000 localabstract:webview_devtools_remote_13680

看chromedriver的代码,里面自带一些http接口,具体看下面的代码

https://github.com/bayandin/chromedriver/blob/33218feb63bc972c7175390ee2302fe5a2f25056/chrome/devtools_http_client.cc#L92

有个比较简单的接口获取浏览器的版本号,以此来确定该使用的chromedriver版本。

$ curl localhost:5000/json/version
{
   "Android-Package": "com.tencent.mm",
   "Browser": "Chrome/57.0.2987.132",
   "Protocol-Version": "1.2",
   "User-Agent": "Mozilla/5.0 (Linux; Android 7.1.1; OD103 Build/NMF26F; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.132 MQQBrowser/6.2 TBS/044205 Mobile Safari/537.36",
   "V8-Version": "5.7.492.72",
   "WebKit-Version": "537.36 (@user1128ad40ab2e3d761c06d1)"
}

从这个链接里面可以看到没有Chrome Version( 57 )对应的应该使用的chromedriver版本号( 2.29 ) https://chromedriver.storage.googleapis.com/2.41/notes.txt

Android WebView 研究笔记

去这个地址下载 https://npm.taobao.org/mirrors/chromedriver

继续更新

猜测:除了微信有个调试的按钮,其他的H5的应用应该也是可以的吧。

先试了试Appium自带的demo apk

https://github.com/appium/java-client/blob/master/src/test/java/io/appium/java_client/ApiDemos-debug.apk

安装到手机上之后,进入 Views -> WebView ,然后看到这么一个简单的界面

Android WebView 研究笔记

图层结构显示也有Hierarchy

Android WebView 研究笔记

Chrome浏览器打开 chrome://inspect

Android WebView 研究笔记

更多相关的内容参考谷歌的Chrome-Devtools文档 https://developers.google.com/web/tools/chrome-devtools/remote-debugging/?hl=zh-cn

在浏览器里面并没有发现当前这个应用的 webview。

重新读了下 谷歌文档-远程调试 WebView

Android WebView 研究笔记

需要在应用中开启WebViewDebugable模式才行,也就是说默认不开启喽。

使用VXP强制开始WebView

那有没有强制开启的方法呢? 很快谷歌出来一篇文章

强制开启android webview debug模式使用Chrome inspect

看来手机需要Root才行,还用到了高端的Xposed(不对呀,我明明记得可以不用root的呀),继续谷歌了下发现还有个VirtualXposed可以不用root

相关的VirtualXposed(简称VXP)简介 https://github.com/android-hacker/VirtualXposed

安装很简单,跟普通的App一样,下载apk到手机,安装就ok了。

接下来用VXP自带的安装器,安装 ApiDemos-debug.apk

然后再安装个插件 WebViewDebugHook 同样是个Apk下载,用VXP安装上就好了。

关于那个插件的原理可以在这里看到 https://www.jianshu.com/p/d6699cd4505e

安装上之后,先打开

Android WebView 研究笔记

进入到 模块 中,勾选

Android WebView 研究笔记

返回,然后向下滑动,进入到这个界面,点击箭头位置

Android WebView 研究笔记

拖到最下面点击 重启 是插件更改生效。

PS: 使用VXP安装的应用 pm list packages 是看不到的,只有在运行的时候用 ps 才可以查看到

回到应用界面,点击刚才安装的APK API Demos , 重新进入到WebView,然后打开 chrome://inspect

这个时候终于看到了,期望的界面。

Android WebView 研究笔记

应用使用的Chrome版本是 62.0.3202.84
Appium的代码里面有个对应的表可以直接查改用哪一个 chromedriver https://github.com/appium/appium-chromedriver/blob/master/lib/chromedriver.js#L20

PS D:\Temp> .\chromedriver.exe -h
Usage: D:\Temp\chromedriver.exe [OPTIONS]

Options
  --port=PORT                     port to listen on
  --adb-port=PORT                 adb server port
  --log-path=FILE                 write server log to file instead of stderr, increases log level to INFO
  --log-level=LEVEL               set log level: ALL, DEBUG, INFO, WARNING, SEVERE, OFF
  --verbose                       log verbosely (equivalent to --log-level=ALL)
  --silent                        log nothing (equivalent to --log-level=OFF)
  --version                       print the version number and exit
  --url-base                      base URL path prefix for commands, e.g. wd/url
  --whitelisted-ips               comma-separated whitelist of remote IPv4 addresses which are allowed to connect to Chr
omeDriver

chromedriver默认监听9515端口。

先来段简单的代码试试。获取WebView中显示的内容

Android WebView 研究笔记
# coding: utf-8
from selenium import webdriver

options = {'androidPackage': 'com.appium.android.apis', 'androidUseRunningApp': True}
d = webdriver.Remote("http://localhost:9515", {"chromeOptions": options})
# /html/body/a
el = d.find_element_by_xpath("/html/body/a")
print(el.text)

运行,之后就报错了,提示

WebDriverException: Message: unknown error: com.appium.android.apis is not installed on device 3578298f
  (Driver info: chromedriver=2.41.578737 (49da6702b16031c40d63e5618de03a32ff6c197e),platform=Windows NT 10.0.16299 x86_6
4)

估计是通过 pm path <package)name> 判断的有没有安装,也罢,再安装一遍好了。然后给options加了 androidProcess 参数

options = {
    'androidPackage': 'io.appium.android.apis',
    'androidUseRunningApp': True,
    'androidProcess': 'io.appium.android.apis'
}

重新再运行代码终于出来了

Hello World! - 1

哎,真是麻烦。。 -~~

参考


以上所述就是小编给大家介绍的《Android WebView 研究笔记》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

PHP5与MySQL5 Web开发技术详解

PHP5与MySQL5 Web开发技术详解

杜江 / 电子工业出版社 / 2007-11 / 79.00元

《PHP5与MySQL5 Web开发技术详解》(含光盘)是目前中文版本第一个真正介绍PHP5及MYSQL5新增语法与功能的权威宝典!一起来看看 《PHP5与MySQL5 Web开发技术详解》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

SHA 加密
SHA 加密

SHA 加密工具

html转js在线工具
html转js在线工具

html转js在线工具