[WIP]Google I/O 2024で驚いたところメモ

特に驚いたところを<font color="DeepPink">赤く表示</font>しています。(ちょっと風邪引いてまとめるのがいつもより遅くなっています。 :pray:  )

# Keynote

(いつも通り夜ふかししながら書いているのでクオリティ低めです。)

https://www.youtube.com/watch?v=XEzRZ35urlk


* Gemini
AI Overview

Photos
ナンバープレートの番号を聞ける。

Geminiはcontextが長いのがいいらしい。
コードのコメントについてGeminiが返してくれるなどの開発者の話など。

1.5 Pro

1Mコンテキストで 35言語で使えるように。

<font color="DeepPink"><b>2Mトークン。 private previewが始まった。</b></font>

### NotebookLM

https://notebooklm.google/

pdfとかドキュメントとかを入れられる。


<font color="DeepPink"><b>靴の写真を撮ってそれで、購入したメールを探したりできる</b></font>

### AlphaFold 3

https://blog.google/technology/ai/google-deepmind-isomorphic-alphafold-3-ai-model/

### 1.5 Flash
速いっぽい？

### Project Astra
universal AI Agent
会話可能な速さに。

<font color="DeepPink"><b>動画を撮りながらそれを解説させたりするデモがあった。</b></font>

<font color="DeepPink"><b>新しいフォームファクターの話が一瞬写った？Vision Proみたいな視点の動画が流れた</b></font>

### Imagin3
画像生成。
文章を理解する能力が高い。
文字のレンダリングもうまくできる。
labs.google.com

### AI Music sandbox
YouTubeと AI Music sandboxというのを作った。

### Veo

動画生成。

<font color="DeepPink"><b>生成された動画の時間をexpand(延長)できる</b></font>

クリエイターとのコラボで試しているデモ。

path to AGIという発言。

## TPU
AIの電気消費が深刻
trilliumを作った
Axion ProsessorというCPUも作っている。

NVIDIA BlackwallというGPUも利用可能に。

## 検索

Google検索がたくさんGoogle検索して、AI Overviewを提供している。

検索で、プランニングしてくれる。3日のご飯っていれると3日間のご飯を提案してくれる。

AI organized search result page。色々検索でページだけでなくマップとか出す。

動画で検索できるように。
<font color="DeepPink"><b>現実で起きていることのトラブルシューティングなどができる。動画で、これ回らないみたいなんだけど。。みたいな感じで質問できる。</b></font>


## GeminiのSide panel
来月利用可能に
Google Meetなどで利用可能っぽい？


<font color="DeepPink"><b>今月に以下が利用可能に</b></font>
<font color="DeepPink"><b>ボタンがでてきて、Gmailの引用で長いスレッドを要約できる。</b></font>
GeminiによるGmailのreplyの自動生成。

Gmailからスプレッドシートででexpenceのサマリとかを作れる。


## AI teammate

<font color="DeepPink"><b>roleとobjectiveをもったteammateを作れる。(やばそう)</b></font>


サマリ作ってくれたりする。メモリも持ってくれる。
いろいろなものに即レスしてくれたりするかもしれない。

### Gemini Live
<font color="DeepPink"><b>AstraをGemini Appに 今年。</b></font>

### Gems
GPTsっぽいやつ？
今年

### Gemini Advanced
動画とpdfとかをたくさん載せてもContext Lengthが長いので処理できたりする。

AdvancedもContext Lengthが2Mに。

35+ language

## Android

AI at the core

* 囲って検索
* AIアシスタント

囲って検索が数学とかもできるうように、年末までに

### Android experience

GeminiをContext Aware。

YouTubeで見ているものに関してGeminiで質問できたりできる。
<font color="DeepPink"><b>AndroidアプリのGoogle DriveでみているpdfをGeminiに渡せたり。なにかアプリから渡せるAPIできるのかな？</b></font>

Gemini NanoがMulti modalに。
Talkbackが画像を解説してくれたりとか。

オンデバイスモデルで電話で詐欺っぽいのがかかってきたときに詐欺だよって出したりできる。

### Developer news

GeminiのAPIで以下が利用可能。
Video frame extraction。
Parallel function calling。
Content caching。

