【问题标题】:How can I check if an android device has hardware acceleration capabilities?如何检查 android 设备是否具有硬件加速功能?
【发布时间】:2016-08-31 00:41:27
【问题描述】:

我正在开发一个 Android 应用程序,它在某个 x86 设备 (API 21) 上崩溃,这在关闭硬件加速后没有发生。经过一番研究,我发现 x86 android 设备只有在较新的版本才有硬件加速功能。

如果设备支持硬件加速,是否有任何方法可以在 android 应用程序中以编程方式检查?

编辑 2:

就像你在 chrome 浏览器中输入 chrome://gpu 并获得像 Canvas 这样的图形功能状态,我只为该设备获取软件,我如何在我的 android 代码中获取它?

编辑 1:

当我尝试在此 x86 设备(Dell Venue 8 7840 API 21)上的示例应用上打开 youtube.com 并启用硬件加速时发生崩溃日志:

W/ActivityManager: Exception thrown during pause
W/ActivityManager: android.os.TransactionTooLargeException
W/ActivityManager:     at android.os.BinderProxy.transactNative(Native Method)
W/ActivityManager:     at android.os.BinderProxy.transact(Binder.java:496)
W/ActivityManager:     at android.app.ApplicationThreadProxy.schedulePauseActivity(ApplicationThreadNative.java:704)
W/ActivityManager:     at com.android.server.am.ActivityStack.startPausingLocked(ActivityStack.java:825)
W/ActivityManager:     at com.android.server.am.ActivityStack.finishActivityLocked(ActivityStack.java:2726)
W/ActivityManager:     at com.android.server.am.ActivityStack.finishTopRunningActivityLocked(ActivityStack.java:2583)
W/ActivityManager:     at com.android.server.am.ActivityStackSupervisor.finishTopRunningActivityLocked(ActivityStackSupervisor.java:2537)
W/ActivityManager:     at com.android.server.am.ActivityManagerService.handleAppCrashLocked(ActivityManagerService.java:11680)
W/ActivityManager:     at com.android.server.am.ActivityManagerService.makeAppCrashingLocked(ActivityManagerService.java:11577)
W/ActivityManager:     at com.android.server.am.ActivityManagerService.crashApplication(ActivityManagerService.java:12261)
W/ActivityManager:     at com.android.server.am.ActivityManagerService.handleApplicationCrashInner(ActivityManagerService.java:11772)
W/ActivityManager:     at com.android.server.am.NativeCrashListener$NativeCrashReporter.run(NativeCrashListener.java:86)

【问题讨论】:

    标签: android android-canvas gpu hardware-acceleration android-x86


    【解决方案1】:

    如果您的 Target API 级别 >=14,则默认启用硬件加速,但也可以显式启用。从 API 11 开始支持硬件加速。

    有两种不同的方法可以检查应用程序是否是硬件加速的:

    • 如果View 附加到硬件加速窗口,View.isHardwareAccelerated() 返回 true。
    • 如果 Canvas 是硬件加速的,Canvas.isHardwareAccelerated() 返回 true

    如果您必须在绘图代码中检查这一点,请尽可能使用Canvas.isHardwareAccelerated() 而不是View.isHardwareAccelerated()。

    【讨论】:

    • 我说的不是启用和禁用硬件加速,而是硬件加速本身的支持
    • 我敢说,每台 API 11+ 的设备都支持硬件加速。
    • 我有一个设备,它有 API 21 并且似乎不支持硬件加速,也许 x86 架构不是这样
    【解决方案2】:

    很简单

    <application android:hardwareAccelerated="true" ...>
    

    【讨论】:

    • 我说的不是启用和禁用硬件加速,而是硬件加速本身的支持
    • 如果您可以正确启用它,则表示它确实支持它
    • 但是当我尝试做一些图形密集型工作时它会崩溃,比如在 web 视图中打开 youtube.com,崩溃日志指向本机代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多