Android WebView 研究笔记

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

内容简介:记录一下省的忘记了,遍看源码,边猜测,边实验目前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 研究笔记》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

Data Mining

Data Mining

Jiawei Han、Micheline Kamber、Jian Pei / Morgan Kaufmann / 2011-7-6 / USD 74.95

The increasing volume of data in modern business and science calls for more complex and sophisticated tools. Although advances in data mining technology have made extensive data collection much easier......一起来看看 《Data Mining》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具