2016-03-11 12 views
9

私は小さなAndroidアプリを作って、しばらく使っています。設定では、アプリケーションの特性の「データ」ライン(「アプリケーション」ラインや「キャッシュ」ラインに表示された量を分析することには関心がない)に気づいたのは約20 MBです。私にとっては大変だったようです。アプリにストレージリークがある(つまり、決して消去されないデータを生成する)のではないかと恐れています。Androidアプリのデータサイズを測定してストレージリークを特定するにはどうすればよいですか?

私は、その多くのスペースを奪う可能性のあるものを調査し、測定することに決めました。私はこのアプリケーションのためにかなりall the available storage optionsを使用しています:SQLite DB、内部ファイル、外部ファイル、共有設定(およびキャッシュファイルGlide画像ロードを含む)。

これまでのところ、a question on SQLite DBのおかげで、私のDBファイルは約500 kBを要することがわかりました。私は再帰的にフォルダ内のファイルとフォルダをスキャンして見つけましたgetFilesDir()私は内部およびアプリケーションプライベートの外部ファイルで10 kBのデータを使用しています。 Shared Preferencesのサイズはまだ分析していませんが、キー/値のペアは20個以下です。

フォルダを調べるgetCacheDirs()私は、Glideが約3 MBのキャッシュを使用していることも知った(Android設定アプリに近い)。

私の質問は、この19.5 MBのデータが見つからない箇所を見つけることができませんでしたか?私はスペースを取るかもしれない何らかのストレージを忘れましたか?さらに、一般的に、ストレージリークを分析するツール(つまり、決して消去される可能性のあるアプリによって生成されたデータ)はありますか?

+1

あなたのアプリのデフォルトのデータパスをadb @/data/...でチェックしますか? 参照: http://android.stackexchange。com/questions/47924/where-android-apps-store-data – James

+0

@Jamesありがとうございました。これらの質問/回答は便利です。/data/ /ファイルと/ data/ /キャッシュは、私が既にチェックしたgetFilesDir()とgetCacheDir()によってそれぞれ検索されます。しかし、私は答えに記載されている他のディレクトリを調べるつもりです。 – Vince

答えて

1

について学ぶためのいくつかの紹介リンクは、私は別のフォルダを模索し始めた、と同僚との問題を議論し、多くのフォルダを探求しようとした後、I最終的に大半のデータは以前のWebviewのキャッシュから取得されていました。私はすべての調査を掲載しています。うまくいけば助けになるでしょう。

たときにアプリが起動し、私は私の主な活動からanalyseStorage(this)を呼び出して、次のコードを実行:

public void analyseStorage(Context context) { 
    long totalSize = 0; 
    File appBaseFolder = context.getFilesDir().getParentFile(); 
    for (File f: appBaseFolder.listFiles()) { 
    if (f.isDirectory()) { 
     long dirSize = browseFiles(f); 
     totalSize += dirSize; 
     Log.d(STORAGE_TAG, f.getPath() + " uses " + dirSize + " bytes"); 
    } else { 
     totalSize += f.length(); 
    } 
    } 
    Log.d(STORAGE_TAG, "App uses " + totalSize + " total bytes"); 
} 

private long browseFiles(File dir) { 
    long dirSize = 0; 
    for (File f: dir.listFiles()) { 
    dirSize += f.length(); 
    //Log.d(STORAGE_TAG, dir.getAbsolutePath() + "/" + f.getName() + " weighs " + f.length()); 
    if (f.isDirectory()) { 
     dirSize += browseFiles(f); 
    } 
    } 
    return dirSize; 
} 

重要なことは、具体的context.getFilesDir().getParentFile()そのコードを実行した後、フォルダ/data/data/my.app.package/

に一致するをスキャンすることで、私は以下のログを持っていた:

D/storage﹕ /data/data/my.app.package/lib uses 0 bytes 
D/storage﹕ /data/data/my.app.package/cache uses 3371773 bytes 
D/storage﹕ /data/data/my.app.package/databases uses 483960 bytes 
D/storage﹕ /data/data/my.app.package/shared_prefs uses 604 bytes 
D/storage﹕ /data/data/my.app.package/app_webview uses 9139469 bytes 
D/storage﹕ /data/data/my.app.package/files uses 7723 bytes 
D/storage﹕ /data/data/my.app.package/app_ACRA-approved uses 0 bytes 
D/storage﹕ /data/data/my.app.package/app_ACRA-unapproved uses 0 bytes 
D/storage﹕ App uses 13003529 total bytes 

