DroidKaigi 2024の驚いたところメモ

個人的に驚いたところを **太字** にしておきます。

# 宣言的UIを学ぶ際に知っておくべき重要なコンセプト

https://2024.droidkaigi.jp/timetable/694168/

https://www.youtube.com/watch?v=txaf9F0d-aE

プログラミングを始めた頃、for文で数値を合計することがありましたよね。UIも同様に、複数のコンポーネントの合計で成り立っているという、という話で宣言的UIの利点として、コードの可読性が向上し、開発者が意図を明確に表現できるそう。

ReactやiOSなど、さまざまなプラットフォームを網羅しており、Side Effectもカバーしています。Composeから他の言語に移行する際にも便利そうな内容でした。


UI Stateをsingle storeで管理するMVIやTCAは新しい概念なのでしょうか？実際、Fluxで既に行われていたことという話がありました。

**MVIやTCA、Reduxは、ボイラープレートが多く、触るべき箇所が多くて面倒だと言われることがある。**
SWRではキャッシュ管理を通じて効率的に処理を行い、UIのReactの関数内にAPI呼び出しのコードを組み込む感じになる。

# 立ち話1: GraphQLとSWR

(2日目でこのセッションについて話題になった。)。このセッションとGraphQLのセッションについて話題になり、GraphQLは本当に楽で、**クライアントでGraphQLが色々な事情でできないから、SWRとかが発展しているみたいなところがあるのでは？** みたいな話になりました :pray: 

# 立ち話2: KMP iOSのFrameworkビルド遅い問題

iOSのKMPビルドで時間かかるという問題をJetBrainsの方と相談させていただいて、色々見てみるということだったが、**`freeCompilerArgs += listOf("-Xprofile-phases")`というので、linkの中で時間の掛かっているフェーズを知ることができるらしい。** 全然ググってもでてこない :pray: 
またビルドが並列化できない問題などがあるという話や、新しいLLVMのバージョンで。。みたいな話を聞くことができました。(がそんなに強くない英語で突撃したので完全には理解しきれていない部分もある :bow: )

# 立ち話3: SWRとかの次は。。？

**JSにAPI呼び出しではなくサーバーサイドでDBとかを呼び出せるようなコードを埋め込んでしまうやつが話題になったが、同じようなことがAndroidでもできないか？**という話。

# いまあるAndroidスキルでフルスタックデベロッパーになる💙

https://2024.droidkaigi.jp/timetable/687445/

https://www.youtube.com/watch?v=6gr2hJJNZAc


Kotlin Multiplatformの成熟度が向上し、iOS、Android、デスクトップ、Webの各プラットフォームでの開発がよりシームレスになった。

 **IntelliJ Ultimateでは、Kotlin Notebookのサポートが非常に充実しており、コード補完機能が優れているという話。**

その結果、サーバーとの通信を迅速に確認できるようになるという話。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/b4e0e244-b943-1625-1ad0-c6fd265680ba.png)
https://youtu.be/6gr2hJJNZAc?t=1795 より


NotebookはGitHubにアップロード可能で、画像の共有も容易であるという話。

# 日本から海外への就職キャリアについて

https://2024.droidkaigi.jp/timetable/691330/

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

海外就職はキャリアの選択肢を広げる手段であるという話。

キャリアは明確な目標を持つことが重要であるという話。

努力を正しい方向で行うことがその効果を最大限に発揮するために重要であるという話。

海外就職によって特定の専門性を深めたり、より高い給与を得る可能性があるという話。

海外就職の前提。
* 就業ビザ
労働市場の需要と専門的なスキル、言語能力で取れる。

心構え。
慣れた環境から離れたり、言語の壁、孤独感など。

海外就職には、現地の文化や言語を学ぶことが重要であるという話。


どうやって企業を見つけるか。
* **現地移住者のコミュニティで求人情報を得たり、仕事の紹介など。** 
* 現地の求人だとビザに慣れていないこともある
* SNSでのつながり
* リファラル(感謝する)

