LoginSignup
177
121

More than 1 year has passed since last update.

Google I/O 2021で驚いたところ

Last updated at Posted at 2021-05-21

Androidのエンジニア (Google Developers Expert for Androidでもある) なので、Androidが多めです。
特に驚いたところを太字で書いています。驚いたところもAndroidのものが多めです。
あとからもう一度見たものに☆をつけます。
なにか間違っているところなどあれば修正するので教えて下さい :pray:
(他は割とてきとうにしか見れていないです)

Keynote

以下に9分でまとまっている動画があるので見てみるとテクノロジーの進化を感じられて楽しいです!

Smart canvas
Notionみたいなもの。ビデオチャットしながら更新したりできる

順次公開ということで、まだ公開日程は決まっていないみたい。

Advancing AI
Advancing AI LaMDA language model
すごく自然に会話できるのでデモ必見
(まだリサーチ段階らしい)

TPU v4 1 exaflop。

Search

  • LaMDA Multitask unified model (MUM)
  • multiple modalities
  • MUMは日本語も対応しているので、海外の山と富士山の情報を比べたりできる
  • 検索結果のAbout this resultを押すと いつ最初にindexされたかセキュアかがわかる

Map

  • ARとAIを使ったいろんな機能が追加されている

Photo

  • 勝手に2枚の写真の間の画像を作ってアニメーションしてくれるらしい

Material Design

Material YouはPixelが中心で次に他の端末に広がっていく

