Speicherverbrauch zwischen Android 2.2 und 2.3

Ich entwickle eine App, die viele Bilder enthält. Ich habe bemerkt, dass der Speicherverbrauch meiner App in Android 2.3 ziemlich viel höher ist als in Android 2.2 – was letztlich zu OutOfMemory-Fehlern beim Laden von Bitmaps führt. Bei der Erforschung dieses Protokolls habe ich das Ergebnis von Debug.getNativeHeapAllocatedSize () im onResume der ersten Aktivität protokolliert. In Android 2.2 gibt dies 5MB aus. In Android 2.3 gibt dies 17MB aus.

Ich habe eine Beispielanwendung erstellt, um zu versuchen, diese weiter zu verkleinern. Die Beispiel-App hat 2 Aktivitäten: Die erste hat ein kleines Bild und einen Knopf, um die zweite Aktivität zu starten; Die zweite Aktivität hat mehrere große Bilder in einem ScrollView. Sie können das Beispiel hier herunterladen: http://dl.dropbox.com/u/21709517/MemoryUsageExample.zip Wenn Sie dieses Beispiel ausführen, meldet Debug.getNativeHeapAllocatedSize () 3MB nach dem Start der ersten Aktivität in 2.2 und 2.3 zugewiesen. Nach dem Starten der zweiten Aktivität, Android 2.2 noch berichtet 3MB zugewiesen, während Android 2.3 Berichte 17MB zugeordnet. Running "adb Shell Dumpsys Meminfo Test.example" zeigt die gleichen Arten von Ergebnissen.

Warum gibt es so einen dramatischen Unterschied zwischen Android 2.2 und 2.3? Und was noch wichtiger ist, was sollte ich anders tun, um zu verhindern, dass so viel Speicher auf Android 2.3?

—–AKTUALISIEREN—–

Nachdem ich die Informationen angesehen habe, die Romain Guy geschrieben hat, habe ich mich entschlossen, mit den verschiedenen Ladeoptionen etwas mehr zu spielen. Das Ergebnis zeigt, dass das Erzwingen der zu ladenden Bilder als RGB_565 den Speicher in Android 2.3 reduziert, aber es verwendet immer noch mehr als 2.2. In meinem Beispiel App, Android 2.3 verwendet jetzt 10MB vs Android 2.2 mit 3MB. Außerdem habe ich versucht, 32-Bit mit ARGB_8888 zu zwingen. In diesem Fall verwendet Android 2.3 17MB, aber Android 2.2 weiterhin nur 3MB verwenden. Das aktualisierte Beispiel finden Sie hier: http://dl.dropbox.com/u/21709517/MemoryUsageExample2.zip

Was ist die Ursache für diese Unterschiede? Gibt es noch mehr, was getan werden muss, um den Speicherverbrauch näher an Android 2.2 zu bekommen? Auch gibt es eine Möglichkeit, Bilder zu erzwingen, die über XML-Layouts in ein bestimmtes Format erstellt wurden? Kann das anwendungsweit gesetzt werden? Vielen Dank.

—– UPDATE 2 —–

Nach diesem Thread ist es nicht möglich, Bilder zu zwingen, die über die XML-Inflation geladen werden, um ein bestimmtes Format zu sein.

Ich hoffe immer noch auf eine Antwort darauf, warum Android 2.2 und Android 2.3 unterschiedliche Mengen an Speicher verwenden, nachdem sie 16 oder 32 Bit gezwungen haben.

  • Scannen und Bearbeiten von Android App-Speicherwerten programmgesteuert
  • Byte-Größe enum in Java
  • Wie benutzt man Valgrind mit Android App in Eclipse auf Ubuntu zu finden Android Android Code Speicher Lecks auf Laufzeit?
  • Cache vs Datenspeicherung für heruntergeladenen Inhalt
  • OutOfMemoryException im Emulator
  • Android, Back-Taste deallokiert Aktivitätsspeicher?
  • Abfrage über "dumpsys meminfo" in android
  • So verwenden Sie das Eclipse Memory Analyzer Tool (MAT) für die Analyse eines Hashhm
  • 2 Solutions collect form web for “Speicherverbrauch zwischen Android 2.2 und 2.3”

    Android 2.3 lädt Bilder in 32 Bits standardmäßig. Sie können das 16-Bit-Format mit BitmapFactory.Options erzwingen.

    Siehe http://www.curious-creature.org/2010/12/04/gingerbread-and-32-bits-windows/ und http://www.curious-creature.org/2010/12/08/bitmap- Qualitäts-banding-und-dithering /

    Meine Vermutung ist das. Android OS preloads einige Bilder in native Heap. Die Anzahl der vorgespannten Bilder hängt vom OS VM Budget für jeden Prozess ab. Seit 2.3 erhöhte das VM-Budget auf 32M, so dass es mehr Bilder für jeden Prozess vorinstalliert als auf 2.2 Geräten. Du hast also in 2.3 mehr nativen Haufen benutzt. Das ist nur meine Vermutung.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.