Работает ли опция большой кучи Android для старых телефонов, обновленных до ICS?

У меня самого есть Galaxy Nexus, и я знаю, что опция манифеста android:largeHeap="true" работает на этом телефоне, но мне интересно, работает ли она на старых телефонах, которые обновляются до Ice Cream Sandwich, то есть на Samsung Nexus S.

Причина, по которой я спрашиваю, заключается в том, что я создал приложение, которое интенсивно использует большие растровые изображения, и приложение изначально было разработано для планшетов с размером кучи 48 МБ. Galaxy Nexus также имеет 48 МБ доступного размера кучи для каждого приложения, поэтому мое приложение прекрасно работает на этом телефоне, несмотря на то, что это не планшет.

Проблема в том, что Nexus S имеет только 32 МБ доступной кучи, поэтому мне действительно нужна опция большой кучи, чтобы приложение работало на этих старых телефонах с ICS.

Мой вопрос: Увеличивает ли параметр android:largeHeap доступную динамическую память? т.е. если Nexus S по умолчанию имеет 32 МБ, смогу ли я получить доступ к 64 МБ, доступным с помощью этого?

Для тех из вас, кто не знаком с этой опцией, она увеличивает объем доступной динамической памяти для вашего приложения за счет снижения производительности. Его следует использовать только тогда, когда нет другой альтернативы.

Обновить

Вот пакет приложения, показывающий доступный размер кучи: http://michellbak.dk/TestHeapSize.apk

Исходный код ниже, чтобы показать вам, что нет ничего вредного:

package com.miz.heapsize;

import android.app.Activity;
import android.app.ActivityManager;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends Activity {

    private TextView text;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        ActivityManager am = ((ActivityManager)getSystemService(Activity.ACTIVITY_SERVICE));
        int memory = am.getMemoryClass();
        int largeMemory = am.getLargeMemoryClass();

        text = (TextView) findViewById(R.id.textView1);
        text.setText("Normal heap size: " + memory + "\nLarge heap size: " + largeMemory);

    }
}

Файл манифеста:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.miz.heapsize"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="11" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:largeHeap="true" >
        <activity
            android:label="@string/app_name"
            android:name=".MainActivity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

person Michell Bak    schedule 30.12.2011    source источник
comment
Если вы придумаете приложение, которое выгружает нужную вам информацию, и опубликуете исходный код, я запущу его для вас на Nexus S с ICS.   -  person CommonsWare    schedule 30.12.2011
comment
Спасибо, тогда я просто напишу небольшое приложение, которое покажет объем доступной кучи памяти. Скоро выложу ссылку в комментариях.   -  person Michell Bak    schedule 30.12.2011
comment
Пожалуйста, взгляните на мой обновленный вопрос с исходным кодом и apk.   -  person Michell Bak    schedule 30.12.2011
comment
Обычный размер кучи: 48 | Большой размер кучи: 128   -  person CommonsWare    schedule 30.12.2011
comment
Святое месье, это массивно! Отлично, спасибо большое, Марк! Если вы добавите ответ, я приму это.   -  person Michell Bak    schedule 30.12.2011
comment
Ответ Тревора намного лучше. Вы видите конкретное поведение конкретного устройства.   -  person CommonsWare    schedule 30.12.2011
comment
обновление к комментарию @CommonsWare, на Nexus 4, работающем под управлением 4.2.1, Large обеспечивает 512, а обычный - 192. Это чертовски увеличение.   -  person Edison    schedule 29.12.2012


Ответы (1)


Параметр android:largeHeap доступен на всех устройствах под управлением Android 3.0 или более поздней версии. Сюда входят устройства, которые были обновлены до ICS.

Тем не менее, вы не гарантируете, что получите 48 МБ места. Точный размер кучи, предоставляемый приложениям, является опцией, которую производители устройств могут устанавливать для каждого устройства отдельно. Как правило, устройства с большим дисплеем будут настроены с большими размерами кучи.

person Trevor Johns    schedule 30.12.2011
comment
Да, Nexus S по умолчанию предоставит вам только 32 МБ памяти кучи, но параметр android:largeHeap должен удвоить объем доступной памяти кучи, поэтому мой вопрос заключается в том, работает ли это на старых устройствах, обновленных до ICS. - person Michell Bak; 30.12.2011
comment
Флаг работает. То, что вы получите, включив этот флаг, не так четко определено. ;) Как предложил @CommonsWare, давайте попробуем и посмотрим, что получится! К сожалению, я оставил свой Nexus S в офисе, но если никто не доберется до него первым, я смогу попробовать его в следующий раз, когда буду дома. - person Trevor Johns; 30.12.2011
comment
+1. Спасибо, Тревор. Большое спасибо :) Марк более или менее только что ответил на мой вопрос в комментариях, поэтому я надеюсь, что вы не возражаете, если я приму это, если он добавит его в качестве ответа. Если нет, я приму твое. Ваше здоровье! - person Michell Bak; 30.12.2011
comment
Я совсем не против. В любом случае ответы Марка обычно лучше моих. ;) - person Trevor Johns; 30.12.2011