NBUアプリ2023
NBUアプリ開発プロジェクト Advent Calendar 2023 の21日目の記事です。
11/23
一ヶ月も有ればアプリ開発できるだろう
いまからAndroid StudioをDL開始
すんなりDLできた。1GBくらいのファイル。
その際にGoogle Developer Profileが作成された。バッジを獲得。ここからアプリ開発で何かする必要あるんだろうな。
22:50
Install開始。すべての選択肢をデフォルトのままで進めた。
エラー。インストール失敗。
と思ったらAndroid Studioはインストールできてた。
Intel HAXMはエミュレータ高速化するときに必要な何かだった記憶。CPUのVT機能を切ってたかなぁ。確認して再挑戦するか。
久々にBIOSメニューを出す。方法を忘れてて苦戦。
VTはEnableにしてあった。記憶通り。以前にHAXM導入を成功してたし。
どうやらVTが有効なのでHAXMは不要の様子。
https://learn.microsoft.com/ja-jp/xamarin/android/get-started/installation/android-emulator/hardware-acceleration?pivots=windows
インストール成功。多分。ディスク容量が10GBほど減ってた。
開発環境
2015年に買ったタブレットPC
Android開発の経験
2009年NTT docomoから発売された HTC製「HT-03A」 で始める。
開発言語はJava
Google「Nexus One」も持ってるよ。個人輸入したんだったかな。
2014年の「モバイルシステム演習」って昔のカリキュラムの科目でUnityで2Dアクションゲームの制作をやってた時以来かも。9年振りか。ホント?
この科目の担当はたしか1年で外されたか科目名が「ブログラム演習3」か「プログラム演習4」に替わってAndroidアプリ開発やらなくなった気もする。
どっちにしろ完全に忘れていた。
BUNRI Questとかアプリ開発者、いろいろ昔から学生たちが頑張ってたの思い出した。
ググったら、こんな記録が残ってる。
何から始めたらいいのかさっぱり分からない。
ChatGPT4との対話から、Jetpack compose使って言語はKotlinが良さそうと判断。
2023の卒研でJavaでノベルゲームエンジン制作をサポートしててさんざんJavaを触ったからJavaはまぁいいや。
Kotlin触ったこと無いから勉強がてらやってみる。
ググったら公式チュートリアルでてきたのでそれで進める。
[Empty Compose Activity]
が見つからない。
[Empty Activity]
で試すとうまくいった。ラベル表記が変わっているらしい。
アプリ名は PipoPI にした。円周率を入力するだけのアプリ。
数字キーを電話風に並べてプッシュダイヤル音を合成して鳴らすことにした。
Android StudioのProject Windowが Loading になる。しばらく我慢強く待つと、以下の画面になった。
チュートリアルで指示されているGradleの設定は一通り済んでいる感じ。特に修正せず。たぶんJetack Composeが標準になってるんだろう。
Android Studioの再生ボタン(実行)押してしばらく待ったら Hello Android がエミュレータに表示できた。
12/21 0:37
開発環境が動いている様子なので、ChatGPT4で組み立てたコードを組み込んでみる。
何カ所か修正が必要だった。
.toShort() を .toInt()
import androidx.compose.material.Button
import androidx.compose.material.Text
などは material3.Button の様に修正
AudioTrack()コンストラクタ を AudioTrack.Builder() に変更
ChatGPT4が出力するコードは古めだった。言語やライブラリの仕様変更でエラーになる。
何とか直せた。
こいつ動くぞ!
*と#ボタンでエラー。数字キーとの場合分けをChatGPT4で書いて直した。
円周率100桁まで記憶できているChatGPT4。私の記憶とも一致したので大丈夫。たぶん。
val pi = "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679"
正しい数字を打ったときだけ表示される様子。
音が鳴らないバグ。
val combinedSample = ((sample1 + sample2).toInt() / 2 * 0x7FFF)
これだとDoubleをIntにする際に全て0になってた。わたしがChatGPT4のバグを修正する際に間違えてた。
val combinedSample = ((sample1 + sample2) / 2 * 0x7FFF).toInt()
これに修正して音声出力OKだった。
USBケーブルでAndroidスマホにアプリをインストールして動作確認できた。
ブッシュ音の代わりに適当にならしていたのを修正。
Wikipediaの画像をChatGPT4に読み取らせてコードに反映。
この画像から縦横の周波数の組み合わせと数字キーを結び付けてコードに正しく反映できた。
ChatGPT4は優秀だな。
04:24
あーあ、午前4時
眠いので寝ます。
バグが残っている。
たぶんメモリリーク。
ボタンを40回ほど押すとアプリがクラッシュして落ちる。
デザイン修正と機能追加してGoogle Playに出してみようかな。
Just Do it
翌日
アプリが落ちる原因が判明した。ボタンを押す度にAudioTrackを生成していたため。40個程度生成するとAudioTrack生成時にクラッシュしていた。
プッシュ音のAudioTrackはアプリ起動時に各プッシュ音ごとに一括して生成して、同じ数字が押されても使い回すようにコードを修正。
するとさらに落ちやすくなった。しばらく悩んで、Android Studio のDebug consoleにエラーログが出ていることに気が付く。
ボタンを何度か押した際に、AudioTrackが再生成されている。おかしい。
原因はChatGPT4の作ったAudioManagerを初期化する場所が駄目だった。
初期化コードを@ComposableなUIコンポーネントのコンストラクタ内に記述したため、UIが再生成された際にAudioTrackも再生成されて落ちていた。
初期化コードをMainActivityのonCreateメソッドに移動して問題解決。ボタンを連打してもクラッシュしなくなった。
ボタンと数字、ナンバー表示欄を画面サイズにフィットするようにコードを調整
円周率100桁入力後にモーダルを表示してゲームの終了と再スタートをできるようにした。
この状態になるまでのコードの99%をChatGPT4で生成できた。
苦戦したところは
KotlinやJetpack composeの旧APIや仕様からの変更した際の私の修正ミス
AudioTrackを毎度生成していたのでボタン連打でクラッシュするのに対応。原因を突き止めるのに手間取った。
AudioTrackの初期化コードの配置場所の私の修正ミス
完全にChatGPT4だけで完成形にまでコードを仕上げるのは大変そう。
コードスニペットを出力させて、ある程度は手動で組み込んで行くとよい。
この過程を資料として示す予定だったが、ChatGPT4とのやり取りに画像を含めたため共有リンクが作成できなかった。
だいたい完成した円周率をプッシュフォン風UIで打ち込むだけのアプリ「PipoPI」のコード
99%ChatGPT4で生成。
質問を重ねてコードを修正していった。修正前のコードはコメント、あるいは未使用メソッドとして残してある。
不要なコードを削除して整理しておいた。
Android Studioでプロジェクトを作成してアプリ名を PipoPI にする。
MainActivity.kt を以下のコードにすると動く筈(未確認)