2012年11月28日水曜日

Androidアプリ開発でのメモリ使用量確認

どうも、俺@残業中で腹減ったです。
最近はAndroidアプリ開発にも手を出しています。eclipse超高機能で便利ですね。

さて、Androidアプリを開発してるとOutOfMemoryに悩まされる開発者の方々多いのではないでしょうか。
僕も悩みまくっていまして、ググると大量に関連した記事が出てきます。
Xcodeだとinstrumentsというツールでメモリリークを調べたりできますが、もちろんeclipseでも可能です。
という訳で、それらをまとめてアプリのメモリ使用量について確認したいと思います。

※環境
Mac OSX 10.8.2
eclipse JUNO SR 1

その1)DDMS
実機転送またはエミュレータでアプリ起動中に、eclipseのDDMSでメモリ量を確認できます。
まずDDMS画面に切り替えます。

次に左側のペインから対象のアプリパッケージを選択します。
※開発中のものがあるので画像加工しています。。

そして、その上部にある「Update Heap」をクリック。

そして、その右側にあるペインから「Heap」タブを選択し「Cause GC」をクリックします。
これはGCが走らないとHeap状況が出ないからなので、GCが走るのを待っても良いです。

そうするとGCが走る度にメモリ使用量が更新されていきます。

HeapSizeは確保されているメモリ量で必要に応じてメモリが確保され増えていきます。
増え続けると限界値まで増えます。
限界値は
Runtime.getRuntime().maxMemory()
で確認可能。
限界値はエミュレータの場合は、Android Virtual Device Managerで設定するMax VM application heap sizeです。


Allocatedは使用中のメモリ量です。
このDDMSでどのくらいHeapが確保されていて、どのくらい使われているのかを確認します。
ちなみにここで言うHeapはDalvikヒープのことを指しているようです。

Androidアプリ自身には、
・ネイティブヒープ
・Dalvikヒープ
の2種類のヒープがあるようです。
あと端末自体に割り当てられているLinuxヒープというのもありますが。

■ネイティブヒープ
Andorid3.0以前であれば、主にBitmapデータを確保するために利用されます。
// 全体ネイティブサイズ
Debug.getNativeHeapSize();

// 使用中ネイティブヒープサイズ
Debug.getNativeHeapAllocatedSize();

// 空きネイティブヒープサイズ
Debug.getNativeHeapFreeSize();
で確認できます。
■Dalvikヒープ
クラスのインスタンスやBitmap(Android3.0以降)データを確保するために使われます。
// 確保されたDalvikヒープサイズ
Runtime.getRuntime().totalMemory();

// メモリが足りない場合に確保しようとする最大のDalvikヒープサイズ
Runtime.getRuntime().maxMemory();

// 空きDalvikヒープサイズ
Runtime.getRuntime().freeMemory();

// 使用中Dalvikヒープサイズ
Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
で確認できます。
このネイティブヒープとDalvikヒープの使用合計サイズが最大値を超えるとOutOfMemoryが発生してしまうのです。
Androidのバージョンが低い端末だと、割り当てられるメモリ量が少ないために、画像生成時などにメモリ枯渇によりアプリが落ちてしまう事が多々あるようです。
特にBitmap系でのOutOfMemoryの場合は、画像サイズをいかに小さくするかで割りと解決出来たりします。


以上でぇぇえぇす。

2012年11月23日金曜日

Androidアプリで "R cannot be resolved to a variable"エラー

どうも、俺@3連休です。
最近はAndroidアプリの開発にも手を出しております。

サーバサイドはvimでコーディング、iOSアプリはxcodeで開発してたのですが最近はもっぱらeclipseです。
eclipseの豊富な機能に圧倒されております。

さてタイトルの件ですが、Androidアプリ開発をしてるとたまに目にするエラーのようで、ググルと多くのサイトに解決方法が書いてますね。
原因はプロジェクト内のgenディレクトリ内に生成されるR.javaが消えてなくなってたり、更新されなくなってたり、ということのようです。
R.javaはリソースに関するデータを扱う自動生成されるプログラムファイルです。

なぜ消えてなくなったり、更新されなくなるのか?の部分を直してやれば解決します。
そのいくつかをご紹介します。

■解決方法
・CleanしてBuildしてやる。
・eclipseを再起動。
・eclipseを終了して、プロジェクト内のgenディレクトリをまるごと削除しeclipse起動。
・resディレクトリ以下にあるxmlファイルに記述ミスがあるので直してやる。
 →consoleにエラーログが出力されているはずなのでチェック。
・なぜか別の android.R; がインポート宣言されちゃっている。それじゃないです。
 →あったら削除。

ちなみに僕も同様の現象が発生し、そのどれを試しても直りませんでした。
ですがMacごと再起動しeclipseを立ち上げたらなぜか直りました。
超レアケースかも知れませんが、最終的には開発端末ごと再起動でなんとかなるかも知れませんよ!


以上でぇぇえぇぇす。


2012年11月10日土曜日

iPhoneゲームアプリ「石積み族」リリースしました!

どうも、俺@休日です。
 11/8にiPhoneアプリ「石積み族」をリリースすることが出来ました。
  石積み族(app storeへ)


 cocos2d v1.0.1での開発です。
 開発着手からリリースまでかなり長い時間をかけてしまったので、以降はもっと短期間で開発できるようにしなければいけません(汗
 iPhoneをお持ちの方は一度遊んでみて下さい!

 以上でぇぇぇぇえす。