Android 正在尝试在主线程之外初始化硬件加速,正在中止

Android 正在尝试在主线程之外初始化硬件加速,正在中止,android,Android,有人知道我为什么在LogCat中得到这个警告吗 01-18 01:18:17.475:W/HardwareRenderer(25992):试图 在主线程之外初始化硬件加速,中止 我在我的主要活动(主线程)中使用WebView执行此操作: 我的舱单上有: <activity android:name=".Main" android:hardwareAccelerated="true" android:label="@string/title_activity_main" &

有人知道我为什么在LogCat中得到这个警告吗

01-18 01:18:17.475:W/HardwareRenderer(25992):试图 在主线程之外初始化硬件加速,中止

我在我的主要活动(主线程)中使用WebView执行此操作:

我的舱单上有:

<activity
   android:name=".Main"
   android:hardwareAccelerated="true"
   android:label="@string/title_activity_main" >

以下是Android中硬件加速的工作原理:

private void enableHardwareAcceleration(WindowManager.LayoutParams attrs) {
    mAttachInfo.mHardwareAccelerated = false;
    mAttachInfo.mHardwareAccelerationRequested = false;

    // Don't enable hardware acceleration when the application is in compatibility mode
    if (mTranslator != null) return;

    // Try to enable hardware acceleration if requested
    final boolean hardwareAccelerated = 
            (attrs.flags & WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED) != 0;

    if (hardwareAccelerated) {
        if (!HardwareRenderer.isAvailable()) {
            return;
        }

        // Persistent processes (including the system) should not do
        // accelerated rendering on low-end devices.  In that case,
        // sRendererDisabled will be set.  In addition, the system process
        // itself should never do accelerated rendering.  In that case, both
        // sRendererDisabled and sSystemRendererDisabled are set.  When
        // sSystemRendererDisabled is set, PRIVATE_FLAG_FORCE_HARDWARE_ACCELERATED
        // can be used by code on the system process to escape that and enable
        // HW accelerated drawing.  (This is basically for the lock screen.)

        final boolean fakeHwAccelerated = (attrs.privateFlags &
                WindowManager.LayoutParams.PRIVATE_FLAG_FAKE_HARDWARE_ACCELERATED) != 0;
        final boolean forceHwAccelerated = (attrs.privateFlags &
                WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_HARDWARE_ACCELERATED) != 0;

        if (!HardwareRenderer.sRendererDisabled || (HardwareRenderer.sSystemRendererDisabled
                && forceHwAccelerated)) {
            // Don't enable hardware acceleration when we're not on the main thread
            if (!HardwareRenderer.sSystemRendererDisabled
                    && Looper.getMainLooper() != Looper.myLooper()) {
                Log.w(HardwareRenderer.LOG_TAG, "Attempting to initialize hardware "
                        + "acceleration outside of the main thread, aborting");
                return;
            }

            final boolean translucent = attrs.format != PixelFormat.OPAQUE;
            if (mAttachInfo.mHardwareRenderer != null) {
                mAttachInfo.mHardwareRenderer.destroy(true);
            }                
            mAttachInfo.mHardwareRenderer = HardwareRenderer.createGlRenderer(2, translucent);
            mAttachInfo.mHardwareAccelerated = mAttachInfo.mHardwareAccelerationRequested
                    = mAttachInfo.mHardwareRenderer != null;
        } else if (fakeHwAccelerated) {
            // The window had wanted to use hardware acceleration, but this
            // is not allowed in its process.  By setting this flag, it can
            // still render as if it was accelerated.  This is basically for
            // the preview windows the window manager shows for launching
            // applications, so they will look more like the app being launched.
            mAttachInfo.mHardwareAccelerationRequested = true;
        }
    }
}
从那里,您可以看到,您得到的日志是在主线程之外请求硬件加速时(如日志所示)

在您的例子中,您必须更深入地了解代码并查看所有非主线程,其中一个线程调用硬件加速

如果没有更多详细信息(一些代码等),我无法帮助您。

根据文档

setRenderPriority

每个进程只应调用一次

