我很想在Manifest中使用 Android:LargeHeap =“true”选项来获得额外的内存(我们在高分辨率的1980x1200显示器上处理5+ MB位图并且很快就会期待更大的显示器。
我已经没有处理Android中用于位图的糟糕内存处理的所有常规技巧(即,除了尝试并祈祷它没有办法知道碎片内存中是否存在足够大的漏洞不会崩溃。我已经花了数周优化,修剪和应用其他技巧来最小化内存并防止崩溃。这是在2.x vs 3.x / 4.x中可以完成哪些功能的技巧,但是将它们全部保存在一个应用程序中。无需指出“如何优化位图” - 我已经完成了这些并应用了我所能做的。
版本2.x不支持LargeHeap,并且我在2.x中不需要LargeHeap选项的较低分辨率屏幕使用不同的图像。 (也没有内存不足问题。)
当android:minSdkVersion =“8”时,它根本不允许使用Android:LargeHeap选项。
有没有办法有条件地为包含3.x的系统包含LargeHeap,并在2.x中忽略它?或者如果检测到3.x,应用程序本身是否尝试设置LargeHeap?我找不到任何办法,但也许我忽略了一些技巧。
我也意识到LargeHeap相当糟糕,但我们已经没有其他技巧了。理想情况下,只有在OnCreate程序中真正需要(和允许)时,以编程方式执行LargeHeap会很好。
答案 0 :(得分:5)
当android:minSdkVersion =“8”时,它根本不允许使用Android:LargeHeap选项。
是的,它会。
现在,如果构建目标(例如,属性> Android)设置为API级别8,则无法编译。您需要使用构建目标API级别11或更高版本进行编译。但是android:minSdkVersion
与它无关。旧设备上只会忽略该选项。
有没有办法有条件地为包含3.x的系统包含LargeHeap,并在2.x中忽略它?
在清单中的android:largeHeap="true"
元素中使用<application>
。
或者,如果检测到3.x,应用程序本身是否会尝试设置LargeHeap?
AFAIK,没有编程手段来设置它。
答案 1 :(得分:4)
我使用这种方法:
AndroidManifest.xml中的
android:largeHeap="@bool/largeheap"
我创建了2个configuration.xml文件
价值观中的第一个: configuration.xml
<bool name="largeheap">false</bool>
第二个值-v11(仅用于版本&gt; = 11)
<bool name="largeheap">true</bool>
答案 2 :(得分:0)
如果你处理了很多大位图,你最好使用JNI,它不受堆限制的约束,而是受设备RAM本身的限制。
另一种方法是根据设备可用的堆大小来灵活。
据我所知,使用largeHeap标记是可以的,但是你没有得到任何关于你得到多少堆大小的承诺,如果有的话。事实上,我不确定谷歌是否甚至要求制造商提出它应该给你多少钱。
为了使用largeHeap标志,只需在清单中设置它,并使用targetSdk设置为最新的可用标记。在minSdk中,您设置了您支持的最小API,因此在旧设备上运行时将自动忽略此标志。对于属于新API的任何xml属性也是如此。
只有属于较新API的类和方法才会导致问题,但为此您应该阅读Lint的警告。