Qiita Night〜2022年、Androidアプリはどう作る？〜のイベントレポート

# 概要
- 2022年7月20日に開催された[Qiita Night〜2022年、Androidアプリはどう作る？〜](https://increments.connpass.com/event/251564/)のイベントレポート

ライブ配信のアーカイブ

<iframe width="560" height="315" src="https://www.youtube.com/embed/MxZjdt_Xo1I" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

# コンテンツ
- LT
    - 2022年のAndroidプロジェクトセットアップ / @takahirom
    - バイトルアプリ開発の裏側 / @hayashidamoka
    - Kotlin Nativeってandroid向けにも書けるんですよ / @RyuNen344
    - 進化したWidget / @dosukoi_android
- トークセッション / @takahirom、@dosukoi_android、@konifar（モデレーター）
    - 最近のAndroid開発事情
    - 各社のアプリ開発事情
    - 今後のAndroidに期待していること

## LT
### 2022年のAndroidプロジェクトセットアップ
- スピーカー：@takahirom
- 所属：CyberAgent, Developer Experts
    - ABEMA Androidの開発に従事
- 資料

https://qiita.com/takahirom/items/983f7ee06afe85c78246

#### メモ
資料内でQiitaの記事として詳細にまとめられているので割愛

### バイトルアプリ開発の裏側
- スピーカー：@hayashidamoka
- 所属：ディップ株式会社 Androidエンジニア
- 資料

https://qiita.com/hayashidamoka/items/0d8e757192f291d5a2a8



#### メモ
1. チーム体制
    - バイトルアプリ開発チームは3つのチームとリアーキテクトのチームから構成されている
    - エンジニア以外もチームに居ることで質問などもしやすく
1. ユーザーファースト思考
1. リアーキテクチャ中！
    - 既存のコードが2016年をベースにしていたので、向こう5年耐えうるものにするためにGoogle推奨のアーキテクチャに沿ってマルチモジュールへのリアーキテクチャを実施している
    - JAVAとKotlinが混ざっているところがあるのでコードのKotlin化も進めている
1. オンラインでのコミュニケーション
    - バーチャルオフィスの導入
    - 週2でランダムメンバーでの夕会
1. LT大会
    - ライブコーディングでも資料でも形式は自由にしている
1. 輪読会
    - 年に10万円までの上限の補助で同じ書籍でみんなで学ぶ
    - 週1で担当がまとめたものを元に議論

### Kotlin Nativeってandroid向けにも書けるんですよ
- スピーカー：@RyuNen344
- 所属：チームラボ株式会社 スマートフォンアプリエンジニア
- 資料

https://speakerdeck.com/ryunen344/kotlin-nativetuteandroidxiang-kenimokakerundesuyo
- Qiita記事

https://qiita.com/RyuNen344/items/6e359c90fd42fdd6850c

#### メモ
- エンジニア、最終的にCかC++にたどり着く説
- Kotlin Nativeって実はandroid NDK向けにも吐き出せる
- Kotlin Multiplatformとは？
    - Kotlinで1つコードを書くと、裏側でiOSやAndroidのAPIを呼び出せたりする
- Kotlin Nativeとは？
    - Static or Dynamicライブラリを生成できる
    - Static or Dynamic Cライブラリを取り込める

![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427308/68c1caa3-79fa-cf4a-eb57-dcd56d9809a8.png)


- Kotlin NativeをNDK向けに書き出す
    - 設定：build
        - Kotlin Nativeプロジェクトはandroidライブラリとして認識できないため手でファイルをコピーしてあげる必要がある
        - ビルド時にandroidプロジェクトに.soファイルをコピーする処理をKotlin Native側のプロジェクトに追加する

![image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427308/75e5dbf0-90c4-6ffc-f77d-4b0938b32de9.png)


- JNI on Kotlin NativeをうまくやるTips Primitive編
    - Primitiveな型はそのままKotlin Native上でもKotlinクラスで受け取れる
    - instanceを生成する際はallocを自動でやってくれるmemScoped関数を用いてメモリ番地がScope内で不変になるようにする
        - 他にもいろいろ便利関数がある
- 吐き出した.soファイルをNDKに読み込ませる
    - Kotlin Nativeにはパッケージの概念が存在している
        - これによりトップレベル関数などの名前空間がぶつからない
        - 例：c側からみるとprint関数は`Kotlin_io_Console_print`になっていたり
    - 呼び出し方が独特（冗長）になる
- パフォーマンス
    - 前提条件下のもと計測
        - Kotlin Nativeのnew mm（memory manager）は不使用
        - Kotlin Nativeで.soを吐き出してそれをNDKに取り込んで処理を呼び出す
        - フィボナッチ関数で計測（1番Order数の多い再帰パターン）
        - Coroutineなどを用いて処理中の実行スレッドの変更などは行わない
        - tailrecを使った言語レベルの最適化は行わない
    - 結果的には素のネイティブ実装を上回った
    - Kotlin Nativeはdebug symbolが重めなのでしっかりReleaseビルドを使ったほうがよい
- まとめ
    - 素敵なところ
        - IDE支援をさらに受けやすい
        - 強力なstdlib周りを設定無しで使える
        - コアロジックに関しては慣れているKotlinで記述することがでいる
    - あと一歩
        - Kotlin使ってるのにPointerを意識した実装が発生する
        - coroutine,atomicfuが対応されていない（回避策はあり）
    - ネイティブライブラリしかなく、C++のキャッチアップに余裕がないときにおすすめ

### 進化したWidget
- スピーカー：@dosukoi_android
- 所属：株式会社Kyash Androidエンジニア
- 資料

https://speakerdeck.com/dosukoi_android/jin-hua-sitawidget-b6aeb0b4-f8bb-4465-bbcd-688c89404e0e

#### メモ
- 最近（4ヶ月前くらい）KyashはWidgetをリリースした
    - アプリを開かなくてもみれるので便利
- Widgetを作るのは大変
- 2021年に大きなアップデート
    - Glanceの登場
        - Compose（便宜上）でWidgetを作れるライブラリ
        - 今はalpha版
- 比較
    - Viewの扱い
        - これまでのWidget
            - 初見に厳しい...
                - RemoteViewってなんだ？
                - 属性をStringで指定
        - これからのWidget
            - 普段からComposeで開発している人は慣れ親しんだ記法
    - リスト実装
        - これまでのWidget
            - RecyclerViewは使えないのでListViewを使う必要がある
                - が、ListAdapterが使えるわけではないListViewに対してAdapterをセット
            - `RemoteViewsService`と`RemoteViewsService.RemoteViewsFactory`のそれぞれを継承したクラスを作る必要がある
            - `RemoteViewsService.RemoteViewsFactory`を継承したクラスは9つのメソッドを継承する必要がある
                - 9つのメソッドをoverrideする必要がある
        - これからのWidget
            - LazyColummでリスト実装
            - クリックイベントもitemに設定してあげれば良い
    - イベントハンドリング
        - これまでのイベントハンドリング
            - StringでActionを定義する必要がある
            - IntentとActionを紐付けてあげる
            - PendingIntentを発行
                - 普段のAndroid開発でそこまで多く使うわけではないので、慣れがない問題
            - Viewに対してPendingIntentを登録
            - イベントは全てonReceiveに飛んでくる
            - 定義したActionごとにハンドリング
        - これからのイベントハンドリング
            - 汎用的なAPIが用意されている
                - 以下の際に始めから用意されている関数を使えばよい
                    - Activityを開きたいとき
                    - Broadcastを送りたい時
                    - Serviceｗ開始したいとき
            - 独自Actionの定義ができる
                - 独自Actionを型として定義
                - Modifierで独自Actionを登録してあげる
    - Glanceでの状態の扱い
        - DateStoreで状態を管理する
        - Primitive型の扱いはとても簡単
        - 独自のデータ型もprotocol bufferで定義できる
- まとめ
    - 普段Composeで開発してる人にとってはWidgetは開発しやすいものになりそう
    - イベントハンドリングが楽になるのもとても助かる
    - これからWidgetを開発するのであれば、Glance一択になりそう
- 注意点
    - Glanceはまだalpha版
    - Composeで書けるけど、差分更新ができるわけではない

## トークセッション
### スピーカー
- @takahirom
- @dosukoi_android
- @konifar（モデレーター）

### セッションテーマ
- 最近のAndroid開発事情
- 各社のアプリ開発事情
- 今後のAndroidに期待していること

#### 最近のAndroid開発事情
宣言的UI Jetpack Composeが主流になりつつある

- Kyashは新しく作るときは完全にJetpack Compose
    - 難しいアニメーションなどはAndroid View
- ABEMAも基本的に同じ
    - やろうとして難しいなどがなければJetpack Compose
        - 既存の置き換えを一気に進めることができないとかはある

Android Studioの便利機能

- 1年前と比べてよくなったところ
    - Electric Eelがいい感じになってそう
        - Live Editがいい
            - プレビューでも実機でもいい感じに動いている
- 最近開発する上でなくてはならない機能

ベストプラクティス

- 公式ドキュメント
    - Repositoryだけでなくドキュメントも充実してきている
- Now in Android
- Googleの方が書いたブログ

#### 各社のアプリ開発事情
どのくらいトレンドを取り入れているか

- Kyashは技術的には攻めているが、メンバー減でトレンドを追う難しさもある
- ABEMAはGoogleのアーキテクチャガイドなどにそっては追っている

技術的課題とアーキテクチャ

- ABEMAはAndroidとiOSで揃えるようにClean Architectureに移行して、UseCase以下をKMMで作ろうとしている
- Kyashは今まではMVVM
    - 仕様共通化のためにKMM導入
    - ViewModelまでKMMに寄せている
    - KMMがある部分はMVI的な感じになっている
        - Action -> Mutation -> Stateという変換（Reduxみたいな感じ）

#### 今後のAndroidに期待していること
- KMPとかの関連でAndroid Studioのインポートが壊れたりとか、Composeの対応で問題があったりするのが少しずつ改善されているが、Kotlinとの統合をもう少し頑張ってほしい
- Glanceは早くbeta/stableにしてほしいなという気持ち
- Composeに関しては色んなコンポーネントが充実してきているが、accompanistを使わざるを得ない状況がある
    - accompanistはChris Banes個人のライブラリに依存している部分があるのでCompose側に組み込んでくれると嬉しい

# お知らせ
### Qiita Nightの登壇者とDevトークでお話できます

https://jobs.qiita.com/employers/team-lab/dev_talks/268

https://jobs.qiita.com/employers/193/dev_talks/272

https://jobs.qiita.com/employers/580/dev_talks/341

### 今後のイベントについて
Qiitaでは今後もエンジニアの皆さまにお楽しみいただけるイベントを開催予定です！
詳しくは以下をご確認くださいませ。

https://qiita.com/official-events