Gemini 1.5 Pro complexタスクに使う
Gemini 1.5 Flash 速いコスパが良い

両方今日使える。

#### Gemma

OSSのModel。自由に使える。

RecurrentGemma
CodeGemma

<font color="DeepPink"><b>画像を読み込めるPaliGemmaができた。</b></font>

Gemma2ができる 27B

#### SynthID
AIが作ったものを分かるように。
Open sourceに。

### LearnLM

GeminiをLearning向けにファインチューンしたもの。
Gemsの一つ。Learning coach。
Videoで質問したりできる。
<font color="DeepPink"><b>selected userでYouTubeで問題作ったりとか質問したりできるように</b></font>

# Developer Keynote

https://www.youtube.com/watch?v=ddcZnW1HKUY

世界中の開発者がAIを使えるようにするというミッションでやっている。
Android Studioなど色んなところで使える

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/6a2888c6-6d71-2d3c-380e-239eb04f3166.png)

https://youtu.be/ddcZnW1HKUY?t=104

## <font color="DeepPink"><b>Context Caching</b></font>
今月使えるようになる。

どう動くのか？
Context Windowはいいけど、計算量がかかる。
<font color="DeepPink"><b>例えばプロンプトの大部分が変わらない場合、それをキャッシュし、次のときに軽く取得できる。例えば記者が次の記事を書きたいときにこれまで書いた記事を集めたいとしたときに、最初に20centかかったとする。次のときのpromptでは10centで良くなる。これは法的文書化、研究文書などたくさんの用途がある。</b></font>

## Gemini API Competition

Gemini API Competitionが行われる。あのBack to the futureのelectric classic DeLoreanがもらえるらしい。

https://ai.google.dev/competition

## Android

Excellent experiencesとAI at the coreをかかげているっぽい。

Gemini nanoの話。ローカルで動く。またアプリにモデルを組み込む必要がない。

### MediaPipe

Gemini nanoではなくカスタムモデルを使う場合はこちらを使う。

### Developer Productivity

噂に聞いていた、Kotlinの発表
<font color="DeepPink"><b>First class tooling and library support for Kotlin multi-platform on Android</b></font>
<font color="DeepPink"><b>Google DocsアプリはKotlin Multiplatformにマイグレートして、Android, iOS, Webでロジックを共有している。</b></font>
Workspaceチームは他のGmail, Calender, Driveなどで投資を続ける。
https://youtu.be/ddcZnW1HKUY?t=1062

Composeでの最初のピクセルが描画されるまでの時間の改善。
ComposeでのSharedElementTransitionのサポート

<font color="DeepPink"><b>Material Guidanceを使ったアプリを作りやすくなるComponentを用意</b></font>

ListDetailPaneScaffold
SupportingPaneScaffold
NavigationSuiteScaffold

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/5ec55dae-d129-a2b8-b4d4-73a69fb32ace.png)
https://youtu.be/ddcZnW1HKUY?t=1232 より

ComposeでのStylusやMouse、Keyboardのサポートが増えて、<font color="DeepPink"><b>Handwriting recognitionにより、文字の認識により手書きの文字をテキストにすることができる。</b></font>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/f7dcc4d9-0491-c84f-d059-cdbdaa8bcfb0.png)
https://youtu.be/ddcZnW1HKUY?t=1254

Firebase device streamingにSamsungなどを追加に。

<font color="DeepPink"><b>Compose UI Check mode</b></font>
adaptiveなレイアウトになっていない問題やaccessibilityの問題を見つけてくれる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/7234b8a8-4542-faa8-9d3f-6659523f0f4d.png)
https://youtu.be/ddcZnW1HKUY?t=1317

SoundClouldの話、Composeでモバイルのスキルが使えるので、どのフォームファクターでもComposeが使えるのが良い的な。

### Android Studio

Geminiでクラッシュを解析して、解決策をしてくれる。

AIに何を共有するかを渡せるようになった。
https://youtu.be/ddcZnW1HKUY?t=1533

Android StudioのGeminiがリファクタリングができるように。右クリックでGemini -> transform "simplify and make idiomatic"で

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/3f83a4dc-1e2d-9772-f0fd-96c01afb08ac.png)

