スタディサプリ Product Team Blog

株式会社リクルートが開発するスタディサプリのプロダクトチームのブログです

Amazon アプリストアでスタディサプリ小学・中学講座を公開するまで

スタディサプリ小学・中学講座を開発している Android エンジニアの @maxfie1d@omtians9425 です。 2024年2月26日にスタディサプリ小学・中学講座をAmazonアプリストアにて配信を開始致しました。

すなわち今後は Fire タブレット においてもスタディサプリ小学・中学講座をお使いいただくことができます!本記事では Amazon アプリストアでの配信にあたり必要な開発や Tips についてお届けします。

学習を始める方におすすめの端末をご紹介|スタディサプリ

Fire タブレットAmazon アプリストアとは

Fire タブレットAmazon から発売されているタブレットで、代表的な Fire HD 10 などに加えてキッズモデルもラインナップされています。

OS には Fire OS が採用されています。Android をベースにした OS であり記事執筆時点で最新バージョンの Fire OS 8 は Android 10 および Android 11 ベースとなっています。言い換えると Android で動くアプリであれば大きな変更を加えることなく動作させることができます。

一方で Android と大きく異なる点もあります。例えば Google Play には非対応であり、アプリは Amazon アプリストアからダウンロードするという点が挙げられます。

開発初期の調査

いざ Fire タブレットに対応させることになったとはいえ、Fire タブレットについてはチーム内や社内でも経験があるメンバーがおらず通常の Android タブレットと違っていろいろ動かない部分が出てくるのでは?と開発当初は懐疑的に考えていました。

そこでまずはスタディサプリ小学・中学講座 Android 版 のアプリコードをまったく変更せずにビルドしたものが Fire タブレットで動作するかを検証してみることにしました。

結果としてはアプリはすんなりと起動し、全体的に触った感触としても問題なく動作することが確認できました。Fire タブレットと同価格帯の他の Android タブレットと比較してもむしろ動作は安定しており、快適にご使用していただくことができそうだということが分かりました。

仮に Fire タブレットで上手く動かない部分が多く出てきそうならばまるごと WebView ベースのアプリにするなど別の戦略の検討も考えていたところではありましたが、native で対応するという方針を立てることができました。

さらに詳細な調査

前述したように既存のコードをまったく変更することなくFire タブレットでアプリを一応は動作させることができました。

しかしながら内部的に実は動いていない部分があるだろうという予想のもと、依存しているライブラリや外部サービスごとに1つずつ検証していきました。

Firebase

スタディサプリ小学・中学講座 では Firebase を使用しています。Firebase は Fire タブレットでも動作するのでしょうか?

前提として FireOS には Google Play 開発者サービス が搭載されていません。一方で Firebase の機能には Google Play 開発者サービスが不要なものと必須または推奨なものの2種類があります。

例えば Firebase の Crashlytics は Google Play 開発者サービスが不要なため、Fire タブレットにおいても問題なく動作します。

Fire タブレットにおいても Crashltyics は動作します。Google Play 版と同様に Amazon アプリストア版のクラッシュ情報も Crashltyics で確認しています。

一方で Cloud Messaging や Firebase ML などは Google Play 開発者サービスが必須のため Fire タブレットでは動作しません。そのため Fire タブレット用の実装を置き換える必要があります。

Firebase について詳しくはドキュメントにがありますのでご参照ください。

developer.amazon.com

firebase.google.com

プッシュ通知

スタディサプリ小学・中学講座では KARTE を使用してプッシュ通知を配信しています。そして KARTE ではプッシュ通知の送信にFirebase Cloud Messaging を使用しています。前述したように Cloud Messaging は Google Play 開発者サービスが必須の機能であり Fire タブレットでは動作しないため Fire タブレット用に実装を移植する必要があります。

Fire タブレットでは Amazon Device Messaging によるプッシュ通知がサポートされています。また、こちらのアンケートに回答することで Firebase Cloud Messaging から Amazon Device Messaging への移植に役立つ情報を得ることができます。

developer.amazon.com

ちなみに KARTE のプッシュ通知以外の機能(ポップアップ等)は Fire タブレットでも動作します。

アプリ内課金

スタディサプリ小学・中学講座では Google Play のアプリ内課金に対応しています。しかし Fire タブレットGoogle Play に非対応のため、Fire タブレット用の実装を移植する必要があります。

