Android 1.xと2.2の互換性について
Androidアプリの開発は1.0の時から始めたのですが、1.x時代に開発したアプリを最新の2.2向けにテストをしている際に気が付いた違い、というか互換性の無い部分をまとめてみようと思います。
なお、ここにまとめた以外にも互換性の無い部分があるかも知れませんので、情報がありましたならばコメントにてお教え下さい。
1. java.io.Fileクラスの動作が違う
java.io.File#listFiles()メソッドは指定のディレクトリ直下のファイル一覧を返すメソッドですが、以下の違いがありました。
- Android 1.6 … ディレクトリが空の時にはFileの0長配列(new File[0]) が返される。
- Android2.2 … ディレクトリが空の時にはnullが返される。
ちなみに、JavaSEで試した所、Android1.6と同様の動作でした。
APIドキュメントにはnullが返される事が書いてありますが、以下の場合の様です。
- (ディレクトリではなく)ファイルの場合(Android、JavaSE共)
- 入出力エラーが発生した場合(Androidのみ)
上記の様にディレクトリを指定している、且つ入出力エラーが発生したとは思えない時にnullが返されるのは「変」だと思えるのですが、どうなのでしょうかね??
何にしてもCore JavaAPIの動作が違うのは考え物です。これのお陰で1.xでは動いていたアプリが急にエラーが出る事もあり得ます。
2. SDカードのパスが違う
SDカードのパスは、1.x時代は「/sdcard」でしたが、2.xからは「/mnt/sdcard」になりました。
「/sdcard」でも認識する様ではありますが、Environment#getExternalStorageDirectory()メソッドなどを使用して環境に依存しない造りにするべきですね。
しかし、SDカードなどの外部記憶装置が無く、本体メモリしかない場合はどうなるのでしょうね??(笑)
3. ScrollViewから渡されるタッチイベントの動作が違う
ScrollViewにViewを貼り付けている場合、タッチイベントの扱いが2.2になって急に変わっています。
詳細は「Androidアプリの「ピクらっち」をアップデートしました!」にも書きましたが、以下の通りです。
- Android2.1まで … Viewに渡されるタッチイベントはScrollViewの有無関係無しに同様に渡される
- Android2.2 … Viewに渡されるタッチイベントはすぐにキャンセルされる。
※「MotionEvent.ACTION_CANCEL」がすぐに渡されます。
上記の様に、2.1から2.2の間に急な動作の変更により、うちのアプリは散々な目に遭わされました(苦)
※この動作はAndroid SDKのエミュレータでも再現可能です。
回避方法は、「Androidアプリの「ピクらっち」をアップデートしました!」に記載していますので、ここでは割愛します。
4. APIの変更
2010/10/25 追加
Androidは頻繁にバージョンアップします。そしてその度にdeprecatedメソッドが出てきます。
しかし、このdeprecatedメソッドがくせ者で、今までのJava開発と違い、deprecatedなメソッドは容赦なく機能停止される様です。
詳細については、deprecatedなメソッドの事についてまとめた Androidのdeprecatedメソッドの注意点 を参照して下さい。
2010/11/14 追加
deprecatedメソッド以外にも、「AndroidManifest.xml」ファイルに記載するpermissionが変更されている場合があります。
しかも、急に変更される事がありますので、注意が必要です。
5. まとめ
Androidは初期の頃から比べると以下の様な機能が追加されて進化しています。
- 複数解像度対応
- マルチタッチ対応
- 頻繁なセキュリティ対策の変更
(最新はLicense Verification Library (LVL))
OSを無料で配布しているためか、好き勝手に機能追加などを行っている様にも見受けられますが、その度に開発者に負担がかかる事が度々ありました。
今後もこの様な事が続くのでしょうね。OSが基本無料ですから。
「ただより高いものはない」という事でしょうね(笑)
6. ちなみに
ちなみに、iOSの方でも同様に互換性の無い部分はありました。
しかし、Androidの場合は初期の仕様策定が甘過ぎる様に感じています。
更に、Androidの場合は端末の種類が多く、端末間の互換性の問題も気になる点です。
今まで以下の様な端末間の互換性の違いがありました。
- Androidの標準機能であるMIDIが鳴らない端末が存在する模様
- メモリ量が違う
- CPUの速度が違う … (1年位で切り捨てられた)第一世代端末と(現在の)第二世代端末では2倍以上の違いがあります。
OSの標準機能位はサポートして欲しいとは思いますが、それが日本の常識では考えられない世界基準なのでしょうね(笑)
2.の最後の件は、そもそもSDカードが使用可能であることをEnvironment.getExternalStorageState()で確認してからアクセスを試みるべきではないかと。
コメントありがとうございます。
実際には、外部記憶装置の状態以前に、外部記憶装置自体が無い場合にはどこに保存させるべきなのか?という意味で書いたものです。