こういうDiffを出してくれる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/3b8dd8d1-94e7-0aef-6957-975ef06d7f73.png)

https://youtu.be/ddcZnW1HKUY?t=1594 より

この画面でさらにドキュメントを追加してもらうこととかもできる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/fab6bc43-e89a-69e4-dc9f-7017942a06aa.png)

デザイナーから渡された画像を使って画面を自動生成して作るデモ
<font color="DeepPink"><b>Gemini Pro 1.5になって、Context Sizeも増えることで、画像をGeminiに渡せるように。</b></font>

結構いい感じ。

デザイナーから渡された画像:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/1a28adc0-cde9-93fb-7d8f-f277eef9e55e.png)

出来上がったもの:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/069ef6a6-30cb-ba66-5063-e86babe85324.png)

https://youtu.be/ddcZnW1HKUY?t=1835 より

## Web
OnDevice AIがWebGPUとWASMで可能になる。

BilliBilliがWASMをつまってテキストをスピーカーの後ろに移動させたところ、かなりの数値の改善が見られた。
https://youtu.be/ddcZnW1HKUY?t=2001

<font color="DeepPink"><b>Chrome 126以降 Gemini NanoがChromeのデスクトップクライアントに組み込まれるようになる。</b></font>

"Help me write"という機能が追加になり、短い文章を生成してくれるようになった。


## Cross platform
Project IDXが Public betaに。
WebでできるIDEみたいな感じ。

### Flutter

WASM対応でJSのパフォーマンスが2倍になった話。

### Firebase
新しいアイコンに
<font color="DeepPink"><b>Firebase Data Connect with Google Cloud SQLのpreviewを公開。安全でタイプセーフなアプリをFirebaseで作成できる。コードを書く量を減らせるように設計されている。</b></font>
Data connectはAIの開発のために構築されている。vectorやfunction callingなどが使える。

Firebase App Hosting
GitHubからソースコードを取り出し、ビルドして、Google Cloudにデプロイするので速い。
Firebase Genkit
アプリ開発者向けのAI統合フレームワーク。 Genkitの引数を変えると簡単に、AIのモデルを変えられる。

### AI Models

OpenSourceのAI Model

CodeGemma
先月リリース
コード用

RecurrentGemma
先月リリース
ニューラルネットワークとローカルアテンションを使って、メモリ効率を向上させ推論を高速化するもの。

PaliGemma
マルチモーダル対応

Gemma2
new architectureだそう。

Google AI Edge
Generative modelを含むすべてのいいモデルへのアクセスを提供して、edgeでツールを走らせられるようにする。
<font color="DeepPink"><b>TensorFlow liteが拡張されPytorchのモデルが動かせるようになった。</b></font>

<font color="DeepPink"><b>デバイス上でRAGを走らせることができる。</b></font>
RAGの例として、家族が好きなものをメモとして書いて、それを利用して、モデルへのプロンプトを拡張して、もっと良い回答を得られるようにしたい場合MediaPipeでできる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/c37cc056-ce5a-b021-13bc-498c807f85bc.png)
https://youtu.be/ddcZnW1HKUY?t=3496 より


# What's new in Android

https://youtu.be/_yWxUp86TGg

## AI

Gemini nanoの話(端末上で動くGemini)
AICoreによってAndroid 14+に統合されていて、Google AI Edge SDKによってAPIが提供されているらしい。(ちょっと難しいけど、Google AI Edge SDKを使うと、端末のAICoreにアクセスできるということっぽい)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/ee3c3834-9c38-c6c6-8c9f-a74c94a6e88e.png)
https://youtu.be/_yWxUp86TGg?t=88 より

<font color="DeepPink"><b>Gemini nanoは現状Pixel 8 ProとGalaxy S24で利用可能。</b></font>
(Galaxy S24はメモリ8GBなので自分はメモリがハードウェア要件なのではと他のブログなどを見て勘ぐっていたのだけど違うみたいだった)

現状のユースケースは、
メッセージで、シェイクスピア風の文章を作ったり(いる？)、レコーダーでいろんなAIを組み合わせる一つとして使ったり、
Adobe Acrobatで要約したりして使っている。

