20

目前,我有一段代码,旨在同时在 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"

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

<uses-sdk
    android:minSdkVersion="15"
    android:targetSdkVersion="15" />

在单个 APK 中,我如何设置

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

5 回答 5

73

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

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

AndroidAPI 10不支持大堆。

  1. values-v14在文件夹中创建文件res
  2. 我创建bools.xmlvalues-v14
  3. bools.xml将此值放入values-v14

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

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

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

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

<application
        android:largeHeap="@bool/largeheap"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher">
                ....
</application>

我通过制作内存泄漏应用程序或仅加载巨大的位图来测试此代码,并且它可以正常工作!

祝你好运!

于 2013-02-19T06:53:41.960 回答
9

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

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

于 2013-02-21T19:43:34.863 回答
1
  1. 1.使用目标Android 3.0(API 11)或更高版本构建项目。(项目属性 - Android - 项目构建目标 - 选择 API 级别 11 以上)

  2. 在 Manifest 文件中,将 uses-sdk 值更改如下

    <使用-sdk android:minSdkVersion="10" android:targetSdkVersion="11" />

对于 Android 3.0 的早期版本,您可以使用 VMRuntime 类进行内存操作。

于 2013-02-19T07:08:19.253 回答
0

似乎您在project.properties文件中有不正确的目标 sdk,检查它并将目标更改为您的 AndroidManifest 的 targetSdk (15) 并重建项目。

项目属性

# Project target.
target=15

PS 我尝试将 android:largeHeap 添加到我的项目 (minSdk = 7, targetSdk = 17) 中,并在所有 Android 版本上正常运行。

于 2013-02-19T06:23:16.530 回答
0

请更改项目属性:

在项目属性 -> Android -> 项目构建目标 -> Google API,API 级别 19(或您需要的任何其他):)

因此,您可以保留您的最低 SDK 选项而无需更改,例如 8 :)

于 2014-06-09T14:21:12.040 回答