在Android 4中启用android:largeHeap,并在Android 2.3中禁用它

Che*_*eng 20 android

目前,我有一段代码,设计用于在Android 2.3和4+中运行

如果android:largeHeap在AndroidManifest.xml中应用代码,代码将执行得更好(大多数情况下它不会有OutOfMemory异常).

<application
    android:name=".MyApplication"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:screenOrientation="nosensor"
    android:largeHeap="true"
Run Code Online (Sandbox Code Playgroud)

目前,我android:minSdkVersion需要设置为15而不是10(Android 2.3).如果没有,android:largeHeap则在AndroidManifest.xml中不允许.

<uses-sdk
    android:minSdkVersion="15"
    android:targetSdkVersion="15" />
Run Code Online (Sandbox Code Playgroud)

在单个APK中,我可以设置多少

  • android:largeHeap如果我在Android 4+中使用选项
  • android:largeHeap如果我在Android 2.3中,请不要使用选项

Gle*_*enn 73

您还可以在Honeycomb中禁用大堆并在ICS或JB中启用它.只是一点点hacky或什么的.这是我尝试过的.

在我们继续之前,将Build目标更改为Honeycomb,Jelly Bean或ICS,以便我们可以放置android:largeHeap属性.此外,您可以设置android:minSdkVersionAPI 10.

Android API 10不支持大堆.

  1. values-v14res文件夹中创建一个文件夹
  2. 我创建bools.xmlvalues-v14
  3. 把这个值bools.xmlvalues-v14

<bool name="largeheap">true</bool>

values> bools.xmlvalues-[API VERSION]>的布尔值,用于bools.xml在不同的API版本中禁用大堆,或者默认情况下.

<bool name="largeheap">false</bool>
Run Code Online (Sandbox Code Playgroud)

将值更改android:largeHeap@bool/largeheap而不是硬编码truefalse

<application
        android:largeHeap="@bool/largeheap"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher">
                ....
</application>
Run Code Online (Sandbox Code Playgroud)

我通过制作内存泄漏应用程序或只加载一个巨大的位图来测试这段代码,并且,它的工作!

祝好运!

  • 没关系仇敌,我会把这个添加到你的帖子http://stackoverflow.com/questions/5350465/android-heap-size-on-different-phones-devices-and-os-versions (2认同)

Phi*_*hil 9

android:largeHeap="true"属性保留在您的AndroidManifest.xml.对于不支持它的版本,应忽略此项.然后,要支持旧版本,请使用VMRuntime类设置堆大小(如果需要,通过反射).

有关此主题的更多信息:如何增加Android应用程序的堆大小?