Android on-device gen AI under the hoodの紹介
今年の後の方でnanoがマルチモーダル可能になってもっと良くなる。nanoのアーキテクチャについて知りたい人は見てみて。

Prototyping SDKsというくくりで以下の2つが話されていた
Google AI client SDKを使ってアプリに組み込める。
Vertex AI for Firebase SDK


Material3 adaptive librariesの話
adaptive
adaptive-layout
adaptive-navigationが利用可能に。
<font color="DeepPink"><b>例えばadaptive-navigationを使うと勝手にボトムバーが、ナビゲーションレールになる</b></font>

上でも紹介があったが、以下が追加された

ListDetailPaneScaffold
SupportingPaneScaffold
NavigationSuiteScaffold

<font color="DeepPink"><b>スクリーンでなくペイントして考えることが大事で、そうすることで、ユーザーがパネルのサイズを調整できるようにできる。この機能はMaterial3 Adaptiveに追加される。</b></font>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/d0774a2a-bd06-92fe-93e3-3a811dcfaed3.png)

https://youtu.be/_yWxUp86TGg?t=483 より

このあたりは `Building UI with the Material 3 adaptive library` のセッションと `Building adaptive Android apps` のセッションを見ると良いそう。

Target SDK 35(Android 15)にするときにedge to edgeがデフォルトになるという話。 enableEdgeToEdge()を呼んでおくと、バックポートしてくれたり、3ボタンのBottom Navigationなどもうまく管理できるようにできる。

Android 15ではシンプルなデフォルトを提供する。 <font color="DeepPink"><b>ステータスバー、ナビゲーションバーがデフォルトで透明化される。</b></font>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/d297fbe5-1b70-cea7-409a-ff10c935b37a.png)
https://youtu.be/_yWxUp86TGg?t=565 より

Material3のTopAppBarやNavigationBarを使うと自動でハンドリングできる。


Android 15では開発者オプションのpredictive backのオプションが消され、有効にしているアプリではユーザーに表示されるようになる。

### ウィジェットの話
ウィジェットの追加前にプレビューを表示できるようになった。
アプリからウィジェットを追加するように求めることができる。
Glance1.1でUnit Testのサポートなどが入っている。

Canonical widget layoutがリリース。ベストプラクティスに則ったWidgetのレイアウトが利用できて迅速に使い始められる。

`Build Android Widgets with Jetpack Glance`で詳細が聞ける。

### Media and camera

Android 15のカメラで画像を明るくできるLow light boost

CameraX 1.4 betaのUltraHDRなど

camera-viewfinder-composeでComposeでViewFinderを利用して、画面上にプレビューを表示できるのが 1.0-alphaでリリース。

Media3のパフォーマンス向上。新しいtransformerAPIを使って、ビデオのエンコードが5倍高速になったり、YouTube shortでは19%タイムアウトが削減されたりした。

### Performance

Battery: バッテリー消耗の原因は画面オフ中のものであることが分かった。APIを適切なものを選ぶ必要がある。

Perfettoを使うとAndroid 14以上で電力消費が見られる

詳細は`How to improve battery efficiency of background work on Android`

`Practical performance problem solving in Jetpack Compose`というコードラボで、実際的なパフォーマンスの問題解決について学べる。

簡単にパフォーマンスを改善する方法は、ベースラインプロファイルとdex reorderingを入れ、R8を入れることによって60%の改善が見込める。

Vulkanの話 ゲームを作る人向けの話なのでとばさせてください

### セキュリティとプライバシー

<font color="DeepPink"><b>Safer intent 悪意のあるアプリがintent filterの一致を悪用できないように改善。ただ、これは複雑なものになりそうなので、strict modeでテストできるようにしている。</b></font>

意図しないbackground activityの起動を減らすためにデフォルトでブロックするように。

mininumでインストールできるTarget SDKのバージョンが24より小さいとインストールできなくなる。(多分、RuntimePermission周りかな)

Photo picker (アプリが直接ユーザーデータにアクセスしないようにする。)。広い権限が必要な場合はそれが必要な理由を明示する必要があるようになった。

Play Integrity APIを使っているアプリは80% 未承認な利用がそうでないアプリに比べて少なくなっている。

`Safeguarding user security on Android`で詳細が聞ける。