私が見ることができるものは:

  • キャッシュは、画像の読み込みのためにのみグライドによって使用される、SQLiteデータベースがとる3メガバイト
  • をとる共有設定は600B
  • を取る500KB
  • 私が持っていたすべてのWebviewsのキャッシュは、まだ取り9メガバイト
  • filesや他のフォルダにあるファイルの残りの部分、主にバグ追跡のためにACRAで使用して取るさを10kB

最終的に、私は最終的に私のデータのほとんどがWebviewキャッシュに送られ、実際にはキャッシュとして明示的に保存されていないことを発見しました。私はこれらのファイルを削除し、実際には上記の数よりもさらに20 MBのサイズを縮小しました。私は今、自分のアプリのデータがどの程度の大きさであるかを知っています。

1

MAT TOOLを使用すると、アプリのメモリ/サイズの問題を最適化することができます。アプリでメモリを使用している部分を表示します。

を実行しますアプリアンドロイドスタジオ中とツール - > Android-に行く> AndroidDeviceMonitor、あなたのシナリオを実行し、デバイスモニターに、私はdownload .hprof file下に添付された画像をたどることで、ファイル .hprofあなたのアプリをクリックしてダウンロード

は、その後、あなたはマットがのhprof-conv.exe内部sdk->プラットフォーム・ツール を使用して.hprofファイルをサポートするEclipseとあなたのCMDのPROMTにcmdとを追跡するために、ファイル.hprof Androidのスタジオを変換する必要があります

F:\Android_Studio_SDK\platform-tools>hprof-conv "C:\Users\Bala\Desktop\your_AS_file.hprof" "C:\Users\Bala\Desktop\MAT_File_Name.hprof" 

そしてMATツールでファイルにアクセスしてください - あなたの.hprofファイルを開くために> OpenHeapDump、それはあなたのアプリケーションのメモリは、パッケージ、クラス、object..etcで活用表示されます。

@Jamesの提案に続いてMATツール
link 1
link 2

+0

私はあなたの努力を感謝しますが、私はデータ記憶ではなく、メモリについて尋ねています。 – Vince

1

あなたは自動的にアプリ内のすべてのメモリリークを検出するリークカナリアのようなライブラリを使用することができます。 https://corner.squareup.com/2015/05/leak-canary.html

あなたはまた、AndroidのメーカーでDDMSに移動し、コーディングすることなく、あなたのアプリケーション内のストレージのより多くの情報を得ることができます何でも しかし、リークの大半はLeak Canaryによって検出されます。

希望すると助かります!

+0

もう一度、ありがとうございますが、問題はストレージに関するもので、メモリリークではありません。 – Vince

5

ストレージリークはありません。

あなたにはodex(のDalvik)またはoat(アンドロイドランタイム)ファイルはカウントされませんでした。彼らは通常、これらのファイルは、時間のインストール中に、最適化のためのシステムによって生成され

/data/dalvik-cache/xxx.odex 
/data/dalvik-cache/<target-architecture>/xxx.oat 

に位置しています。

また、あなたは、デバイスが根付いていない場合はディレクトリやファイルは、adbのシェルからアクセスすることはできません

/data/app/xxx.yyy.zzz.apk 

に位置するあなたのAPKファイルをカウントしませんでした。

私はあなたが/data/data/xxx.yyy.zzz下で計数ストレージサイズを常に設定で合計サイズより小さい

/data/data/xxx.yyy.zzz 
/data/app/xxx.yyy.zzz.apk 
odex or oat file 

設定でストレージ使用ショーは、次の3つの部分

が含まれると思います。

+0

アプリがデバイスにどのように保存されているのかを説明していただきありがとうございますが、私の質問(私はそれがはっきりしていないことを認識しています)は、アプリケーション実行ファイルのサイズよりも、私はそれをより明確にするために質問を更新します。 – Vince

関連する問題