Google Play APP DOJO #38 に参加してきた

Google Play APP DOJO #38に参加してきたので、その内容を自分なりにまとめてみました。
テーマは、「Android Q 新機能詳細 -ダークテーマから共有機能まで-」です。

# 概要

Google I/O 2019で発表されたAndroid関連のアップデートについて

# Android Q

YouTubeにプレイリストあり。
[Android @ Google I/O 2019](https://www.youtube.com/channel/UCEHq7-M4iDmmGx_JK-F9HgQ)
現在、「Android Q Beta 4」が出ている（API Level 29）

## プライバシー

[Android Q privacy checklist | Android Developers](https://developer.android.com/preview/privacy/checklist)

### 位置情報

バックグラウンドでの利用権限が分離され、バックグラウンド時には別のパーミッション「ACCESS_BACKGROUND_LOCATION」が必要になる。

### Scoped Storage

/sdcard以下へのアクセス制限が以下の通りに変更される。

- 自分のファイルはアクセスできる
- 写真・音声・動画はMediaStoreでアクセス
- 他のアプリが作ったファイルはDocumentsProvider（Intent.ACTION_OPEN_DOCUMENT）でアクセス

位置情報へのアクセスには「ACCESS_MEDIA_LOCATION」権限が必要。
Android R（Qの次のOS）になった時、FileSystemでアクセスできなくなるらしい。

### その他の変更

- バックグラウンドからユーザの操作なしにUI起動できない
- カメラの情報を取得するのにもカメラの権限が必要
- バックグラウンドからクリップボードへのアクセス禁止
- etc

## ダークテーマ

システムの設定でダークテーマの切り替えが可能になった。

### 対応方法

#### DayNight

```values/styles.xml
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">
...
</style>
```

#### -night

```values/styles.xml
<style name="AppTheme" parent="Theme.MaterialComponents.Light">
...
</style>
```

```values-night/styles.xml
<style name="AppTheme" parent="Theme.MaterialComponents">
...
</style>
```

#### Force Dark

```values/styles.xml
<style name="AppTheme" parent="Theme.MaterialComponents.Light">
    <item name="android:forceDarkAllowed">true</item>
</style>
```

#### 一部を除外

```layout.xml
<xxxView 
    ...
    android:forceDarkAllowed
    ...
/>
```

### 注意事項

色をlayout.xml上でベタ書きしていると、ダークモードにしたときにうまくいかないことがあるかもしれない。
colorPrimaryに設定しておけば、テーマの切り替えで対応が可能。

### その他

Android Q未満でも、AppCompatを利用すればダークテーマに対応はできる。
だからといって特に対応する必要はない。

## Gesture Navigation

Android Qから完全ジェスチャーモードが加わった。
Android R移行時、完全ジェスチャーモードのみになるかも。
とはいえ、DrawerLayoutは無くならないと思われる。
ただ、Gesture Navigationが入った時にどういう挙動になるかは確認したほうがいい。

## Bubbles

他のアプリの上に描画する機能。（Facebook Messengerなどで利用されている）
これをSYSTEM_ALERT_WINDOWというが、これを無くしたいがためにBubblesが誕生した。
SYSTEM_ALERT_WINDOWでは、たくさんアプリが起動してしまうため、低スペックのアプリには厳しい。

Android Qでは、ユーザ向けの機能にはならない。
この機能はあくまでPreview Releaseである。
開発オプションの中で有効にすれば使える。

## Sharing

マシュマロでDirect Shareができたが、不評であった。
（Direct Shareに関しては以下参照）
[Direct Shareを試してみる - Qiita](https://qiita.com/droibit/items/5b8a94d50396e386f253)

今回のバージョンアップにより改善された。
Settings Panel（Android Qでしか使えない）を使えばよりGood。

# Jetpack 最新情報

以下にバージョン一覧がある。
[AndroidX Versions | Android Developers](https://developer.android.com/jetpack/androidx/versions)

## LiveData(KTX)

Android KTXによって、よりKotlinらしく書くことができる。

[LiveData Overview | Android Developers](https://developer.android.com/topic/libraries/architecture/livedata)

## ViewModel(KTX)

Android KTXによって(ry

[ViewModel Overview | Android Developers](https://developer.android.com/topic/libraries/architecture/viewmodel)

## DataBinding

[Data Binding Library | Android Developers](https://developer.android.com/topic/libraries/data-binding)

### Android Studio 3.5

- ビルドが20%高速化
- XMLとコード間の即時連携
- インクリメンタルアノテーションプロセッサー（プレビュー）

### View Binding(Android Studio 3.6から)

- DataBindingと同様、ただし値のバインディングはしない
- findViewByIdの置き換え
- 型安全、早い

## Savedstate

[Savedstate | Android Developers](https://developer.android.com/jetpack/androidx/releases/savedstate)

Android 1からある機能。
アクティビティの現在の状態を覚えておくもの。
ViewModelで十分に思えるが、「プロセスが殺されてしまった場合にデータが削除されてしまう」問題があり、それを解消できる。（プロセスが殺されてもデータが保持される）

## WorkManager

[Schedule tasks with WorkManager | Android Developers](https://developer.android.com/topic/libraries/architecture/workmanager?hl=ja)

### 2.2(alpha)

- パフォーマンス・互換性の向上
- Robolectric test、Unit test

### 予定

- ForegroundでもWorkManager APIが使えるように

## Room

[Room Persistence Library | Android Developers](https://developer.android.com/topic/libraries/architecture/room?hl=ja)

### 2.1(alpha)

- コルーチン(suspend)
- 全文検索
- ビュー（DatabaseView）

### 予定

- インクリメンタルアノテーションプロセッサー
- Relationの強化
- マイグレーションを簡単に
- コルーチンChannelとFlow

## Paging

[Paging library overview | Android Developers](https://developer.android.com/topic/libraries/architecture/paging)

### 予定

- ネットワークから取得するのを簡単にする
- ヘッダー・フッター
- RxJavaサポート

## Navigation

[Navigation | Android Developers](https://developer.android.com/guide/navigation/?hl=ja)

### 2.1(alpha)

- スコープ
- URIによるナビゲーション
- ダイアログフラグメントのサポート

### 予定

- Dynamic featureのサポート

## CameraX

[CameraX の概要 | Android Developers](https://developer.android.com/training/camerax?hl=ja)

### Camera機能のこれまで

Camera APIは非推奨となり、単純な機能・単純なAPIしかできない。
Camera2 APIで高機能、低水準なAPI(ハードウェアに近い)が用意されたが、マニアックすぎて敷居が高いのがネック。

### CameraXとは

カメラを利用するアプリに必要な機能を使いやすいAPIであり、API Level 21まで後方互換性がある。
実行時権限は扱わない。

### その他の機能

- プレビューに対する顔認識
- Firebaseとの連携
- Extension Camera2 APIを使って機能を拡張
- さらに簡単なAPIを目指し中

## Benchmark

[Benchmark app code | Android Developers](https://developer.android.com/studio/profile/benchmark.html?hl=ja)

インストゥルメンタルテストの中でベンチマークを取る。
CIでアプリやライブラリのパフォーマンスを継続的に監視したい時に利用。

### 何をBenchmarkするか

- ただ単に遅いコードを早くしたいとき
- 継続的に一定のパフォーマンスを保証したい時

## Security

[Security | Android Developers](https://developer.android.com/jetpack/androidx/releases/security)

比較的簡単に導入ができる。
EncryptedFileやEncryptedSharedPreferencesがある。
簡単にファイルを暗号化できる。
しかも、暗号化のキーは端末から取り出すことができない。

# ぜひ読んで欲しい記事

[Google Developers Japan: アプリの品質を改善してGoogle Play で見つけてもらいやすくする](https://developers-jp.googleblog.com/2019/06/improved-app-quality-and-discovery-on.html)