Google Play APP DOJO 2019年6月

# AndroidQ 新機能詳細
- Android10。APIレベル29
- 2019年6月17日時点でAndroidQ Beta4だが、APIが正式リリースに向けた最終版APIレベル29となっているため、AndroidQは今もう使える

###プライバシー保護の強化
既存のアプリのどういうところに影響があるか、チェックリストが出ているのでそれをもとにチェックする
※AndroidQプライバシーチェックリスト
https://developer.android.com/preview/privacy/checklist

- 位置情報の取得
  - AndroidQより前は一つのパーミッションでよかったが、AndroidQではバックグラウンドにいる時に取れるようにするためにはマニフェストにもう一つパーミッションの定義が必要になった
  - バックグラウンド取得のパーミッションの選択はユーザーがいつでも出来るので、バックグラウンドで位置情報が取得出来ない時でもクラッシュしないようにコーディングする必要がある

- Scoped Storage
  - ストレージのアクセスの範囲が制限されるようになった
  - /sdcard以下へのアクセスの制限がかかり、AndroidQからは基本見れなくなる。ただし自分が作ったファイルに関してはこれまで通り何の権限もなく出来る
  - 他のアプリが作ったものは見れない。写真・音声・動画・その他ドキュメントについては専用のAPIがあるのでそれでアクセスする
  - ただしオプトアウトで/sdcard以下を参照することが出来るようにすることも出来る。それが出来るのはAndroidQまでで、次のAndroidRでは出来なくなる

###ダーク テーマ
- 以前のAndroidバージョンからあった
- 新しくなったところは、システムの設定でライトモードとダークモードで
切り替えられるようになった
- 各アプリはライトモードとダークモードを持つ
- アプリでダークモードに対応して頂きたい
- 対応の仕方は、いろいろある
- 一番簡単なのは、アプリのテーマの親を変える
\<style parent="Theme.AppCompat.Light.DarkActionBar"></style>
↓
\<style parent="Theme.AppCompat.DayNight.DarkActionBar"></style>

- さらに細かくしたい場合は、
values/styles.xmlとvalues-night/styles.xmlにそれぞれ分けることができる

- ディレクトリを分けることでも対応することでできる
- android:forceDarkAllowed=trueで定義すればだいたいうまく勝手に設定される
- android:forceDarkAllowed=falseでviewごとにダークテーマの設定を除外することも出来る
- Andoird Q未満でダークテーマに対応するには
→AppCompatで出来る。システム全体の設定はないのでアプリごとの対応が必要
- ダークモードにした時に、xmlに色を直接書いているとうまく適用されない場合があるので、その時は?colorPrimaryでxmlに記載しておくことでダークモードのテーマの色が適用がされる

###ジェスチャーナビゲーション
- AndroidQからは完全ジェスチャーモードが加わる
- ボタンはなくなる。例えば、戻るボタンはなくなるがその機能は残る。左端をスワイプして戻るを押す

- 全画面表示に対応することで完全にジェスチャーに対応できる。ナビゲーションバーとステータスバーを透明にして、TOPのビューに対してシステム領域まで広げる、この対応をすることで全画面表示になる

###Bubbles
https://developer.android.com/preview/features/bubbles?hl=JA

- 他のアプリの前面に描画する。
- 既存でシステムアラートウィンドウがあるが、将来的にはなくしたい。だけどアプリの上に描きたいアプリはある。それがBubbles
- AndroidQではプレビューリリースなので、開発者オプションの中で有効にしないと使えない。システムアラートがなくなった時に備える
- Bubbleに置き換えるのはなぜか
→低スペック端末でも動くようにするため

###Sharing
https://developer.android.com/preview/features/sharing?hl=JA

- 共有の機能に関して、様々な改善がされた
- DirectShare（送られる側）とPreview（送る側）がある
- 古いDirectShareを使っているアプリに対して送ることは出来ない

###Settings Panel
- インターネット接続・NFC・音量などのシステム設定をフローティングUIでアプリ上に表示出来る機能。AndroidQでしか動作しない

