LoginSignup
110
86

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-05-15

概要

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

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

Keynote

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

Developer Keynote

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

  • 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

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

  • メンテナンス性
  • ビルド速度
  • 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

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

  • 現状の問題点、ネットワークから取得して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

  • "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

  • 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

  • インストール後のアプリの起動速度が、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

  • 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

  • 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

現状

  • 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

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

110
86
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
110
86