🏋️

Androidアプリ開発に挫折した人がAIを引っさげてリベンジした話

に公開

きっかけ

こんにちは、ランサーズでエンジニアをしている岡田です。

私には大学生のころ、スマホアプリに挑戦しようとAndroid Studioのエミュレータを起動した瞬間にノートPCから「フシュ~」という轟音が鳴り響いてから、Android Studioのアイコンがエンジニア風デスクトップの置き物になった挫折経験があります。
それ以来、Androidアプリ開発は自分には難しい縁遠い世界だと思っていました。

そんな苦い思い出があったのですが、最近になってAIツールが発達してきて「もしかして、AIがあれば再挑戦できるかも?」と思うようになり、
ちょうどどこでも使える自分専用のアプリを作りたいという欲求も生まれてきた時でした。
普段、自作でアプリを作りたい時はローカルでDockerを使ってWebアプリを作ることが多いのですが、外でも使うものとなると話が変わってきます。
どこからでもアクセスできるWebアプリを作るにはサーバーを維持し続ける必要があって、実運用が面倒だしお金もかかります。

自分だけで使うなら、スマホで動くAndroidアプリの方が適しているのでは?今のAI使えば何とかなるでしょ。

そんな淡い希望を抱いて、遠ざけていたAndroidアプリ開発に再挑戦してみることにしました。

この記事では、Android初心者がAndroid StudioのGeminiを使って開発してみた体験と、せっかく作ったアプリを紹介させていただきたいと思います!

※ 開発手順を細かく解説する記事ではありません。「初心者がAIを使って開発すると、実際どんな感じ?」 という視点で読んでいただければ幸いです。

著者のAndroidアプリ知識

  • スマホアプリなんて作ったことがない
  • AndroidはKotlinが主要言語なんでしょ?
  • .kt以外に.xml.ktsがあるけど、これは何?
  • Android Studioはインストールしてサンプルコードの動作確認で挫折した
  • Firebaseはアカウントも作ったことがない
  • スマホに自作のアプリが入ってる人って、なんかカッコいい

作ったもの紹介

まずは完成したアプリを紹介させてください!

アプリのコンセプトは

  • メモ感覚で簡単に日記が書ける
  • 習慣の見える化で知らなかった自分に出会う

で、毎日の記録をつけるのが苦手だけど、振り返り用に日記はつけたい人向けのアプリです。

元々は「病院に行った時に自分の症状がいつからどうだったか、お医者さんに説明するの覚えてないし面倒なんだよなぁ」という実体験から
「毎日の行動を記録しておいて、診察室で待っている間にAIで要約、後はお医者さんに伝えるだけ。」
そんな体験を作りたくて、まずは毎日の記録を簡単に記録できるようにしたいな、と日記アプリの開発を決めました。

機能1:テキスト入力で日記登録

テキスト形式で入力すると内容からAIが勝手に時間と出来事に分けて、その時の感情と一緒に日記を登録してくれます。

機能1:テキストから日記登録する様子

機能2:期間を指定して傾向分析

分析モードで複数の日を指定すると、その期間の出来事を要約して、自分が何に対してどんなことを感じやすいか傾向をまとめてくれます。

機能2:分析機能の動作

実際に1ヶ月使ってみた結果

約1ヶ月使ってみた結果です。
結構こまめに入力をして、「とりあえず最低限記録してくれればいいか」程度に思っていたのですが、想像より適切に出来事を分割して記録してくれました。
ついでに出来事に関する感情もAIが推定してつけてくれるので、出来事を振り返るだけじゃなくて、自分はこういう時にこう感じやすいんだなと自己分析が捗った気がします。

分析結果のスクリーンショット

開発体験記

環境構築編

とにもかくにもAndroidアプリ開発をするうえで、Android Studioの利用は避けては通れません。ただ、大学生の時よりPCのスペックも上がったし、なんとかいけるはず。
インストールの手順はネットで調べて分からなければAIに聞いて、すんなり完了しました。
一緒にFirebaseのアカウントも作られていて、セットアップは思ったより簡単でした。

ただ、とにかくお金周りが心配だったので、最初にChatGPTでFirebaseの料金体系を確認。
開発時のAI利用も無料内でやりくりしたかったので、仕様固めはChatGPTを使い、実装はAndroid StudioのGeminiとブラウザのChatGPT/Geminiを併用する形にしました。

要件定義編