### Credential Manager
ユーザーログインのためのシンプルな開発者サービスを提供する。sign-in with Googleやpasskeyやパスワードを1つのインターフェースに集約して、アプリでの複雑さを減らうことができ、安全で関連性の高いログインの方法を出す。ユーザーはいつでもログインの方法を選ぶことができる。
DASHLANE、TikTok, KAYAKなどでパスキーのサポートを開始し、Credential Managerに移行し、ユーザーにいい影響が出ている。KeyboardでもCredential Managerのオプションを表示するようになった。
運転免許証などのIDをdigital walletで保存できるようになり、それをアプリに共有できるようになった。
Wear OSもサポート。

### Wear OS 5 developer preview
新しいcomplication data type?というものが定義された。 (文脈的にWatch faceの表示タイプ的な感じなのかな？)
`Building for the future of WearOS` で詳細。

Running Metricsが追加。Ground Contact Timeなどで、いつ疲労するかなどが分かるようになったらしい。

Google FitのAPIから移行するためにRecording APIというのが導入し、歩数とかが測定でき雨量に。

### Health Connect
アプリにユーザーのデータを提供するために新しいパーミッションが増えたらしい。

### AndroidTV
Compose for TV 1.0.0-beta01
パフォーマンスと入力サポートを改善、あらゆる範囲の改善を追加。
TVマテリアルカタログアプリでコンポーネント、テーマやレイアウトを探索できる。
Android Studioのテンプレートも更新された。

AndroidTVへの改善
Video Discover API
Androidのフォームファクターをまたいだ再開を可能にする。Android TVのContinue Watching APIと後方互換性がある。

Round app icon
丸いアイコンが標準になった。TV app icon guidelineどおりに表示されていることを確認する。

Power reduction
MediaSessionとちゃんと連携して、power state changeに対応できるようにする。

`Everything you need to know about Google TV and the Android TV OS` で詳細。

### Android for cars
(Xで流れてきてある程度知っていた)

Car app quality tierを導入
car readyなアプリを作るためのガイドライン。

Android automotive OS向けの2つの新しいエミュレーター遠隔ディスプレイエミュレーターアプリが画面間をどのように移動するのかをテストできる(ちょっとよく分かっていない)。configurableエミュレーターを使うとさまざまなシステムバーの設定をエミュレート可能になり、車固有のカットアウトを表示可能になる。

<font color="DeepPink"><b>Androidオートモーティブを実行するPixelタブレット用のシステムイメージをリリース。</b></font> これにより物理デバイスでテストする手段が提供される。 (そこまでやるのか。)

### スタイラスによる手書き

ユーザーはテキストを入力するときにスタイラスを置く必要がなくなるようなアップデート。
Composeの場合は最近のアップデート(1.7)までアップデートする必要がある。Android TextViewなどではそのまま対応できる。
詳しくはここ
https://developer.android.com/develop/ui/views/touch-and-input/stylus-input/custom-text-editors

CanvasFrontBufferedRendererなどレイテンシーを下げるためにCanvasをレンダリングに使う新しいAPIが追加。

詳細は`Increase user productivity with large screens and accessories`

### Developer productivity - Compose

Compose compiler が Kotlin2.0からKotlinのリリースと共にリリースされるように。

Strong Skipping mode。(割と知っている話題)。パフォーマンスのデバッグをしたくなく、勝手に早くなって欲しいというのが理由。

#### Composeパフォーマンス

* Rippleの遅延生成を可能にするためにIndication APIを書き直した。カスタムIndicationがある場合はbreaking changeになる。がマイグレーションドキュメントを用意している
* Comnpose RuntimeにLow Levelな変更を加えた。preferenching APIの改善とslot tableの書き直し。もうそれはテーブルではなくなった。最初からテーブルではなかったという人もいますが (自分もコード読んでいて、使っている構造はIntArrayで中身はparentとかがある木みたいな構造でした)。外部には影響がないです。
* Modifier.animateItem()をつけるだけでmoveなどのアニメーションが簡単にできるように。
https://youtu.be/_yWxUp86TGg?t=2020
* Shared Element Transition。他の画面との要素を関連付けするために使われる。predictive back supportもしているので、バックのジェスチャーで戻るときもアニメーションして戻ったりできる。
* <font color="DeepPink"><b>ContextualFlowRowとColumnを使うと画面内に表示するもの以外はComposeしない。そしてコンポーズした数が出せるので、展開インジケータを作成できる。</b></font>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/c1e6f03f-be33-35f7-4452-4da21a25ae02.png)
https://youtu.be/_yWxUp86TGg?t=2068 より 。赤矢印追加しています。

