【专业技术】揭秘安卓浏览器如何注入javascript脚本

Android中向webview注入js代码可以通过webview.loadUrl("javascript:xxx")来实现,然后就会执行javascript后面的代码。

但是当需要注入一整个js文件的时候,貌似就有点麻烦了。

不过理清以下思路,方法其实也很简单,如下: 我们通过在webview的onPageFinished方法中执行js代码注入:

第一种: 当webview加载完之后,读取整个js文件中的内容,然后将整个文件内容以字符串的形式,通过webview.loadUrl("javascript:fileContentString")注入

第二种: 页面加载完之后,直接向webview对应的html中加入<script>便签,并包含要注入的js的Url地址

String js = "var newscript = document.createElement(/"script/");";js += "newscript.src=/"http://www.123.456/789.js/";";js += "document.body.appendChild(newscript);";

这是网上通用的做法,仅对单纯的加载单个网页,在onPageStart,

onPageFinish注入都可以。

但是我们的网页是那种多层嵌套,一般都设置document来完成请求加载新网页。用这种方法解决不了我的问题。经过分析其实在请求每个主页、子页面或js代码时都会调用

shouldInterceptRequest() 函数来是否用本地文件代替网络文件进行呈现。基于有这样的实现,分析该函数的流程。用该方式我们自己来实现一个js注入函数。

首先找到主资源加载完成的地方,因为我们将js文件直接插入到请求的文件末尾。

在文件DocumentWriter.cpp

的endIfNotLoadingMainResource() 函数中

addData(0, 0, true);

使用addData()将我们要注入的js脚本字符串加入到Data数据中。放到

addData(0, 0, true);之前,并获取当前url,我们会将当前请求载入url通过webview传出到java层,判断是否需要注入代码,并将js字符串传回给webcore。这样我们就可以在webview层实现复杂网页的js注入了。

原文发布于微信公众号 - 程序员互动联盟(coder_online)

原文发表时间:2015-05-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

扫码关注云+社区