見出し画像

2020年2月における note Androidアプリの開発現場

2020年2月における note Androidアプリの開発現場について、ざっと書きました。
「あれについて聞きたい」、「これについて聞きたい」など質問・疑問などあれば、ぜひ記事にコメントしていただけると嬉しいです。

2019年1月の状況は以下の記事を参照してください。

書いてる内容などは違いますが、影響を受けたのは以下の記事です。

note Androidアプリはこちらです。

開発体制

Androidエンジニア 1名(私)
デザイナー 1名(iOSアプリのデザイナーも含めると2名)
QA 1名

どんな改善・施策を行うかは、アプリエンジニアが率先して考えて決めています。主に改善・施策を行うことで、アプリでの体験が向上しそうなものを優先的に実装しています。実装工数を意識することも大事ですが、工数がかかっても体験が向上させることを優先しています。

現在 私がAndroidアプリ開発以外の仕事も担当しているため、アプリ開発に使っている時間をとても限られています。限られた時間の中で、何を今やるべきか?をしっかり考え実装し、2週間に1回くらいリリースするくらいのペースです。

開発言語

JavaとKotlinを使っています。
noteのアプリは2014年から開発が始まっているため、多くのコードがJavaで書かれていま(私が開発に関わり始めたのは、2018年7月から)。
Javaで書かれているコードのメンテナンスはそのままJavaで書き、新しいコードはKotlinで書いています。

以下はnote AndroidアプリのGithub Repositoryで見た言語比率です。

スクリーンショット 2020-02-20 12.20.59

下記の画像が2019年1月時点での言語比率なので、地道にKotlinのコードが増えています。

スクリーンショット 2020-02-20 12.22.36

minSdkVersion

21です(Android 5 以上サポート)。
バージョンごとの利用数や比率を見ていると、Android 5系・6系のサポート終了を今年のどこかで実施しても問題なさそうな印象です。

targetSdkVersion

29です。Android Qをターゲットに開発しています。
targetSdkVersionは積極的に上げていく方針で開発してます。
方針の理由などについては、過去にnote engineer meetup #1でお話したので、以下の資料を参照してください。


----- 🍭-----


ここからは実装をする上でよく使ってるライブラリなどについて書きます。

AndroidX / Android Jetpack

Support LibraryからAndroidXに移行済みです。

DataBinding

レイアウトはできるかぎりDataBindingを使うようにしています。
ObservableFieldやTwo-way data bindingは行っていません。
あくまでfindViewByIdしなくてもViewにアクセスできるようにすることや、Viewへのデータ反映を楽にすることを目的で使ってます。

OkHttp + Retrofit

Http ClientにはOkHttp + Retrofitを使っています。
Converter.Factoryなどを使ってレスポンスをよしなにやってたりしますが、特殊な使い方などはあまりせず、普通に使ってます。

Moshi

JSON ライブラリはMoshiを使っています。
バージョンは1.8.0を使用しているため、KotlinのコードではCodegenの恩恵は受けています。

RxJava 2.x

最近だとCoroutinesの方がいいのかな?って思うこともありますが、使い慣れたものの方が躓くことが少ないのでRxJavaを使ってます。
とはいえ、Kotlinのコードも増えてきたので今年中にはCoroutinesの導入もしたいと考えています。
RxJava 3への移行は経験としてやってみようかと考えています。

RxRelay

画面をまたいだステータス更新などにRxRelayを使ってます。
note Androidアプリ開発の前任者の方はBroadcastReceiverを使っていましたが、実装のコード量が多くなりがちなので、staticなRxRelayを使うように最近はしてます(賛否はありそうですが...)。
以下のようなクラスがあり、これをRxJavaを使うのと同じように使っています。

public class GlobalRelay {
    public static final PublishRelay<XXX> notifyDeleteNote = PublishRelay.create();
    public static final PublishRelay<XXX> notifyLikeNote = PublishRelay.create();
    public static final PublishRelay<XXX> notifyUnlikeNote = PublishRelay.create();
}

Picasso

画像ダウンロードライブラリにはPicasso バージョン 2.71828を使っています。普通に問題なく使えてます。Picasso 3に期待したいところ。

Lightweight-Stream-API

JavaでOptionalとStreamを使用するために使ってます。
過去にContributeもしてるライブラリなので気に入ってます。

Icepick

instance state周りはこのライブラリに任せてます。

KVS Schema

SharedPreferencesのライブラリには、使い慣れたKVS Schemaを使っています。


----- 🍭-----


ここからは実装以外の観点で使っているものなどについて書きます。

Firebase Analytics + BigQuery + Redash

アナリティクスにはFirebase Analyticsを使い、Firebase Analyticsの情報をBigQueryに流しています。
BigQueryにたまったデータをRedashを使って集計・分析しています。

Firebase Test Lab

リリース前のQA時にFirebase Test LabのRobo Testを活用しています。
導入が簡単で価格も安いのでオススメです。
Firebase Test LabのRobo Testの概要については、過去に勉強会で発表した以下の資料を参照してください。

Firebase Crashlytics

クラッシュレポートはFirebase Crashlyticsを使ってます。

CircleCI + Danger

CIはCircleCIを使ってます。CircleCI上でDangerを動かして、Android Lintの実行やPull Requestのチェックなどを行っています。Danger便利です。

Firebase App Distribution

社内向けテストアプリ配信には、Firebase App Distributionを使ってます。Fabric Betaからの移行を推奨されているので、移行しました。移行作業はドキュメントを見れば簡単にできました。


----- 🍭-----

導入してないものなど

去年に引き続き設計です。
アプリエンジニアの人数が去年から増えていないこともあり、設計は先送りにしています。私一人で下手なものを導入して失敗しないためにも、新しいメンバーがJoinしたら、一緒に設計を考えましょう!なスタンスです。

去年からの変化

AndroidAnnotationsを使用したコードを書き換えたおかげで、AndroidAnnotationsがなくなりました。

noteはAndroidアプリエンジニアの採用やってます!

これを読んでいるあたながもしかしたらnote Androidアプリエンジニアの2人目になるかもしれません。

そうなったときは、ぜひ一緒に色々考え、議論しながらいいアプリを開発をしていきたいと思い、今日もアプリを開発しています。


サポートしてもらうことで、キンパツは大好物のミスドが食べられます!よろしくお願いします!