2011/11/30

経過時間を求める方法

端末がブートしてからの経過時間をミリ秒単位で取得するにはSystemClock.uptimeMillis()を使用します。
コードのA地点からB地点までの経過時間を求める際などに利用できます。
sendMessageDelayed、TimerやAlermいらずなのでお手軽です。

※現在時刻はユーザが変更できるので System.currentTimeMillis()は危険です。
※SystemClock.uptimeMillis()でも危険なケースがあるのかな?(調査中)

以上です。

2011/11/26

ログにクラス名、メソッド名、行数を表示する方法

ログにクラス名、メソッド名、ファイル行数を出力する方法です。
Throwableインスタンスを生成してスタックトレースを取得します。
パフォーマンスへの影響は大きいので、常時出力はしない方がよいです。

private void methodA() {
    dbg("test");
}

private static void dbg(String msg) {
    StackTraceElement[] stack = new Throwable().getStackTrace();
    String className = stack[1].getClassName();
    String method = stack[1].getMethodName();
    int line = stack[1].getLineNumber();
    StringBuilder buf = new StringBuilder(60);
    buf.append(msg)
        .append("[")
            // sample.package.ClassName.methodName:1234
            .append(className).append(".").append(method).append(":").append(line)
        .append("]");
    android.util.Log.d("tag", buf.toString());
}

ログメソッドの呼び出し元の情報を表示します。
# スタックトレースからの取得なので、メソッドスタックを意識する必要はあります。
下記のような出力結果になります。

11-26 07:16:43.419: E/tag(649): test[yuki.test.IncludeTestActivity.methodA:2]

以上です。

Androidでパケットログを取る方法

Androidにおけるパケットログの取得にはtcpdumpコマンドが利用できます。

adb shell tcpdump -s 0 -v -w /data/tcp.pcap

コマンド発効~コマンド終了するまでパケットをキャプチャし続けます。
(終了するにはCtrl+C)

取得したログは/data/tcp.pcapに保存されていますので、pullしてWireshark
なりのパケットログ解析ツールにかければOKです。

以上です。
2011/11/25

EventLog. answer to life the universe etc

DDMSのEventLogから小ネタを1つ。
EventLogのフィルタ設定に"すべての答え"があります。


Google検索に実装されている計算機機能。
例えば「1*2」で検索すると「2」と計算して答えてくれます。

「人生、宇宙、すべての答え」と問いかけると、その答えをGoogleが一瞬で演算して
答えてくれるという小ネタがありますが、これがAndroidのEventLogにもこっそり実装
されているようです。

2011/11/23

Android.mk:LOCAL_MODULE_TAGSの指定


Android.mkを記載する際に指定するLOCAL_MODULE_TAGSについて。

LOCAL_MODULE_TAGSはシステム領域にアプリケーションをインストール(プリイン)
する際に必要なプロパティです。
指定できる値にはeng/user/userdebug/optional(デフォルト)があります。

ここで指定した値は、システムをビルドした際にプリインするかどうかの判断で
使用されます。

●engビルド(デバッグビルド)
特に指定は不要です。LOCAL_MODULE_TAGSの指定値に関係なく
全てインストールされます。
userビルドの時にインストール不要の場合はengを指定します。

●userビルド(商用ビルド)
明示的に値を指定する必要があります。
userまたはuserdebugの場合、プリイン対象となります。
optionalの場合はcore.mkのPRODUCT_PACKAGEにmodule名指定が必要となります。

engビルドの時は存在するのに、userビルドした際には存在しない!なんて状況が
あったりします。
動作の最終確認は、できればuserビルドでやりたいところです。
事実、userビルドかengビルドかを参照して動作(厳密な権限チェックをする/しない)
を切り替えるモジュールも存在します。

# Android3.0か4.0だかでLOCAL_MODULE_TAGSは指定必須になったような。。。
2011/11/21

AlertDialogのsetViewで出現する間隔を消す方法

AlertDialogにsetViewするとき、

setView(View view, int viewSpacingLeft, int viewSpacingTop, int viewSpacingRight, int viewSpacingBottom)

ではなく、

setView(View view)

を使用した場合、コンテンツ領域とボタン領域の間に間隔が設けられてしまいます。
(図1の赤矢印部分)

これを回避するには前者のパディング指定ありのsetViewを使用します。

AlertDialog dialog = builder
    .setTitle(R.string.hoge)
    .setPositiveButton(android.R.string.ok, null)
    .create();
dialog.setView(view);

これで間隔を無くすことができます。



参考:AlertDialog.setView

以上です。
2011/11/17

Android端末のメモリ状態を取得する

