wakwak3125's blog

年に数回更新する予定のブログ。 AndroidとかKotlinとかJavaとか。

今から新規でAndroidアプリを書き始めるなら。

この記事は Android Advent Calendar 2016 2日目の記事です。

こんにちは。わくわくです。
現在お仕事で書いているアプリを新規で書き始めたのが2015年で、現在は2016年です。
そう、1年が経ちました。その頃から今まで書いてきて、今から書くならこんなライブラリや設計を採用するよ(したいよ) というのをまとめたいと思います。
これからAndroidアプリを書くけどどんなものつかっていけばいいんや〜?といった方の参考になれば幸いです。
すでにAndroid開発をされている方にとっては内容が薄く感じられることと思いますがご了承いただければと思っております…(予防線)
(裏の目的としては自分の備忘録のようでもあったりします。)

この記事では紹介しているライブラリや設計などに関しては深くは説明を書きませんが、参考になる資料などをまとめて行ければと思っております。

言語について JavaかKotlinか

2016年にめでたく1.0がリリースされたKotlinですが、使っていてとても楽しくて好きな言語になりました!
現在は1.0.5-2が最新バージョンです。

Kotlin 1.0 リリース: JVMとAndroid向けの実用的(Pragmatic)言語 | JetBrains ブログ

現在お仕事で書いているアプリも新規で書くクラスやテストコードなどでは積極的にKotlinを採用しております。
1.0リリースからKotlinを導入してよかったことやちょっと残念だったこと等をまとめていきます。

メリット

  • ラムダが使える
  • 便利な拡張関数
  • スコープ関数
  • switchより便利なwhen
  • null安全である
  • interfaceにデフォルト実装を書くことができる
  • デフォルト引数が使える
  • 名前付き引数が使える
  • リスト操作が容易

などなど、AndroidにおけるJavaでは使えないような機能が備わっております。
さらに、null安全であるため、AndroidでFragmentを使う際によく発生しがちなヌルポを防いでいくことができます。
では、そんなKotlinを使う上での自分なりのデメリットを考えてみました。

デメリット

  • 公式の言語ではない事によるサポートの将来性
  • 一部aptを使用したライブラリとの相性問題(IcePick, Parceler, Dagger2...etc)
    • こちらはKotlin側でも積極的に改善が進んでおり、現在ではあまりデメリットとも言えないとは思いますが、まだまだハマってしまうことがたまにあるので、記載させていただきました。
  • DataBindingを使う際、ソースコードが真っ赤になってしまう問題
    • こちらもKotlin1.0.5でかなりカイゼンされました!

しかし上記のデメリットを受け入れた上でも導入してよかったと感じています。
Kotlin向けに作られたライブラリなども盛んです。

参考

qiita.com

qiita.com

設計について

Androidの設計についてはいろんなところで議論が進んでいますが、現在は MVP もしくは MVVM を採用することが多いのかなと思っております。
MVCだと簡単なアプリでは問題にはなりませんが、規模が大きくなっていくといわゆる筋骨隆々なマッチョActivity/Fragmentが出来上がってしまうことになります。筋肉が付く場所は自分の体だけでいいと思っています。

MVP

Model-View-Presenterでアプリを表現していきます。

Activity/Fragmentを完全にViewとして扱い、Viewで発生したイベントをPresenterが処理し、Modelと通信します。
ModelはPresenterに対して、データをわたし、Viewの描画処理を担います。

MVVM

Model-View-ViewModelでアプリを表現します。

MVPとめっちゃ大きく変わる!といったことはありませんがViewの描画処理をViewModelと言うクラスが担当します。
AndroidではDataBindingと一緒に使うことで今まで書いていたtextView.setText("hoge")的なものを書かなくて済むようになるので大変楽になります。

参考記事

こちらのサンプルプロジェクトがとても参考になりました。
標準の実装からMVP, Android-DataBindingを使用したMVVMをまとめたリポジトリになっていてテストコードも用意されております。

github.com

  

また、上記プロジェクトを解説してくださっているエントリーもありますのでこちらにもとても助けられました。

qiita.com

  

全然関係ないですが内容が気になるこちら。

qiita.com

設計に関して、自分は読んだだけでは理解ができない頭なため、実際に手を動かして写経、そして自分でもアプリを書いてみる。などしてみることで理解が進みました!
どっちを採用すべきかはその画面などによるかとも思いますので、やはり一度手を動かしてみると気づきがあるのかな…と思いました。(基本的なところなんですが…)

ライブラリ

ライブラリも非常にたくさんありますね。よく使うものを抜粋させていただきました。
作者の方、コントリビューターの方々には足を向けて寝ることができないな…といった気持ちです。
基本方針としては最新版/それなりのユーザーが居るものを使います。

ネットワーク処理を楽にする

  • square/Retrofit
    • 超ド定番のRESTClientです。僕はこれがなければきっと何もすることができません。
    • 2系になってからより便利になりました。今から開発を始めるなら迷わず2.x系を採用します。
  • google/gson
    • 上記のRetrofitと合わせて使います。Jsonを扱うライブラリです。
    • Java開発の現場ではJacksonを使うことも多いようですが、Androidにおいてはメソッド数問題のため導入がためらわれるようです。