履歴書どうするか。
* 翻訳はやめよう。
* 理想的な環境を考えることで、書きやすくなる。
* 模擬面接を行う

求人票で見るべきもの
* 事業の大きさによって必要なスキルが異なる。 (スタートアップでは色々やるなど)
    * キャリアにも関係してくる。

* 汎用的な技術を学ぶことが重要であり、日本独自の技術は海外では評価されにくいという話。
    * Felicaなど日本独自の技術などは扱いにくいなど

# 立ち話
韓国からいらしたDroidNights運営をされている方と、Espressoで実機テストやってるよという話を聞いた。時間は結構掛かるなど。色々課題はありそう。だがユーザーが使うアプリに近いのはいいよねという話。

# (DroidKaigi App developer's Fireside chat)

(動画、タイムテーブル、非公開)

https://x.com/new_runnable/status/1834055520065650993

色々話した。RinとDIと今後どうしていく？がちょっと話題に上がった。

# アイデアからIDEへ： Android Studio用プラグインの開発

https://2024.droidkaigi.jp/timetable/684398/

https://www.youtube.com/watch?v=3ID-W-X_5mw

(途中から参加)

スレッドモデル
* Event Dispatch Thread (EDT)
UIスレッドで、UIイベントの処理やインターフェースの更新を担当する。データの書き込みもEDTで行う必要がある。
* **Background Thread (BGT)**
長時間実行されるリソース集約的な操作やバックグラウンドタスクを処理するためのスレッド。

**Coroutineスコープで、サービススコープを使うとライフサイクルに紐づけ等られる。**
`@Service(service.LevelPROJECT)`をつけて、そこでCoroutineScopeを受け取る。そして、scope.launchを呼ぶ。

でreadAction{}でelement.textに触ったりする。
EDTスレッドで書き込みする。

Kotlin UI DSLというツールキットがあり、ダイアログやパネルの作成に使用できるが、すべてのUIコンポーネントをカバーしているわけではない。

Composeは公式にはサポートされていないが、IntelliJの見た目をテーマとして提供するJewelというライブラリを使用することで、プラグイン開発に役立つ可能性がある。

Ask the speakerで話聞きにいった。
UI Kotlin dslはダイアログとかで使えるがToolsで使える？使えるかも知れないが、ちょっと分からなそう。
Serviceの使う側の作り方ってどうやるの？service<クラス名>()で作れるよ。ただ、シングルトンになっちゃうかもという話。

# WebADBを使用したAndroid専用端末化への自動キッティング手法

https://2024.droidkaigi.jp/timetable/693456/

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

なんというかまさに業務での知見という感じのセッションでした。

サンプルアプリ

https://github.com/HisamotoKunimine/android-kitting-sample

**WebUSB APIとは？WebブラウザからUSBデバイスにアクセスするAPI。ChromeやEdgeでサポート。FirefoxやSafariではセキュリティやプライバシーに関する懸念から現時点ではサポートされていない。**
使える条件は、HTTPSで提供されていること、複数のUSBはできないなど。

selectedDevice.connect() で接続するっぽい
https://github.com/HisamotoKunimine/android-kitting-sample/blob/42ea9e0a20c78f35ea8ec72fc73a317a208daeb1/web-adb-kitting/src/app/connect.tsx#L116

外部サービスから直接APIを叩いてapkを取得しようとするとCORSエラーになるので、cronで定期的に最新のapkをストックしてくるような構成を取る必要がある。

apkをストリームのバイト列にしてにしてインストールするなど。
adb.subprocess.shell()でadbのコマンドを使える。

(Compose Multiplatform WebでWebADB動かすサンプルを誰か作ってほしい🙏 見つからなかった)



どうやって端末のタップさせるか？アクセシビリティサービスAPIを使うにはアプリである必要があり、Google Playで出すには権限申請が必要であるが、キッティングツールではGoogle Playに出さないので、その申請が不要で簡単に利用できる

# Androidアプリのスクリーンショットテストをマスターする

https://2024.droidkaigi.jp/timetable/693281/