* <font color="DeepPink"><b>Textがrich contentを受け取れるように。キーボードからGifを受け取ったりできる。</b></font>
* <font color="DeepPink"><b>linkとベーシックなHTMLをTextがサポート</b></font>
* Accessibility スキャナなどの関連機能のComposeサポート。

`Updates to Android accessibility features and APIs` で詳細。

### Kotlin Multiplatform

<font color="DeepPink"><b>Kotlin Multiplatformをサポート。</b></font> (support Kotlin Multiplatform on Androidみたいな微妙な言い方を他ではしていたんだけどここではシンプルに言っていて良かった)
今はビジネスロジックの共通化にフォーカスしている。

Android Studio, GeminiとAndroid Studio, そして DeveloperProductivityについては `What's new in Android development tools` で

Android 15 Beta2が明日リリース。 2日前の動画なので、2024/05/18かな。

# What's new in Android development tools

デバッグでラムダの中とかも簡単にbreakpoint貼れるようになるなど。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/0de5c8c7-ed34-eb27-f67f-222313744c76.png)


USB-CケーブルのUSB 3.0以降でないときに警告で遅くなるというのを教えてくれる。

<font color="DeepPink"><b>Device Stremingから繋いでいる端末の設定を変更できる</b></font>
resetもできる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/3f5621f2-2ce5-f411-03ec-219d0330800c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/270a8b84-7f8c-292c-7fa8-16b59a85c62f.png)

https://youtu.be/2wOfYgIMf-A?t=630 より
レイアウトインスペクタのsnapshotを使うと3Dでレイアウトが見れる。

ComposeのUIチェックにはPreviewのここから入れて、ボタンが小さいとかコントラストが足りないので文字が見にくいとかそういうのをチェック可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/1a95bcb6-cc8b-8100-68a3-b202197b425e.png)
https://youtu.be/2wOfYgIMf-A?t=687

このFind CPU Hotspotsを押すとプロセスを最初から開始して、call stackを見ることができるが、<font color="DeepPink"><b>ここから起動すると自動的にマニフェストにprofilableを入れて、アプリを起動できる。</b></font>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/febf1138-4993-5d94-7add-123a1dc49c35.png)
https://youtu.be/2wOfYgIMf-A?t=940 より

<font color="DeepPink"><b>LeakCanaryとの連携を開発中</b></font>


Geminiとの連携の話。基本的には右クリックしてGemini -> Transformで色々できるという話。

<font color="DeepPink"><b>Shift + F6で関数の中身を見て関数名をサジェストしてくれる。</b></font>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/b9cab4e7-ed6d-e0ac-22ab-2891b7b40130.png)
https://youtu.be/2wOfYgIMf-A?t=1503

また、関数内の変数を全部考え直すことが可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/4ae78774-6a9d-3a77-6521-d0cd6c366720.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/b4351197-06d9-83ca-516e-758e0ad7a398.png)
https://youtu.be/2wOfYgIMf-A?t=1507 より

GenerateにTest Scenariosが追加。エッジケースなどを考えてくれて、テストのメソッドなどを考えてくれる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/fb4f86ce-72d3-c816-311c-eef57903cf9b.png)
https://youtu.be/2wOfYgIMf-A?t=1575 より

<font color="DeepPink"><b>コミットメッセージも考えてくれる</b></font>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/bf3c1aab-ddc1-545a-6e45-5accf366ef9f.png)
https://youtu.be/2wOfYgIMf-A?t=1605 より

画像を渡して、それのComposeを作ってくれるデモ (これはDeveloper Keynoteとかにもあったかも)

Firebaseのクラッシュの画面で、Geminiに解決のステップを解説させられるようになった。