Android端末のメモリ状態を取得する方法です。
# cat /proc/meminfo
MemTotal:         516316 kB
MemFree:          314328 kB
Buffers:              16 kB
Cached:            93892 kB
SwapCached:            0 kB
Active:           114636 kB
Inactive:          72664 kB
Active(anon):     103988 kB
Inactive(anon):        0 kB
Active(file):      10648 kB
Inactive(file):    72664 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:         93420 kB
Mapped:            54552 kB
Slab:               4440 kB
SReclaimable:       1320 kB
SUnreclaim:         3120 kB
PageTables:         3932 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:      258156 kB
Committed_AS:    1430652 kB
VmallocTotal:     450560 kB
VmallocUsed:       18524 kB
VmallocChunk:     430084 kB

/proc/meminfoで利用可能な物理メモリの容量は下記の式より求めることができます。
MemFree+Inactive

MemFree :システム全体で利用できる物理メモリの空き容量
Inactive:解放可能な物理メモリの容量

次はプロセス毎の物理メモリ使用量を調べる方法です。
# top
  PID PR CPU% S  #THR     VSS     RSS PCY UID      Name
 1337  0   4% R     1    928K    392K  fg root     top
   43  0   1% S    17  17472K    532K  fg root     /sbin/adbd

プロセス別の使用中物理メモリ容量は「RSS」の値を参考にします。


以上です。

2011/11/16

android4.0のソースをダウンロードする方法

以前android.gitがダウンしていた時に書いた、android.gitを使わずandroidソースを
ダウンロードする方法ですが、
http://yuki312.blogspot.com/2011/09/androidgitkernelorgandroid.html

4.0の環境が公開されたことに伴って、公式gitが復活したようなので、android4.0
を公式gitからダウンロードする方法を記載します。


環境は前回とかわらず
---------------------------
【環境】
Windows7 + Cygwin

Cygwinに必要なパッケージ(curlとか)は忘れました。すみません。
とりあえず 実行→パッケージが必要なら追加インストール としてください。
---------------------------
です。


【手順】
1. Cygwin起動
→Cygwin.batを実行

2. ホーム直下にbinディレクトリを作成
$ mkdir ~/bin

3. repoコマンドのインストール
$ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo

4. repoコマンドのパーミッション変更
$ chmod a+x ~/bin/repo

5. repoコマンドの初期化
$ mkdir ~/android_src/
$ cd ~/android_src/
$ ~/bin/repo init -u https://android.googlesource.com/platform/manifest
※1. nameとmailアドレスを尋ねられますが適当でOK
※2. 初期化に失敗した場合は手順aに
※3. SSL関係のエラーがでた場合は手順bに

6. ソースコードをダウンロード
$ ~/bin/repo sync
※ダウンロードには長時間かかります。

以上です。

---
以下はエラー発生時の対処法

(a) windowsコマンドプロンプトより
$ cd (cygwinインストールディレクトリ)/bin
$ ash.exe
$ /usr/bin/rebaseall

(b) 下記のようなエラーがでて失敗することがある
error: SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL
その場合は下記を実行
$ cd /usr/ssl/certs
$ curl http://curl.haxx.se/ca/cacert.pem | awk 'split_after==1{n++;split_after=0} /-----END CERTIFICATE-----/ {split_after=1} {print > "cert" n ".pem"}'
$ c_rehash

ダウンロードが途中で止まってしまう場合はandroid4.0をダウンロードする方法(エラー対処編)を試してみてください。
2011/11/12

Androidでソースコードデバッグする方法

Android開発におけるデバッグについて、Eclipse付属のデバッガを使用してソ
ースデバッグする方法。

【前準備】
・エミュレータを起動しておく
・必要な個所にブレークポイントを貼っておく

【手順】
1. [Run]→[Debug Configurations]
2. 左ペインより[Remote Java application]
3. ダブルクリックやNEWで設定を新規作成
4. ConnectタブのPortを8700に変更
5. ApplyしてDebug押下

DDMSパースペクティブ等でDevicesViewを確認し、デバッグしたいプロセスに
緑色の虫マークがついていれば成功です!
あとはアプリを動作させている際に、ブレークポイントを通過する処理に入っ
た場合、EclipseのDebugパースペクティブがアクティブになり、ソースデバッ
グが可能になります。(あとはJavaのそれと同じです)

実行時にエラーが出る場合は下記を試してみてください。

a1. DDMSパースペクティブを開くかDevicesViewを追加
a2. デバッグしたいプロセスをデバッグ対象として選択(緑の虫アイコン)

下図のようにデバッグしたいプロセスを選択して緑の虫アイコンを押下すれば
OKです。


これでもエラーが出る場合は再度デバッグ実行を試します。
[Run]→[Debug Configurations]...
※一度デバッグ実行していれば[Run]→[Run As...]にリストされているので、
そちらを実行します。

上手くいかない場合は、デバッグ実行→DevicesViewでデバッグ指定
を繰り返すとうまくいくことがあります。

以上です。

2011/11/08

chrome to phoneが使用できない間の対処法

技術情報から離れて少し休憩。