https://www.youtube.com/watch?v=5i4RAciOi2s

左がユニットテストで右がE2E、Screenshot testの位置は開発の真ん中ぐらいだそう。 (Googleのドキュメントのソースがある？)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/55bdfb65-57ea-fc0e-3f43-b789d5c5e55e.png)

https://youtu.be/5i4RAciOi2s?t=265 より

主にGoogleのScreenshot testing(Composable Preview Screenshot Testing(CPST))の仕組みとRoborazziを比較している。

CPSTはscreenshotTestのソースセットにPreviewを置かないといけなかったり、Roborazziが柔軟であるけど、セットアップが必要など。

(セットアップについては以下で自動化しようとしている)


<blockquote class="twitter-tweet" data-media-max-width="560"><p lang="ja" dir="ltr">RoborazziのPainポイントのマニュアルで色々やらなくちゃいけないのはそうなんですが、このあたりでセットアップを楽にしたり、Previewの設定を反映したりとかを頑張って自動化しようとしてます🙏 <a href="https://t.co/P67kCidHBB">https://t.co/P67kCidHBB</a> <a href="https://twitter.com/hashtag/DroidKaigi?src=hash&amp;ref_src=twsrc%5Etfw">#DroidKaigi</a></p>&mdash; takahirom (@new_runnable) <a href="https://twitter.com/new_runnable/status/1834471032885002524?ref_src=twsrc%5Etfw">September 13, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

(半分は自分が作っているライブラリと、見ているライブラリの情報だったので、自分にとっては割と知っている情報が多かったが、結構詳しいと思いました。また活用方法など参考になりました。)

# テストの新時代

https://2024.droidkaigi.jp/timetable/679601/

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


JUnit5は 8年前リリース。
JUnit5は3つのコンポーネントに分かれています: Jupiter、Platform、Vintage
* Jupiter テストを書くためのコンポーネント
* Platform testを実行するためのもの (気にしなくてよいが、実行していることを意識しておくと良い)
* Vintage (互換性)

JUnit5のコードはJUnit4との違いは？
基本的にはJUnit5のコードはJUnit4と大きく変わらず、主にインポートが変わるだけ。
`@Test`つけたりとか。

Androidのユニットテストは？動く。  mannodermaus/android-junit5
7年前リリース。
pluginとか依存関係を追加する。

**JUnit4とJUnit5テストは同時に動かせる。**

API 26以上では端末でも動く。なぜ26か？JUnit5はJava 8のAPIを使用しているため、API 26以上の端末で動作する。Desugaringも効かない。
25以下で動かすとクラッシュせず、スキップされる。

`@RegisterExtension ActivityScenerioExtension.launch` というのをAndroid JUnit5のライブラリで用意している。

Parametereizedテスト: `@ValueSource`でPrimitive型でのParameterizeがかける。EnumSourceなどもある。 @MethodSource("argumetns")みたいな形でメソッド名を指定して、そこでParameterを作れる。
**CsvSourceというのもあって、以下みたいにかける。**

```
@CsvSource(
"Alice, 22",
..
)
```

Composeのテストも`createComposeExtension()`も用意してある。

Conditional Test Executionとは？
いくつかの条件の時にテストをスキップできる。例えば環境変数やOSなど。
android-jnit5ではデバイスの製造元とかでもスキップできる。
```
@Test
@EnabledIfEnvrionmentVariable(name = "CI", matches = "true")
...
```

Parallel Test Executionとは？
**実行時間を短縮するため、テストを同時に実行する機能。ただ、UI testsはできない。 Android Instrumentationはstaticで同じInstrumentationを使うため。**
`@Execution(ExecutionMode.CONCURRENT)`をつける。

Robolectricは？っていつも聞かれて無理ですって答えていた。**これまでは**
**今は、It works!**