Fire タブレットでは Amazon In-app Purchasing によるアプリ内課金がサポートされています。また、こちらのアンケートに回答することで Google Play Billing Library から Amazon In-App Purchasing への移植に役立つ情報を得ることができます。

developer.amazon.com

学習画面 (WebView)

スタディサプリ小学・中学講座の学習画面は Web 技術で実装されており、アプリから WebView で表示するという構造になっています。すなわち Fire タブレットの場合ブラウザが Silk ブラウザによって学習画面が表示されることになります。Silk は Chrome と同じ Chromium ベースのブラウザですが Silk 特有の不具合があるのではないかという懸念がありました。

しかしながら十分にテストをした結果 Silk に起因すると思われる不具合は些細な表示崩れが数件あった程度で問題なく動作することが分かりました。

小学1年生向けレッスンの学習画面。ネイティブアプリ上で WebView で表示している。Silk においても問題なく表示できた。

その他

Firebase、プッシュ通知、アプリ内課金、WebView については Fire タブレットのための対応が必要になる場合があることを紹介しました。しかしながら対応が必要なのはそれくらいでして、JCompose を含め Jetpack は当然動きますし adb や開発者モードも動きます。調査を行う際は Google Play に依存している機能に特に注意しながら念の為網羅的に見ていくことをおすすめします。

Fire タブレット用に画面を出し分ける

プッシュ通知やアプリ内課金は実装の移植が必要であることを紹介しました。その他にもアプリ内では Fire タブレット用に画面の一部や全部を出し分けたいというユースケースがあるかと思います。

そこで Google Play 版と Amazon アプリストア版のアプリ (以下、Google 版と Amazon 版) で異なる画面を出し分けるために Flavor を導入することにしました。

Flavor の設定

Flavor を設定するために build.gradle に以下のように記述します。

flavorDimensions = ["distributionPlatform"]

productFlavors {
    google {
        getIsDefault().set(true)
        dimension = "distributionPlatform"
    }
    amazon {
        dimension = "distributionPlatform"
    }
}

ここでちょっとした Tips を紹介します。ある Flavor に対し getIsDefault().set(true) と記述することでデフォルトで選択される Flavor を指定することができます。これにより例えば初めてリポジトリをクローンしたときに意図しない Flavor でビルドしてしまうことを防ぐことができます。

Flavor として amazon, google を追加したことで Build variant は google|amazon × debug|rc|release の合計6種類になった

続いて Amazon 版の Application ID の設定を行うために build.gradleapplicationIdSuffix を設定します。この例では Flavor が amazon のときだけ Application ID の末尾に .amz が付加されるようになります。

productFlavors {
    amazon {
        applicationIdSuffix ".amz"
    }
}

この設定により Google 版と Amazon 版で異なる Application ID が適用されるので中身こそほぼ同じですが別アプリとして扱えるようになります。Application ID を分けることの利点として Google 版と Amazon 版 を明確に区別できるようになるため例えばクラッシュや分析のログを見分けるのに役立つ点が挙げられます。また、1端末に Google 版と Amazon 版の両方をインストールすることができるので開発中に便利です。

Google 版と Amazon 版で分岐するコード

Flavor の設定をすることができたので、次は Google 版と Amazon 版で分岐するコードを書いていきます。 はじめに以下のように Google 版 と Amazon 版を意味する enum class DistributionPlatform を定義します。

enum class DistributionPlatform(val platformName: String) {
    GOOGLE("Google"),
    AMAZON("Amazon")
}

次に DistributionPlatform を返却する interface DistributionPlatformProvider を定義します。

interface DistributionPlatformProvider {
    fun get(): DistributionPlatform
}

最後に DistributionPlatformProvider の実装クラスを作ります。

internal class DistributionPlatformProviderImpl @Inject constructor() : DistributionPlatformProvider {

    override fun get(): DistributionPlatform {
        return when (BuildConfig.FLAVOR) {
            "google" -> DistributionPlatform.GOOGLE
            "amazon" -> DistributionPlatform.AMAZON
            else -> throw Exception()
        }
    }
}

コードはこれだけです。DistributionPlatformProvider は任意の Activity や ViewModel に注入することができるので、つまりどこでも画面の出し分けや処理の切り替えをすることができるようになりました。また Google 版と Amazon 版 を DistributionPlatformで表現することで BuildConfig.FLAVOR を直接参照するよりも型安全になっています。

