Google I/O 2019メモ+驚いたところ

# 概要
AndroidエンジニアなのでAndroidのところメインで見ています。

量が多すぎて、時間も取れておらず、あんまりまとめられていません。🙇🏻
**驚いたところは太字にしています**

# Keynote
https://www.youtube.com/watch?v=lyRPyRKHO8M
詳しい記事がたくさんあるのでそちらをどうぞ。
  
# Developer Keynote 
https://www.youtube.com/watch?v=LoLqSbV1ELU

Android
https://youtu.be/LoLqSbV1ELU?t=364

 * User privacy & security 
 * Developer productivity https://youtu.be/LoLqSbV1ELU?t=479
    - Kotlinを一年前に発表した
        **AndroidはいっそうKotlin firstになる。Kotlinの開発者のためにたくさんの新しいJetpackのAPIが最初にできる**
       ただJavaやC++のサポートも続ける
 * CameraXのリリース https://youtu.be/LoLqSbV1ELU?t=657  
デバイスなどの違いに悩まされるのを解決する。API Level 21から。コードを簡略化する。extension add-on機能を使うとデバイスの機能にアクセスできる。これによりHDRやナイトモード、ポートレートモードなどを利用できる。


アーキテクチャコンポーネントへの改善

 * Coroutinesのサポートなど。

新しいコンポーネント

 * CameraX
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/bbf243e7-6539-d425-ec8f-8380126a828c.png)
 * SavedState for ViewModel
 * **Reactive style UI Tool kit Jetpack Compose**  
reactive UI programming library  
AOSPで開発していく。

**Android Studio  6ヶ月間機能開発を止めて、クオリティの改善を行った**

* In-app update(Beta) アプリ内でアップデートの訴求をしたり、全画面で出したり、アップデートをダウンロードして、再起動で更新みたいなことができる  
* KotlinのJetpack APIもある。extensionの**updateIfRequired()を呼ぶだけでいい。**

---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/07dc41f1-fbe4-cb05-9b9e-a3e16d8a72d8.png)
---

しかし`updateIfRequired()`だけだと毎回アップデートしてしまうので、ラムダを渡して、バージョンコードを見て、判定することができる。ダウンロードしている間もアプリを使っている事ができる。

---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/af17c3eb-c090-7d41-a0bf-7e303bfda6d5.png)
---

(このPlay core libraryのktxのドキュメントが見つけられていません。。)

* Interactive Canvas:  
https://youtu.be/LoLqSbV1ELU?t=1469  
**Google Home Hubとかでの表示で利用される。 HTML JSなどを使う**
https://developers.google.com/actions/canvas/

---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/8a766fc4-d0ca-8ebb-663c-b5b3d60a5c59.png)
---

Google Assistantとうまく連携する方法について。テンプレートを共有したりする。

* ChromeでのImage lazy loading。 loading=“lazy”をimgタグに追加するだけ

* **https://web.dev のサイトでモダンなWebサイトの作り方がわかるらしい。Reactも追加された。**

* ML Kitの新しい機能
デバイス内、オフラインでTranslateできる。
カメラ内の物がなんなのかを検出して追いかけられる
* AutoMLを使うとテーブルのデータを入れるだけで、予測できる。動画でもできる。

* TensorFlow Lite 、AndroidやiOSで動く。例えばカメラを使ったダンスを真似するゲームなどをデバイス内でできたりする。

* AutoML Vision Edge 
FirebaseとML Kitを組み合わせる。
例えばFirebaseのWebページ上で犬の画像をたくさんあげて、Firebase上でtraningして、modelをアプリから使える

* Firebase Performance MonitoringのWebバージョンが登場

* **Flutter for Webが登場**

# What's New in Android
https://www.youtube.com/watch?v=td3Kd7fOROw

* SYSTEM_ALERT_WINDOWは危険、電池とかいろいろ消費するプライバシー Qからはこの権限を与えない。代わりに**BubblesというAPIがAPI Level 29で追加される！**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/edfb61dc-4bd3-bd21-e181-e0e480d4dc03.png)

* DarkThemeを使うにはDayNight Themeを使う。
  * MODE_NIGHT_AUTO_TIMEはDeprecated。
  * 方法1: DayNightテーマを使う。
  * **方法2: forceDarkAllowedをmanifestでtrueにして、変えてほしくないところをViewに対してforceDarkAllowed=falseにすることで制御できる**
