はじめに
ホワイトプラスエンジニアの仲見川です。
私はいままで主にサーバーサイドエンジニアとしてリネットの開発に関わってきました。
2020年4月よりAndroid™*1アプリ開発を担当しています。
業務としてAndroidアプリの開発に本格的に携わるのは初めてなので、おかしな所など有ればご指摘頂けると大変助かります。
今回タイトルにもあるようにリネットのAndroidアプリを2年半ぶりにリリースするという大任を仰せつかりました。
なかなかこのような大きなバージョンアップはないので、どのように進めて実現したかを記録に残しておこうと思いこの記事を書いています。
目次
体制
開始時点ではアプリチームはまだ立ち上げ前で、私が1人で担当しました。
目標をきめる
最近ではCM放送による認知の拡大もあってAndroidアプリの利用者も増えてきました。
ユーザーの増加はとても嬉しい限りですが、一方でリネットのAndroidアプリは長らくメンテナンスがされておらずiOSとの機能差も多くユーザー体験の質が低い状態が続いていました。
加えて、リリースのために乗り越えるべき課題が積み重なっており軽微な修正ですら片手間で進めるのは難しい状態でした。
そのため、ユーザー体験の質を上げるためにアプリチームを立ち上げ改善していくことになりました。
今回の話のスコープはアプリチーム立ち上げに先駆けてAndroidアプリの地ならしとも言うべき対応になります。
今後も継続的に改善をしていく前提で、何を進めて行くかはアプリチームが立ち上がってから検討して行くため、今回の目標は「今後Androidアプリを安定的にリリースでき、改善サイクルが回せるようになる事」という最低限にしました。
久々のリリースとなるため、不具合が出たときに開発環境のアップデートと機能開発どちらで起きたのか切り分けしやすく、と言う側面も目標を最低限とした理由です。
ゴールを目指すための進め方
自分自身が趣味としても離れており、また元々担当していたものではないためコード理解を深めることと、変更箇所を荒い粒度で可視化していくことを当面のゴールとしました。
実際にやったこととしては、最新のAndroidStudioでビルドが通らない状態からのスタートとなるため、プロト的に修正内容の善し悪しは1度置いてビルドが通り、アプリの起動と簡単な動作確認ができる状態にしました。
このプロトで修正した事をIssueにして必要な修正なのか、妥当な修正内容なのか1点ずつ調査、対応して行きます。
また、対応を進める中で出てきた疑問などはIssueにして知見を蓄積していきました。
(例、FirebaseAnalyticsがアプリから情報送信してダッシュボードに反映されるタイミングなど)
今回やったことの全体像
対象バージョン、開発環境のバージョンアップ
今回のメインはtargetSDKVersionをAndroid10の29にアップした事となります。
新しいAndroidバージョンリリースの1年後には該当Androidバージョンに対応したAPIレベルにする必要があるのでこれをしないとリリースができません。
(緑の塗り潰しがリリース可能な期間)
リリースする上では28でも大丈夫ですが28と29で今回すべき対応に差が無く、近々ダメになるバージョンにする必要も無いので29としました。
しかしこれをやると、buildToolVersionはtargetSDKVersionよりも古いとダメなので29.0.2に更新。
さらに、サポートライブラリが26以降はAndroidXへと変わるためAndroidXへの移行も必要になる。 と、芋づる式に対応しなければいけない事が出てきます。
AndroidStudioのバージョンも大きく上がっているためGradle周りも見直しています。
これらの開発環境にまつわるバージョンアップとそれに伴って変更される箇所を修正しました。
Analyticsの新規実装
AnalyticsをiOSと同等にする為にReproとFirebaseAnalyticsを新たに実装しています。
ここでの新規実装部分はKotlinを導入しています。
テスト
エミュレータにてAndroid5.0〜10までと実機にて6.0〜10までの各バージョンを用意し全機能テストを手動にて行いました。
最初というのもあって万全を期するためですがちょっとやり過ぎな気もしていてどのレベルの変更でどこまでテストして行くかは今後の課題です。
リリース
APKが出来上がりリリースに向けてGooglePlay Console権限の見直し(自分が入れるようにしたり)や変更された点を調査し、過去のドキュメントを最新化するなど手順書の修正を実施しました。
そして昨年よりAndroidもiOSのように審査が始まっているため、審査完了後リリース!
と、行きたいところですが2年半リリースされていないだけ合ってストアの表記が古くストアのテキストやスクリーンショットの表記を最新化もしました。
iOSもそうですがリリース時にしかストア表記が変更できない項目が多い為、リリース前に用意しておかなければいけません。
ストア表記の反映後、満を持してリリースしました!
今回やったことのトピックス
- targetSDKVersionルールの事(BuildTool、Gradle最新化、AndroidX
- minSDK(最低インストールバージョンの切り上げ)
- 使用しているライブラリのバージョンアップ
- https対応(必要なhttpの許可)
- アナリティクスをGAからFirebaseに変更
- Repro導入
- 非推奨になったクラス、メソッドの対応
- Android5.0でWebViewがクラッシュする不具合に遭遇した件
- などなど
このあたりのトピックスは別の機会にまた記事を上げていこうと思っています。
やらなかったこと
テストの実装
今回は業務ロジックに変更を加えていないこと、いわゆるFatActivityな部分が多くテストの追加が簡単ではないために今回は対応しませんでした
CI、CD環境の構築
テストもありませんし今回は1人での開発のため無理にCIやCD環境を作りでビルドするところまでせずに手動でビルドしたものをリリースする事としました
コードのリファクタリング(アーキテクチャの導入など)、Kotlin化
前述の通りFatActivityでテストも無いため安全なリファクタリングが難しいことと、あくまでも今回の目的は安定的にリリース可能な状態とする事だったため全体的なリファクタリングやコードのコンバートはしませんでした
今後やりたいこと
Kotlin対応
今回でもFirebaseAnalytics関連で新規に実装した部分についてはKotlinを導入しています。
今後はKotlinで実装を進めて行くため既存のJavaをKotlinへコンバートして行きます。
DDD、アーキテクチャの導入
リネットではサーバーサイドの開発ではDDD、アーキテクチャを導入しており私もサーバーサイドの開発においてDDDに基づいた設計、開発を経験して不具合が出にくく、変更時が容易という実体験があるので、これをアプリの設計手法にどのように取り入れていくかを検討しているところです。
ユニットテスト
こちらは現在進めていて新規実装についてはテストを追加して行くように考えています。
既存部分はFatActivityをどのように解消していくかと言う所で合わせて進めて行きます。
CI/CDによるデプロイ、テスト版配信
CI環境はせっかく書いたテストを腐らせないためにも必要です。
CD環境はリリース時に手動でbuildValiantを設定しビルドしたAPKを登録する作業は生成したAPKが本番用で正しいか、取り違えてないかかなり神経を使います。意外とこの作業にかける工数も大きいので早くやりたい対応です。
Reproの活用
アナリティクスやキャンペーン配信のためにReproを導入しており、
こちらを活用出来るよう、キャンペーンの表示やPush通知の開発を進めていきます。
Analyticsを活用したPDCA
Reproの活用と似たような事ではありますが。
Analyticsにてユーザー行動を分析し、使いにくい部分やユーザーが知りたいことを知れるような情報設計にして行く等データに基づく改善を進めていきます。
最後に
やること、やりたいことに書いたように今後も事業貢献のために継続的な開発を行っていきますが、そのためにもDXを意識しつつ進めていこうと考えています。
今回のリリース後は事業側メンバーも含めたアプリチームが立ち上がりましたのでそのチームにて改善を進めています。
言われたアプリを作るのではなくエンジニア主導で改善をしていく!位の気概で楽しみながらチャレンジしています!
リネットでは資金調達も行いエンジニア採用を加速させています*2、特に一緒にアプリを良くしていくiOSエンジニアを大募集しています。
ご興味があれば是非、募集要項をご覧ください!