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()
注意:我只是做了一些简单的测试,我不确定这个问题是否解决了,因为原始异常无法可靠地再现
如果您决定尝试这种方法,请做足够的测试。请详细说明您正在尝试做什么。日志错误的一个简单部分实际上不太可能发生。谢谢,我添加了更多我刚刚发现的参考