android向けアプリ開発にはclaude code

こんにちは、はむたまです。
最近開発していないぁとふと寂しく思ったので、個人開発をすることを始めました。アプリ開発自体は過去にやったことがあったので記憶を遡れば書ける元エンジニアです。

ですが、いざ書き始めると全然キー打ちが進まない。
そこでアプリ開発をする上で要件定義からリリースまでの流れを生成AIの力を借りながら進めました。今回はその時の内容をまとめます。

概要

元エンジニアが日常で困りごとを個人アプリ開発で悩みを改善することで、楽をしようとするものです。バリバリのアプリ開発時期から5年も経っているため、生成AIの力に頼って開発した模様をお届けします。

この記事を読んでわかること

  • Android向け(google playstoreにて提供)アプリは意外と作りやすい
  • codingにおいてはgeminiよりclaude code
  • .kts, README.mdなど必要な成果物の注意事項

もしよければ最後に公開されたらアプリのリンクを貼っておきますので、ダウンロードしてみてください。

本題

企画段階

アプリ開発をしようとしても何を作るか決めないことには始められません。多くの方は誰かから依頼されたことに対して成果物としてアプリを提供することでしょう。仕事としての開発はちょっと遠慮したいので、自分が欲しいと思うアプリを開発することで、開発体験を味わいつつ自分にとってもメリットのある状況を作ろうと思います。

最近悩んでいること

最近何か困っていることないか?と自問自答しました。

  1. 物価、金利が上がってきて月額住宅ローン返済、家賃が上がってきたけどいくらが妥当なんだろうか
  2. 買い物に行った際に冷蔵庫に調味料や買い溜め商品が残っているか忘れる
  3. バスの時刻表を読んでも実際にバス停に到着するバスは必ずしも一致しない
  4. 家の周りでタバコを吸う人がいて、副流煙が迷惑であるが管理会社が対応しないこと
  5. 気温の上下が激しくてエアコンのオンオフを決めかねる
  6. 部屋の掃除をいつやったか忘れる

こんなところかなーと思います。
解決策として、以下の軸で検討しました。

  • 解決案が思いつくこと
  • アプリの実装イメージがつくこと
  • 大規模ではなく個人開発の範疇で対応可能なこと
  • 作ってみて誰かの悩みを解決すること

4以外は個人でも対応可能です。天気は個人で決めかねるので5も難しい。バスの時刻表は汎用性が低いので3も違いました。
1,2,6は開発しやすいかなと考えます。

いずれも作っていこうと思うのですが、とっかかりやすい6. 部屋の掃除をいつやったか忘れるを改善していこうと思います。

要件定義段階

システム開発の要件定義として機能と非機能を決めます。今回の部屋の掃除をいつやったかクリアにすることについて要件をまとめました。
◯機能要件

  • いつ掃除したかわかるもの
  • 部屋の間取りに対してどこを掃除したかGUIで設定できること(間取りモード)
  • 掃除対象を一覧化してリスト形式で確認できること(リストモード)
  • 別のユーザと情報をシェアできるような仕組みを持つこと
  • UI/UXの観点を持ってユーザ(私)が選択に困らないこと
  • 誤設定に対してリカバリが可能であること
  • 掃除完了ボタンによって最新更新日時が記録されること
  • 最新更新日時に対して個人で設定した日付を過ぎた場合に赤くなること
  • 最新更新日時の日付に対して設定した日付に近くなったら黄色くなること
  • 掃除周期を設定、変更できること
  • 部屋の数や間取りをGUIベースで増減できること
  • 間取りの簡易図に掃除対象を配置できること
  • ユーザが設定したjsonデータを入力/出力できること
    ◯非機能要件
  • インターネットに情報を公開しないこと
  • DBにデータを格納せず端末固有のローカルデータであること
  • アプリとの接続が切れてもデータを保持できること
  • ビルド時に署名により改ざんを検知できること
  • 複雑な処理を避けて各操作が1s以内にレスポンスが返ってくること
  • ソースコードを資材管理ツールで管理し、変更履歴を追えること