<font color="DeepPink"><b>去年のI/Oで紹介があったけど、クラッシュを見るときにAndroid Studioで見れるやつ。Android Gradle Plugin 8.3以上だとAndroid Studioはどのバージョンでクラッシュしたか分かるようになる。のでそのバージョンのコードでのクラッシュの場所がわかる。</b></font>(仕組み気になる。)

Android Studioのリリースサイクルの変更。いつもだとstableバージョンをリリースして終わりだが、もっと頻繁にリリースして、stableリリースのタイミングを早めて、feature dropという形で、あたららしい機能を提供することで、リリースの頻度を高める。

Before
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/4c702b64-3b37-b26c-583a-6a5a4cf1b99e.png)
https://youtu.be/2wOfYgIMf-A?t=2504 より

After
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/69e6b97a-4617-fc39-d90e-4a35ccbd4d5e.png)
https://youtu.be/2wOfYgIMf-A?t=2539 より

# Actionable app profiling in Android Studio

https://youtu.be/ELKKWDPCLXU

## App Startup

TTID(最初に表示されるまでの時間)とTTFD(コンテンツが表示されるまでの時間)の話。

TTFDを取るには<font color="DeepPink"><b>ComposeならReportDrawnWhen、ViewならFullyDrawnReporterを使う</b></font>。

自分だけかもしれませんが、ソースコードが気になる方はこちら。
ReportDrawnWhen: https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:activity/activity-compose/src/main/java/androidx/activity/compose/ReportDrawn.kt;l=128;drc=5f8df427d262f9848fab982f8c45ee3dc7f9acbc
FullyDrawnReporter: https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:activity/activity/src/main/java/androidx/activity/FullyDrawnReporter.kt;drc=5713d41811d5a99c93b5d585cbac46bfaa9ed5a6
https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:activity/activity/src/main/java/androidx/activity/ComponentActivity.kt;l=1090?q=reportFullyDrawn&ss=androidx%2Fplatform%2Fframeworks%2Fsupport

Baseline Profileってあるけどなんで効くのか？

Before
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/1354ab90-8b24-65fe-b50c-f4d5f9cf7a96.png)
https://youtu.be/ELKKWDPCLXU?t=274 より

<font color="DeepPink"><b>Android Studio ProfilerでJit thread poolを見るとJit thread poolでJITコンパイルに数秒かかっているなどが分かる。</b></font>
<font color="DeepPink"><b>70%のJITコンパイルの時間の短縮などが見られるようになる。</b></font>

After
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/4756bcfa-c419-3bbd-5e5b-fb991147e61b.png)
https://youtu.be/ELKKWDPCLXU?t=284 より

overunのメトリクスは1%の一番悪い(長い)フレームのsyncronization deadlineを超えたフレームを出す。overrunはdealineを超えた時間の量。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/c6e9744a-e64e-f017-995f-265f43f5e266.png)
https://youtu.be/ELKKWDPCLXU?t=398 より

これを調査するには？<font color="DeepPink"><b>どのぐらいJIT Activityが行われているかを確認する。特にJIT thread pool children timeを見る</b></font>。 アプリが実際にJITコンパイルに費やした合計時間を示す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/0e9585fc-f6a8-1e6d-8d1e-2f2b3f9f5151.png)
https://youtu.be/ELKKWDPCLXU?t=415 より

Android Studioのjankレンダリングを見る機能を使う。結果 Jit thread pool childrenが1.7秒かかり、8つのJank markerが表示されていることが分かる。

ここでBaseline Profileを入れてみると改善が確認できる。このOverrun マイナスになっているのはdeadlineを超えていないということ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/a4e4df06-299b-811f-2dfa-8dfaca680c5e.png)
https://youtu.be/ELKKWDPCLXU?t=470 より
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/783114a6-c01d-44c4-b266-1a3451d08dfd.png)
https://youtu.be/ELKKWDPCLXU?t=492 より
他の数値も改善されている事がわかる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/314fece1-dd47-7af3-bb4c-3e7b9b57be7d.png)
https://youtu.be/ELKKWDPCLXU?t=505 より

<font color="DeepPink"><b>Macrobenchmarkを使って、上記の測定を自動にできる。</b></font>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/bba02dfc-a6c4-0768-cccb-b547ff7941c1.png)
https://youtu.be/ELKKWDPCLXU?t=521 より

