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

Posted

技术标签:

【中文标题】在 Android 4 中启用 android:largeHeap,在 Android 2.3 中禁用它【英文标题】:Enable android:largeHeap in Android 4, and disable it in Android 2.3 【发布时间】:2013-02-01 19:19:11 【问题描述】:

目前,我有一段代码,旨在同时在 android 2.3 和 4+ 中运行

如果在 AndroidManifest.xml 中应用 android:largeHeap,代码的性能会好很多(大部分时间不会出现 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 4+,请使用 android:largeHeap 选项 如果我使用的是 Android 2.3,请不要使用 android:largeHeap 选项

【问题讨论】:

你可以参考这个:***.com/questions/11275650/… 【参考方案1】:

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

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

Android API 10 不支持大堆。

    res文件夹中创建一个文件夹values-v14 我在values-v14 中创建了bools.xml 将此值放入bools.xml of values-v14

&lt;bool name="largeheap"&gt;true&lt;/bool&gt;

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>

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

祝你好运!

【讨论】:

别介意那些仇恨者,我会把这个添加到你的帖子中***.com/questions/5350465/…【参考方案2】:

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

有关此主题的更多信息:How to increase heap size of an android application?

【讨论】:

【参考方案3】:

    1.使用目标 Android 3.0 (API 11) 或更高版本构建项目。 (项目属性 - Android - 项目构建目标 - 选择 API 级别 11 以上)

    在Manifest文件中,修改uses-sdk值如下

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

【讨论】:

【参考方案4】:

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

project.properties

# Project target.
target=15

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

【讨论】:

【参考方案5】:

请更改项目属性:

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

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

【讨论】:

以上是关于在 Android 4 中启用 android:largeHeap,在 Android 2.3 中禁用它的主要内容,如果未能解决你的问题,请参考以下文章

Android M MO流程并与Android L MO对比

在android L上加载OpenCV时如何删除日志记录

目前有哪只手机支持android L系统?

Qcom android L ro.sf.lcd_density属性修改

CardView在Android L中没有显示Shadow

Android Camera Intent 与 Android L 崩溃