Lobi で Android 4.1 をサポート終了した話

こんにちは!

ゲームコミュニティ事業部(Lobi)サービス基盤チームでアプリエンジニアをしているジェイソンです。

僕が開発に携わっている ゲーム攻略チャットSNS、マルチ掲示板 Lobi(ロビー) は、 その前身であるナカマップのリリースが2010年12月15日なので、つい先日運用8年目を迎えたことになります。

現在、ストアに公開されている最新バージョン、Lobi Android v12.0.0では、最低動作環境を以下のように変更しました。

  • (旧)Android 4.1 以降動作
  • (新)Android 4.2 以降動作

本記事では、最低動作環境をなぜ上げることにしたのか、上げることでどのようなメリット・デメリットがあったのかをご紹介していきます。

旧バージョンのOSのサポート方針

Android 4.1~4.1.1(Jelly Bean)は、2012/07/09に公開されてから、すでに5年以上が経過しているバージョンです。

Project Butterによる動作高速化や、Smart App Updateによるアプリの差分アップデートなど、当時はとても興奮したOSバージョンでした。

今でもこのバージョンを使っている方が一定数いるため、可能な限りサポート対象として、ストアからインストールできるようにしてあげたいところです。

しかし、Android 4.1.x をサポートし続けることによって、正確にはサポートするOSバージョンが増えることによって、 どのOSバージョンのOSでもアプリを正常動作させるため、テストや保守コストが増大してしまいます。 また、サポートライブラリでカバーしていない新しいAPIを使えないなどの理由で、バックポートライブラリの導入を検討したり、要件の見直しが必要となるケースが発生してしまいます。

そのためLobiでは、対象OSバージョンのDAUや新規流入がある水準を下回ったら、サポート終了として検討を進める運用をしています。 実際にサポート終了するのは、進行中の施策状況や、リリース計画に影響がでないタイミングとなります。

WebPのフルサポート

Lobi の Android/iOS アプリは、昨年末のバージョンからWebP形式の画像をサーバーから取得するようになりました。 これは過去にもご紹介しています。

Lobiで画像のWebp変換による通信量削減と調査のためにAWS Athenaを利用した話

しかし、Android 4.1.x 環境に限っては、従来通りJpeg形式の画像をサーバーから取得していました…

なぜなら、WebP形式の画像自体は Android 4.0 以降であればサポートしているものの、 当初は非可逆圧縮かつ、透明度が不要な画像でしか使えなかったのでした。 (Android 4.2.1 以降であれば、可逆圧縮・透明度ありなWebP形式をサポートしている)

Supported Media Formats

Android 4.1 サポート終了にともない、上記の分岐が不要となったため、画像取得周りがシンプルになりました。

また、アプリで扱う画像形式が統一されることで、キャッシュ効率の改善も期待できそうです。

Activity#isDestroyed

Activity#onDestroy の実行有無を判定するために、Activiyt#isDestroyed を使いたいことがありました。

しかしこのメソッドは Android 4.2 以降でないと使えず、いままでは以下のような分岐が必要でした。

if (DeviceUtil.hasJellyBeanMR1()) {      
    return !activity.isDestroyed();       
} else {      
    return true;     
}

Android 4.1 サポート終了にともない、以下のようにシンプルに書けるようになりました。

public static boolean checkActivityRunning(Activity activity) {
    if (activity == null) {
        return false;
    } else if (activity.isFinishing()) {
        return false;
    } else if (activity.isDestroyed()) { ← シンプル!
        return false;
    }

    return true;
}

UserAgentの取得

UserAgentを取得したいとき、Android 4.1 以前は以下のようにしなければいけませんでした。

new WebView(context).getSettings().getUserAgentString();

しかし Android 4.2 以降では、UserAgent取得用のメソッドが用意され、以下のようにシンプルに取得できるようになっています。 WebSettings

WebSettings.getDefaultUserAgent(Context);

Android 4.1 のサポート終了によって、不要となった分岐処理をまとめてみましたが、こう見るとそれほど多くはありませんね。

これはたまたま、Lobi Android に影響を与える変更が少なかったということもありますが、 Android Support Library を積極的に使っていることも一因かもしれません。

みんな大好き Android Support library

Android Support Library として、さまざまなライブラリが公開されており、それぞれが後方互換性や追加の機能を提供してくれます。

また、特定のOSで発生するバグなどが修正されている場合もあります。

Lobi Android のように、できる限り幅広いOSバージョンをサポートしたいアプリの場合、Android Support Library は非常に有用です。

Activity であれば ActivityCompat、ImageView であれば ImageViewCompat のように、 Android が提供しているクラスを使うときには *Compat が用意されていないかどうかチェックして、積極的に使っていきましょう。

最低動作環境を上げることによるデメリット

Android 4.1 環境の端末を使い続けている方は、今後Lobiアプリの新規インストールや、バージョンアップができなくなってしまいます。

そのため、対象となる端末でインストールできる最新バージョンで大きな不具合が発生している場合は、リリーススケジュールの調製をするなど、状況に応じた対応が求められます。

また移行期間として、最新バージョンのアプリをインストールできない人向けに、旧バージョンをインストール可能にしてあげるなど、Android 4.1 環境の端末を使い続けている方ができるだけ不快な思いをしないようにしています。

まとめ

最後は Android Support Library の紹介となってしまいましたが、Android 4.1 をサポート終了することによって嬉しいポイントをご紹介しました。 長期間にわたってサービスを継続させるためにも、旧OSバージョンのサポート方針について明確にすることはとても大切ですね。

旧OSバージョンのサポート終了について悩んでいるエンジニアの皆さまの一助になれば幸いです。

カヤックではサービス持続性を大切にしたいエンジニアを募集しています