#Jetpack最新情報
SDKの開発はKotlinファーストで、AndroidSDKはJavaもKotlinもどちらもサポートするが
Kotlin独自の機能もライブラリにどんどん取り入れていく。

AndroidStudio3.5のベータ版は既存機能の強化を主としていて非常に安定している。

###LiveData（KTX）
- Kotlinでの記述により冗長な記述がなくなり、きれいにコードを書けるようになる

###ViewModel（KTX）
- Kotlinでの記述により冗長な記述がなくなり、きれいにコードを書けるようになる

###DataBinding
- xmlに書いたものが即時にビルドしてソースコードに反映されるようになった
- 3.6からViewBindingという新しいライブラリが出る。idだけバインディングして、値のバインディングはしない

###SavedState
- Androidの1からある
- アクティビティやビューの現在の状況を覚えておくandroidxのライブラリ
- 状態を覚えておくのはViewModelでいいのではと思うかもしれないが、SavedStateはViewModelでできないことをやる。ViewModelはメモリで保持しているがこれは、SavedStateはプロセスが殺されても生きている。SavedStateに入れるのは現在入力中の内容（フォームの入力内容）が望ましい。DBに保存するのもどうかというものを入れる

###WorkManager
- 2.1（alpha）
- パフォーマンス・互換性の向上
- 将来の予定
  - WorkManagerAPIは、バックグラウンドでアプリの処理をさせるものだが、フォアグラウンドでもWorkManagerを使うことを予定している

###Room
- 2.1（beta）
- コルーチンの対応が入った
- @fts4をつけるだけで全文検索の対象となる（matchとかwhereをつくる）。
- データベースのviewに対応した
- 将来の予定
  - インクリメンタルアノテーションプロセッサー
  - @RelationでN対Nもとってこれるようにする。今は1たいnだけ
  - マイグレーションを今はCreate Tableで個々でスキーマを用意して行なっているが、それを自動的に出来るようにする
  - LiveData（Stream）でできることをコルーチンでもできるようにする
  - CreateTableのDefaultValueを使えるようにする

###Paging
- ネットワークからのデータ取得を簡単にする
- RecyclerViewでヘッダー・フッターをつけるのは簡単だがページングが絡むとややこしくなるので、それをサポートするAPIを用意した
- RxJavaサポート

###Navigation
- フラグラメントからフラグメントなどの遷移をID指定ではなく、URIで出来るようにする
- 将来の予定
  - DynamicFeatureをサポート。DialogFragmentを使えるようにする予定

###CameraX
- CameraXはAPIレベル21以上をサポートする
- これまでのCameraAPIは非推奨
- これまでの経緯として、Camera2APIでは細かいことができるようになった
- CameraXは内部でCamera2を使っていて、Camera2を使いやすくしている。例えば、コードをすごく短く書ける
- Camera2APIはなくならない
- CameraXその他の機能
  - Firebaseと組み合わせてリアルタイムな解析を出来る
  - カメラをもっと使いたい人はCamera2APIを使ってエクステンションで機能を拡張できる
  - 将来の予定
    - さらに実装が簡単になる

###Benchmark
- CIの側でベンチマークを取れる
- アプリの中でよく使われる機能のパフォーマンスを継続的に維持する為のチェックでこのライブラリを使う
- TestImplementationで実装する
- ベンチマークを取るアプリはdebuggableをoffにしないとベンチマークに影響が出る
- GradleでJUnitを実行すると、jsonファイルが出力されて、どのメソッドにどのくらい時間がかかっているかがわかる
- AndroidStudioのJUnit実行でも、時間を計測することが出来る
- AndroidSDKのRoomの開発などでも使われている

###Security
- EncryptedFile → MasterKeys（暗号化キー）を使ってファイルを暗号化する。MasterKeysは端末から絶対取り出せないのでファイル自体をとられても暗号化されているので見られない
- EncryptedSharedPreference → MasterKeys（暗号化キー）を使うSharedPreference。KeyValueの指定は普通のSharedPrefenceと同じ。これも端末の外からは絶対見られない