エネルギー消費量も取れるようになったよという話。

LeakCanaryが新しいAndroid Studioで使えるようになる話。LeakがAndroid Studio内で見られるなど。

# Designing scalable Compose APIs

https://youtu.be/JvbyGcqdWBA?t=14

(元になったドキュメントを読んだことがあるので、復習みたいな感じで)

Composable関数はComposable関数を呼び出せるので、Composable関数のAPIを作っていることになる。

* どのようにComposable関数を考えて、計画するか？
* どのようにKotlinの命名規則を活用するか？
* APIの強固な構造を定義する方法
* これらのAPIを検証し、保持する方法

これらのルールは

* Composeのフレームワークでは必須
* Libraryではガイドラインとして利用する
* アプリでは推奨事項として利用する

## どのようにComposable関数を考えて、計画するか？

FilterChipの例をみながらどのように新しいAPIを作ることを決めるかを見ていく。

まず新しいコンポーネントが思いついたときに、このAPIが1つの問題を解決することを目的としているかどうかを考える。
例えばFilterChipであれば、限られた選択肢の中から、簡潔な選択肢を表すコンポーネントが必要という問題を解決するコンポーネント。一つのコンポーネントが、一つ問題を一箇所で解決する。これにより<font color="DeepPink"><b>APIがユースケースベースになり、これにより簡単かつ明確に利用することができるようになる。</b></font>

このFilterChipにSuggestionさせたいとか、クイックアクションさせたいとかがでてきたとすると、違う問題なので、違う場所で解決されるべきもの。

ただ、ほぼ同じ見た目なんだけどどうしたらいい？もしアプリで一貫した要求があり、バリエーションのあるコンポーネントがある場合は上位のレイヤーに新しいコンポーネントを作る良い機会になる。この場合はFilterChipにChipを作るような感じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/528b5fb8-708d-b384-fa6c-9bd0c04ea2ca.png)
https://youtu.be/JvbyGcqdWBA?t=185 より
Higher level APIに行くにしたがって、よりカスタマイズができず、より意見(opinioned)の持ったような形になる。
(LowとHighのイメージが逆なのでむずい)

ChipGroupというコンポーネントを作るべきか？向きの縦横はRowとかColumnでできるし、装飾もModifierでできるので、いらないということになる。(このあたりがコンポーネントが1つの問題を解決するという意味なのかもなと思った)

## 名前付け

(スライドがわかり易すぎる。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/554cb183-e583-0c6e-9024-23f1a801af2b.png)
https://youtu.be/JvbyGcqdWBA?t=323 より


以下1, 2, 3はそのまま説明の通り。
☓になっているGoogleChipやFeatureXChipについては、コンポーネントはユースケースや目的によって名前がつけられるべきなのでということ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/c6986015-1509-9b96-239e-897e8ba6ebb4.png)
https://youtu.be/JvbyGcqdWBA?t=368 より

CompositionLocalによるカスタマイズはさけて、パラメーターを使おう。
APIユーザーはあることを期待するので、Modifierを最初のオプショナルパラメーターとして持つべき。
**パラメーターにするべきか？Modifierにするべきか？あるコンポーネントの代表的な振る舞いやUIがパラメーターになるべき。**

default値で、NullableとEmptyとDefaultの値どれを使うべきか？Nullableはその機能が必要ないとき例えばChipのImageとか。Emptyはその機能が必須だが、emptyになれるとき、ChipのContentとか。DefaultはShapeとか。

AccessibilityでChipに画像と文字が入っているときなどは、子のsemanticsをマージできる。

**ボタンが押した状態などをテストしたい場合は？interactionSourceを外部から設定できるようにする。**
(この方法はRoborazziでも動くらしい https://slack-chats.kotlinlang.org/t/16651702/hi-everyone-i-m-currently-integrating-https-github-com-takah )

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/c989c211-3099-f31c-5bfa-3e63f888b539.png)

https://youtu.be/JvbyGcqdWBA?t=1102 より

Backward compatibility﻿ガイドをみると、後方互換性の保ち方がわかる。
https://goo.gle/kotlin-back-compat



まだ途中です。(ストックしておくと更新通知受け取れるかもです :pray: )
[WIP]