前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【专业技术】揭秘安卓浏览器如何注入javascript脚本

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

作者头像
程序员互动联盟
发布2018-03-12 16:25:07
3.5K0
发布2018-03-12 16:25:07
举报

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注入了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2015-05-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员互动联盟 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档