课程名称:BAT大牛亲授技能+技巧 Android面试快速充电升级
课程章节:Android基础相关面试问题
主讲老师:DocMike
课程内容
1.使用 webview 中常见的问题
-
webview的安全漏洞,Android API level 16 以及之前的系统版本,由于程序没有正确限制使用addJavascriptInterface() 方法,远程攻击者可通过使用 Java Reflection API 利用该漏洞执行任意Java对象的方法。具体做法是,通过 addJavascriptInterface() 给 WebView 加入一个 JavaScript 桥接接口,JavaScript 通过调用这个接口可以直接与本地的 Java 接口进行交互。就有可能出现手机被安装木马程序、发送扣费短信、通信录和短信被窃取、获取本地设备的SD卡中的文件等信息,从而造成信息泄露,甚至手机被远程控制等安全问题。解决方案:如果一定要使用 addJavascriptInterface() 接口,在 Android4.2 以上,允许被JavaScript 调用的方法必须以 @JavascriptInterface 进行注解声明,从而避免漏洞攻击。Android4.2 以下,采用 setWebChromeClient() 重新 onJsPrompt() 拦截 prompt() 消息进行交互。
-
webview 在布局中动态加载时,一定要在最后的时候手动移除掉,防止放生内存泄漏。
-
JSBridge,就像其名称中的Bridge的意义一样,是 Native 和非 Native 之间的桥梁,它的核心是构建Native 和非 Native 间消息通信的通道,而且是双向通信的通道。 简单来讲,主要是给 JavaScript 提供调用Native功能的接口,让混合开发中的前端部分可以方便地使用地址位置、摄像头甚至支付等 Native 功能。JavaScript 是运行在一个单独的 JS Context 中(例如,WebView 的 Webkit 引擎、JSCore)。由于这些Context 与原生运行环境的天然隔离,我们可以将这种情况与 RPC(Remote Procedure Call,远程过程调用)通信进行类比,将 Native 与 JavaScript 的每次互相调用看做一次 RPC 调用。
-
webviewClient 的 onPageFinished() 方法,当 webview 页面加载完成后会调用这个方法,但是这个方法存在一些问题,当正在加载的网页如果产生跳转的时候,这个方法就会被调用多次,通过使用 WebChromeClient 的 onProgressChanged() 方法来替代。
-
后台耗电,webview 在后台会启动好多线程,使用不当,这些线程就会在后台一直存在,造成耗电。
-
硬件加速,可能会造成屏幕白块,闪屏等花屏问题,解决办法临时关闭加速。
2.关于 webview 的内存泄露问题
webview 出现内存泄露的原因是:当 webview 关联 Activity 的时候,自动创建了一些线程,而 Activity 无法确定这些线程的生命周期,换句话说,这些线程的生命周期和 Activity 的生命周期是不一样的。 这就导致了当 Activity 销毁时,webview 还有可能持有 Activity 的引用,从而导致了内存泄露。
解决 webview 内存泄露的方法:
- 动态添加 webview,对传入 webview 中使用的 Context,要通过弱引用的方式。动态添加 webview 的意思是在布局中创建 webview,当 Activity 创建时 add() 添加进来,在 Activity 销毁时,通过 remove() 移除掉。
- 开启独立进程加载 webview 页面,当页面关闭后,通过 System.exit() 强制退出进程。
课程收获
这一节详细介绍了使用 webview 时需要注意的一些问题,尤其需要重点关注可能会引起内存泄漏的问题。
共同学习,写下你的评论
评论加载中...
作者其他优质文章