どうも先日(2011/11/08現在)からchrome to phoneで端末にデータを送信しようとすると、
「携帯端末がこのユーザーで登録されていません。」
と出て失敗する模様。

端末側でログインしようとするもどうにも失敗します。。。
私にとっては必需品となりつつある機能なので困りました。

他ユーザの方々も同じ症状に悩まされておられるようなので、
アプリかサーバどちらかに問題が発生している可能性が高いと思います。
http://www.google.com/support/forum/p/mobile/thread?tid=3bf1b6be91506e0e&hl=ja

ということで、問題が解決するまでの間は下記の方法で我慢。

QR-Code Tag Extension
https://chrome.google.com/webstore/detail/bcfddoencoiedfjgepnlhcpfikgaogdg

■QuickMark QRコードスキャナー
https://market.android.com/details?id=tw.com.quickmark&hl=ja

前者でデータをQRコード化して、後者でそれをパシャリとすればOKです。

2011/11/06

Activity間やサービス間でデータを共有する方法


複数のActivity間やサービスでデータを共有するにはIntentのExtra、preferenceやDatabase
など様々な方法がありますが、Extraでは貧弱だけれどpreferenceやDBなどを使用
するほどでもない場合には下記の方法があります。

【android.app.Application クラス】
android.app.Applicationクラスを使用すればグローバルにアプリケーションの
状態を保持することができます。
通常、ActivityはconfigChangeを契機に再起動され、メンバ変数も特別な処理を
行わない限り初期化されます。
そういったActivityのライフサイクルに左右されず、アプリケーション(プロセス)
の開始~終了までデータを保管できる場所としてApplicationクラスが使用できます。
これはアプリケーション内の各ActivityがgetApplication()を使ってアクセスできます。
Applicationクラスを使用するにはAndroidManifest.xmlに登録することで自動的に
インスタンス化されます。
→使用方法は下記が参考になります
 http://techbooster.jpn.org/andriod/application/2353/


【public static】
staticなフィールドやメソッドは複数のアクティビティやサービスからアクセス
できる方法として使用することができます。
気を付けないといけないのは、staticフィールドはActivityのライフサイクルに
左右されないということです。
ライフサイクルに伴い初期化や後処理を行う必要がある場合は別途管理する必要
があります。

Android Developerサイトにも情報が載っていますので参考にしてみてください。
http://developer.android.com/resources/faq/framework.html

以上です。

2011/11/01

端末空き容量が無い場合の試験を実施する方法


端末ROMの空き容量を0(端末ROM使用量をフル)にする方法です。
空き容量が0になるとストレージへのファイルIOやデータベースの更新操作時等、
さまざまな場面で実行時例外がスローされます。

ハイスペックな端末の場合は気にならない問題かもしれませんが、そうではな
い端末ももちろんあります。
この問題に対応する/しないを決めた上でアプリケーションを設計・実装しましょう。

まずは、端末のファイルシステムのブロックサイズを調べます。
※下記はAndroid4.0のエミュレータで検証

# df /data
-実行結果-
Filesystem             Size   Used   Free   Blksize
/data                   64M     7M    56M   4096

実行結果より、ブロックサイズは4096Byteとわかります。
実行結果の見方は下記
 - Size:ROMの総容量
 - Used:ROMの使用量
 - Free:ROMの空き容量
 - Blksize:ファイルシステムのブロックサイズ

次に、サイズ指定でファイルを生成します。
サイズは ブロックサイズ*個数 で指定します。
下記は1000ブロックのdummyファイルを作成するコマンドです。
 - bs:ブロックサイズを指定します
 - count:作成するブロック数を指定します
 - of:ファイルパスを指定します
# dd if=/dev/zero of=/data/dummy bs=4096 count=1000
-実行結果-
1000+0 records in
1000+0 records out
4096000 bytes transferred in 0.260 secs (15753846 bytes/sec)

上記をみると 4096*1000 で4096000Byte(4MB)のdummyファイルが作成されたこ
とがわかります。

dfデータでもう一度空き容量を見てみましょう。
# df /data
Filesystem             Size   Used   Free   Blksize
/data                   64M    11M    52M   4096

Freeが56M→52Mに減っていることがわかります。

※ワンポイント
一気に空き容量0となるようにdummyファイルを作成してもよいですが、
そうなると一切のファイルIOができなくなってしまいます。
試験する際は、一時的に空き容量を少し回復できるようにファイルパスを変えて
2段階でdummyファイルを作成することをお勧めします。

例)
// 空き容量回復用のファイルdummy1を作成
# dd if=/dev/zero of=/data/dummy1 bs=4096 count=1000

// 空き容量を無くす用のファイルdummy2を作成
# dd if=/dev/zero of=/data/dummy2 bs=4096 count=99999999

少しだけ空き容量を作成したい場合はdummy1を削除すればOKです。

以上です。