* Share sheetが新しくなった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/9cfdbefe-4453-0926-13a0-f2cf2acf7ff9.png)
* interruptions: 通知が並び替えされる。ユーザーが選べる![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/519752dc-3284-4afe-073c-ce42ee64c2be.png)
* MessagingStyle notificationでsmart replyが使えるようになった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/bc8bef54-4efd-0761-790d-1030ec44ac5f.png)
* ジェスチャーをAndroid Qでサポートアプリ内での表示場所の制御する。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/b7c62440-87fe-6916-ba89-22269c9fa7bf.png)
* Text 6.0でHyphnationがデフォルトONになったが Hyphenationは遅いので Qでデフォルトでオフになる。
* Magnifier ズーム表示できる
* QでのPrivate APIについては以下のリンクを見る。
http://d.android.com/preview/non-sdk-q
* **ARTでApp Profileをクラウド上に持つことでアプリの起動速度が上がるらしい**
* QのAPIはnullability  annotationがついている
* kapt 1.3.30でincremental processingが使える。
* android.preferenceはdeprecated。androoidx.preferenceを使おう
* Architecture Componentsの更新  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/fceaf52f-9799-8ae0-0aff-4c555bd8727e.png)
* CameraX 簡単に使える。端末ごとのHDRなどの機能も使える。
* **Jetpack Compose**
**Next-generation UI toolkit Jetpack Compose ・Unboundled ・Reactive ・Kotlin**
ここから試せる。
https://d.android.com/jetpackcompose
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/a73be5da-8c52-3986-02a9-bddc406c7ff1.png)
* ViewPager2
* ViewBinding: annotation processorを使わないことで早い。
* External Storage targetSdk = Qになるとサンドボックスがデフォルトで使われるようになる。
* Setting Panel APIでWifiの設定の切り替えができる

# Build a Modular Android App Architecture
https://www.youtube.com/watch?v=PZBg5DIzNww

モジュール化のメリット: 

* メンテナンス性
* ビルド速度
* CI速度
* Dynamic featureによるapkサイズの減少
* 独立したテスト



* これが使える？ https://goo.gle/androidx-dependency-tracker  
* 分けるときは機能による分割(Feature modularization)とレイヤーによる分割(Layer modularization)ができる。
* dynamic featureを使うときにonDemandを使う基準はなにか？80/20の原則がある。80%のユーザーがアプリの20%を使っていたときに、80%の他の例えば有料機能やエキスパートのための機能をonDemand="true"のdynamic featureにできる。onborading(チュートリアル)のような機能はインストール後使わなくなるので、onDemand="false"にして、あとで消すことでスペースを確保できる。
* 参照できないモジュールのActivityをstartするにはActivity名を直書きしたりする必要がある。
* Navigation Architecture componentを使うと改善できる。
* Database connectionの管理ができない, module間の連携ができない。
* RoomのMulti module向けの新しい機能は準備中。

# Best Practices for Developing on Android TV
https://www.youtube.com/watch?v=Vo-UQDVykIs

３つのキーワードを実現したい

* Assistant Ready
* Content Forward
* Commerce Friendly


* Google Playが新しくなった
* MediaSessionConnectorを使うとすべての再生コントロールとコールバックを用意してくれる。
* ちゃんとした大きさのBannerの画像を入れておくとアプリのメニューでの表示が綺麗にできる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/8a58f540-dedc-ba67-8b02-25c69bf95478.png)
* Video Preview対応する。
https://developer.android.com/training/tv/discovery/preview-videos
* Google Play上でdistribute your app on android tvにチェックを入れる
など、終わりの方の画像で見られる

# Build Apps for Foldable, Multi-Display, and Large-Screen Devices
https://www.youtube.com/watch?v=8uQEzv3upy8
* 必要であればminAspectRatioかmaxAspectRatioで比率を制限できる
* android:resizeableActivityをfalseにしてもfoldableや画面回転では効かない
* マルチウィンドウではすべてのフォーカス可能なActivityがResume状態になる 
* マルチウインドウでもCameraは1つしか開けないので注意

