ls -al

仮想通貨やプログラミングに関する事などをつらつらと書き綴ります

UltraSpeedMemoを作り上げるために使った技術たち

UltraSpeedMemoで使ったツール・ライブラリなどピンからキリまでまとめ

 こちらのアプリで使った技術を小さなものから大きなものまで全て羅列しています。アプリを実際に触りながら読んでみると参考になると思います。


目的

 Androidアプリ作りについて基礎は勉強したけども、そこから先については右も左も分からない開発者に対して、ここを見て気になったところをググれば、アプリを0から作れる程度の知識を得られるインデックスを提供すること。 詳細は書かずに、ググるのに必要な各種の名前と、一文程度の概要を記述する。


想定する読者

  • Androidアプリ開発の基礎を学んで、その先の知識を身に付けたい開発者
  • このアプリを作った時の詳細を忘れた数ヶ月後の自分

半分くらいは自分のためのメモ書きです


Androidアプリ作りで使ったツール・ライブラリ

IDE

  • AndroidStudio

まずはこれが無いと始まらない。

言語

  • Kotlin

 以前はJavaで開発されていたが、今から開発するのであればより開発効率の高いKotlinを使うことを推奨する。

UI周り

  • androidx

 互換性を保ちながら、UI周りをいい感じにしてくれるライブラリ。以前はSupportLibraryと言う名前で提供されていた。

  • AppCompatActivity

 androidxに入っている。下位互換性を保ったまま最新の機能が使えるActivity。Activityで何か作るなら大抵はこれを使えば間違いない。

  • Navigation Architecture Component

 現在α版のライブラリ。Androidの画面遷移周りをよしなにしてくれる。遷移グラフを定義することで、画面と画面のつながりを視覚的に理解しやすく出来、お好みで遷移アニメーションや型付の引数渡しなどができるようになる。

1

Navigation Architecture Componentを利用することで遷移が視覚的にわかりやすくなる

  • Fragment

 Activityでは対処できない、無数の画面サイズに対応するために生まれた仕組み。上記Navigation Architecture Componentを活用するために、本アプリはSingle Activity, Many Fragmentな作りになっている。

  • MotionLayout

 現在α版のライブラリ。Androidのアニメーション周りをよしなにしてくれる。遷移開始時のConstraintと、開始後のConstraintを定義し、その他いくつかのパラメータを設定することでアニメーションを行ってくれる。
 このアプリでは、右図のように、FABのhide/show的なポジションのメソッドがないMaterialButtonに対して、それっぽい動きをさせるために使用している。
 一点落とし穴として、MotionLayoutを使用している際、AndroidAppBundleを利用すると、アニメーションが動作しなかった。どうもMotionを定義したXMLがビルド時に省かれてしまったようで、通常のAPKを生成することで動くように出来た。



  • DataBinding

 面倒なView層の作業(テキストをセットしたり、onClickの動作を紐づけたり…)をXML上で出来るようにしてくれる仕組み

  • ViewModel

 Androidのライフサイクルを気にせずデータを保持できる仕組み。onSaveInstancestateでstateを保存してonRestoreInstanceStateで復元するような面倒なコードを書く必要がなくなる

  • RecyclerView

 Androidにおいて、多数ある項目を並べて表示するために使われるUIコンポーネント。名前の通り、単にリストを表示するというものではなく、Viewをリサイクルして表示する必要のあるもの全般に使える。

  • bindingcollectionadapter

https://github.com/evant/binding-collection-adapter
 上記RecylerViewはAdapterを書くのが面倒だが、DataBindingを活用することで、XML上でデータとViewの紐付け方を定義することで、Adapterを全く書かなくてもRecyclerViewが使えてしまうライブラリ。実際、本アプリはRecyclerViewのAdapterを一行も書いていない。非常に楽

  • constraintlayout

 以前はRelativeLayoutとかLinearLayoutとかでレイアウトを組むことが多かったが、今はだいたいこれ一つでサクサク作る。

  • material-design-icons

 Apache2.0ライセンスで使えるアイコンを提供している。本アプリで使用しているアイコンからアプリ自体のアイコンまで、全てここにあるものを使って作成されている。

https://material.io/tools/icons/?style=baseline

バックグランドサービス

  • Service

 バックグラウンドで何かしらのタスクを実行するのに必要なもの。Oreo以降からバックグラウンドサービスの扱いが厳しくなり、扱いが若干面倒になった。

  • startForegroundService

 Oreoより前はstartServiceでバックグラウンドサービスを起動できたが、Oreo以降はこちらで起動した上で、制限時間内に通知を表示したりstartForegroundを呼んだりしないとクラッシュしてしまう。

通知周り

  • NotificationChannel

 Oreo以降で導入された機能。全ての通知は予め生成したチャンネルを割り当てる必要がある。ユーザーはこのチャンネル単位で通知の表示・非表示を切り替えることができる。

  • NotificationCompat

 下位互換性を保ちながらNotificationを扱えるようにしてくれるライブラリ。上記チャンネルの影響で通知を表示する際のコードにもバージョン分岐が発生してしまうが、これを使うことでそういった面倒な部分を回避できる。

  • DirectReply

 Android7.0以降で使えるようになった、通知上でテキストを入力し、アプリでその入力を受け取れる仕組み。これのために、本アプリを扱える端末はだいぶ限られてしまっている。

データ永続化

  • Realm

 モバイルアプリケーション向けデータベース。いわゆるNoSQLで、オブジェクト指向な作りになっている。SQLiteよりも高速で動作する。若干癖があるが、慣れるとSQLiteよりも簡単に扱えると思う。

ビルド周り

  • applicationIdSuffix

 Gradleで使用することでapplicationIdにsuffixを付けられる。これによって、デバッグ時のアプリとリリース時のアプリのapplicationIdを別にできる。

  • main.java.srcDirs += ‘src/main/kotlin’

 Kotlinを使用する際に、デフォルトで存在するJavaディレクトリ以下ではなく、kotlinディレクトリ以下をソースとして認識させたくなった際のおまじない。

その他

  • play-services-oss-licenses

 アプリ内で使用している各種ライブラリのOSSライセンスを表示するActivityを作ってくれる。

  • play-services-ads

 広告を貼って収益化するのに必要。合わせて、admobというサービスを利用する必要あり。

  • KOIN

 DIに使っている。各Activityで書きがちなViewModelの初期化だったり、Repositoryの生成だったり、そういうお決まりのボイラープレートを1ヶ所に纏め、コード量を減らすと共に、DIによるコンポーネントの差し替えの仕組みを提供できる。