Android (詳細はWhat's new in Androidで)

  • Android 12
    Android 22% だいたい全部速くなったらしい
    Android 12 Beta 1が今日から利用できる!

  • Wear OS
    The biggest update for Wear OS!
    Tiles
    Navigation
    fitbitとのコラボレーション

Project Starline
* ストリーミングで3Dモデルを用いて、データを100倍圧縮できるように(ZoomやGoogle Meetみたいなもので利用できそう)
* https://www.youtube.com/watch?v=Q13CishCKXY

Developer Keynote

Android
Web
Flutter
Firebase
Machine Learning

Android (詳細はWhat's new in Androidで)

  • Android 12

    • Privacy アプリがどのようにデータを使うかをみることができる。
    • Performance
    • Customizable launch animations
    • User experience
    • AVIF transforming
    • Widgetがもっとインタラクティブに
  • Creating beautiful app

    • top 1000の80%のアプリがKotlinを使っている
    • Jetpackライブラリ Macrobenchmark alpha
    • Jetpack Compose は7月に1.0
  • Large screen and Wear

    • voice shortcut
    • android autoで使える
    • Wear OS
    • Tiles
    • エミュレーターの設定で心拍数変えたりできる

Web

  • Power
    • Web Assembly: Google Meetで使われている
    • Google Map Web GL
    • Hardware API
    • PWAがAndroidのPlay Storeに出せるように
  • Performance (離脱していた)
  • Privacy

Flutter

  • null safety
  • Material You support

Firebabseもサポート

Firebase

ML

matter

  • IOT向けの規格

What's new in Android☆

Android 12

  • Material NEXT向けの変更テーマ、通知、ウィジェット、トーストに入っている
  • パレットの拡張
    • デバイスのデフォルトテーマを使うことによってデバイスのアクセントカラーを取得できる。 Pixelなら青など。 その色との調和するためにはTheme.DeviceDefault または最新のTheme.DeviceDefault.DayNight を使用し、ユーザーの選択により明るいテーマと暗いテーマに適応できる
    • パレットが拡張された。このパレットの色を使ってロック画面、ホーム画面の色が変わるなど。 Pixelシリーズではもう一歩進んで、壁紙に基づいてパレットが自動的に選択される。他のデバイスでは他の方法で選択されるかもしれない。
    • image.png
    • https://youtu.be/D2cU_itNDAI?t=194
    • この色はユーザーが自分でカスタマイズもできる。マテリアルカラー12色から0から1000まで選べる。 これはリソースのpublic APIでありアプリの開発者が利用できる
  • Widget
    • Widgetでも上記のカラーパレットを使うことができる
    • RemoteViewウィジェットを構築する新しいAPI
  • Launch animation
    • デフォルトのスプラッシュ画面が用意された
    • AnimatedVectorDrawableが利用できる
    • ドキュメントはこちら → https://developer.android.com/about/versions/12/features/splash-screen
      • これまでのandroid:windowBackgroundを使い続けるにはAndroid 12用のalternative resourceを用意するらしい。
      • > If you already have a legacy splash screen implementation that uses attributes like android:windowBackground, consider providing an alternate resource file for Android 12.
  • Notification
    • Material NEXT用にデザインが変わった。デフォルトのテンプレートを普通に利用していれば問題ないがRemoteViewを使っている場合は多くの作業が必要になる。フルカスタムビューというやり方だとダメで、装飾された中のレイアウトでできるようにする必要がある。
    • ターゲットをS(Android 12)にすると、通知をタップしたときに数秒待たされる体験が、一度Broadcast Receiverを経由してActivityを起動している(これをトランポリンという)と起こっていて、これができなくなった。(これは知っていたが結構引っかかるアプリ多いはず)
  • トースト
    • トーストを送信しているアプリのアイコンが表示されるようになった。そのかわりテキストは短くする必要がある。1行や2行を超える場合、Notificationを使おう。
    • トーストがスタックしてずっと表示されることがあるので、トースト数に上限が設定された。
  • Picture in picture
    • PiPへの以降をスムーズにアプリと連携して行えるようになった
    • サイズ変更が行えるようになった
      • これに伴って、クロスフェードしてサイズ変更ができるようになった。
  • setRenderEffectでダイアログなどをブラー効果でぼかせる。
  • リップルエフェクトの変更
  • エッジ効果のアニメーションの変更。 (オーバースクロール スクロールして行き過ぎたときのアニメーション)
    • この変更はアプリの挙動に影響が出る可能性があるらしい。
  • AVIFという画像形式のサポート
    • JPEGよりめっちゃきれい
  • デバイスが対応していないフォーマット向けにメディアを自動的にトランスコードする機能が追加された image.png
    • ContentResolverAPIを使うと、対応しているフォーマットかそうでないフォーマットかが分かるようになった。
    • 詳細はAndroidMediaの動画にて。
  • Hapic Playback 音に合わせた触覚フィードバック。例えばゲームで足跡に合わせて振動させるとか。 すべてのデバイスで対応しているわけではなく、api isAvaliableで判定できる
  • Privacy
    • 近くのデバイスをスキャンしてペアリングしたいだけなのにBluetoothのスキャンのときに位置情報のパーミッションが必要だったが、必要なくなった。
    • ユーザーが正確な位置を提供しないことを選べるようになった
    • clipboardにアクセスするときにトーストが表示される。
    • foreground restriction
      • バックグラウンドからforeground serviceが起動できなくなっている。12以降でsetExpeditedを呼ぶ必要があるが、WorkManagerでバックポートできる。
  • これまではドラックアンドドロップ、コピーアンドペースト、キーボードステッカーが別々のAPIで実装しなくてはいけなかった。これをsetOnReceiveContentListenerだけで良くなった。AndroidXで利用できるが、制限があり、今はAppCompatEditTextでだけ利用できる
  • Macrobenchmark
    • スタートアップやスクロール向けのベンチマークがとれるライブラリ
  • Wear
    • Tile
    • 新しいAPIが追加されている

What's new in Google Play

SDKでクラッシュレポートが取得できるように。
aabでCode transparencyが使えるように。アプリのコードが元のバージョンから変更されていないことを確かめる https://firebase.google.com/docs/app-check
Billing library 4.0 結構アップデートしている
複数一気にIn app purchaseできるように
Multi-line subscription複数のsubscription
Prepaid plans

What’s new in Jetpack☆

  • JetpackのBeta定義が変わった
    • 今まではBetaではAPIの変更はしなかったが、criticalな問題やコミュニティのフィードバックに対応するときにはAPIを変更する
  • androidx.annotation:annotation-experimentalが作られた。これによって、@OptInアノテーションを付けないと使えないアルファクオリティのAPIが追加される。
    • JavaにもLintで同じ機能が追加される
  • CameraX
    • 露出補正など
    • cameraの状態のもっと詳細な情報にアクセスできる
    • など
    • 最新のOSの機能 (HDR Previewなど)
    • パフォーマンス (captureが15%速くなったり、initializationが25%速くなったり。)
  • AppSearch
  • Security Crypto
    • Preferenceの暗号化
    • Stableに
    • 将来的にDataStoreとのインテグレーションが追加される
  • Hilt
    • 1.0 Stable
    • val viewModel by hiltNavGraphViewModels(R.id.nav_graph)で navigation graphのスコープのViewModelが利用できる
  • WorkManager
    • Multiprocess request (パフォーマンスの恩恵がある)
    • 2.7からAndroid Sのforeground restrictionに対応。
    • WorkManager InspectorがAndroid Studioで利用できるように
      • chainなどかなり詳しい情報が見られる
  • Room
    • Kotlin Symbol ProcessingをExperimental support。 kaptの200%速い
    • enumサポート
    • RxJava3のサポート
    • DBがビルドするときにtype converterをチェックできるようになった
  • ConstraintLayout
    • 2.0 Stable
    • MotionLayoutもStableに
      • Studio motion editorが使える
      • 詳細はdevelopment tools
  • Fragment
    • 内部のリファクタ
    • アップデートには注意が必要
    • 警戒するべき特定のケースがリリースノートに書かれている
    • ActivityResultsとの連携
    • FragmentOnAttachListenerが作られ、 FragmentActivityのonAttachFragment()がdeprecatedに
  • Navigation
    • bottom navigation barのようなケースのためのmultiple back stacks
  • Google Shortcuts library
    • Google AssistantなどのGoogleとの連携を行いたい開発者向けにAssistantと他のGoogle servicesにShortcutInfoクラスを提供することができる。
    • 15個のショートカットまで送れて、Google Assistantなどのサービスで表示される
  • EmojiCompat 2
    • 動的に最新の絵文字を読み込める
  • Paging
    • Kotlinによるrewrite
    • first class support for coroutines and flow(RxJAvaやGuava primitiveもサポート)
  • MacroBenchmark
    • アプリの起動やスクロールといった統合した動作を見ることができる
    • CIで動かせる
    • Android Studioで動かして動作も見られる
    • "Measuring Jank and Startup with Macrobenchmark"で見られる
  • Compose
    • "Using Jetpack Libraries and Compose"でNavigation、ConstraintLayoutなどとComposeがどう動作するのかが分かる
  • foldables, large-screen devices, and Wear devices.についてもアップデートがあった。
    • "What's New in Foldables"で紹介

Using Jetpack libraries in Compose☆

Jetpack Composeのいちばん重要な部分はすべて書き直すことではなく、既存のアプリで徐々に導入できるということ。そのため、ビジネスレイヤやデータレイヤはそのままComposeのUIで利用できる。
Bloomというアプリで説明していく。
image.png
By https://youtu.be/0z_dwBGQQWQ?t=47

BloomのViewModelには2つの役割がある。

  • 1つはUIに公開される状態とその状態が生成される方法を分離する。
  • 2つ目はconfigration change後に生き残って最新のデータを返すこと。

viewModel()関数を使うとViewModelOwner、例えばFragmentにComposeを置いていたらFragmentのスコープを利用する。
image.png
by https://youtu.be/0z_dwBGQQWQ?t=187

Composeでは状態を保持しないコンポーザブルを優先することをおすすめする。

  • (State hoistingこのあたりはComposeのドキュメントを読むとかなり書いてあるので飛ばします。)

Stateの管理方法で興味深い方法があったので紹介。
タップしたら関連する植物を表示できるようなロジックが必要なComposeableがある場合にComposableにロジックが書かれるがどうするか?
image.png
by https://youtu.be/0z_dwBGQQWQ?t=354

以下のようにカプセル化する。

image.png
image.png
image.png
by https://youtu.be/0z_dwBGQQWQ?t=437

なぜViewModelに含めるのではなく、CollectionsCarouselStateでユーザー操作を示すイベントを保持するのか?
ViewModelがActiivtyやFragment、またはナビゲーショングラフのdestinationのいずれかにスコープされるため、ViewModelは一つのインスタンスだけ取得できる。そのため、画面のルートに近いComposable関数でViewModelを保持し、そうでないカルーセルのような場合はViewModelを使用せず、代わりに状態をもつクラスを作る。
image.png
by https://youtu.be/0z_dwBGQQWQ?t=474

そのスコープでViewModelが一つだけ取得できるとすると、複数の画面があるアプリでActivityで一度だけsetContentして作られる場合は適切ではないのか??

実際Composeに移行しようとすると以下の手順になる。

  • Fragmentを使った遷移 (FragmentとXMLを利用する)
  • Fragmentを使った遷移 (Compose codeを使った遷移)
  • Navigation Composeを使った遷移

複数の画面があったときにFragmentの場合はそのFragmentでViewModelを保持すればよいが、Navigation composeを使った場合はどうなるか?
ここで hiltNavGraphViewModel()を使う。ディスティネーションはActivityやFragmentではないので、デフォルトのHiltのFactoryがないが、hiltNavGraphViewModel()を使うと適切なFactoryが設定される。複数の画面でもこれをすると必要な場合にのみ状態が作成され、バックスタックから取り出した場合のみ削除される。

image.png
by https://youtu.be/0z_dwBGQQWQ?t=848

もし、植物の詳細が見られる DetailScreenの場合はどうなるか?
植物を特定するidをNavigation ComposeのnavArgumentで渡しておいて、
image.png
by https://youtu.be/0z_dwBGQQWQ?t=938

savedStateHandleからsavedStateHandle.get(key)で受け取る。
image.png
by https://youtu.be/0z_dwBGQQWQ?t=1007

呼ぶ側はこうする。

image.png
by https://youtu.be/0z_dwBGQQWQ?t=1052

What's new in Jetpack Compose

(基本的な話が多かったので流し見。基本を抑えたい人にはすごく良さそう)
MotionLayoutをComposeに入れようとしている。

Happy composing

What’s new in Android development tools☆

Android Studio 4.1

  • Live Database Inspector
  • TensorFlow Liteのモデルのimport機能
  • ネイティブC++のメモリプロファイラ

Android Studio 4.2

  • Android Gradle Plugin update assistantでAGPをアップデートできるように
  • Safe Argsのサポート
  • Apply changesのバックエンド機能の見直し

Android Studio Arctic Fox 2020.3.1

  • バージョンの付け方の見直し
    • 2020 = IntelliJ Versionの年
    • 3 = IntelliJ Versionのメジャーバージョン
    • 1 = Android Studioのメジャーバージョン
    • IntelliJのバージョンとの違いは最後の番号がAndroid Studioのメジャーバージョンを示す。
    • 数字のバージョン管理はわかりにくいこともあるので、コードネームを割り当てている。

Android Gradle Plugin :7.0.0

  • バージョンの付け方の見直し
    • Gradleのバージョンと紐付けた。
    • GradleのバージョンとAndroid Studioのバージョンが切り離されたので、ビルドの出力に影響を与えずにCanaryのAndroid Studioを使ったりできるようになった。

Jetpack Compose関連

  • Jetpack Composeのライブリテラルで文字などの変更がリアルタイムにプレビューに設定される。
  • ライトテーマやダークテーマの確認がPreviewでかんたんにできる。
  • プレビューの左の歯車からかんたんに設定を変更できる。 image.png by https://youtu.be/WRNWzhrl6-s?t=242
  • ComposeのConstraintLayoutを使っているときにLayoutBlueprintにすると制約が見られる image.png by https://youtu.be/WRNWzhrl6-s?t=272

AnimatedVectorDrawableがAndroid Studioでプレビューできるようになった。

(Composeのプレビュー系の機能紹介。自分が知っているものは飛ばしているので動画確認してください。)

  • アニメーションのPreviewが表示でき、速度を落としてアニメーションを再生できる。
    image.png
    by https://youtu.be/WRNWzhrl6-s?t=328

    • レイアウトxmlをlayout-sw600dpなど別のものに切り替えるボタンができた。
    • エミュレーターでフォルダブルのヒンジの折り曲げるのを見られるようになった。
    • WearOS
      • スマホエミュレーターとWear OSのエミュレーターを立ち上げて、ペアリングできる
      • image.png
      • by https://youtu.be/WRNWzhrl6-s?t=497
      • Wear OSのemulatorの設定から心拍数などを変えられるようになった
    • Andrroid TV
      • Google TVの体験が組み込まれたシステムイメージがダウンロードできるようになった
      • ユーザープロフィールや設定などリモコン機能などを備えたパネルが使える
  • Android Device Managerが新UIで実機とemulatorのデバイスをコンパクトでより良く管理できるように

  • USBバススルー USB 経由で Andrid Auto エミュレータに直接携帯端末を接続できる

  • Test Retension

    • emulator上でのテストで問題が発生した時点のスナップショットが取れる
  • WorkManager Inspector

    • (他のセッションでも見たので省略)**
  • Migrate to Non-Transitive R Classes...

    • Rクラスが複数のモジュールにまたがって存在するとビルド速度が低下するので、それをリファクタリングする提案をしてくれる

What's new in Android Gradle Plugin☆

  • configuration caching
    • configuration フェーズをキャッシュすると、結果的にそのフェーズはほぼすべて消える。
    • 同じビルドコマンドを呼び出すたびにタスクグラフを再計算せず、Gradleのタスクツリーをシリアル化、逆シリアル化して再利用する。
    • このおかげでAGPのビルド時間が改善された
    • タスクツリーを逆シリアル化するとタスクを並列実行しやすくなる
    • image.png
    • by https://youtu.be/AZBW5StgF8o?t=39
    • "Please try it as soon as possible"
    • すべてのプラグインにconfiguration cachingと互換性があるかを確認する。
  • Non-Transitive RとLintに対応した (Rクラスが複数のモジュールにまたがって存在するとビルド速度が低下する)
    • 利用しているリソースとその使われている元がわかりやすくなって、大規模プロジェクトでビルドパフォーマンスが改善する。
    • Android Studio Previewでこのリファクタリングがサポートされた。 (Migrate to Non-Transitive R Classes...参照)
  • Lintがキャッシュされるように
  • Android Gradle Pluginのドキュメントが利用可能に
  • Variant API
    • まず GradleのProvider/Propertyへの理解が必要 (そのために一昨年のを少しだけ見ます https://www.youtube.com/watch?v=AZBW5StgF8o )
      • Androidのビルドのタスクに誰でもアクセスできるようになっていると、Androidのチームが動きを変えようとしても変えられなくなってしまう。
      • "Gradleではアーティファクト間の違いを議論するのではなく アーティファクトそのものを議論する"
      • Provider<T>
        • get()とかが生えている
        • Tの値を提供する
        • Gradle 4.0より
      • Property<T>
        • Providerでもあるが、 (implements Provider<T>)
        • set()が使える
        • Gradle 4.3より
      • Gradleが上記ProviderやPropertyをabstract classで宣言しておくと勝手にサブクラス化してくれて、リンクだけやれば良いので便利になる。
      • ↓ これまでのGradleの書き方
      • image.png
      • by https://youtu.be/OTANozHzgPc?t=328
      • 使う側がプラグインAがあって、プラグインBがあって、依存関係を正確に反映させる必要があった。
      • ↓ これからのGradleの書き方
      • image.png
      • by https://youtu.be/OTANozHzgPc?t=347
      • それをProvider/Propertyを使えばタスクをインスタンス化せずに、タスクの依存関係を作ることができる
      • これをするとタスクをインスタンス化を直接せずにLazyに依存関係ができる。
    • GradleのProvider/Propertyへの理解ができたところで続き、Varinat APIのPropertyとして例えばapplicationIdが利用できるようになった。これを使って以下のように、applicationIdを提供するタスクを書くことができる
    • image.png
    • by https://youtu.be/AZBW5StgF8o?t=401
  • androidブロックには静的な構成を書き、androidComponentsブロックには動的構成を書く
  • image.png
  • by https://youtu.be/AZBW5StgF8o?t=431
    • 左に書いてあるような順番で動きbeforeVariantsで特定のvariantを無効にしたりできる。
  • これを利用することでMerged Manifestやdexファイルなどの中間ファイルにアクセスできるようになる
    • AGP自体もこれを使う
  • Legacy Transform APIは柔軟性に優れていたが、複雑だった
    • そこでAGP 4.2にはバイトコード変換専用の新しいAPIがある。

Measuring Jank and Startup with Macrobenchmark | Session☆

問題点

  • Analyticsからのフィードバックはすぐには得られない (ユーザーがある程度増えてから集計されるのを待たないといけない)
  • アプリのパフォーマンスのテストは難しい。
    • 迅速なフィードバックをするツール、ベンチマークが必要
      • それがベンチマーク
    • Android Jetpack Benchmarkはマイクロベンチマークなので、スタートアップの時間などは測れない
    • 安定したベンチマークを取るのが難しい

これに対して、Jetpack microbenchmarkでは以下のアプローチで解決をはかる。

  • リアルデバイスのパフォーマンスを測る
  • スタートアップとスクロールを測定(今後追加予定)
  • 正しく測定できているかどうかはっきりしない部分をパラメータとして設定できる (さまざまな種類のスタートアップやアプリのコンパイルモードなど)

image.png
by https://youtu.be/0adLO2VRJtc?t=332

どのように書くか

  • JUnitのルールを使う
  • StartupTimingMetricとFrameTimingMetricが使える
  • Androidではアプリを初めて起動するときにアプリが全くコンパイルされていないことも部分的にされていることも、完全にコンパイルされていることもある。のでそれをCompilationModeで指定する
  • startModeでCOLDスタートかWarmかHotかを指定する。Coldはプロセス開始から、WarmはonStartから、HotはonResumeから。
  • 繰り返し回数を指定する。多いと正確に、少ないと高速になる。

どのように動作するか?

  • プロセスを終了
  • リクエストした方法でコンパイル
  • systraceを使う
  • テストを走らせる
  • systraceが終わったらそれを解析する
  • 終わったものを複数の方法で出力できる
    • jsonファイル
    • Traceファイル
    • Studio sumnmary
      • image.png
      • by https://youtu.be/0adLO2VRJtc?t=428
      • ここから直接Android Studioのprofilerに飛べる
        • トレースがわかりにくい時はトレースポイントを追加しよう。
        • image.png
        • by https://youtu.be/0adLO2VRJtc?t=517
        • デコードが遅いファイルが一個だけあったのを発見して、ここではファイル名が書かれている
        • このファイルの直せば良いということが分かる。

独自のトレースポイントを追加する方法

  • androidx.tracingライブラリを使って trace("name") {...}でトレースできる。
    • ラップするだけでどんな時間でも測れる。
    • カウンタなどの便利なツールもある

What's new in Android testing tools☆

Android StudioとGradleでテスト実行の仕組みが違ったので、サーバーでだけ失敗したりしていた。Android StudioからGradleの仕組みを利用するようになった。
* Canary versionでここが有効になっていることを確認すること
* image.png
* by https://youtu.be/juEkViDyzF8?list=RDCMUCVHFbqXqoYvEWM1Ddxl0QDg&t=124

Unified Test Platform (UTP)

  • 旧称 Nitrogen

  • OSやビルドツールチェーンとは別のモジュール方式で、テストの改善や機能の追加ができるようになった。

image.png
by https://youtu.be/juEkViDyzF8?list=RDCMUCVHFbqXqoYvEWM1Ddxl0QDg&t=200

  • Unified Test Platform(UTP)を使って行っていること

テスト失敗時のエミュレータースナップショットが撮れるようになった

Android Studio外で実行されたテストをAndorid Studioで再現するには、test-result.pbのprotobufファイルをRun > Import Tests from Fileでインポートできる

What's new in Android Media☆

VideoQuality

問題点

  • ユーザーが動画を投稿するときに動画のクオリティが下がる。
    • メディアパイプラインは以下のようにたくさんの工程を経るため。
    • image.png
    • by https://youtu.be/pX00lybwwIk?t=93
    • 黄色の部分は品質に影響が出る可能性がある。
    • ベストプラクティス
    • New compression format
    • visual qualityを上げる良い方法
    • Android 11ではロイヤリティフリーの動画コーデックであるAV1のサポートを導入
    • Android 12ではAVIFをサポート
      • AVIDはAV1コーデックをベースとした新しい画像形式
      • JPEGの1/3のサイズで同等の品質。
      • 今後数年間で急速に採用が進むはず。長期的に最適なコーデックになる
    • おすすめのコーデックはHEVC
      • 利用できるハードウェアはまだ限られているが
      • 品質にすぐれ、ファイルサイズが改善される
      • 動画によるがAVCの半分で同じ品質を保てる
      • Androidではかなり前からHEVCがサポートされている
      • 高価格帯デバイスで広くサポートされている
      • Android 12ではHEVCをデフォルトのキャプチャフォーマットにするOEMが増えた。
        • そのためアプリでHEVCを取り込めるようにすることが重要
        • ただ、間に合わないアプリもあると思われるので、AVC形式にトランスコーディングする機能が追加になった。
    • AVC形式へのトランスコーディング
      • 瞬時には行われないことを注意する
      • 利用する場合はテストして遅延増加に対応する。(メインスレッドでやっているとANRが起こる場合もある)
      • image.png
      • by https://youtu.be/pX00lybwwIk?t=294
      • 対応しない形式をmedia capabilitiesファイルで宣言するだけ。Android StudioのLintで自動生成できる。

Performance Class API

  • 総合的なデバイスのパフォーマンスを判断できる

ExoPlayer

  • ExoPlayer 2.12
    • 今まではMediaSourceを経由して、MediaItemを追加していた
      • それがMediaPlayerに直接追加できるようになった。
      • Playerが再生中でもできる。
      • MediaItemにAdTagUriを追加して収益化もできる
    • 新しいUIコンポーネント
      • アニメーション
      • 字幕、音声トラックの変更
      • 再生スピードの変更
      • などができるようになった
  • ExoPlayer 2.13
    • Transformer API
      • MediaStreamを受け取り、変更を適応して、出力する
      • 現在利用できるトランスフォーメーション
        • コンテナフォーマット間でのTransmuxing
        • trackの削除
        • など
    • 低遅延ライブストリーミングプロトコルのサポート
      • Low-Latency DASHと AppleのLow-Latency HLS拡張
      • 何もしなくても有効になる
      • 細かい微調整をするには setLiveMaxOffsetMs()を呼ぶ。

Real-time Audio

  • 変更を行い、オーディオ遅延を減らしている
  • 4年間で 109ms -> 39ms (トップ20端末)
  • リアルタイムオーディオが必要なアプリでOboeというライブラリが推奨になった。
    • API 16と下位互換性がある
    • Mavenで配布できるようになった

Effective background tasks on Android☆

Foreground Serviceの問題点

  • Foreground Service notificationが一日に200〜500を超える数が送られていた
  • そのほぼ半分がバックグラウンドから開始されている
    • ユーザーがアプリがアクティブになることを予期していないときになっている
    • 70%のForeground Serviceが10秒以内に終わる
    • ほとんどが2分以内

上記のデータをAndroid 12に盛り込んで解決策を考えた

  • バックグラウンドからフォアグラウンドサービスを開始できる状況を制限
    • Target API 31以上
  • 正当なユースケースがある事もわかっているので、緊急(urgent)のタスクの信頼性を高めるAPIも提供
  • 状況によって、ForegroundServiceの通知の表示を10秒間遅延させる
    • それまでに終了した場合は通知されない
    • サービスが続いていれば、表示される
    • この動作はアプリの設定で上書きでき、遅延させることもすぐに表示させることもできる
  • できるだけ早く実行できる必要がある短いバックグラウンドタスクのために優先ジョブ(Expedited job)の導入

    • フォアグラウンドでもバックスタックからでも呼び出せてすぐに実行できる
    • OSはすぐに実行するためにベストを尽くす
    • ジョブに割り当てる最大継続時間を数分に抑える
    • DozeモードやBattery Saverモードでも実行できる
    • スタンバイバケットの対象になる。つまり、使用頻度の低いアプリではジョブを実行する機会が少なくなる。
    • WorkManager 2.7から利用できる
  • いつForegroundServiceを開始できるのか?

    • アプリが表示されているとき
    • ユーザーからのインタクラクションのとき
      • 通知のタップ、ウィジェットのタップなど
    • 特定のシステムブロードキャストとコールバックは除外
      • BOOT_COMPLETED, MY_PACKAGE_REPLACE
      • ジオフェンス、High priority FCMメッセージ
  • ユーザーがUIから起動するものはForeground Service

    • その他のバックグラウンドサービスはWorkManager
      • 急を要し、数分もかからない作業の場合は、おそらく優先ジョブが正しい選択
      • その他は非優先ジョブ
    • プッシュ通知ではFCMが推奨
      • 優先度の高いFCMを使用するとDozeでも受け取れる
      • メッセージングアプリの場合は可能な限りFCMのペイロードにメッセージを入れることで、ネットワークを使うことを避けてバッテリーを節約できる
        • ペイロードが適さない場合は優先ジョブが使える

State of Kotlin on Android

--Kotlinの勢いについて--

Kotlin on Androidをサポートすると発表してから4年

  • トップ1000のアプリで80%が利用している。
    • 60%のアプリエンジニアが使っている Android Basics in Kotlin Courseで数千人が学んだ Googleの70を超えるアプリでKotlinが利用されている。 Googleの中でもAndroidとサーバーアプリがKotlinで書かれて、Googleのモノレポでもかなりコードが増えている。 Googleの100チーム以上がKotlnを使っている。

なぜ人々がKotlinが好きなのか

  • Expressiveness
    • property, extension methods
  • Safety
    • nullability, string template
  • Interoperability
    • 既存のコードとの互換性
  • Structured concurrency
    • Coroutines

Google内部での調査によるとKotlinに移行したアプリは10%のクラッシュを経験するユーザーが減った。
Kotlin GDEが50人いて知識をシェアしたりしている。

--ツールのアップデートについて--

Gradle Kotlin DSL
* Android DeveloperでKotlin DSLでも確認できるようになった。

KAPTのincremental supportが改善
Kotlin Gradle pluginでconfiguration cachingがサポート

Kotlin Symbol Processing

  • 最近アルファに
  • KSPのゴールはKotlin ecosystemでfirst-classな機能にすること
  • Javaのstubの生成をkaptに対しては行わず、ビルド時間を削減する
  • Kotliin compilerと連携
  • すべてのKotlin symbolにアクセスできる
  • incrementalとmulti-run processingが可能
  • multiplatformに対応する
  • Jetpack RoomライブラリはbetaでKSP supportを行った。
    • kaptの2倍速くなった
  • 既存のAnnotation ProcessorのKSPの対応状況を確認できる

IDEのパフォーマンスの改善

  • Kotlin 1.5では、本物の大きいプロジェクトでのたくさんのパフォーマンスの問題を解消。

GoogleとJetBrainsでCompilerを書き直して、これらの体験を良くした。

  • Kotlin Compilerのパイプライン
  • frontendはコードの正確性
  • backendはコード生成について見ていく

image.png
by https://youtu.be/etLUpHvhNZw?t=274

  • Kotlin IRバックエンドに書き直した。 Kotlin 1.5でリリースされた。
  • Kotlin IRバックエンドとともに豊富なCompiler pluginが追加された。
    • Jetpack Composeの言語の拡張で利用された
    • 新しいバックエンドができることでフロントエンドのコードがJVM, JS, Native間で統合したフロントエンドを提供できるようになる。統合フロントエンドを今年後半の提供を目指している。

--ライブラリとAPI--

AndroidKTX
- 最初は1ライブラリだったが数十のライブラリに成長

Kotlin-first library

  • PagingやDataStoreでKotlinのcoroutinesやflowが利用できると同時にJavaからも利用できる

Kotlin-only library

  • Jetpack Compose
  • Kotlin Compiler Pluginを中心に構築されているのでKotinで記述する必要がある。

Jetpack以外でもMapやPlaces、Firebase、PlayCoreなどのSDKのextensionのリリースが行われ、Kotlinの開発が安全かつシームレスになっている。

Androdだけでなく、サーバーサイドのエンジニアリングチームも、Kotlin gRPCのライブラリがオープンソース化されたり、最近protobuf用のKotlinバインディングをリリースし、Kotlin DSLを提供している。

Structured concurrency

去年AndroidでKotlinを使用する場合の非同期処理の手段としてKotlin Coroutinesを正式に推奨することを発表した。
StateFlowやSharedFlowの追加に伴って、トレーニング資料や将来のAPIに取り入れる方法を検討している。
(最近出たこれかな?)
https://medium.com/androiddevelopers/migrating-from-livedata-to-kotlins-flow-379292f419fb

これに伴ってLiveDataが非推奨になるか?という質問がある。
LiveDataはJavaのユーザーのためにそのまま残る。
KotlinではStateFlowは同じ機能を提供し、オペレーターでsuspend functionが使える。
DataBindingでも最新のAndroid StudioでStateFlowが使えるようになった。
launchWhenStartedではUIがアクティブでないときに潜在的なリソースの浪費を招く可能性がある。安全に監視できるように新しい関数セットの追加に取り組んでいる。 (動画が撮られるのが早かったのか、おそらくrepeatOnLifecycle()のこと)

Coroutines DebuggerがIntelliJ IDEAからAndroid Studioに導入された。
将来のAndroid Studioで導入予定。
アクティブなディスパッチャとコルーチンに関する詳細を確認できる。
実行中や一時停止といったステータスをUIで確認したり、すべての情報をファイルにダンプしたりできる。
image.png

お知らせ: Kotlin Android ExtensionのViewのbindingが非推奨になったので、ViewBindingを使おう

--Modern language features--

Javaも改善されていっている。
それをAndroid開発で取り入れる取り組みを進めている。

  • desugaring
  • Android 12以降ではARTと言われるAndroid Runtimeがアップデート可能なメインラインモジュールになる。 つまりオペレーティングシステムのアップデートを待たなくてもサポート対象の言語機能をアップデートできるようになる。将来のAndroidデバイスに新しいAPIを直接追加することも可能になる。(現時点では開発者がなにかやることはない。今後の発表をお待ちを)

What's new in the Design tool☆

Layout Editor

  • 注目の機能としてはAccessibilityのチェックがリアルタイムに行われるようになった。 (Android Studio Arctic Fox | 2020.3.1)

Layout Validation

  • パフォーマンス改善
  • ロケールのサポートで、編集中の画面で言語の表示を確認できる。
  • Wear deviceやタブレット向けに新しいプリセットも追加

Layout Inspector

  • パフォーマンス、安定性向上
  • Jetpack Composeのサポート
    • 渡されたパラメーターを確認してアプリで何が起こっているのかを確認できる
  • Animated Vector Drawableのプレビューができるようになった。

ConstraintLayout & MotionLayout

  • ConstraintLayout 2.0

    • VirtualLayoutとFlowで複雑な画面が作れる
    • MotonLayoutの追加
      • 複数のViewのアニメーションをかんたんに調整できる
      • Motion TagというYouTubeの動画でMotionLayoutが提供する強力な機能が網羅されてる
      • MAD Skills with MotionLayout
        • 具体的な使い方を集めた動画
      • Companion Motion Editorでアニメーションをグラフィカルに作成できるエディタ
    • ConstraintLayout 2.1
    • Baseline constraintの指定方法やマイナスのmargin指定などの新しい機能の追加
    • 画面の作成に役立つヘルパーオブジェクトの追加

      • Carousel
        • VirtualLayout。 非常に複雑な外観を持つインパクトが大きい美しいアニメーションをリストを使ってかんたんに作成できる
        • image.png
        • by https://youtu.be/B1u7JZ1rLyE?t=234
      • Rotation Support
        • 回転するアニメーションパスや回転するジェスチャ
      • Motion Effect

      • MotionLabel

      • Foldableサポート

        • ReactiveGuide helperが折りたたみの位置をInjectする。
        • ReactiveGuideはWindowManagerライブラリから値を受け取って位置を調整する
        • それを使って、アニメーションすることができる
    • ConstraintLayout in Compose

    • 全機能がComposeで使える

      • 同じエンジンで動く
      • プレビューでは制約を表示できる
    • ConstraintSetを抜き出すことができる。

    • この制約はJSON形式でも指定できるので、とてもおもしろい応用範囲が広がる

      • (これはサーバーからレイアウトを返してA/Bとかもできちゃうのでは?)
    • MotionLayout Light

    • ComposeでMotionLayoutができるもの

    • まだ完全なMotionLayoutではないが完成を目指している

    • 複数のConstraintSetの間をジェスチャーで動かすことができる

    • ComposeのPreview

    • (知っているので割と飛ばします)

    • 歯車マークから切り替えができる

    • Live Literals

    • @PreviewParameterでパラメーターを入れられる

    • Interactive preview

      • アニメーションなどを確認できる
    • Deploy to device

      • デバイスにデプロイできる
    • Animation Preview

Developer Tools and Languages | Q&A

長い動画で全部書くと大変なので、要約っぽいところだけ書きます。あとよく理解できなかったものを外しています :bow:

KAPTとKSPの将来は?置き換えるのか?それともKAPTがまだ使える場面があるのか?

KSPのほうがビルド時間短くてKotlin MPPにも対応できて良いのでいいんだけど、コミュニティ次第。推奨するが、alphaなのもあり現在KSPに移行するには投資が必要になる。JavaのAnnotation ProcessorだとkaptでKotlinに対応するのが何もしなくても良い。Roomのksp対応は良いサンプルになる。

Android Studioのbetaがでるのが早かったけど、フローが変わったのか、なにかComposeとかと関係があるのか?

Canary 15あったので、そうでもないかも。

どのように新しいR8の最適化の実装を見つけるか?

大きいオープンソースプロジェクトやGoogleのアプリにアクセスして、outputを解析する。例えば文字列プールを見て、取り除くことができるか見る。
もう一つはバグトラッカーに来るfeature request。

Mac M1対応

すでにpreviewがあるけど、emulatorなど大変な作業なので、まだステーブルではない。

wireless adb in linux

サポートしていれば、すべてのプラットフォームで動くようにするが、すべてのプラットフォームで動かずには裏で動いているmdnsはトリッキー。サポートするようにする。

prefabのパッケージエコシステム周りの改善はある?

Prefabとは、Android NDKを使ったネイティブコードを活用するアプリケーション開発の世界で新しく登場した、C/C++などのコードのビルドでサポートされるパッケージ解決のための仕組みです。Android Studio 4.0がリリースされた時にアナウンスされた新機能のひとつです。
https://atsushieno.hatenablog.com/entry/2020/12/18/002931#Prefab%E3%81%A8%E3%81%AF

改善されているはずだが、release noteに書いてあるはず。 Googleのライブラリもすでに使っている。

AGPのコードはどこにある?

Google maven repositoryにsourceも一緒に上がっているはず。
ブランチを追いたい場合は今はstudio-mainになっている。mirrorブランチもある。

ARTがmainlineモジュールになったけど(OSのアップデートなしでAndroidの実行環境がアップデートできるようになったけど)、sugaringしなくてもあたらしいAPIが使えるようになるか?

なる。が時間がかかる。

Android StudioがデフォルトでKTSのGradleファイルを使わないのはなぜ?

まだ少しパフォーマンスペナルティがあるため。GradleとJetBrainsチームとこの問題に取り組んでいる。6.8で改善されたが、 もっとgroovyに近い時間でできるのを待っている。

"サブモジュールを1つのaarとして出力する"問題が5年間解決されていないのはなぜ?

AGPプラグインで一番voteされている。
依存関係のマージする必要がある。できるようにしたいとは思っている。

Jetbrains Code With MeはASに来る?

使えると思うけど、Jetbrainsがどのバージョンに載せるか次第。

Jetpack ComposeのStableリリースを最初にサポートするバージョンはArctic Fox?それとも4.2.xでも使える?

Arctic Foxでサポートを残すことにきめたArctic FoxだとPrevewが使える、4.2だと必要とするものに足りていないと思う。

あたらしいIntelliJ IDEAがAndroid Studioに統合されるのがいつか?

Android Studioを一年に4回リリースを試している。これはIntelliJと一緒。IntelliJのバージョンからはるかに遅れるようなことはしたくない。
しかし安定版のリリース2週間前にIntelliJのマージをすると壊れやすいので、最初のCanary versionでマージするようにしている。

aabファイルの中にmappingファイルが入っているのを見つけたけど、これは防げないの?

ユーザーに配布されるものではないので、悪いことではない。クラッシュレポートに役立つ。ちょっとあとで確認してみるね

カスタムリントをかんたんに書く方法を計画していませんか? 大きなコードベースでもっと速くLintが走るようになりませんか?

80ページのドキュメントを最近作った。
Gradle 7.0からモジュールごとに結果が解析され、モジュールごとに結果が保存され、キャッシュされる。

177
121
1

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
177
121