撞车日志:
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的错误
最重要的是,我的问题是:如何从我的应用程序修复它?
发布于 2012-11-06 13:14:32
我应该申报哪一项许可?
AFAIK没有相关的许可。不幸的是,setThreadPriority()的实现是在本机代码中,这使我很难弄清楚到底发生了什么。
cm男似乎否认这是CM的错误
不,他们没有。没有人发布证据证明这是CM9或更高版本的问题,这就是为什么他们把这个问题标为陈腐的原因。如果您在CM9或更高版本上看到这个问题,我建议您更新这个问题。如果您在标准Android上看到这一点,请创建一个可以重现错误的示例项目。
如何从我的应用程序修复它?
很有可能你不知道。您可以尝试在您的WebView上运行一些实验,看看是否有特定的内容触发此异常,并尝试修改或删除该内容。
发布于 2013-06-21 03:22:07
我从我的应用程序(它严重依赖于webview )中得到了几十个由这个异常引起的崩溃日志,涉及的ROM版本分别是4.0.4和4.0.3。
似乎没有正常的方法来修复它,所以我尝试遵循黑客的方法。
4.0.4上的代码片段:
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);
}
}
}仍然存在的问题是何时调用tryTweakWebCoreHandler()。在一些设备上创建和测试WebView实例之后,我尝试调用它,可以调用WebCoreProxyHandler.handleMessage()。
注:我只是做了一些简单的测试,我不确定这个问题是否解决了,因为原始异常不能可靠地再现。
如果您决定尝试这种方法,请做足够的测试。
https://stackoverflow.com/questions/13248172
复制相似问题