# Understand Kotlin Coroutines on Android
https://www.youtube.com/watch?v=BOHK_w09pVA

* 現状の問題点、ネットワークから取得してUIに反映する場合に、コールバックをUIスレッドで呼ぶ形式だとリークするので、OutOfMemoryErrorになる。
* 中断可能なオブジェクトを管理すればいいが、管理が難しい。
* そこでRxを使う場合はAutoDisposeなどを使う、LiveDataを使っても解決できる。解決された問題では？
  * LiveDataは好かれているがLiveDataは何もサポートしていない。
  * RxJavaは好かれており、そして嫌われてもいる。パワフルだが、時々間違った使い方があるのと、非同期に対してオーバーキルと考えられている。
  * Coroutinesはベストな解決策に見えるが、extensionと開発者の成熟が必要で急な学習カーブが必要。

* 望まれる解決策はなにか？
  * シンプル(simplified)で、網羅的(comprehensive)で、強固(robust)である

Googleは2つのことを決めた。
* **Jetpackにおいて、Kotlin CoroutinesのFirst classサポート**
* 同様にRxJavaもサポートしていき、案内のドキュメントを作る


* suspendとresumeはcallbackを置き換える

* WorkManagerは2.0.0 stableでCoroutinesをサポートしている。
  * **基本的にWorkerではバックグラウンドで動くので必要なさそうに見えるが、キャンセルを考慮すると一行ごとに`if (!isStopped()) return Result.failure()`といった処理を書く必要があり、大変。Coroutinesでsuspend functionを使っていた場合はちゃんとキャンセルされる**

* **LiveData 2.2.0-alpha1でval liveData = liveData{emit(ここにsuspendFunctionの呼び出したとえばdb.getUser()など)} みたいな感じでLiveDataが使える！！！**

lifecycleOwner.lifecycleScopeでライフサイクルのCoroutines Scopeが使えるが、キャンセルされまくるので危険。例えばonCreateで`lifecycleOwner.lifecycleScope.launch`でAPIアクセスすると、画面回転などのたびにAPIアクセスすることになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/f13f3d51-50e9-6c89-6fca-0191736c45d0.png)
liveData{}を使って対応するか、CompletableDeferredを使うと対応できます(動画参照)

`kotlin-corotuines-test` 1週間前にリリースされたもの。GoogleとJetbrainsが両方で作った。

# What's New in Android Studio UI Design and Debugging Tools
https://www.youtube.com/watch?v=oWTG5g5rT4s

* "Design time attribute" : RecyclerViewで右クリック→サンプルデータ　の設定ができる
* ImageView上で右クリックでSet sample dataってして、画像を選ぶだけでサンプルデータをセットできる
* Navigation EditorからFragmentがつくれる
* **Resource Manager: Android Studioの右側のメニューから使える。画像一覧で見られる。hogehoge@2x.pngとかのファイルとかdrawable-がないときとかにいい場所に入れてくれる。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/1724f5d5-3ced-7478-2b1c-75c75d3059dd.png)


* SVGファイルからいっきにimportできる
* Color Picker搭載
* New Layout Inspector (DRAFT)
  * getterメソッドを呼んで、属性を探してくる
  * Layout Inspectorが端末のScroll追従して動く
3Dで表示
  * **新しいLayout Inspector どこで背景色がついたのか3Dで分かる**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/4e320e3f-3e0f-e984-9a5e-531f6511ec5c.png)
  * **CustomViewで@InspectablePropertyをフィールドにつけておくとそれをコード生成でInspection用のプロパティ一覧を生成するときに利用される。**

* **Style Resolution Stacks**
  * **リソースの解決の情報を保存するようになったのでデバッグでどこからの色なのかとかわかるようになった？**

# What’s New in Architecture Components
https://www.youtube.com/watch?v=Qxj2eBmXLHg

* **Kotlin first for Android!**
* ktxだけでなく、Kotlinだけの機能もある
* KotlinのためのAPIデザイン

* DataBinding 
20%早くコンパイル
build cache support
incremental support

* **DataBindingでビルドせずにDataBindingのBindingクラスができたり、プロパティの変更が適応されるようになる！**
* メソッド名などをリファクタリングで変更したときにDataBinding内のコードも変更される

