最近做的项目,用webview加载网页,自测好好的,突然有一天,项目赋予了系统级应用能力,这个时候,webview不能用了;
狗血,怎么办呢?
因为应用是系统级别的,在AndroidManifest.xml中添加了android:sharedUserId=“android.uid.system”
根据异常分析,是安全问题限制了webview控件使用
追溯源码发现有这样的判断
if (uid == android.os.Process.ROOT_UID || uid == android.os.Process.SYSTEM_UID
|| uid == android.os.Process.PHONE_UID || uid == android.os.Process.NFC_UID
|| uid == android.os.Process.BLUETOOTH_UID) {
throw new UnsupportedOperationException(
"For security reasons, WebView is not allowed in privileged processes");
}
如果进程ID是root或者system,就会抛出UnsupportedOperationException。
为什么会有这种安全机制呢?因为webview允许运行js,如果用户通过js注入安全代码,那么js就可以肆无忌惮的使用系统权限,这无疑是一个漏洞。
解决方案:
方案一:换控件
就是android:sharedUserId="android.uid.system"的问题,因为是系统应用所以只能修改基础调试库的展示控件,把展示调试信息的webview改为textview。
方案二:修改framework层代码
禁用判断条件
因为我们是做硬件的,所以可以支持修改framework层代码,通过OTA更新来解决