Durante il processo di rilevamento di gravi problemi di memoria nella mia app, ho esaminato diversi dump dell'heap della mia app e il più delle volte ho una bitmap ENORME che non lo so.Come visualizzare effettivamente una bitmap prelevata da un dump dell'heap di Android
Richiede 9,4 MB, o 9,830,400 byte, o in realtà un'immagine 1280x1920 a 4 byte per pixel.
Ho verificato Eclipse MAT, è effettivamente un byte [9830400], che ha un riferimento in entrata che è un android.graphics.Bitmap
.
Mi piacerebbe scaricare questo file in un file e provare a vederlo. Non riesco a capire da dove viene. La mia più grande immagine in tutti i miei drawable è un png 640x960, che richiede meno di 3 MB.
Ho provato a utilizzare Eclipse per "copiare valore su file", ma penso che stampi semplicemente il buffer sul file e non conosco alcun software di immagine in grado di leggere un flusso di byte e visualizzarlo come 4 byte per immagine pixel.
Qualche idea?
Ecco cosa ho provato: il dump l'array di byte in un file, premere a/sdcard/img, e caricare un'attività come questa:
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try {
final File inputFile = new File("/sdcard/img");
final FileInputStream isr = new FileInputStream(inputFile);
final Bitmap bmp = BitmapFactory.decodeStream(isr);
ImageView iv = new ImageView(this);
iv.setImageBitmap(bmp);
setContentView(iv);
Log.d("ImageTest", "Image was inflated");
} catch (final FileNotFoundException e) {
Log.d("ImageTest", "Image was not inflated");
}
}
non ho visto niente.
Sai come è codificato l'immagine? Diciamo che è memorizzato in byte[] buffer
. buffer[0]
è rosso, buffer[1]
è verde, ecc.?
non è che solo la cache di rendering nativo? Esegui con l'accelerazione hardware abilitata? – Peterdk
Sì, ho l'accelerazione HW. Ma questo non spiega perché il mio bitmap è stato upscaled del 200% e perché questa enorme bitmap è allocata nell'heap, IMHO. –
Hai avuto fortuna a scoprire quale immagine fosse? Anch'io ho una tale immagine canaglia che occupa 1.1 MB e sembra provenire dalle risorse precaricate di Android. Quando guardo l'anteprima del buffer di byte usando GIMP, vedo un'immagine blu con gradiente radiale di dimensioni 1044x270. – c05mic