Android性能API 11及以上水平

8
我似乎遇到了一个无法解决的问题,我已经花了整个周末来尝试解决它,但是没有成功。当我创建了一个简单的测试应用程序,其中包含两个活动: 1. MainActivity:几个按钮、一个计时器(后台线程)和对SQLite数据库的轻量级请求。 2. SecondActivity:几个按钮,只有一个拥有点击监听器,当你点击它时,你会回到第一个活动。
我使用大按钮(屏幕宽度约为屏幕高度的四分之一),XML布局资源不包含任何嵌套权重元素或其他奇特的东西。这是一个测试项目,没有其他功能。
我遇到了以下严重问题: - 当我将清单文件中的API级别设置为3时,一切正常。(屏幕自动处于兼容模式) - 当我将API级别设置为11或更高时,第二个活动加载需要长达10秒钟。第一次打开第二个活动后,似乎缓存了数据,延迟不再存在。 - 当我将API级别设置为11或更高,并强制(屏幕分辨率)兼容模式时:没有变化,延迟仍然存在。
我构建了这个测试项目,因为当我升级一个旧应用程序时遇到了这个问题。它在旧的API级别上运行得很顺畅,但只要我将它放到Android 3或更高版本上,它就会出现长达25秒的延迟!(即使是打开一个仅显示静态文本的活动...)。
我正在新的Galaxy Tab上测试,那不可能是问题所在。我花了几个小时在谷歌上寻找解决办法,但没有发现任何接近的东西。我甚至完全卸载了Eclipse和所有Android资源,并进行了全新安装和更新(包括对我的Galaxy Tab进行了恢复出厂设置)。但是还是没有用。
我进行了跟踪,问题出现在GLES20Canvas.nDrawDisplayList中。似乎构建这个列表需要很长时间,即使没有太多要构建的内容...
有人知道我如何解决这个问题吗?
谢谢, Martin
2个回答

3

通过查看这篇文章,我找到了解决此问题的方法: http://code.google.com/p/android/issues/detail?id=22514

解决方法是禁用硬件加速。

AndroidManifest.xml文件中,在应用程序标记中添加:

android:hardwareAccelerated="false"

现在一切都恢复正常了。不幸的是,硬件加速不能使应用程序在启动时更快地运行。


您可能不想为所有设备禁用硬件加速,请参见-> http://stackoverflow.com/a/21791909/546901我只在一个设备上注意到了这个问题,HTC One。Traceview结果显示问题出现在nDrawDisplayList上。我尝试过的任何其他设备的Traceview结果都很好。这似乎意味着是设备或操作系统级别的错误,而不是应用程序代码错误。人们报告看到此问题的设备(HTC One或Galaxy Nexus)上使用低深度listview或scrollview似乎很容易重现。 - Brendan Weinstein

1

GLES20Canvas.nDrawDisplayList

当这个功能到来时,如果你需要绘制很多东西,特别是非常大的视图,它预计会占据大部分时间。

我想给你提供一个链接,里面包含android-30-hardware-acceleration的注意事项。


1
谢谢。我之前已经阅读过那篇文章并进行了实验,但没有成功。事实上,即使是一个简单的文本视图,在渲染时也需要几秒钟的时间(布局中没有其他内容)。到目前为止,我找到的唯一解决方案是禁用硬件加速。 - martin
Romain Guy只是Google的辩护人,无心解决开发者真正面临的问题。 - StackOverflowed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接