android - errore durante l'apertura del file HPROF




memory-leaks dump (4)

Ricevo la seguente eccezione quando provo ad aprire il file HPROF (creato da Debug.dumpHprofData ) con Memory Analyzer:

java.io.IOException: Unknown HPROF Version (JAVA PROFILE 1.0.3)
at org.eclipse.mat.hprof.AbstractParser.readVersion(AbstractParser.java:124)
at org.eclipse.mat.hprof.Pass1Parser.read(Pass1Parser.java:69)
at org.eclipse.mat.hprof.HprofIndexBuilder.fill(HprofIndexBuilder.java:65)
at org.eclipse.mat.parser.internal.SnapshotFactoryImpl.parse(SnapshotFactoryImpl.java:203)
at org.eclipse.mat.parser.internal.SnapshotFactoryImpl.openSnapshot(SnapshotFactoryImpl.java:114)
at org.eclipse.mat.snapshot.SnapshotFactory.openSnapshot(SnapshotFactory.java:143)
at org.eclipse.mat.snapshot.SnapshotFactory.openSnapshot(SnapshotFactory.java:123)
at org.eclipse.mat.ui.snapshot.ParseHeapDumpJob.run(ParseHeapDumpJob.java:56)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55)

Come posso risolvere questo?

Grazie


Answers

hprof-conv posizione dello strumento hprof-conv stata modificata.

Ora si trova su AndroidSDK/platform-tools/hprof-conv


Il file hprof che ottieni da Android ha un formato specifico per Android. Dovresti convertire il file hprof preso dal sistema operativo Android in formato hprof standard. Per questo è possibile utilizzare hprof-conv strumento hprof-conv che si trova su AndroidSDK/tools/hprof-conv .

Per esempio:

hprof-conv android.hprof mat.hprof

Quindi aprire mat.hprof in Memory Analyzer.

EDIT: hprof-conv potrebbe trovarsi sotto AndroidSDK/platform-tools/ in alcuni pacchetti.


Se si utilizza Eclipse, è sufficiente modificare quanto segue:

  1. Apri Preferenze (dal menu Finestra)
  2. Passare ad Android-> DDMS
  3. Cambia l'azione HPROF in "Apri in Eclipse"

Sfortunatamente la setVisibility(View.GONE); + setEnabled(false) combo non funziona universalmente su tutte le versioni / dispositivi Android. A seconda di quando lo si invoca, si può finire impiccati sullo schermo vuoto (senza NPE, solo schermo vuoto).

Finora l'unica soluzione che funziona per me è:

Per attività:

protected void removeAdView(int adViewId) {
    View view = getWindow().getDecorView();
    View adView = view.findViewById(adViewId);

    if (adView != null) {
        ViewGroup parent = (ViewGroup) adView.getParent();
        parent.removeView(adView);
        parent.invalidate();
    }
}

Per frammento:

protected void removeAdView(View topView, int adViewId) {
    View adView = topView.findViewById(adViewId);

    if (adView != null) {
        ViewGroup parent = (ViewGroup) adView.getParent();
        parent.removeView(adView);
        parent.invalidate();
    }
}

Questa soluzione è basata sulla risposta di @ Quartertone, ma è estesa per essere più universale (cioè funziona con tutti i ViewGroup non solo LinearLayout ). Basta inserire questi metodi nelle tue classi di attività / frammenti di base.





android memory-leaks dump