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

Я бы хотел использовать опцию 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.

3 ответа

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

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

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

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

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

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

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

Я использую этот метод:

в AndroidManifest.xml

android:largeHeap="@bool/largeheap"

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

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

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

2-е в значениях-v11 (использовать только с версией>= 11)

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

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

Другой подход заключается в гибкости в зависимости от размера доступной кучи устройства.

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

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

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

Другие вопросы по тегам