AI Studio で作ったアプリを自分の端末に入れたら署名が合わないと弾かれた話
AI Studio で生成した Kotlin/Compose アプリを USB で実機へ転送したら INSTALL_FAILED_UPDATE_INCOMPATIBLE で弾かれる——。Google Play 公開済みアプリと同じパッケージ名のデバッグ署名ビルドを上書きできない理由と、本番アプリを消さずに試す手順をまとめます。
翻訳済みの一行が、いつの間にか英語へ戻っていた — エージェントが触った文字列リソースを差分で守る
エージェントに values フォルダの整理を任せると、訳済みの値が静かに原文へ戻ることがあります。既定言語を正、各ロケールを差分として鍵単位で突き合わせ、欠落・戻し訳・書式引数の崩れだけを pre-commit で止める設計と実装をまとめました。
日付が変わった瞬間に、昨日の壁紙がもう一度出た — 時刻処理をエージェント任せにしないための日付境界設計
毎日入れ替わる壁紙が、日付の変わり目に昨日と同じものを出したり、海外移動中の利用者だけ二回切り替わったりしていた問題を、端末時計・タイムゾーン・夏時間の三つに分けて設計し直した記録です。エージェントが書いた素朴な時刻コードのどこが本番で崩れるか、安定した日付キーの作り方、巻き戻し時計への防御、注入可能な時計でのテストまでを個人開発の視点でまとめました。
お気に入りを一つ押すたびに、見えている壁紙が全部描き直されていた — Compose の再コンポーズを実測で止めた記録
壁紙アプリのグリッドで、お気に入りを一つ切り替えるたびに可視サムネイル全件が再コンポーズされていた問題を、Composition Tracing で実測してから直した記録です。不安定な引数の特定、データモデルの安定化、ラムダと派生状態の扱い、修正前後の再コンポーズ回数の比較までを個人開発の視点でまとめました。
三つの経路がそれぞれ番号を振っていた — versionCode を単一の真実から決めて配信を止めない設計
AI Studio がワンプロンプトでアプリを生成し Play の内部テストへそのまま上げられるようになった結果、人手・CI・エージェントの三経路が別々に versionCode を採番して衝突するようになりました。番号を単一の真実から決め、アップロード前に照合するガードまでを実装つきで整理します。
生成から実機、内部テスト配信まで一手でつながった日に、私が手放さなかったもの — AI Studio の一気通貫を個人開発の配信フローに据える
AI Studio がテキストから Kotlin/Compose アプリを生成し、エミュレータ・実機・Play 内部テストまで一画面でつなぐようになりました。便利さの裏で「配信の瞬間」をどこまで機械に預け、どこを自分の手で握るか。個人開発で複数アプリを抱える立場からの線引きと、その境界を支える実装をまとめました。
レビュー導線を出したのに何も表示されない — Play In-App Review の数量制限と「表示保証なし」前提の設計
Play In-App Review API は launchReviewFlow が成功しても、ダイアログが表示されたとは限りません。数量制限・表示保証なし・テストでの無音化という3つの罠を解きほぐし、満足の瞬間に出して衝突を避ける発火設計を、Antigravity に実装させる手順とあわせて記録します。
インストール直後だけ起動が一拍遅い — Baseline Profile で Android のコールドスタートを実測で詰めた手順
更新直後やインストール直後だけ Android アプリの起動が一拍もたつく原因を JIT と Cloud Profile の観点で切り分け、Baseline Profile でコールドスタートを実測で詰めた手順を、Macrobenchmark の構築から段階公開での監視まで個人開発の視点でまとめました。
リリースビルドだけで落ちる — R8 フルモードが Gson のマッピングを壊したときの調べ方と直し方
デバッグでは動くのにリリースだけでクラッシュする。R8 フルモードが Gson のリフレクションを壊す典型と、mapping.txt を使った原因特定、keep ルールの最小化までを実装視点でまとめます。
アプリ内の言語切り替えを、端末の言語設定と切り離して実装する — Android Per-App Language の実装メモ
Android のアプリ内言語切り替えを AppCompatDelegate.setApplicationLocales と locales_config で実装する手順と、API 33 未満の互換・プロセス再生成・AdMob まわりの落とし穴を実装視点でまとめた記録です。
壁紙ビューアのスライドショーとページ送りスクラバーを iOS から Android へ逆移植する — SnapHelper との双方向同期でつまずいた点
iOS 版の全画面壁紙ビューアにあったスライドショーと下部スクラバーを Android へ逆移植した実装記録。RecyclerView と SnapHelper で現在ページを確定させ、スクラバーと双方向同期し、自動送りとユーザー操作の競合を状態機械で解いた手順を Kotlin の動くコードで共有します。
戻るボタンで広告が出る/出ないが安定しない — 入れ子のifを独立ガードのリストに作り替えた記録
戻るボタン直後にインタースティシャル広告が稀に重なる不具合を、入れ子の if から理由を返す独立ガードの並びへ作り替えて解決した記録です。評価順序の明示、決定表を起点にしたテスト生成、複数の壁紙アプリへ展開したときに効いた点までまとめました。