2011/06/03

Android プロジェクトを jarライブラリ化する

Android に関わらず、プログラムを書いていると、作った成果物をライブラリ化したいと思うことは多々あります。
Eclipse の Android 開発環境(ADT) には Is Library という設定があって、ソースコードのままライブラリとして利用出来ます。
ただ、この方法だと、再配布がしにくいです。
というわけで、Eclipse の Javaプロジェクトを jarライブラリ化する機能を使って、Android プロジェクトを jarライブラリ化する方法を紹介したいと思います。

2011/6/5 追記
この方法はres以下を使用するAndroidプロジェクトには使用できないようです。(いろいろ実験してみましたが無理でした。うまい方法をご存知の方は是非教えてください。)
res以下を使用したい場合は、上記の Is Library を使用することでライブラリ化することが可能です。
Is Libary の詳しい使い方は ADTによるLibrary Projects という Kazzz さんのエントリがわかりやすいです。

2011/8/12 追記
本件、Googleが公式に出来ないと発表していることがわかりました。
res を使っている場合、jarライブラリ化するのは諦めた方が良さそうです。
その辺については、Android Project で Is Library を使う場合、res の管理に注意 というエントリにまとめたので、参考にしてみてください。
res を使用しない場合は、以下の要領でjarライブラリ化可能ですが、Google が公式に認めていない以上、お勧めは出来ません。あしからず。

2011/05/31

R cannot be resolved to a variable がどうしても消えない

Android で開発していると、 R cannot be resolved to a variable というエラーが頻発します。


こういう時は、Eclipse が gen ディレクトリの作成をミスっているのが原因なので、

  1. gen ディレクトリ以下を全て削除してみる
  2. プロジェクト → クリーン としてみる

とかすると普通は直るのです。

ところが、今回は何回やってもエラーが消えないのです。
で、よくコンソールの出力を見てみたところ、

2011-05-31 21:29:57 - Test] res\drawable-hdpi\icon.png.org:0: エラー: Resource entry icon is already defined.
[2011-05-31 21:29:57 - Test] res\drawable-hdpi\icon.png:0: Originally defined here.

って書いてありました。
つまり、「res ディレクトリの中に icon.png が2個あるよ」ってエラーだったのです。
正確には icon.png と icon.png.org なのですが、どうも両方とも同じ物として認識してしまうようです。

というわけで、res フォルダの中に .org がついたファイルなど余計な物があるとうまくいかないということがわかりました。
バージョン管理ツールを使っている方など要注意です。

最初からコンソールをちゃんと読んでおけば気づいたのにねぇ。
慣れって恐ろしいです。

2011/03/26

ホームボタン と 戻るボタン で Activity の終了処理が異なる

@Android 2.1 Xperia

Android の Activity は以下のようなライフサイクルを持っているというのは、大抵の本やサイトで紹介されています。(以下の図は Tech Booster さんから頂きました。大変わかり易いです)

ただ、「Activity がもう表示されない」という状態も
  • 戻るボタンで Activity が消える
  • ホームボタンで Activity が消える
  • 省電力モードになって画面が消える
  • 他のアプリケーションがかぶさって Activity が消える
といろいろなパターンがあります。
そして、最近気づいたのですが、これらのパターンで呼ばれるイベントが異なるようなのです。

以下、Xperia で動作させてみたときのログです。

起動
DEBUG/LifeCycleTest(3005): onCreate
DEBUG/LifeCycleTest(3005): onStart
DEBUG/LifeCycleTest(3005): onResume



戻るボタン
DEBUG/LifeCycleTest(3005): onPause
DEBUG/LifeCycleTest(3005): onStop
DEBUG/LifeCycleTest(3005): onDestroy



アイコンクリック
DEBUG/LifeCycleTest(3005): onCreate
DEBUG/LifeCycleTest(3005): onStart
DEBUG/LifeCycleTest(3005): onResume



