Androidアプリ作りに使った技術をまとめてみた[VibrationCompass編]

　自作Androidアプリ作りに使った技術（ツールやライブラリなど）をピンからキリまでまとめてみました。

　<u>[こちら](https://play.google.com/store/apps/details?id=ja.gr.java_conf.asickohyaena.vibrationcompass)</u>のアプリで使った技術を小さなものから大きなものまで全て羅列しています。アプリを実際に触りながら読んでみると参考になると思います。

ブログの方にも書いています。ほとんど内容が同じですが、何かあれば参照してください。
https://5hyn3.github.io/posts/vibrationcompass-tech/

# 目的

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

アプリ内で使ってる技術のみを紹介するので、ここにあるものが全てでは無い。例えばRecyclerViewのような重要な要素があったりするが、本アプリでは使用していないので紹介しない。

# 想定する読者

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

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

# アプリについて

## VibrationCompass
![ic_launcher-web.png](https://qiita-image-store.s3.amazonaws.com/0/105287/2aa4a6c1-8d9e-875c-d139-3257a13d24d1.png)

<img width="262" alt="スクリーンショット 2018-11-16 23.12.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/105287/e38591cc-62cd-6f49-ea13-5ae1ee47ecf5.png">

スマートフォンのバイブレーションを活用し、画面を見なくても目的地にナビゲートすることを可能にするアプリです。詳しくは以下のページを参照してください。

https://5hyn3.github.io/posts/release-vibrationcompass/


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

## IDE

- AndroidStudio

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

## 言語

- Kotlin

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

## UI周り

- androidx

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

- AppCompatActivity

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

- Maps SDK for Android

　アプリ内でGoogleMapの機能を使えるようにできるSDK。

<img width="596" alt="Monosnap 2018-11-20 22-48-04.png" src="https://qiita-image-store.s3.amazonaws.com/0/105287/a7861396-0ff0-24d2-6584-d10088a04639.png">

- ConstraintLayout

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

- DialogFragment

　Dialog表示を行うために使う。AlertDialogなどは手軽に使いすぎるとメモリリークの危険があるが、こちらなら基本安全。

- BottomSheetDialogFragment

　BottomSheetの実装に使う。
<img width="586" alt="Screenshot_1542544828.png 2018-11-20 22-45-19.png" src="https://qiita-image-store.s3.amazonaws.com/0/105287/54ff0440-62b3-d2ec-2639-0736f489c44a.png">

- NavigationView

　メニューを作るのに使う。本アプリでは上記BottomSheetDialogFragmentと合わせて、BottomSheetの実装に使っている。

- BottomAppBar

　画面下に表示されるタイプのAppBar。昨今流行りのノッチデザインでもこれなら指が届く位置にボタンを置いたりできる。以下FloatingActionButtonと組み合わせると、かっこいいデザインにしてくれる。

<img width="402" alt="スクリーンショット 2018-11-16 23.12.58 2018-11-20 22-43-00.png" src="https://qiita-image-store.s3.amazonaws.com/0/105287/c7339a0e-0a17-8f46-6be7-12adc07ee859.png">

- FloatingActionButton

　多くのアプリで見かける、画面右下で浮いているボタン。

- kotlin-android-extensions

　面倒なfindViewByIdをせずにViewにアクセスできるライブラリ。

- calligraphy

　Androidで外部フォントを楽にアプリに組み込めるようにできるライブラリ。

- material-design-icons

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

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

- 源真ゴシック

　本アプリで使用しているフォント。

## バックグランドサービス

- Service

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

- startForegroundService

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

- Doze

　Mushroom以降から搭載された省電力機能。これにより、スリープ中にバックグラウンドで動作するアプリに様々な制約が発生する。

- ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS

　上記Dozeの影響を受けないようにアプリをホワイトリストに入れてもらうようユーザーにお願いするIntentを発行できるAction。

- wakelock

　端末をスリープさせないようにするためのlock。これを取得することで端末をスリープさせなくし、スリープ中にも安定して様々な処理を行わせることができる。ただし、上記Dozeで一部例外はあれど基本的にはあまり使えないものになっている。本アプリではスリープ中にも安定してセンシングを行うために上記ActionでDozeを回避し、wakelockを取得しているが、本来であれば可能な限り使わない方向で実装を進めるべきだと思う。

## 通知周り

- NotificationChannel

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

- NotificationCompat

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

## ハードウェア周り

- LocationServices

　位置情報を提供してくれるライブラリ。GPSに限らず、各種センサを統合して高精度に位置を推定してくれるFusedLocationProviderClientを使うことができる。また、位置情報を活用した各種の便利な関数(2地点間の距離を計算したり、現在の移動方向を計算したり)を内包している。

- SensorManager

　各種センサ(地磁気や加速度など)を取り扱うことができる。GPSはここではなく、上記LocationServicesで取り扱う。

- Vibrator

　端末を振動させることができる。

## ビルド周り

- Android App Bundle

　ユーザーの使用するリソースに絞って配布するapkを最適化することでアプリサイズを削減できる仕組み。

- bundle-tool

　Android App Bundle形式でビルドしたアプリをインストールするのに必要なツール。apkのときとは異なり、現在の最新のやり方に従うと、こういったツールなしではアプリをインストールすることができない。

https://github.com/google/bundletool

- applicationIdSuffix

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

- main.java.srcDirs += 'src/main/kotlin'

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

## その他

- play-services-oss-licenses

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

- play-services-ads

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

- permissionsdispatcher

　面倒なMushroom以降で必要なRuntimePecrmission周りをよしなにしてくれる。

- SharedPreferences

　アプリの設定値などを保存できる機能。簡易的なデータベースとして扱えないこともないが、そういうことをする場合はSQLiteやRealmを活用した方が良い。