どうRobolectricはどう動くか？Robolectricの仕組みはClassLoaderで別のクラスを読み込ませている。
JUnit5はカスタムClass Loaderをサポートしていなかった。 去年のJuly 23まで。ただ、これを対応するのはけっこう大変。
だが、apter-tech/junit5-robolectric-extension がやった。
Robolectric実際使える？？やっていっている。**Compose unit testではできない。なぜ？メインスレッドの制約がありクラッシュする。** Compose Test APIはまだサポートできていない。 Espresso使うとdeadlockしてしまう。

# AndroidアプリのUIバリエーションをあの手この手で確認する

https://2024.droidkaigi.jp/timetable/693401/

https://www.youtube.com/watch?v=Wvb2Ph-T4pg

**ディストリビューションダッシュボードで、どの大きさの端末のどの解像度がよく使われているかわかるので、テスト対象の参考にできる。**

Previewを編集するときはAndroid Studioの歯車で表示されるメニューを使うと変更が楽にできる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/186deaa3-835c-9b35-613a-356f2ed3bb80.png)

Compose PreviewでUI Check Modeを使うとPreivew全種類を作成してくれる。またVisual Lintで検出された問題を表示できる。Visual LintはMaterial Designの推奨にあっているかが半分ぐらい。

デバイスでの確認方法: Resizable Emulatorを使うことができるが、API Levelなどの制限がある。

adbでの画面サイズを取得したりサイズ変更したり色々できる。
adb shell wn size resetなどでリセットもできる。

Device setting shortcutというので実機などの設定をDark themeなどを変更できる。

**Appiumの設定アプリをインストールすることで、adbからブロードキャストを送信して言語設定を変更することが可能になる。**

Compose Previewのスクリーンショットテストは[別セッション](https://www.youtube.com/watch?v=c4AxUXTQgw4)で行う。(Robolectricのクオリファイアも同様)

**DeviceConfigurationOverrideはRobolectricでも使える。**

```kotlin
DeviceConfigurationOverride.ForcedSize(
  DpSize(480.dp, 320.dp)
) {
}
```

Window Testing Library

**折りたたみ機能などのウインドウ管理に関する機能をテストでき、LocalTestでも動作する。**
Window Testing LibraryがLocal Testで動くというのはRobolectricで動くということなのかな？言及あってできるっぽい。 Previewでも使える。

StateRestorationTester
**Configuration Changeをシュミレートできる。UIの状態が復元できるかをテストする。これもLocalTestで動く**

このドキュメントがおすすめらしい。
https://developer.android.com/training/testing/different-screens/tools


# Android開発以外のAndroid開発経験の活かしどころ

https://2024.droidkaigi.jp/timetable/693873/

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

キャリアAndroidで大丈夫って思うよね？
「たぶん大丈夫」という話

なんというか自分とKonifarさんが10年ぐらい前に、もくもく会で会った時の話とかから始まってエモくて泣きそうになりました😂 

ViewModelの作りで、iOSのキャッチアップに大いに助かった。

DDDでは、もちこちゃんの大冒険というのがおすすめらしい。

テストとかも考え方は変わらない。

一つ得意領域があることで、差異をキャッチアップできるので早い。
今はChatGPTも使える。

IntelliJ IDEが他のところでも活きる。Golandなどがある。

CursorのときもIntelliJのキーバインド設定があったりする。

Androidのライブラリでの体験での経験が活きることがあった。


**Backend Master Classというのがあって、Goをキャッチアップするだけではなく、モデリングのドキュメント自動作成など。一通りできるようになった。** 

AWSの認定試験もおすすめ。仕事で簡単なタスクをやるのも良い。

マネジメントについて、デザイナーなどとのやり取りの経験が活きる。
技術面や開発フローの意思決定。意思決定の数だけ強くなれる。
マネジメントも広く浅く知っておくことの一つとしておくと良い。
EMのコミュニティでシェアしていたりする。

**コミュニティとの関わり方。コミュニティで人と話す楽しさやキャッチアップへの効果を知っていたので、それを使って他領域にも入っていった。**

ここは自信があるという領域を作るのが良い。そこで**10%ぐらいは他領域をキャッチアップして広く浅く知識をつけると良い。**