Studyplus Engineering Blog

スタディプラスの開発者が発信するブログ

スタディプラス のAndroid事情

https://s3-ap-northeast-1.amazonaws.com/esa.s3.prod.lithium.studylog.jp/uploads/production/attachments/8682/2018/07/30/34447/a298aca0-1cc6-4021-aa28-f6f3bb44beeb.png

スタディプラス のAndroid事情

今回はAndroidアプリ担当エンジニアのNabesukeです。
組み込みエンジニア→Android→放浪→iOS→バックエンド→フロントエンド→Androidというよくわからない経歴を持っています。
今回はStudyplus Android版の裏側をご紹介します。TOP画像はこの前のスタディプラス LT大会2018(夏) - Studyplus Engineering Blogで使ったもの。

Android版の現状

Kotlin化を進めているが未だJavaが8割以上

image.png (8.9 kB)

目下Kotlin化( + ゆるいDatabinding)を進めていますが記事執筆時点でJavaは8割以上残っています。
(入社時は9割5分くらいがJavaでした。あんまり覚えてない)

Studyplusは画面が多いのでその分クラス数も多いです(1000ファイル以上あります)。
したがってヒマを見つけてはKotlin化に励んでいますがまだまだ終わりは見えていません。

MVCで作られています

比較的ファイル分割もされており、見やすく作られているので、学習コストも少ない分見やすいです。

使っているライブラリ

  • RxJava2
  • Retrofit2
  • Okhttp3
  • Glide
  • Orma(Roomに置き換えます)
  • fabric

その他広告SDKやらプッシュ通知など

クラスのpackage分けについて

これは開発者の好みとか諸事情がたくさん絡んでくるのでなんとも言えませんが、現状は「ふるまい」毎に分けられています。adapter/dialog/view/などなど。app直下にactivity達が大集合しています。
数えたらapp直下に160オーバーのActivityがありました。これは絶賛整理中なので、最初はもっとたくさんのactivity達がひしめいていました。

いま、どういうことをしているか

いまのところ私一人で開発しているので、ひとりでがんばってるなー程度に見ていただけたら幸いです。

packageの整理

私は機能単位でファイルを分けたい方なのでActivityやFragmentなどのPresentation層部分は機能別で振り分けています。(messageパッケージの中にメッセージ画面と関連するactivityやfragment、adapterなどをまとめる)
こうすると比較的関連activity/fragmentなどのクラスを探しやすくなるメリットがあります。modelやextentionなど、機能横断で使うものは現行そのままにしています。

Kotlin化

image.png (5.1 kB)

常に最優先で進めています。 いまのところ 「ぬくもりあふれる手作業」 で置き換えています。

ファイル数でいうと

  • java 719 file
  • kotlin 178 file(頑張った!)

その他xml多数

となっております。

なんでKotlin化するか?

ざっくり言ってしまうとKotlinが好きだから。これが一番大事だと思います。Kotlinかわいい。 過去、Androidアプリを開発した方で心がくじけた方もKotlinの書きやすさを見たら戻ってきたくなります(Android StudioやAndroid自体の良さもありますが)。自分もKotlinと会わなかったらAndroidに戻ってこなかったです。

大体以下の理由になります。主観が多分に混じっているので見識者はツッコミお願いします。

  • Googleが公式言語として認めている。
  • 割とコードを短縮できる(体感4/5くらいにはなる気がする)
  • スコープ関数や拡張関数、配列に対しての処理が便利。
  • Null safe。javaにもあるが、まだイマイチ使いにくい印象。
  • コルーチン(のasync/await)が使いたい。

MVCからゆるいMVVMへ

MVCで見やすいとは言いましたが、これのデメリットはよく言われるようにFatActivityになりがちです。
今後の機能追加で肥大化する可能性が大いにあります。
よって、MVVMに移行していますが機能追加との兼ね合いで進捗は芳しくありません。

AACを使ってActivityやFragmentから処理をひっぺがす

今は通信処理や、状態の更新処理などがActivityに書かれているので一旦それをViewModelに切り出します(いずれはViewModelからも引き剥がす)。 AACのViewModelはActivityのライフサイクルに合わせてデータをよしなに管理してくれるのでちょっと気持ちが楽になります。楽になりたい。
尚、Layout.xml側にViewModelをbindさせるかどうかは絶賛考え中です。ものによりますが、CustomAdapterとか定義すると途端にコードが追いにくくなる印象。

テスト

リリースの度に胃が痛くなる原因なんですが、いまのところテストがありません。
ぬくもりあふれる手作業でテストしてます。テスト導入したい。入社してから思ってるけど未だ着手の気配すらない。他にやること多すぎるという言い訳をさせてください。

CIツール

Bitriseを使いはじめました。いまのところBranch毎の各Build Variant向けビルドとfabricへのアップロード、play storeへのアルファ版リリースを自動化してる程度です。

おわりに

ぬくもりあふれる手作業が多い開発ですが、 これを書いている間にKotlinが2割を超えました。

image.png (16.0 kB)

私が入ってから5ヶ月。Convert to Kotlin してコードを修正し、ButterKnifeを取り除きDatabindingに移行するという作業を延々と手作業で繰り返しました。この調子で頑張りたいと思います。

「自分だったらもっとうまくやれるぜ!」や「ここをもっとこうしたら良くなるのにな」と思った方、弊社でお待ちしています