Android WebView没有修改给定线程的权限,我应该声明哪个权限?;

Android WebView没有修改给定线程的权限,我应该声明哪个权限?;,android,permissions,webview,Android,Permissions,Webview,事故日志: java.lang.SecurityException: No permission to modify given thread android.os.Process.setThreadPriority(Native Method) android.webkit.WebViewCore$WebCoreThread$1.handleMessage(WebViewCore.java:764) android.os.Handler.dispatchMessage(Handler.

事故日志:

    java.lang.SecurityException: No permission to modify given thread
android.os.Process.setThreadPriority(Native Method)
android.webkit.WebViewCore$WebCoreThread$1.handleMessage(WebViewCore.java:764)
android.os.Handler.dispatchMessage(Handler.java:99)
android.os.Looper.loop(Looper.java:137)
android.webkit.WebViewCore$WebCoreThread.run(WebViewCore.java:829)
java.lang.Thread.run(Thread.java:856)
我应该申报哪项许可

编辑:

我在工作中发现了类似的问题

答案是“这是氰的错。”

然而,在线程中,cm成员似乎否认这是cm的错误

首先,我的问题是: 如何从我的应用程序修复它?

我应该申报哪项许可

此AFAIK没有相关许可。不幸的是,
setThreadPriority()
的实现是在本机代码中实现的,这使得我很难弄清楚到底发生了什么

cm成员似乎否认这是cm的错误

不,他们没有。没有人发布证据证明这是CM9或更高版本中的问题,这就是为什么他们将该问题标记为过时。如果您在CM9或更高版本上看到此问题,我建议您更新此问题。如果您在标准Android上看到这一点,请创建一个可以重现错误的示例项目

如何从我的应用程序修复它


你很可能不会。你可以尝试在你的
网络视图上运行一些实验,看看是否有某些特定内容触发了此异常,并尝试修改或删除该内容。

我从我的应用程序(严重依赖于网络视图)中得到了几十个由此异常引起的崩溃日志,涉及的ROM版本是4.0.4和4.0.3

似乎没有正常的方法来修复它,所以我尝试了以下黑客方法

4.0.4上的代码snipet:

private static Handler sWebCoreHandler;
// Class for providing Handler creation inside the WebCore thread.
private static class WebCoreThread implements Runnable {
    // Message id for initializing a new WebViewCore.
    private static final int INITIALIZE = 0;
    private static final int REDUCE_PRIORITY = 1;
    private static final int RESUME_PRIORITY = 2;

    public void run() {
        Looper.prepare();
        Assert.assertNull(sWebCoreHandler);
        synchronized (WebViewCore.class) {
            sWebCoreHandler = new Handler() {
                @Override
                public void handleMessage(Message msg) {
                    // ...
                    // Process.setPriority(...)
                }
            };
        // ...
        }
        // ...
    }
}
我认为这个异常是从sWebCoreHandler.handleMessage()抛出的,如果我们能在handleMessage()上包装try/catch,问题就可以解决了

处理程序类有四个成员:

final MessageQueue mQueue;
final Looper mLooper;
final Callback mCallback;
IMessenger mMessenger;
mQueue被设置为mLooper.mQueue,而mCallback在sWebCoreHandler中为null,所以我们只需要在sWebCoreHandler中使用值设置mLooper和mMessenger

static Handler sProxyHandler = null;

static void tryTweakWebCoreHandler() {
    // 4.0.3/4.0.4 rom
    if (Build.VERSION.SDK_INT == Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) {
        tweakWebCoreHandle();
    }
}

static private void tweakWebCoreHandle() {
    if (sProxyHandler != null)
        return;
    try {
        Field f = Class.forName("android.webkit.WebViewCore").getDeclaredField("sWebCoreHandler");
        f.setAccessible(true);
        Object h = f.get(null);
        Object mMessenger = null;
        Method m = Handler.class.getDeclaredMethod("getIMessenger", (Class<?>[])null);
        m.setAccessible(true);
        mMessenger = m.invoke(h, (Object[])null);
        sProxyHandler = new WebCoreProxyHandler((Handler)h);
        if (mMessenger != null) {
            Field f1 = Handler.class.getDeclaredField("mMessenger");
            f1.setAccessible(true);
            f1.set(sProxyHandler, mMessenger);
        }
        f.set(null, sProxyHandler);
        // Log.w(TAG,  "sWebCoreHandler: " + h);
    } catch (Throwable e) {
        Log.w(TAG, "exception: " + e);
    }
    if (sProxyHandler == null)
        sProxyHandler = new Handler();
}

static class WebCoreProxyHandler extends Handler {
    final Handler handler;
    public WebCoreProxyHandler(Handler handler) {
        super(handler.getLooper());
        this.handler = handler;
    }

    public void handleMessage(Message msg) {
        // Log.w("WebCoreProxyHandler", "handle msg: " + msg.what);
        try {
            handler.handleMessage(msg);
        } catch (Throwable tr) {
            Log.w("WebCoreProxyHandler", "exception: " + tr);
        }
    }
}
静态处理程序sProxyHandler=null;
静态void tryTweakWebCoreHandler(){
//4.0.3/4.0.4 rom
if(Build.VERSION.SDK\u INT==Build.VERSION\u code.ICE\u SANDWICH\u MR1){
调整WebCoreHandle();
}
}
静态私有空间WebCoreHandle(){
if(sProxyHandler!=null)
返回;
试一试{
字段f=Class.forName(“android.webkit.WebViewCore”).getDeclaredField(“sWebCoreHandler”);
f、 setAccessible(true);
对象h=f.get(null);
对象mMessenger=null;
方法m=Handler.class.getDeclaredMethod(“getIMessenger”,(class[])null;
m、 setAccessible(true);
mMessenger=m.invoke(h,(Object[])null;
sProxyHandler=新的WebCoreProxyHandler((Handler)h);
如果(mMessenger!=null){
字段f1=Handler.class.getDeclaredField(“mMessenger”);
f1.设置可访问(真);
f1.集合(sProxyHandler,mMessenger);
}
f、 set(null,sProxyHandler);
//Log.w(标签“sWebCoreHandler:+h);
}捕获(可丢弃的e){
Log.w(标记“异常:+e”);
}
if(sProxyHandler==null)
sProxyHandler=新处理程序();
}
静态类WebCoreProxyHandler扩展处理程序{
最终处理者;
公共WebCoreProxyHandler(处理程序处理程序){
super(handler.getLooper());
this.handler=handler;
}
公共无效handleMessage(消息消息消息){
//w(“WebCoreProxyHandler”,“handle msg:+msg.what”);
试一试{
handleMessage(msg);
}捕获(可丢弃tr){
w(“WebCoreProxyHandler”,“异常:+tr”);
}
}
}
剩下的问题是何时调用tryTweakWebCoreHandler()。在一些设备上创建并测试WebView实例后,我尝试调用它,可以调用WebCoreProxyHandler.handleMessage()

注意:我只是做了一些简单的测试,我不确定这个问题是否解决了,因为原始异常无法可靠地再现


如果您决定尝试这种方法,请做足够的测试。

请详细说明您正在尝试做什么。日志错误的一个简单部分实际上不太可能发生。谢谢,我添加了更多我刚刚发现的参考