はじめに
「Android 1.6対応、絶対必要だから」
そう言われて開発に着手したのは、2010年の春だった。
当時の私は、Javaの経験はあったものの、Androidはまだまだ不慣れ。開発端末も限られ、情報も少ない。そんな中で言われるがままに開発を進め、文字通り“地雷原”を突き進むことになる。
この記事は、Android黎明期に1.6端末で起きたさまざまな問題と、そこから得た教訓を記した「黒歴史の供養録」である。
1.6対応を信じた開発スタート
開発対象は、ある業務系アプリ。上司が言ったのは、「法人向けに納品する端末がAndroid 1.6搭載だから、完全対応してほしい」という指示。 Android 2.1が出始めていた頃だったが、「業務用なら最新よりも安定性」と言われれば、素直に従うしかなかった。
当時使っていた開発環境は以下の通り:- Eclipse + Android SDK 1.6
- 実機はなかなか手に入らず、エミュレータ中心
- サンプルも公式しかなく、Stack Overflowの回答もまだまだ少なかった
当然、今のように“AndroidX”もなければ、まともなレイアウトプレビューすら存在しなかった。
地雷その1:エミュレータと実機の差が地獄
最初の地雷は「レイアウトがエミュレータと実機でまったく違う」というもの。
特に酷かったのが RelativeLayout
と ListView
の組み合わせ。
エミュレータでは正常に表示されていたのに、実機(HT-03A)では画面が真っ白になる。調べてみると、 layout_weight
を使った時の互換性がバグだらけで、特定のAPIではうまく描画されなかった。
しかも、レイアウトの調整はEclipseでのXML手打ちだったため、何度もビルド→インストール→確認を繰り返す、超非効率な作業。
今なら「Jetpack ComposeでPreviewを確認すれば一発じゃん」と言えるが、当時は精神力だけが武器だった。
地雷その2:メモリ不足で落ちる、落ちる、また落ちる
当時の1.6端末のメモリは、たったの192MB〜256MB。
しかも、アプリが使えるのはそのごく一部。ImageViewにPNGを数枚並べただけで OutOfMemoryError
。スクロール時のGCでカクつきまくり。
私は無知だった。「Bitmapの解像度落とすとか必要なんですか?」状態。
リソースの最適化・圧縮・Lazy Loadingなど知らず、とにかく「表示されればOK」で作っていた。結果、本番で大量のクラッシュが発生し、納品先から怒鳴り電話が飛んできた。
地雷その3:APIバージョンによる非互換の罠
getDrawable()
や setBackgroundDrawable()
など、APIによって使える・使えないがあり、1.6ではクラッシュするコードを普通に書いてしまっていた。
それに加えて、LocationManager
の使い方もAPIごとに挙動が異なり、GPSをONにしているのに全く取得できない事態に。原因は、1.6では明示的にproviderを指定しないと動かなかったため。
当時は「Fragment」すら存在せず、すべてActivity
で切り替える構造。タスク設計も甘く、バックスタックがごちゃごちゃになり、再現困難なバグも頻発した。
何が足りなかったのか
今になって思えば、当時の失敗は以下の要素が原因だった:
- 実機確認の軽視
→ エミュレータ頼りで、本番端末との挙動差を想定していなかった - バージョン別の挙動差への無知
→ API Levelごとの条件分岐や廃止メソッドの把握が甘かった - UIの柔軟性不足
→ 固定サイズのピクセル指定や、非レスポンシブな作り方 - メモリ管理の知識不足
→ Bitmapの扱い、Viewの再利用などの知見がなかった
あれから十数年、今だから分かること
現在のAndroid開発は、当時とは比べ物にならないほど快適になっている。
- Jetpack Composeによる宣言的UI
- 開発環境の安定性(Android StudioのPreviewやLint)
- Kotlin CoroutinesやFlowによる非同期処理の扱いやすさ
- Firebase Crashlyticsによるエラー収集
- AndroidXによる互換性の吸収
今の私なら、たとえAPI 16以下の対応を求められても、「本当にその端末で使うんですか?」と冷静に確認するだろう。
おわりに
この失敗は、私にとって“ただの黒歴史”ではなく、“成長の原点”だ。
バージョン対応を盲目的に信じたこと、検証を怠ったこと、そのすべてが今の自分を形づくっている。
もしこの記事を読んでいるあなたが、今まさにレガシー端末対応で悩んでいるなら、一つだけ言いたい。
「本当にその端末、必要ですか?」
失敗は恥ではない。
でも、“繰り返す失敗”は、回避できる。