ChatGPTと対話しながら仕様書を作成。入出力の例も含めた指示書形式でまとめていきました。

AIと要件を固めていく工程はこんな感じでした。

一度目

日記アプリをFirebaseで作る場合の構成例を教えて。日記アプリにはGeminiでチャットすると勝手に時間と出来事に分けて日記に登録される機能と、日記の単一または複数の日を指定するとその期間にあった出来事を要約してまとめて自分が何を感じて何を思いやすいか傾向をまとめてくれる機能に使います。

二度目

ありがとうございます。とても良いです。ただ要件を少し変えたい部分があります。

  • 機能1
    • ユーザーから入力された生のチャット文も保存する
    • 出力される日記はユーザーの入力によって複数件になることがある(ユーザーの入力を保存するテーブルと日記を保存するテーブルが1:Nになる)
    • 日記には、時刻(timestamp)(ただし現在時刻とは限らず、ユーザーの入力によって適切な時刻を出力する)、出来事の名前(event)、思考や状態や具体的な詳細(description)、感情(hue, saturation)(プルチックの感情の輪に従って、感情の種類をhue、感情の強さをsaturationで表現、ユーザーの入力から推論する)

三度目

ありがとうございます。では、もう一度、機能1と機能2の要件について指示書にしてまとめてください。入力例と出力例も入れて分かりやすい指示書の形にしてください。

ざっくりとした要件を伝えて、AIに構成を提案してもらい、足りない部分を追加で指示していく流れです。

ちなみに、AIは当初はGemini APIを使うつもりでいましたが、AIと話しているとFirebase AI Logicなるものがあるらしく試しに使ってみることにしました。
https://developer.android.com/codelabs/gemini-summarize?hl=ja#0

開発編

さっそく出来上がった仕様書を元にプロトタイプを作ってもらいます。

仕様書
「メモ感覚で(簡単に)日記が書ける」
「習慣の見える化で知らなかった自分に出会う」
ターゲット:日記をつけるのが苦手だけど、日記をつけたい人

# 前提条件
あなたはプロのAndroidアプリエンジニアです。プロとして、コンポーネント分けや設計、コメントなど、可読性・保守性が高く、ソフトウェア設計の重要な要点を満たしたコードを書く能力があります。また、今後、アプリ開発未経験の人が開発に携わっても問題ないように適切にコメントを残して、何を変更すれば何が変更されるかを分かりやすく書いたREADME.mdも残してください。

# 命令
以下の要件を満たす日記帳アプリを作成してください。

## コンポーネント
- テキスト入力フォーム
- テキスト送信ボタン
- テキスト送信時間
- 送信内容一覧(日記ごと)
- 日記一覧(日付ごと)
- 日記編集ボタン

## 機能
- トップページは今日の出来事の入力できる入力フォーム・送信ボタン・送信時間(デフォルトは今の日本時間、手動で変更可能)、すでに送信されたその日の送信内容一覧
- 日記一覧ページには日付ごとの日記一覧が表示されている
- 日記を選択すると過去の日記の送信内容一覧を確認・編集できる(今日の日付を選択するとトップページに戻る)
- 送信された内容ごとに色分けされて食事・仕事・趣味・移動・家事・雑務などが分かれている

## 特徴
- 毎日の記録をすることができる単純なアプリ
- シンプルな設計とシンプルなデザインで毎日の出来事を簡単に記録できるようになっている
- 過去の出来事を振り返り、自分の行動パターンや体調・メンタルの調子などを振り返ることができる
- そのときに入力できなくても、後から編集できるので、記録を忘れていても安心

いきなり完璧を目指さず、動くものを積み重ねる方針で進めました。

  1. まずは仮画面でページ遷移やボタンのクリックができるレベル
    作成途中のスクリーンショット
  2. 次に各画面の中身を固めていく
    • トップページ
    • 日記一覧ページ
    • 日記詳細ページ
    • 分析結果一覧ページ
    • 分析結果ページ
    • 設定ページ
  3. UIができたら処理の実装に入って、ボタンアクションやデータ保存等の機能を揃えていく
    • メッセージ送信で出来事を日記に自動登録
    • 各ページへ移動する機能
    • 手動での日記の登録
    • 既存の日記の編集
    • 日記一覧で日付をクリックして日記詳細ページに飛ぶ機能
    • 日記一覧で日付を複数選択して分析結果を表示する機能
    • 各日付と出来事を保存する機能
    • 分析日時と分析結果を保存する機能
  4. 最後に、気になるところを修正
    • 修正指示
      • 出来事の時間と内容は横並び
      • 内容はtitleとdescriptionに分ける
      • descriptionは1000文字を上限として、編集画面では折りたたんで表示
      • 日付は午前4時で切り替える