* **View Bindingを使うと3つのいちところどり！！Android Studio 3.6から対応！**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/77b74266-90c4-c954-a53f-245051994e37.png)

* Compatible with DataBinding
* SavedStateはIPCでSYSTEMにデータが渡される
* SavedStateHandleというmapのようなオブジェクトがViewModelに渡されるので、そこにLiveDataを入れたりできる
* Parcelable dataで、大きさの制限もあるので注意
* val userViewModel: UserViewModel by viewModels()

* WorkManagerの最優先事項はPerformanceとcompatibility、テスト、
* WorkManagerの新機能 On demand initilization。必要なときに初期化する、アプリ起動時のパフォーマンスなどを改善できる
* ApplicationクラスにInterfaceをつけることで、あとからConfigurationを読み込めるようになった
* Testing Robolectric サポート Worker unit testing
* WorkerのForeground serviceのサポート
* Room 2.0ではwithContextでIOしてから呼び出さないとsuspend functionにしても呼び出せなかったが、Room 2.1ではsuspendだけで良くなった
  * RxJavaのCompletableやSingleに対応
  * Incremental annotation processor
  * Relationship improvement
  * Migration improvements
  * 将来的にRoomはCoroutines Channel & Flowに対応
  
* 次のPagingのaplhaは夏予定
  * Navigation scopeでViewModelが作れる。URI対応、Dialog対応、Dynamic featureサポート

# Understanding Android Runtime (ART) for Faster Apps
https://www.youtube.com/watch?v=1uLzSXWWfDg

* インストール後のアプリの起動速度が、Profile in cloudで15%程度早くなる。
  * Profileの中には何があるか？
    * 起動時に使うクラス、メソッド
    * よく使うメソッドなど
* 将来的にはアプリのプロファイルはDeveloperを助けるためにも使われる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/5bc436ea-da4d-06cc-ab15-bff2e23b3fea.png)

* Android PでのART
  * Application image, pre-forking application process, generational garbage collector

* Android Qではアプリのプロセスを事前にフォークしておいて、それをプールしておく。それによって5ms程度早くなる

* **起動のInspectionのための新しいツール: StartupAnalyzerKt** reportFullyDrawn()を使って起動のエンドポイントを教える
tools/trebuchetにある
https://android.googlesource.com/platform/tools/trebuchet/+/refs/heads/master/trebuchet/startup-analyzer/


* Heap compaction、Rootから参照されているものをすべてコピーしてそれ以外を消す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/d610350f-edd5-8337-ae88-ff2ed251c059.png)

* Region space compaction、領域を分けて、領域を避難させて上のやつをやる感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/e5b0c65f-dae4-bf33-0579-6ddb61b7db01.png)

Young-generation collection、上の新しくallocationしたところを消していくバージョン？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/217e803c-aef8-9e91-fff2-c7b7b2e1606c.png)

CC = Collection cycle

Qでは2つを組み合わせて行う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/8ef6344e-4433-4921-bb9b-dcbf6d00f12f.png)


# Jetpack Navigation
https://www.youtube.com/watch?v=JFGq0asqSuA

* Activity内のFragmentのグループでViewModelのスコープを作ってデータを共有できる。
 val args: MyFragmentArgs by navArgs() 

* **Navigationのargsの記法はここでわかる** https://developer.android.com/guide/navigation/navigation-pass-data

* <include>でモジュール分けした他のモジュールのnavigation graphが読み込める。
* 他のモジュールのFragmentにNavigationでいくには？Navigation by URIを使う。chat://conversation/$userIdとかをFragmentに書く。(あんまりうれしくないような🤔 URIをどう管理したらいいんだろう？)
* Dynamic feature用のNavigationが読み込めるあとあと用意される。(Architecture componentのセッションによると夏にalpha予定？)

# What's New in the Android Studio Build System
https://www.youtube.com/watch?v=LFRCzsD7UhY

* Namespaced Resources(まだ実装していない。これから頑張る)
* Worker API 
3.5からデフォルトON
-Pandroid.enableWorkers=true
kaptのworker デフォルトOFF
-Pkapt.use.worker.api=true
* Dexを今はモジュールをマージしたあとにやってるけどモジュールごとにやるようになるので早くなる！

