イケてるAndroidオープンソースアプリ集

PLAID Advent Calendar 2017 11日目の記事です。

メンテナンスされていてそこそこ規模が大きいAndroidOSSアプリのまとめがあまりないな、と思ったので探しながらまとめました。
明確な基準はありませんが参考になりそう（主観）で、次の条件を大体満たしていているものをいくつか挙げました。

- スター1,000以上
- 最終コミット2カ月以内
- 英語

### [google/iosched](https://github.com/google/iosched)
- Google/IOのカンファレンスアプリ。タグで2011-2017年版まで管理されてる
- 主な利用ライブラリ：Gson, FCM, LeakCanary, Espresso
- AbstractThreadedSyncAdapterやLoaderManager、ContentProviderを多用
- MVPアーキテクチャ
- Calendar Providerによるスケジュール同期機能、TileProviderによりMapをSVGで描画など

### [DroidKaigi/conference-app-2017](https://github.com/DroidKaigi/conference-app-2017)
- DroidKaigiのカンファレンスアプリ
- 主な利用ライブラリ：Retrofit2, RxJava2, Android-Orma, Dagger2, retrolambda, DataBinding
- MVVMアーキテクチャ
- テストはkotlin
- ベストプラクティスやノウハウがガンガン共有されてるのでとても参考になる
- [droidkaigi2018は1月中旬に公開予定らしい。](http://konifar.hatenablog.com/entry/2017/11/23/002905 )2016年版は[ここ](https://github.com/konifar/droidkaigi2016)

### [kickstarter/android-oss](https://github.com/kickstarter/android-oss)
- 主な利用ライブラリ：Retrofit2, Dagger2, RxJava, RxBinding, retrolambda, Robolectric
- ViewModelのテストがしっかり書かれてる
- MVVMアーキテクチャ
- Model<-ViewModel<->Viewでほぼ全てRxのObservableによるやり取りをしている、カッチリした設計

### [wikimedia/apps-android-wikipedia](https://github.com/wikimedia/apps-android-wikipedia)
- 主な利用ライブラリ：Retrofit2, ButterKnife
- マテリアルデザインで画面・機能もそこそこあり、gradle3.0.0だったり、意外と良さそう。
- 複雑なviewに対してはltrやフォントサイズ変えつつ[FacebookTesting](https://github.com/facebook/screenshot-tests-for-android)でスクリーンショットテストしてるのが面白い

### [DrKLO/Telegram](https://github.com/DrKLO/Telegram)
- ほとんど外部ライブラリに依存していない
- サーバとの通信はNDKで実装されてる[MTProto](https://core.telegram.org/mtproto)（TCP、UDP、HTTP上）
- SwipeによるBackNatvigationのためにFragmentやFragmentスタックの独自実装してる([3fecce964594ebc32af5bdd98f170ffceb0df0fa](https://github.com/DrKLO/Telegram/pull/410/commits/3fecce964594ebc32af5bdd98f170ffceb0df0fa)）
- layoutを動的に作ってる上、viewmodelやpresenterもないのでUIレイヤが大きくなってる
- チャット画面などにかっこいい機能が多いので参考にできる部分もありそう

### [hidroh/materialistic](https://github.com/hidroh/materialistic)
- MaterialDesignのHacker Newsクライアント
- 主な利用ライブラリ：Dagger, Retrofit2, RxJava
- RobolectricによるActivity、Fragmentのテストが多い

### [owncloud/android](https://github.com/owncloud/android)
- オープンソースオンラインストレージ、ファイル共有ソフトownCloudのクライアント
- 外部ライブラリにあまり依存していない
- AccountAuthenticator、ローカルのファイル管理やアップロード・ダウンロード処理周りが参考になりそう

### [naman14/Timber](https://github.com/naman14/Timber)
- Material DesignのMusic Player
- 主な利用ライブラリ：Retrofit
- プレイリスト管理やバックグラウンド再生も含めプレイヤーとして基本的な機能をMediaPlayerで実装してる。複雑なMediaPlayerの利用例として良さそう

### [TeamNewPipe/NewPipe](https://github.com/TeamNewPipe/NewPipe)
- youtubeクライアント
- 主な利用ライブラリ： ExoPlayer2, RxJava2,RxBinding2, AndroidArchitectureComponentのRoom
- 購読、視聴履歴管理にRoomを使ってる。
- バックグラウンドやポップアップ再生に対応しており公式アプリに劣らず高機能なのでExoPlayerの利用例として良さそう

### ReactNative
- [f8](https://github.com/fbsamples/f8app)：F8カンファレンスアプリ
- [git-point](https://github.com/gitpoint/git-point/) ：GitHubアプリ
- [zulip](https://github.com/zulip/zulip)： Dropboxがリリースしたグループチャットサービス

### GitHubクライアント
GitHub公式アプリがメンテナンスされなくなってからフォークされたアプリ

- [ForkHub](https://github.com/jonan/ForkHub)
    - 主な利用ライブラリ：OkHTTP3
- [PocketHub](https://github.com/pockethub/PocketHub)
    - 主な利用ライブラリ：RxJava2, Roboguice

### 変わり種
- [antoniolg/Bandhook-Kotlin](https://github.com/antoniolg/Bandhook-Kotlin) ：kotlinによる音楽プレイヤーアプリ
- [shadowsocks/shadowsocks-android](https://github.com/shadowsocks/shadowsocks-android)：
[Shadowsocks](https://bestvpn.jp/shadowsocks/)のクライアント。Scalaで書かれてる
- [launcher3/Launcher.java](https://github.com/amirzaidi/Launcher3)：ランチャーアプリ

### サンプルアプリ系
- [googlesamples](https://github.com/googlesamples/)：公式のサンプルがたくさんある
  - [googlesamples/android-architecture](https://github.com/googlesamples/android-architecture)：MVP, MVVM with DataBinding, CleanArchitectureなどによるtodoアプリの実装
  - [googlesamples/android-architecture-components](https://github.com/googlesamples/android-architecture-components)：AndroidArchitectureComponentsのサンプル
- [JakeWharton/u2020](https://github.com/JakeWharton/u2020)：Daggerのサンプル
- [Plaid](https://github.com/nickbutcher/plaid)：Designer News,Dribbble,Product Huntからニュースを引っ張ってるニュースアプリ。MaterialDesignにこだわってるのでUI実装が参考にできそう（弊社と名前が一緒ですが無関係です。）

## 感想
- それぞれ独自でMVVM、MVPアーキテクチャを構築したりしてるのでAndroidArchitectureComponentsがデファクトになり統一されてほしい。
- ORMは思ったより使われてなさそう。多少面倒臭くてもsqlite, ContentProviderあたりで普通にやるのが落とし穴も少なく無難なのかも。
- Retrofit, Rxはデファクトと言えるがDaggerは規模にもよるのでまちまち。
- テストはやはり難しくほとんどないプロジェクトもある。
- BaseActivityは反対されることもあるが作ってるプロジェクトの方が多い。
- activities, fragmentsのようなパッケージの分け方が推されることがあるが機能別で分けてるプロジェクトも多い。
- FacebookTestingが気になるので追って調査したい。

他にもいいものがあれば教えてください。

## 参考
- [20+ Awesome Open-Source Android Apps To Boost Your Development Skills](https://blog.aritraroy.in/20-awesome-open-source-android-apps-to-boost-your-development-skills-b62832cf0fa4)
- https://github.com/pcqpcq/open-source-android-apps
- [List of free and open-source Android applications
](https://en.wikipedia.org/wiki/List_of_free_and_open-source_Android_applications)