利点

  • 最初から何かしら動く状態から始められるので、モチベーションを維持しやすい
  • 最初に仕様書を作っておくと、途中で「あれもこれも」となりにくい
  • ページや機能ごとに区切って指示を出せると、問題が起きた時にどこが原因か分からない状態になりにくい

実際、DB周りは全く分からなかったので、AIがRepository, Entity, DataAccessObjectを分離した設計で書いてくれたのは助かりました。

課題

ただし、いくつか課題もありました。

  • 定期的にGeminiが一つのファイルで完結させようとしてくる
  • Android Studioの無料モデルでやろうとすると性能が低く、Geminiの無料APIを使っても直ぐに上限に達してしまう
  • Android StudioのGeminiは過去の会話が遡れない

AIにとっては「一つのファイルにまとめる」方が回答しやすいのかもしれませんが、後から修正したいときに困ります。理解しやすく、変更しやすい形を維持することを意識して、細かく切り分けてもらうよう指示しました。

また、ColorPickerの実装では何回修正してもらっても上手くいきませんでした。結局、自分で理解して問題を切り分けて、最後の詰めは自分で実装することで解決しました。
どうしても指示する側に知識がないと、AIは同じ修正方法を繰り返してきます。その修正方法を修正するのにGeminiのAPIを消費していく、さらに、コンテキストが長くなって1からやろうとすると過去の会話が消えてしまう、という悪循環でした。

  • 一定の知識がないと、修正指示をしても同じような対応をするばかりで思うように進まない
  • AIが書きやすい形より、後から人が手を入れやすい形になるようにした方が良いと実感

これは今回学んだ大きなポイントでした。

感想編

良かったこと

  • デザインパターンを知らない状態でも、基本構造はちゃんと作ってくれる
  • コードの理解を深めたいときにAsk機能が便利だった
  • AndroidアプリのビルドがAndroid Studioに任せっきりでできたのが良かった

困ったこと

  • 慣れないIDEは使いにくい(日本語化したい、ショートカット覚えるの面倒)
  • アイコンの設定とかGUI操作が必要な作業は、AIだとまだやりにくいと思った
  • Room(スマホのローカルDB)はGUIでDBのスキーマ変更できず、テーブルの変更が面倒だった

Androidアプリ開発経験者からアドバイス

Android開発経験者の同期からいくつかアドバイスも貰いました。

  • Android Studioで全て完結するより、別の有能なAIエディタでコーディングして、Android Studioは動作確認という開発も可能
  • 実機デバッグを使うとエミュレータの負担を軽減できる
    → これは実際に試したらとても早く、開発が快適になりました!

振り返り

作成にかかった期間はだいたい構想に1ヶ月、開発に1ヶ月くらいだったと思います。

作ったものは既に存在するようなものでしたが、スマホで動く自分だけのアプリを作れた感動は一度挫折している分、とても大きかったです。
実際に動くものを人に見せると良い感想をもらえて嬉しかったですね😊

ブラウザで動くWeb開発はDockerで簡単にできますが、公開まで含めるとネイティブアプリの方がコスト面で良いかもと感じました。

今後やりたいこと

  • まだ作りたいと思っているが実装できていない機能の追加
  • スマホならではの能力(センサーやプッシュ通知など)を使った機能の実装
  • デスクトップアプリにも興味が出てきた

まとめ

Android開発未経験でも、Android StudioのGeminiを使えばアプリは作れました!

開発中に感じたことをまとめると

  • AIが基本構造を作ってくれるので、デザインパターンを知らなくても始められる
  • 理解しやすく変更しやすい形を自分で意識することは大事
  • 問題の切り分けは結局自分でやる必要がある
  • IDE周りやGUI操作系はまだAIだけでは厳しい部分もある。

今度やるなら、別のAIエディタで開発して、Android Studioは動作確認用という形がいいかもしれません。

もし、この記事を読んで「なんだ、自分でもAndroidアプリを作れそうじゃん」と思った方は、ぜひ挑戦してみてください!きっとできるはずです。

ランサーズ株式会社

Discussion