* Syncが不要なタスクを動くのをなくして、効率化された
* **3.1 〜 3.5でビルド速度が上がったけど、実際のアプリのビルド時間平均を取ると上がっている。アプリへの機能の追加、サードパーティのプラグインなどが追加されているため。**
**ChromeでAndroidアプリのビルドをTraceできる！ -Pandroid.enableProfileJson=true**

* Annotation Processingの状況
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/8b6311b1-77fa-b8d1-50b2-d0f556367036.png)

* Configurationに何秒も時間がかかっていたらおかしいので改善したほうがよい


# Declarative UI Patterns
https://www.youtube.com/watch?v=VsStyq4Lzxo

現状

* ButtonがTextViewを継承していたり、APIが歴史の経緯がある
* Viewが状態を持っていてつらい。？
* Kotlinやxmlやstyleやattrsなどいろいろ書かないといけなくて辛い。

これらをに対して、Jetpack Composeを作った。
UI widgetでもあり、Composeはcompiler pluginでもある。既存のコードやアプリと互換性がある。まだ実験段階
Composeは組み合わせる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/30a422c9-7414-33bf-faed-088577801e37.png)


RecyclerView的なのもできる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/c4b88229-539b-0ff9-2441-c4de73266711.png)

asyncもできる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/8bec66c7-cc6d-4ff7-09e2-a7e73c040d57.png)

Composeで使うdata classなModelは@Modelをつける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/4a475ee6-3a25-6af5-32a9-7faacb805911.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/21ab3a40-3aa0-3493-e16c-09f664931f81.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/f7c7a919-3925-abc7-f2e4-d76910adeae6.png)



## あとで聞いたComposeメモ

* AndroidのViewはComposeのViewの中で作らず、それぞれのコンポーネントをComposeの1つだけあるViewの中で描画する。
* Composeの中に既存のViewを入れたり、既存のViewにComposeのViewを入れたりできる。
* (現状フォーカスがおかしくなることがある。噂)
* 今はLinearLayoutのようなレイアウトだけしか組めない。ConstraintLayoutのようなレイアウトの対応は今行っている。
* iOSでも動いたりなどのKotlin MPPの対応は考えていない。プラットフォーム依存を引き離す対応はテストやプレビューで利用できるように考えているため。

# Android Jetpack: Understand the CameraX Camera-Support Library
https://www.youtube.com/watch?v=kuv8uK-5CLY

* CameraXはLifecycleAware
* Camera360のCameraXのデモ 人を加工してカメラで耳つけたりとかも出来ている

```kotlin
val previewConfig = PreviewConfig.Builder().build()
val preview = Preview(previewConfig)
preview.setOnPreviewOutputUpdateListener { previewOutput ->
}
CameraX.bindToLifecycle(this as LifecycleOwner, preview)
```

setOnPreviewOutputUpdateListenerでpreviewOutput?.surfaceTextureを使ってGL rendererに書き込める
CameraX extensionsを使うとHDRや夜間モードなど、端末の機能を使える 

# Best Practices for Using Text in Android
https://www.youtube.com/watch?v=fpSfCvP36aA
* Hyphenationは AndroidQとAppCompat 1.1.0でデフォルトOFFに
PrecomputedText 
* RecyclerView prefetch UIスレッドが動いていないときにinflateするようにしてパフォーマンスを改善する
CompoundDrawableの代わりに
imeOptions=“flagNoPersonalizedLearning” パスワードとかで学習させたくないものに使う
imeOptions=“flagForceAscii”
今のKeyboardの情報がSettings.Secureから取得できる

# New Tools to Optimize Your App's Size and Boost Installs on Google Play 
https://www.youtube.com/watch?v=rEuwVWpYBOY
Install requrestが100%だとするとインストール完了が70% ほかはキャンセルとエラー
スペース、時間などが原因としてある
**3MB減ることは1%インストールを増やすことにつながる！** 
(インストール時に容量が足りなかったら？、)他のアプリのアンインストールを促すダイアログを出す
アプリごとにGame engineなどのnative libraryをダウンロードしなくてよくなる。 
WiFiを通して、Peer to peerでアプリ(だけでなく画像などなど)を送れるようになる。(AirDropかな？)
bundletool get-size total --apks= myapp.apks --dimensions=SDK SDKごとのサイズが表示される
さらに—dimentionsでサイズが出せたりする
最適化は早くすることに役立つが、サイズを大きくする。
App size in the Play Console。ダウンロードサイズの推移がグラフで見られる。
容量が少ない端末でUninstallした割合がPlay Consoleで見られる
Play consoleのApp size breakdownではダウンロードしたサイズのdexやresourceなどの内訳が見られる
Optimization plugin-in for Android Studio webpに変換したりしてくれるやつ