FRP

  • ReactiveX/RxJava
    • 複雑なイベント処理/非同期処理などはRxJavaを使うことでシンプルに記述することができます。
    • すでに多くのアプリで採用されていますね。しかしその独特の概念などもあるため無理して導入する必要は無いと思っています。もちろん、導入したほうが色々と楽になることは間違いと感じているのですが、新しい概念的なものもあるので学習はある程度必要なのかなと思っています。
    • 導入に際しては前述のRetrofitと一緒に使うことができるので、そちらの通信周りの非同期処理から使い始めるのが良いかと思います。
  • ReactiveX/RxAndroid
    • RxJavaをAndroidで使う時に便利になるライブラリです。
    • RxJavaを使用する際は合わせてつかうことになるとおもいます。

画像を扱う

  • square/picasso
    • URLから画像を非同期読み込みして表示してくれたり、またいい感じにキャッシュしてくれたりします。使い方もとても簡単です。
  • bumptech/glide
    • Picassoとほぼ同じような使い方で使うことができます。

上記のライブラリ2つはほとんど同じような使い方ができますがキャッシュ周りや優先度付けなどに若干の差があります。しかし通常使う分に関しては両者とも大きな差は無いので好きな方を使う。といった感じでも良いと思っています。
こちらの記事が大変参考になりました。

qiita.com

バックポート系

前述しましたが、Android開発におけるJavaではJava8で使えるような機能が使えません。しかしこちらはライブラリを使用することによってある程度改善することができます。

  • aNNiMON/Lightweight-Stream-API
    • Java8のStreamAPIのバックポートライブラリです。
    • リスト操作において、forEachなどが使えたり、さらにはOptionalも使えるようになります。
    • Kotlinを採用しない場合等ではとても強力な助けになると思っております。
  • JakeWharton/ThreeTenABP
    • Java8ので改善された日付処理のバックポートライブラリです。
    • 今までもJoda-Time-Androidが使われることがあると思いますが、バイナリサイズなどの観点から新規で書くにあたってはこちらを使用するのが良いと思います。
  • evant/gradle-retrolambda

データベース/ORM

  • realm/realm-java

    • いろんなプラットフォームで使える、SQLiteを置き換えるモバイル用のデータベース、Realmです。
    • 非常に高速で、使いやすいAPIを用意してくれています。
    • お仕事ではこちらを使用しております。
    • 注意点としては導入することでAPKサイズが大きくなってしまうというのが大きなデメリットです。
      • こちらに関してはapk splitという機能を使うことである程度緩和できますが、アプリのファイルを複数管理することになるの手間が増えてしまいます。 realm.io
  • gfx/Android-Orma

    • こちらは高速・使いやすいSQLiteのORMです。
    • 上記のRealmと違ってアプリサイズが肥大化することもなく、またORMであるので今後別のORMに乗り換えることになっても移行が容易であることがメリットであると感じています。
    • データベースはアプリを一度作り始めると変更をしにくい箇所でもあるとおもうので、どちらを使うかは要検討、、、と思います。 乱暴な言い方になってしまいますが、個人なら好きな方を使うのが良いとおもいます。

その他

  • facebook/Stetho

    • Facebookが提供しているAndroidアプリの中をいろいろと見れるライブラリです。
      • SQLite, SharedPreference, Network...etc
      • Realmを使用している方はこちらを使うことでRealmの中身をみることができるようになります。
  • google/Dagger

    • square社が提供しているDIコンテナのGoogleフォーク版です。通称Dagger2
    • DIコンテナ自体は必要になったら導入、という風にするのでも良いのではないでしょうか。
  • hotchemi/PermissionsDispatcher

    • Android6.0から導入されたPermissionをキレイにさばくことのできるライブラリです。
    • 使い方はとても簡単ですが、まずはAndroidのPermission処理の大筋の流れを掴んでおくことが重要です。 developer.android.com

DataBinding

過去にAndroidアプリを書く際はButterKnifeというライブラリを使ってViewインスタンスの生成を行っていました。
こちらはfindViewById(R.id.text_view)といったものを書かずとも、Viewのインスタンスを生成できる、といったライブラリでした。
しかし現在では、Googleの提供する、DataBindingという機能を使うのが良いでしょう。
DataBindingを使えば、ButterKnifeよりも、より楽にViewにアクセスできる様になります。
導入もとても簡単です。公式のドキュメントが一番わかり易いと思いますので導入・使用に際してはそちらを参照していただければと思います。

https://developer.android.com/topic/libraries/data-binding/index.html?hl=ja

リリース自動化

  • Triple-T/gradle-play-publisher
    • Gradleで完結できるリリース自動化Pluginです。
    • Gradleだけで完結させたい…!と言った人はこちらがおすすめです。
  • fastlane/supply
    • iOSでは有名なfastlaneのGooglePlayへのリリース自動化ツールです。
    • 結構自由にいろいろできます。
    • こちらは内部はrubyで書かれております。

あとがき

さて、設計やライブラリの紹介をざーーっとしてきましたが、一応個人的な感想としては普段から本当にいろんなライブラリやインターネット上の情報に助けられて開発をしているな、と言った気持ちです。もしなければヒーヒーいって開発をしていたことでしょう…
感謝の気持ちでいっぱいです。

が、それと同時に非常に多くの選択肢があるのも事実です。
なので、1からAndroid開発を始めたいけど、何をつかったらええのかよくわらん。って言う人向けに今回の記事を書いてみました。
当初はRealm Mobile Platformで書こうと思っていましたが、自分なりに開発を進めて1年がたった節目でもあるのでこれからやっていく人のほんの最初の手助けでもできればと言う感じです…。

他に質問・「こっちのほうがいいぞ!」などあれば随時受け付けていますのでぜひともお申し付けください。

以上です!ありがとうございました。