Upgrade to Pro — share decks privately, control downloads, hide ads and more …

KANNA Android の技術的課題と取り組み

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

KANNA Android の技術的課題と取り組み

2025年4月23日開催、Findy 様主催の【Androidエンジニア特集】Androidアプリ開発 開発組織が向き合う課題と戦略 という技術イベントの登壇資料です。

Avatar for Yosuke Watanabe

Yosuke Watanabe

April 23, 2025
Tweet

Other Decks in Programming

Transcript

  1. • 株式会社アルダグラム • 設立: 2019年5月 • 現場 DX サービス「KANNA」 •

    建設業、不動産業、製造業など、あらゆる 現場の生産性向上を実現 • グローバルに展開 • 東南アジアを中心に世界70カ国以上 会社紹介
  2. • React Native で作られている • 一部機能をネイティブで実装 • Android なら Kotlin

    + Compose、iOS なら Swift + SwiftUI • 現在は KMP + CMP で Android / iOS の両方を一つのコードで開発 • 採用した理由は後述 • ※ KMP = Kotlin Multiplatform、CMP = Compose Multiplatform • GraphQL • チャットなどの一部機能で Firestore を使用 KANNA Android アプリの技術スタック
  3. • Android 公式ドキュメントの Guide to app architecture を参考 • Repository

    + (UseCase) + ViewModel + Compose • Gradle はマルチモジュール構成 • Google が公開しているサンプルプロジェクト now in android を参考 • テストはできる限り書くようにチームとして意識 • JUnit 4 / Robolectric • 特殊な構成にしないことで、新規メンバーも把握しやすいように KANNA Android アプリのアーキテクチャ
  4. • アプリチーム6名 (正社員3名、業務委託3名) • Android: 3名、iOS: 3名 • スクラム開発: 1週間のスプリント

    • 機能開発時には DesignDoc を書く • 開発する機能によっては、他チームと連携して開発 • API / デザイン 開発体制の紹介
  5. • 写真・PDF に対して、線やテキストを 書き込める • プレビューでは以下の操作が可能 • 書き込んだ内容の移動、回転、拡大縮小、 削除、Undo /

    Redo • テキストの再編集 • 写真自体の拡大・回転 • 「完了」ボタンを押すとファイル保存 写真・PDF の編集 - 機能説明 -
  6. • Compose ではなく Android View で実装 • 写真の表示: panpf/zoomimage •

    写真の拡大表示だけでなく、回転表示もサポート • PDF の表示: TalbotGooday/AndroidPdfViewer • PDF の編集: TomRoush/PdfBox-Android 写真・PDF の編集 - 技術詳細 -
  7. • 「完了」ボタンを押したら、線やテキストの情報を写真や PDF に 書き込んでファイル保存 • 写真の場合は Canvas に全て書き込んだ上で画像ファイルに出力 •

    PDF は編集用のライブラリを使用 • 日本語を表示するにはフォントのロードが必要 • 詳細はブログ記事にて: bit.ly/3DXkpmA • PDF に書き込む時は y 軸が反転するので注意 • 画面上では 左上が原点で y 座標は下向きに正だが、PDF は左下が原点で上向きに正 写真・PDF の編集 - 技術詳細 -
  8. • 帳票は WebView で HTML を表示 • TypeScript を使って DOM

    の操作を行ったり、 ネイティブと連携 • JavaScript を使うのは辛いので… 帳票 - 技術詳細 -
  9. • TypeScript → JavaScript へのトランスパイルはカスタムの Gradle プ ラグインを作成 • android/gradle-recipes

    の addGeneratedSourceFolder というサンプ ルを参考 • ビルド時に自動生成されたファイルを assets ディレクトリに格納できる • これでビルド時にトランスパイルが実行され、変換後の JavaScript ファイルを assets ディレクトリに格納できる • ブログ記事: bit.ly/4jmKKJE 帳票 - 技術詳細 -
  10. • エクセルに元々設定されていた数式や関数は帳票でも使えるよう に再現 • 四則演算 • SUM / IF /

    AND / AVERAGE / ROUND / ISBLANK / MAX / MIN / COUNT • 関数・数式にセルの値を埋め込んで評価 • 「A1=B1+C1」のような数式があり、B1のセルに5、C1のセルに3が入力 されていた場合、「5+3」を評価して結果をA1のセルに表示 帳票の関数・数式 - 機能説明 -
  11. • 関数・数式の評価は math.js を使って JavaScript 側で行なっている • 「2 + 3」のような数式を評価してくれる

    • SUM などの関数は評価できないので、math.import を使って独自関数を定義 して評価 帳票の関数・数式 - 技術詳細 -
  12. • セルの値の置換に構文解析を使用 • 「IF(A1>0, “B1”,C1)」のような関数の場合、B1は文字列なのでセルの値に 置換してはダメ • 正規表現だと判定が難しい • 関数はネストして書くことができるので複雑になる

    • 構文解析 : 文法規則に従っているかをチェックし、構造を解析する • プログラミング言語でも使われている • 構文解析には Strumenta/antlr-kotlin を使用 帳票の関数・数式 - 技術詳細 -
  13. • 会社設立当初は Web エンジニアが少人数でモバイルアプリも開発 • React が得意なメンバーが集まっていたため、React Native を採用 •

    アプリ開発を進めていく中で、高度な機能開発が増えていき、ア プリチームが組成された 課題
  14. • アプリチームにはモバイルアプリ開発が得意なメンバーが多く、 React Native に精通していない • ネイティブへの置き換えを検討 • メンテされていないライブラリを使っている関係で、React Native

    自体のバージョンや周辺ライブラリのアップデートが容易に行え ない • アプリの動作がネイティブと比較して遅い • 海外では Android ユーザーが多いが、使用端末のスペックが高くない 課題
  15. • 新機能開発や既存の一部の画面を Android / iOS でそれぞれネイテ ィブ実装を行なった • React Native

    ではネイティブと連携したり、ネイティブの画面を表示する 仕組みが提供されている • しかしここでも課題が発生 • Android / iOS それぞれで実装が必要なので工数がかかる • 実装の細かい部分でコミュニケーションコストがかかる • エンジニアのリソース不足 課題
  16. • 課題を解決するために KMP / CMP を採用 • 採用した理由 • Android

    / iOS の開発が UI も含めて1つのコードで行える • 仮に今後 KMP / CMP が廃れていっても、Android 側はそのまま資産として 残る • Google や JetBrains が KMP / CMP をサポート • 実際に2ヶ月ほど KMP / CMP で置き換えできるかを試し、UX を損ねるこ となく置き換えられそうだった 課題
  17. • KMP / CMP を使って React Native を脱却していく • 現在15%程度の画面が移行済み

    • 2年後には React Native を取り除くことを目標 • AI を活用した開発 • 現状でもテストコードや簡易な画面の作成は AI を使っている • 現在色々と検証中 • React Native の画面のコードから Compose の画面のコードを作る、等 今後の展望
  18. • 弊社では Android エンジニアの需要が高い • KMP / CMP への移行対応のため •

    今後新規機能開発も KMP / CMP を使うため • また今後さらなる海外展開を見据えているため、ますます Android アプリの重要度は高まる • 特に東南アジアは Android ユーザーの比率が高い • Android エンジニアを絶賛募集中 アルダグラムにおける Android アプリの重要性
  19. • CMP では SwiftUI の画面を表示できると公式ドキュメントに記載 がある • https://www.jetbrains.com/help/kotlin-multiplatform-dev/compose-swiftui- integration.html •

    KANNA で SwiftUI で実装したリスト系の画面を CMP で表示させて みたが、スクロールしても反応しなかった おまけ: CMP でハマったこと
  20. • Issue はあったが進展はなし • https://youtrack.jetbrains.com/issue/CMP-6828 • 調査してみたところ、Compose 側のジェスチャーと SwiftUI 側の

    ジェスチャーが競合してしまい、Compose 側のジェスチャーが優 先されていた • ワークアラウンドとして Compose 側のジェスチャーの優先度を 下げる処理を iOS で実装し、スクロールできるようになった • https://gist.github.com/watabee/fa4ce518c309aa1dbabf3e748a42414b おまけ: CMP でハマったこと