# What's New in the Android OS User Interface
https://www.youtube.com/watch?v=nWbW58RMteI
Android Qの機能 Sharing, Notifications, Multitasking
Sharing、 more developer customization options気になる
Sharing Shortcuts アプリ内にダイレクトにシェアできる(例えばアプリ内の別のユーザーに対してシェアできる)
Gentle notification
Notification Actions: Quick replay できる
Bubbles ユーザーの最も大切なタスクをいつでもできる。
MultitaskingとしてPicture-in-PictureとBubbleがある 

Sharing Shortcut: メッセージアプリのJonにシェアするという事ができる。**QからのAPIだけでなく、Sharing ShortcutはAndroidXによる互換性あり！**ChooserTargetServiceから取得する
Shareのrich contentをカスタマイズできる
Shareにアプリのintentを追加できる
Notification Actions: 通知で返信候補で返信などができる。messaging notificationにデフォルトで有効になる。ユーザーは返信してしまう前に編集することができる。
ML Kitで返信候補を入れる
Bubbles: System Alert Windowの置き換え。Collapsedでもメッセージが出せる
https://twitter.com/new_runnable/status/1126530481938296833

# What's New in ConstraintLayout
https://www.youtube.com/watch?v=29gLA90m6Gk
**ConstraintLauyout 2.0 beta1 リリース！！！**
ConstraintHelper
Flow FlexboxLayoutみたいなのができるやつ。溢れたら次の行とかができる
ConstraintLayout ConstraintSetを使ってcloneしてセットしてapplyする方法から変わる

MotionLayout、Programで動きを途中で変更したりできる。transitionToとかで制御
MotionEditor、いい感じ
https://github.com/googlesamples/android-ConstraintSamples
MotionLayoutを使ってコンポーネントを作れる
アニメーションは上下とかだけでなく左右上下などMultistateにできる
MotionLayout in MotionLayout
RecyclerView + MotionLayout
MotionLayoutList 

# Improving App Performance with Benchmarking
https://www.youtube.com/watch?v=ZffMCJdA5Qc
既存のBenchmarkの問題に対して、Jetpack Benchmark Libraryを作った。

```kotlin
@get:Rule
val benchmarkRule = BenchmarkRule()
...
benchmarkRule.measureRepeated {
 // 測りたいもの
}
```

Android Studioとの連携  モジュール→ New → Benchmark Module
apply plugin: ‘androidx.benchmark’
Pull benchmark report

debuggablがtrueになっているとかなり遅くなる
Benchmarkではdebuggable=“false”にする
codeCoverageEnabled  false
Enable Proguard
Emulatorを使わない
Benchmark用のRunnerを使う
CPUがクロックが上がるのに時間がかかる。Benchmarkではこの問題のためにワームアップするようにする
サーマルスロットリング問題
いくつかのアプローチがある。

他のアプリが動いている問題をどうするか？Contention
Benchmarkは平均ではなく、minimumを報告する

cacheに気をつける。file.exists()だとだめ
別の端末で比べるべきではない。コードを比べる。
https://github.com/googlesamples/android-performance

# Build Bigger, Better: Gradle for Large Projects
Moduralize 
https://www.youtube.com/watch?v=sQC9-Rj2yLI
dependencies以外の共通化はbuildSrcでカスタムプラグインを作って対応
buildSrcでのプラグインによる共通化で、カスタムプロパティを使いたいときは普通にPluginの仕組みでExtensionを作って対応
計算をキャッシュする方法の紹介？
buildScanでgarbase collection timeを見てメモリが足りてるか見られる 1gbずつ増やして変化をみる
Tracer Agent
https://android.googlesource.com/platform/tools/base/+/mirror-goog-studio-master-dev/tracer/