Любой способ использовать LargeHeap для v3.x и игнорировать для 2.x в Manifest?

Я бы хотел использовать параметр Android: LargeHeap = "true" в манифесте, чтобы получить немного дополнительной памяти (мы имеем дело с растровыми изображениями размером 5+ МБ на дисплеях с высоким разрешением 1980x1200 и ожидаем даже большие дисплеи в ближайшее время.

У меня закончились все обычные уловки, чтобы справиться с плохой обработкой памяти в Android для растровых изображений (т.е. нет никакого способа узнать, есть ли достаточно большая дыра во фрагментированной памяти, кроме как попытаться молиться, чтобы она не вылетела ). Я уже потратил недели на оптимизацию, обрезку и применение других приемов для минимизации памяти и предотвращения сбоев. Это уловка того, какие функции могут быть реализованы в 2.x по сравнению с 3.x / 4.x, но сохранить все это в одном приложении. Не нужно указывать на «как оптимизировать для растровых изображений» - я уже прошел через это и применил все, что мог.

LargeHeap не поддерживается в версии 2.x, и я использую другие изображения для экранов с более низким разрешением, для которых не требуется опция LargeHeap в 2.x. (тоже нет проблем с нехваткой памяти).

Когда android: minSdkVersion = "8", опция Android: LargeHeap вообще не разрешена.

Есть ли способ условно включить LargeHeap для систем с 3.x и игнорировать его для 2.x? Или само приложение пытается установить LargeHeap при обнаружении 3.x? Я не могу найти способ сделать это, но, возможно, я упустил из виду какой-то трюк.

Я также понимаю, что LargeHeap довольно ужасен, но у нас заканчиваются другие уловки. В идеале было бы неплохо делать LargeHeap программно, только когда это действительно необходимо (и разрешено) в программе OnCreate.


person Frank    schedule 11.01.2013    source источник


Ответы (3)


Когда android: minSdkVersion = "8", опция Android: LargeHeap вообще не разрешена.

Да, это будет.

Теперь, если ваша цель сборки (например, Properties> Android) установлена ​​на уровень API 8, она не будет компилироваться. Вам нужно будет скомпилировать целевой уровень API сборки 11 или выше. Но android:minSdkVersion тут ни при чем. Эта опция будет просто проигнорирована на старых устройствах.

Есть ли способ условно включить LargeHeap для систем с 3.x и игнорировать его для 2.x?

Используйте android:largeHeap="true" в элементе <application> в манифесте.

Или само приложение пытается установить LargeHeap при обнаружении 3.x?

AFAIK, нет программных средств для установки этого.

person CommonsWare    schedule 11.01.2013

Я использую такой способ:

в AndroidManifest.xml

android:largeHeap="@bool/largeheap"

И я создаю 2 файла configuration.xml

Первый в значениях: configuration.xml

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

Второй в values-v11 (использовать только с версией> = 11)

<bool name="largeheap">true</bool>
person Anthone    schedule 24.04.2014

если вы обрабатываете много больших растровых изображений, вам лучше работать с JNI, который ограничен не ограничениями кучи, а самой оперативной памятью устройства.

другой подход - быть гибким в зависимости от доступного размера кучи устройства.

Насколько мне известно, использование флага largeHeap - это нормально, но вы не получаете никаких обещаний относительно того, насколько больше размер кучи вы получите, если вообще получите. на самом деле, я не уверен, есть ли у Google требование от производителей относительно того, сколько еще он должен дать вам.

чтобы использовать флаг largeHeap, просто установите его в манифесте и используйте targetSdk, чтобы установить последний доступный. в minSdk вы устанавливаете минимальный поддерживаемый API, поэтому этот флаг будет автоматически игнорироваться при работе на старых устройствах. то же самое касается любого атрибута xml, принадлежащего новым API.

только классы и методы, принадлежащие более новым API, могут вызвать у вас проблемы, но для этого вы должны прочитать предупреждения Lint.

person android developer    schedule 24.07.2013