2013/11/25

Android のソースコードでバージョン間の差分を簡単に確認する方法

Android の良い所は、いざとなったら OS のコードまで追っていくことが出来ることですNexus や エミュレータ以外では必ずしも正確ではありませんが。。
アプリが不思議な動作をした時も自分のコードが悪いのか、OSのバグなのか追うことが可能です。
例えば、私は先日 MultiSelectListPreference の不思議な動作に出会い、結局 Android のバグであることに気づきました。

上記のバグ、特定の Android のバージョンだけで起こるのです。
そういう時に役に立つのが、バージョン間の比較を行うことの出来るサイト。

私は GrepCode というサイトを利用させてもらっています。
Android に限らず 様々なオープンソースプロジェクトのソースコードを保持していて、ブラウザ上で簡単にバージョン間の差分チェックができます。

Android のソースコードは以下。
GrepCode: android - Java Project - Source Code

2013/11/24

Dialog Theme を適用した Activity に ActionBar を表示する

Android でダイアログを表示する際、DialogFragment を使用するのではなく、Activity に Dialog Theme を適用して表示することが出来ます。
何かのリザルトを表示する時等、使い方によっては大変便利です。

ところで、せっかく Activity を使っているのだから、メニューを表示したいと思うのは私だけでしょうか?
Android 2.x 系だとメニューボタンを押したら、下からニュッとメニューが表示されるので、Dialog Theme を適用した Activity でもメニューを使用する事が出来ます。
しかし、Android 3.x から導入されたメニューは ActionBar。 Dialog Theme を適用すると表示されなくなってしまいます。

とはいえ、物は Activity なので、以下のように Custom Theme を作成することで、Action Bar を復活させることが可能です。
2013/11/21

MultiSelectListPreference にバグがあり、勝手に選択解除されることがある

Android の MultiSelectListPreference、便利なのですが致命的なバグがあることがわかりました。
以下のような手順で操作をすると、勝手に選択が解除されます。
場合によっては Preference の内容も書き換えてしまいます。

この問題は少なくとも 4.1.1_r1 で直っています。
2013/11/16

Eclipse に .project の無い既存の Android プロジェクトをインポートする

@Eclipse Juno SR2
@ADT Rev. 22.3
@Android SDK Rev. 19

以前、「Eclipse に既存の Android プロジェクトをインポートする」というエントリで以下のように書きました。

.project ファイルがない場合は何も表示されません。その場合は、Eclipse でインポートできるサンプル等ではないので、別の方法で Eclipse に取り込んでやる必要があります。

その後、「別の方法」が提供されたので書いておこうと思います結構すぐに出来るようになったのですが、書こうと思いながら大分時間が経ってしまいました…。

File → New → Other...

Android → Android Project from Existing Code

Root Directory を入力

選択したディレクトリを再帰的に検索してプロジェクト一覧が表示されます。
この時、プロジェクト名は AndroidManifest.xml 内で宣言されているアプリ名になります。
別の名前にしたい場合は、ここで変更することも可能です。

Finish を選択すると、選択したプロジェクトがインポートされます。

2013/11/14

Android SDK をアップデートしたら BufferOverflowException が出るようになった

最近、ちょっと古い Android Project を Eclipse で実行しようとすると以下のようなエラーが起こるようになりました。

Android Console の出力
[2013-11-14 22:04:14 - Dex Loader] Unable to execute dex: java.nio.BufferOverflowException. Check the Eclipse log for stack trace.
[2013-11-14 22:04:14 - LifeCycleTest] Conversion to Dalvik format failed: Unable to execute dex: java.nio.BufferOverflowException. Check the Eclipse log for stack trace.

調べてみると、Eclipse を再起動してみろとか、いろいろ書かれているのですが…

私の環境では再起動してもダメで、以下のように Project Build Target を最新にしてやるとうまく動くようになりました。

Project → Properties → Android → Project Build Target


エラーの内容からすると、生成された dex ファイルに問題がある様子。
ということは、Build に失敗しているわけで、心当たりを探してみると、一つ思い当たることが。

先日、Android SDK のバージョンを 19Android 4.4 KitKat にした時に、古い Android SDK Build-tools を全て Delete したのです。
Android SDK Build-tools Rev. 19 以外が Not installed


時間が無くて調べきれていませんが、対応する Android SDK Build-tools が無いと、正しく dex ファイルが生成できないのではないかと思われます。


追記
ちょっと気になったので確認してみましたが、結論としては Android SDK Build-tools は関係なく、現時点(2013/11/14) の最新SDK Android SDK Tools Rev. 22.3
Android SDK Platform-tools Rev. 19
では Project Build Target が API 15Android 4.0.3 以前の Project のビルドにはことごとく失敗します。
Android SDK をアップデートしたら、Project Build Target もアップデートしないといけないようです。

そもそも、Project Build Target のバージョンはなるべく最新に保ち、Deprecated なものなどに気を配って開発していくべきですので、あまり問題はないと思いますが、リリース直前の複数のプロジェクトを抱えているとやっかいなことになりそうです。
まぁ、そういう場合は SDK のインストールディレクトリから分けるべきなのでしょう。。。