首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android WebView没有修改给定线程的权限,我应该声明哪个权限?

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

Stack Overflow用户
提问于 2012-11-06 09:34:49
回答 2查看 2.4K关注 0票数 0

撞车日志:

代码语言:javascript
复制
    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)

我应该申报哪一项许可?http://developer.android.com/reference/android/Manifest.permission.html

编辑:

我在WebView java.lang.SecurityException: No permission to modify given thread中发现了一个类似的问题

答案是:“这是氰化物的错。”

然而,在线程http://code.google.com/p/cyanogenmod/issues/detail?id=5656&thanks=5656&ts=1341224425中,cm菜单似乎否认它是CM的错误

最重要的是,我的问题是:如何从我的应用程序修复它?

EN

回答 2

Stack Overflow用户

发布于 2012-11-06 13:14:32

我应该申报哪一项许可?

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

cm男似乎否认这是CM的错误

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

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

很有可能你不知道。您可以尝试在您的WebView上运行一些实验,看看是否有特定的内容触发此异常,并尝试修改或删除该内容。

票数 0
EN

Stack Overflow用户

发布于 2013-06-21 03:22:07

我从我的应用程序(它严重依赖于webview )中得到了几十个由这个异常引起的崩溃日志,涉及的ROM版本分别是4.0.4和4.0.3。

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

4.0.4上的代码片段:

代码语言:javascript
复制
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,那么问题就会得到解决。

处理程序类有四个成员:

代码语言:javascript
复制
final MessageQueue mQueue;
final Looper mLooper;
final Callback mCallback;
IMessenger mMessenger;

mQueue设置为mLooper.mQueue,mCallback在sWebCoreHandler中为null,因此我们只需要在sWebCoreHandler中设置带有值的mLooper和mMessenger。

代码语言:javascript
复制
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);
        }
    }
}

仍然存在的问题是何时调用tryTweakWebCoreHandler()。在一些设备上创建和测试WebView实例之后,我尝试调用它,可以调用WebCoreProxyHandler.handleMessage()。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13248172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档