继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

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

GT9456
关注TA
已关注
手记 89
粉丝 12
获赞 17

课程名称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 时需要注意的一些问题,尤其需要重点关注可能会引起内存泄漏的问题。

图片描述
图片描述

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP