Любой способ использовать 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.