Edited at

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

  • 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

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



image.png

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



image.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



  • DarkThemeを使うにはDayNight Themeを使う。


    • MODE_NIGHT_AUTO_TIMEはDeprecated。

    • 方法1: DayNightテーマを使う。

    • 方法2: forceDarkAllowedをmanifestでtrueにして、変えてほしくないところをViewに対してforceDarkAllowed=falseにすることで制御できる



  • Share sheetが新しくなった。

    image.png


  • interruptions: 通知が並び替えされる。ユーザーが選べるimage.png


  • MessagingStyle notificationでsmart replyが使えるようになった

    image.png


  • ジェスチャーをAndroid Qでサポートアプリ内での表示場所の制御する。image.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


  • CameraX 簡単に使える。端末ごとのHDRなどの機能も使える。


  • Jetpack Compose

    Next-generation UI toolkit Jetpack Compose ・Unboundled ・Reactive ・Kotlin

    ここから試せる。

    https://d.android.com/jetpackcompose

    image.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

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


  • Assistant Ready

  • Content Forward

  • Commerce Friendly


  • Google Playが新しくなった


  • MediaSessionConnectorを使うとすべての再生コントロールとコールバックを用意してくれる。


  • ちゃんとした大きさのBannerの画像を入れておくとアプリのメニューでの表示が綺麗にできる

    image.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

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


  • SVGファイルからいっきにimportできる


  • Color Picker搭載



  • New Layout Inspector (DRAFT)


    • getterメソッドを呼んで、属性を探してくる

    • Layout Inspectorが端末のScroll追従して動く
      3Dで表示


    • 新しいLayout Inspector どこで背景色がついたのか3Dで分かる
      image.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


  • 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



  • 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


  • Region space compaction、領域を分けて、領域を避難させて上のやつをやる感じ

    image.png


Young-generation collection、上の新しくallocationしたところを消していくバージョン?

image.png

CC = Collection cycle

Qでは2つを組み合わせて行う

image.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


  • でモジュール分けした他のモジュールの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


  • 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

RecyclerView的なのもできる

image.png

asyncもできる

image.png

Composeで使うdata classなModelは@Modelをつける

image.png

image.png

image.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のデモ 人を加工してカメラで耳つけたりとかも出来ている

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を作った。

@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/