Home » Android » android – Attempting to initialize hardware acceleration outside of the main thread, aborting

android – Attempting to initialize hardware acceleration outside of the main thread, aborting

Posted by: admin May 14, 2020 Leave a comment

Questions:

Does anybody have any insight about why I’m getting this warning in LogCat?

01-18 01:18:17.475: W/HardwareRenderer(25992): Attempting to
initialize hardware acceleration outside of the main thread, aborting

I do this with my WebView in my Main activity (the main thread):

wv = (WebView) findViewById(R.id.main_webview);
wv.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH);

and I have this in my manifest:

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

Here is how the Hardware Acceleration works in 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;
        }
    }
}

From there, you can see that the log you are getting is when the hardware acceleration is asked outside of the main thread (as the log says).

In your case, you have to get more deep in your code and see all the non main threads, which one is calling the hardware acceleration.

I can’t help you without more details (some code etc).

Answer:

As Per documentation

setRenderPriority

should only be called once per process.

Sets the priority of the Render thread. Unlike the other settings,
this one only needs to be called once per process. The default value
is NORMAL.

Possible soultion to your problem

  • Would be removal of the websetting.setRenderPriority.
  • Would another thread that you have not shared in the above code would be accessing
    the hardware

Answer:

webview.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH);

Answer:

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);

        }
    });