ホームボタン
DEBUG/LifeCycleTest(3005): onSaveInstanceState
DEBUG/LifeCycleTest(3005): onPause
DEBUG/LifeCycleTest(3005): onStop



アイコンクリック
DEBUG/LifeCycleTest(3005): onRestart
DEBUG/LifeCycleTest(3005): onStart
DEBUG/LifeCycleTest(3005): onResume



時間がたって画面消灯
DEBUG/LifeCycleTest(3028): onSaveInstanceState
DEBUG/LifeCycleTest(3028): onPause



電源ボタン
DEBUG/LifeCycleTest(3028): onResume



画面回転
DEBUG/LifeCycleTest(3028): onSaveInstanceState
DEBUG/LifeCycleTest(3028): onPause
DEBUG/LifeCycleTest(3028): onStop
DEBUG/LifeCycleTest(3028): onDestroy
DEBUG/LifeCycleTest(3028): onCreate
DEBUG/LifeCycleTest(3028): onStart
DEBUG/LifeCycleTest(3028): onRestoreInstanceState
DEBUG/LifeCycleTest(3028): onResume



ハードウェアキーでカメラアプリ起動
DEBUG/LifeCycleTest(3028): onSaveInstanceState
DEBUG/LifeCycleTest(3028): onPause
DEBUG/LifeCycleTest(3028): onStop


戻るボタンで Activity が見えなくなる場合は onDestroy が呼ばれてアプリケーションが終了しているのに対し、ホームボタンの場合は onPause でサスペンド状態になるようです。
ユーザから見ると、どちらも同じ動作に見えるんですけどね。
また、単に画面が消える場合は onStop で止まるようです。

あと、 onSaveInstanceState と onRestoreInstanceState は呼ばれる時と呼ばれない時があるみたいです。これ、対になっていないと意味がないような気がするのですが…
この結果だけみると、あまり使い道が無いような気がします。
この辺については、もう少し調べてみる必要がありそうです。
誰か詳しい方がいらっしゃいましたら、是非教えてください。

2011/10/11 追記
「ユーザから見ると、どちらも同じ動作に見えるんですけどね」と書いたのですが、Androidの思想的には全然違う動作のようです。
ホームボタンを押した場合は、ホームアプリケーションが起動して現在のアプリケーションが後ろに隠れるだけなのに対し、戻るボタンはActivityスタックからポップするという動作になるようです。
Activityのスタックについては、Y.A.M の 雑記帳: Android Activity, Task, Stack, Launch mode が非常にわかりやすかったので、是非参考にしてみてください。


以下に、実際に動作させたコードを載せておきます。
2011/03/22

Mercurial で過去のログメッセージを変更する

@ Mercurial 1.8.1
@ TortoiseHg 2.0.2

Mercurial は一つ前のコミットをロールバックでなかったことにできますが、2つ以上前のログを変更する方法はあまり公開されていない気がします。
しかし、MQというキューを管理するExtensionを使えば、比較的簡単に実現することができます。
といっても、以下のような制約があるので、実用できる場面は少ないかもしれません。
  • Synchronize 先には反映されません
    (最後に例を載せておきます)
  • マージポイント以前には戻れません

以下では、TortoiseHg を使った例を示しますが、コマンドラインでも可能です。コマンドラインユーザはきっとMQもバリバリ使いこなしているかと思うので、こんな説明は必要ないでしょう。(超勝手な想像だな…)

2011/03/21

Googleドキュメント のスプレッドシートで通貨表示が$になってしまった

Googleドキュメント に既存のスプレッドシートをアップロードしたところ、通貨表示が$になってしまいました。(図1 左の矢印)
セルを選択して通貨を¥にすることは出来るのですが(図1 右の矢印)、この方法だと通貨に小数点以下2桁まで表示されてしまいます。(図2)
図1

図2

いろいろ試してみたところ、
ファイル → スプレッドシートの設定 → 地域と言語
を日本語にしてやると、デフォルト通貨が¥になり、小数なしの通貨を選択できるようになりました。(図3)
図3