DistributionPlatformProvider 使用して分岐している画面の例としてアップデート画面を紹介します。細かいですが誘導先のストアの表記を Google 版と Amazon 版で出し分けをしています。

アップデート画面。ストアの表記を Google 版と Amazon 版で出し分けている。

Amazon アプリストアについて

ライブアプリテスト

Amazon アプリストアにはリリース前に本番に近い状態でテストする仕組みとしてライブアプリテスト(LAT) があります。

この機能を使って事前に設定したテスターに対して Amazon アプリストア経由でアプリを配信することができます。ライブアプリテストで配信されたアプリにはアイコンの左肩に 「TEST」 と表示されます。

ライブアプリテストについて詳しくはドキュメントをご覧ください。

developer.amazon.com

アプリを申請する

開発が完了し、十分なテストも終えたらいよいよ Amazon アプリストアへアプリの申請を出していきます。申請に出すまでの流れは Google Play と同様で、具体的には以下の項目を設定していきます。

  • アプリバイナリ (App Bundle もしくは APK)
  • アプリタイトル、カテゴリー
  • サポート対象デバイス
  • 国/地域
  • 対象ユーザー年齢
  • コンテンツレーティング、ユーザーデータのプライバシー
  • 簡潔な説明、詳細説明、アプリの特徴
  • アイコン、スクリーンショット
  • など

アプリの説明の文字数やスクリーンショットのサイズ等 Google Play と要件が異なるものがあります。ドキュメントをよく確認して準備をすることをおすすめします。

developer.amazon.com

一通りの項目の入力が完了したら配信開始予定時刻を設定して申請を提出します。はじめてアプリを公開する場合の審査時間が長くなることを懸念していましたが、比較的短時間で完了していました。そして公開日には無事に Amazon アプリストアに公開されました 🎉

リリース後の運用

無事にスタディサプリ小学・中学講座を Amazon アプリストアで公開することができました。最後にリリース後の運用について少しだけ触れておきたいと思います。

E2E テスト

スタディサプリ小学・中学講座 では MagicPod を使用して E2Eテストを実施しています。 MagicPod のテストはエミュレータ上で実行されるため Fire タブレットの実機で動かすといったことはできません(ローカルテストを除く)。 しかしながらアプリ内課金等の Fire タブレット固有の挙動があるものを除けば通常の Android タブレットと同じ動作になるため、Amazon 版における E2E も Google 版と同様に Pixel C + Android 11 の端末で実行しています。どうしても実機での検証が必要な部分については手動でテストをしています。

Amazon 版の E2E を MagicPod で実行している様子

ちなみに Fire タブレット相当のエミュレータも存在しません。Fire タブレットが手元にない場合のテスト方法として Android Studio で Fire タブレットに相当するスペックの仮想デバイスを作成する方法があります。詳しくはドキュメントをご覧ください。

Amazonデバイスを使用しないテスト方法 | Fireタブレット

バイナリアップロード自動化

スタディサプリ小学・中学講座 では Google Play へのアプリのバイナリ(App Bundle)のアップロードを CI により自動化させています。Amazon アプリストアでもアプリ申請のAPIが公開されており、自動化することができます(ただし初回は手動でアップロードする必要があります)。

developer.amazon.com

記事執筆時点ではまだ実現できていませんが、サードパーティの便利な fastlane プラグインなどもあるようなので近々自動化したいと考えています。

おわりに

スタディサプリ小学・中学講座を Amazon アプリストアで公開し Fire タブレットに対応させるまでの話をご紹介しました。振り返れば対応検討段階では様々な不安がありました。具体的には、開発工数は小さく抑えられるだろうか?リリース後の運用コストは小さく抑えられるだろうか?優れた体験を提供できるだろうか?といった不安です。

しかし蓋をあけてみると必要な開発はそれほど多くなく、Fire タブレット および Amazon アプリストアのドキュメントも非常に充実していたため比較的短期間でスムーズに開発を終えることができました。

この記事がアプリを Amazon アプリストアで公開するための参考になれば幸いです。

スタディサプリ 小学・中学講座(Amazon アプリストア) のダウンロードはこちらから

amazon-press.jp

developer.amazon.com

developer.amazon.com