端末がブートしてからの経過時間をミリ秒単位で取得するにはSystemClock.uptimeMillis()を使用します。
コードのA地点からB地点までの経過時間を求める際などに利用できます。
sendMessageDelayed、TimerやAlermいらずなのでお手軽です。
※現在時刻はユーザが変更できるので System.currentTimeMillis()は危険です。
※SystemClock.uptimeMillis()でも危険なケースがあるのかな?(調査中)
以上です。
2011/11/30
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コマンドが利用できます。
コマンド発効~コマンド終了するまでパケットをキャプチャし続けます。
(終了するにはCtrl+C)
取得したログは/data/tcp.pcapに保存されていますので、pullしてWireshark
なりのパケットログ解析ツールにかければOKです。
以上です。
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.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端末のメモリ状態を取得する方法です。
/proc/meminfoで利用可能な物理メモリの容量は下記の式より求めることができます。
MemFree+Inactive
MemFree :システム全体で利用できる物理メモリの空き容量
Inactive:解放可能な物理メモリの容量
次はプロセス毎の物理メモリ使用量を調べる方法です。
プロセス別の使用中物理メモリ容量は「RSS」の値を参考にします。
以上です。
# 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ディレクトリを作成
3. repoコマンドのインストール
4. repoコマンドのパーミッション変更
5. repoコマンドの初期化
※2. 初期化に失敗した場合は手順aに
※3. SSL関係のエラーがでた場合は手順bに
6. ソースコードをダウンロード
以上です。
---
以下はエラー発生時の対処法
(a) windowsコマンドプロンプトより
(b) 下記のようなエラーがでて失敗することがある
error: SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL
その場合は下記を実行
ダウンロードが途中で止まってしまう場合はandroid4.0をダウンロードする方法(エラー対処編)を試してみてください。
ダウンロードする方法ですが、
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/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です。
以上です。