http://blog.csdn.net/liyuxi45/article/details/53034076
之前在做项目时,客户提供的apk合入过程中启动报错,查看log发现报错时有exception,如下:
For security reasons, WebView is not allowed in privileged processes。
搜索源码,在frameworks/base/core/Java/Android/webkit/WebViewFactory.java中找到了这条log语句。
- static WebViewFactoryProvider getProvider() {
- synchronized (sProviderLock) {
-
-
- if (sProviderInstance != null) return sProviderInstance;
-
- final int uid = android.os.Process.myUid();
- if (uid == android.os.Process.ROOT_UID || uid == android.os.Process.SYSTEM_UID) {
- throw new UnsupportedOperationException(
- "For security reasons, WebView is not allowed in privileged processes");
- }
-
- Trace.traceBegin(Trace.TRACE_TAG_WEBVIEW, "WebViewFactory.getProvider()");
- try {
- Class<WebViewFactoryProvider> providerClass = getProviderClass();
-
- StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads();
- Trace.traceBegin(Trace.TRACE_TAG_WEBVIEW, "providerClass.newInstance()");
- try {
- sProviderInstance = providerClass.getConstructor(WebViewDelegate.class)
- .newInstance(new WebViewDelegate());
- if (DEBUG) Log.v(LOGTAG, "Loaded provider: " + sProviderInstance);
- return sProviderInstance;
- } catch (Exception e) {
- Log.e(LOGTAG, "error instantiating provider", e);
- throw new AndroidRuntimeException(e);
- } finally {
- Trace.traceEnd(Trace.TRACE_TAG_WEBVIEW);
- StrictMode.setThreadPolicy(oldPolicy);
- }
- } finally {
- Trace.traceEnd(Trace.TRACE_TAG_WEBVIEW);
- }
- }
- }
可以看到是因为该app的uid是ROOT_UID或者SYSTEM_UID并且该app直接或者间接调用了WebViewFactory类的getProvider方法。
之前KK的源码中并没有这个保护条件,但是5.1的源码中就有了。所以保证不影响其它功能的情况下,在app中去掉root或者system uid就可以了。