设置渲染线程的优先级。与其他设置不同, 每个进程只需要调用一次这个函数。默认值 这是正常的

你问题的可能解决方法

  • 将删除websetting.setRenderPriority
  • 您在上述代码中没有共享的另一个线程是否正在访问 硬件

“主线外”听起来可疑;是否有(手动)创建的线程?是的,但没有任何线程与硬件加速有关。有一些Facebook对话框代码(在我看到此警告之前甚至没有调用)和GCM服务。进行跟踪查看,检查哪个线程称为enableHardwareAcceleration,通过了解线程名称,您可能会得到一些提示。删除setRenderPriority()似乎会删除此警告,但由于应用程序的大部分处理都在webview中进行,我确实希望确保它的渲染优先级较高。webview是唯一的其他线程。我需要确保它得到硬件加速。尝试使用breackpoints来查看何时触发异常。这只是一些(随机)代码,不是问题的答案。
private void enableHardwareAcceleration(WindowManager.LayoutParams attrs) {
    mAttachInfo.mHardwareAccelerated = false;
    mAttachInfo.mHardwareAccelerationRequested = false;

    // Don't enable hardware acceleration when the application is in compatibility mode
    if (mTranslator != null) return;

    // Try to enable hardware acceleration if requested
    final boolean hardwareAccelerated = 
            (attrs.flags & WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED) != 0;

    if (hardwareAccelerated) {
        if (!HardwareRenderer.isAvailable()) {
            return;
        }

        // Persistent processes (including the system) should not do
        // accelerated rendering on low-end devices.  In that case,
        // sRendererDisabled will be set.  In addition, the system process
        // itself should never do accelerated rendering.  In that case, both
        // sRendererDisabled and sSystemRendererDisabled are set.  When
        // sSystemRendererDisabled is set, PRIVATE_FLAG_FORCE_HARDWARE_ACCELERATED
        // can be used by code on the system process to escape that and enable
        // HW accelerated drawing.  (This is basically for the lock screen.)

        final boolean fakeHwAccelerated = (attrs.privateFlags &
                WindowManager.LayoutParams.PRIVATE_FLAG_FAKE_HARDWARE_ACCELERATED) != 0;
        final boolean forceHwAccelerated = (attrs.privateFlags &
                WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_HARDWARE_ACCELERATED) != 0;

        if (!HardwareRenderer.sRendererDisabled || (HardwareRenderer.sSystemRendererDisabled
                && forceHwAccelerated)) {
            // Don't enable hardware acceleration when we're not on the main thread
            if (!HardwareRenderer.sSystemRendererDisabled
                    && Looper.getMainLooper() != Looper.myLooper()) {
                Log.w(HardwareRenderer.LOG_TAG, "Attempting to initialize hardware "
                        + "acceleration outside of the main thread, aborting");
                return;
            }

            final boolean translucent = attrs.format != PixelFormat.OPAQUE;
            if (mAttachInfo.mHardwareRenderer != null) {
                mAttachInfo.mHardwareRenderer.destroy(true);
            }                
            mAttachInfo.mHardwareRenderer = HardwareRenderer.createGlRenderer(2, translucent);
            mAttachInfo.mHardwareAccelerated = mAttachInfo.mHardwareAccelerationRequested
                    = mAttachInfo.mHardwareRenderer != null;
        } else if (fakeHwAccelerated) {
            // The window had wanted to use hardware acceleration, but this
            // is not allowed in its process.  By setting this flag, it can
            // still render as if it was accelerated.  This is basically for
            // the preview windows the window manager shows for launching
            // applications, so they will look more like the app being launched.
            mAttachInfo.mHardwareAccelerationRequested = true;
        }
    }
}
webview.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH);
LinearLayout.LayoutParams dfparams = new LinearLayout.LayoutParams(0, 0, 0);
    webview.setLayoutParams(dfparams);
    webview.loadDataWithBaseURL("url", content, "text/html", "utf-8", null);

    webview.setWebViewClient(new WebViewClient() {
        public void onPageFinished(WebView view, String url) {
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT, 0);
            webview.setLayoutParams(params);

        }
    });