かいつまんで要件定義をするとこんな感じでしょうか。
私の中で必要そうなことを盛り込んで作ってみました。リリースしてからコメントや意見をもらったら要件定義の中身に加えて変更管理していく想定です。

設計段階

要件に対して設計を頑張るのは技術者の腕の見せ所です。でも今回は早く簡単にデプロイ体験ができることを目指しているので、こだわりません。
まずは動くもの、要件に沿っていなければ修正を加えることを繰り返す形です。
Android Studioを開発端末にインストールしてプロジェクトを立ち上げました。

project名、package名と決めるべきことを順々に決めていけば単純です。型が決まれば肝となるアプリ開発です。
まずは動くものということでgeminiに要件を伝えてソースコードをはいてもらいました。確かにそれっぽいものは出てくるので、便利には違いありません。しかし最初に伝えた要件や修正が走るたびに議論した内容が抜け落ちるといった新人エンジニアと会話するような始末です。私は要件を正確に伝えているのに、議論を積み重ねて正確なアウトプットを出すことが苦手なようです。

そこでclaude codeを使ってみました。使用感は別にgeminiと違いはありません。しかしアウトプットの質は圧倒的に高いです。エラー解消にエラーログと該当ファイルを渡せば変更前後の差分と完全修正版を回答してくれます。ただgeminiに比べてclaude codeは無料枠のトークンの消費が激しいのが難点です。1日に何回かやり取りをすると枠がなくなり、会話ができなくなります。
1日あたりの開発時間に余裕はなかったので、トークンがなくなったら辞める方針で開発してました。それでも三日程度で合計3hくらいで開発を完了できました。

試験段階

開発できたものを単体テストするのは個人開発において試験効率が悪いです。まずは動くものを作ってエラーをなくすことが最速でデプロイするには必須です。そこでandroid studioのエミュレータでandroid端末を起動して、操作感を確認していきました。この辺りは生成AIに任せるより、自分で使ってみてイメージと違ったことがないか、改善案を考えるのが必要です。
またエミュレータでやるだけでなく、自分のスマホにもインストールして見ることが大切だと感じます。やはり作って終わりではなくて、自分が使う時にセキュリティ/性能において問題があると使いたくありません。なので一生懸命エラーがなくなるように生成AIと会話していきます。

リリース段階

リリースはandroid studioに提供することです。まだ完了しておらずこの段階で執筆中です。
私はこの段階でかなり苦労をしたので、特に細かく残していきます。

リリースまでの流れ

  1. google consoleにアカウントを作成すること
  2. android studioにてビルド時にデジタル署名を加えること
  3. 公開鍵証明書を作成し、アップロード

参考)https://developer.android.com/studio/publish/app-signing?hl=ja

Android Studioにてビルド

android端末にリリースするアプリとして今回はkotlinで開発をしていました。build形式としてapk形式とaab形式があります。単純にアプリの動作確認をするだけならapk形式でのビルドで問題ありません。
google playstoreで誰もが使えるようにするにはaab形式でビルドする必要があります。

ビルド時にデジタル署名を加えること

android studioにて開発者である私が実装したことを証明する、ユーザに提供した際にまで勝手な改ざんがかかっていないことを証明するために必要です。
jks形式のjava keystoreファイルを使う必要があります。これには開発者の名前やパスワード、aliasを設定します。このファイル無くすと再生成が必要になるため絶対に無くしてはいけません。またデジタル署名の期間を変更できるのですが、default25年になっています。

私は5年にカスタマイズしてビルドしたらgoogle console側で弾かれました。google側で署名の保証期間が短いと受け入れてもらえないようです。単純に25年で良いかとおもます。

公開鍵証明書を作成し、アップロード

ターミナルでコマンドを実行しpemファイルを出力します。

$ keytool -export -rfc
  -keystore your-upload-keystore.jks
  -alias upload-alias
  -file output_upload_certificate.pem

自分で作成したjksやpemの名前を指定して、出力します。
この証明書をgoogle consoleにあげることでデプロイができます。

そのあとはgoogle側での内部テストやオープンテストが走るのですが、まだ完了していないため、追って更新します。

こんな感じで開発をしていきました。
気になることがあればコメントをお待ちしております。

ではでは。

コメントする

上部へスクロール