手记

【九月打卡】第5天 Android 中 webview 的相关面试问题

课程名称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 内存泄露的方法:

  1. 动态添加 webview,对传入 webview 中使用的 Context,要通过弱引用的方式。动态添加 webview 的意思是在布局中创建 webview,当 Activity 创建时 add() 添加进来,在 Activity 销毁时,通过 remove() 移除掉。
  2. 开启独立进程加载 webview 页面,当页面关闭后,通过 System.exit() 强制退出进程。

课程收获

这一节详细介绍了使用 webview 时需要注意的一些问题,尤其需要重点关注可能会引起内存泄漏的问题。


0人推荐
随时随地看视频
慕课网APP