目录
很久已经就在日志中发现有开头为 Dalvik作为user-agent的请求,简单搜索下后发现是安卓虚拟机,但没有在意。今天一个朋友又讨论起这个user-agent。一研究发现还是挺有意思的,顺便记录一下。
Dalvik 是啥
每当浏览器/WebView 无法呈现特定的服务器响应(可能是 PDF、流式服务器或其他任何内容)然后触发操作系统打开另一个应用程序的意图时,就会发生这种情况。虚拟机 (Dalvik) 负责处理此路由,在此过程中,可以将文件下载到设备,以便其他应用程序可以访问它(通常,应用程序无法访问彼此的文件,但其他应用程序需要该文件来呈现它)
demo
简单写了个页面call_Dalvik用于测试,唤醒这个请求。
<?php
header('Content-type: application/pdf');
echo '1';
日志和记录
日志如下
0.0.0.0:29486 - - [06/Aug/2024:17:24:42 +0800] "GET /demo/call_Dalvik/index.php HTTP/2.0" 200 1 "-" "Mozilla/5.0 (Linux; U; Android 11; zh-cn; M2006J10C Build/RP1A.200720.011) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/79.0.3945.147 Mobile Safari/537.36 XiaoMi/MiuiBrowser/13.6.15" "-"
0.0.0.0:29488 - - [06/Aug/2024:17:24:42 +0800] "GET /demo/call_Dalvik/index.php HTTP/1.1" 200 11 "-" "Dalvik/2.1.0 (Linux; U; Android 11; M2006J10C Build/RP1A.200720.011)" "-"
一些记录
-
一般会出现2次请求,一次判断类型一次下载
- 如果未触发Dalvik,大部分情况会是2个一样的user-agent,一般来说
- 如果触发Dalvik则第二个请求会是以Dalvik开头的user-agent
-
目前在我的红米中只发现的只有部分浏览器可以稳定触发,其他主流浏览器的都不会触发
- 自带浏览器
区别于小米浏览器,是MIUI中自带的浏览器
- 小米浏览器(谷歌商店下载的)
版本:XiaoMi/MiuiBrowser/13.6.15
- mint浏览器(谷歌商店下载的薄荷浏览器)
开发者为小米:
版本:XiaoMi/Mint Browser/3.9.3
我认为是未做修改的webview浏览器才可以,小米浏览器在更新后( XiaoMi/MiuiBrowser/18.4.410719)则触发失败,应该是针对性做了处理。 关于webview怎么处理,可以研究下最后的几个链接,属于安卓部分了
-
其他浏览器的行为
- chrome会自己判断类型,尝试用其他软件打开并直接下载,只有一个H2请求(可能和使用H2有关)
- edge 会提示是否下载,然后直接下载只有一个H2请求(可能和使用H2有关)
- 夸克(Quark/6.2.6.248)提示下载,和下载会分为2个H1请求
- 更新后的MIUI自带浏览器(XiaoMi/MiuiBrowser/18.4.410719)则用 okhttp/3.14.9 进行下载
183.24.*.*:29552 - - [06/Aug/2024:17:58:58 +0800] "GET /demo/call_Dalvik/index.php HTTP/2.0" 200 1 "-" "Mozilla/5.0 (Linux; U; Android 11; zh-cn; M2006J10C Build/RP1A.200720.011) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/109.0.5414.118 Mobile Safari/537.36 XiaoMi/MiuiBrowser/18.4.410719" "-"
183.24.*.*:29553 - - [06/Aug/2024:17:58:58 +0800] "HEAD /demo/call_Dalvik/index.php HTTP/2.0" 200 0 "-" "okhttp/3.14.9" "-"
思考
参考
Browser sending “Dalvik” as user agent
Can I safely block Dalvik browser agent requests?
WebView - can’t download file without requesting it twice?