◉ANTIGRAVITY LABEN
記事一覧/アプリ開発
▣ アプリ開発/2026-05-10中級

古いアプリの保守をAntigravityに任せて、手元に残した三つの判断

長く運用している壁紙・癒し系アプリの保守を、Antigravityにどこまで任せられたか。クラッシュ修正と段階公開の実録をもとに、任せた作業・手元に残した作業の線引きと、文脈メモの書き方を共有します。

Antigravity385個人開発107保守リファクタリング3実体験8AdMob13

✦ プレミアム記事

先月、Android 版の壁紙アプリでクラッシュの報告が続きました。

原因を追うと、RecyclerView の更新中にリストが書き換わり、IndexOutOfBoundsException が出ている箇所でした。28日間で50人以上のユーザーが影響を受けていた計算です。

直し方は分かっていました。ただ、同じ構造の画面が複数のアプリにあり、一本ずつ手で直す気力が先に削れていきました。

そこで保守作業の一部を Antigravity に渡してみました。実際に渡した作業、渡さなかった作業、そしてその境目で私が何を考えたかを書き残します。

まず、修正そのものは任せられました

RecyclerView の件は、更新時に渡すリストを防御的にコピーする修正で根治しました。この修正を一つのアプリで確定させてから、エージェントに「同じ差分を、似た構造の画面に、各アプリの命名規則を尊重して当てはめてほしい」と依頼しました。

// 解決したいこと: 更新中に元リストが書き換わっても、描画側が落ちないようにする
// Before: 呼び出し元のリストをそのまま保持していた
class WallpaperAdapter(private var items: MutableList<Wallpaper>) :
    RecyclerView.Adapter<WallpaperHolder>() {
    fun update(newItems: MutableList<Wallpaper>) {
        items = newItems          // 呼び出し元が後から変更すると、描画中に範囲外アクセスが起きる
        notifyDataSetChanged()
    }
}
 
// After: 受け取った時点で防御的にコピーし、描画側は自分のコピーだけを見る
class WallpaperAdapter(items: List<Wallpaper>) :
    RecyclerView.Adapter<WallpaperHolder>() {
    private var items: List<Wallpaper> = items.toList()
    fun update(newItems: List<Wallpaper>) {
        items = newItems.toList() // なぜ: 所有権をアダプタ側に閉じ、外からの変更を遮断する
        notifyDataSetChanged()
    }
}

エージェントは「アプリごとに AdManager と AdvertisingService で名前が違うので、それぞれ合わせて変換した」と報告してきました。手で行えば、必ず1〜2本は取り違えていたと思います。

この種の作業は、同じ形が三回以上現れて、結果が数値で測れるものです。クラッシュ数が下がったかどうかは、リリース後のダッシュボードが答えてくれます。

一行で消えたクラッシュが、いちばん手強かった

もう一件、別種のクラッシュがありました。

Glide を 5.0.5 に上げ、Android Gradle Plugin も 9 系に揃えたところ、Android 6.0.1 の端末だけが NoClassDefFoundError で落ちました。Java 8 の Supplier が見つからない、というものです。

エージェントに原因を尋ねると、候補をいくつも挙げてきました。ライブラリの固定、minSdk の引き上げ、問題の呼び出しの回避。どれももっともらしく、どれも広く影響が出る案です。

最終的な解決は、coreLibraryDesugaringEnabled true の一行でした。古い端末でも新しい API が使えるよう、ビルド時に変換する設定です。

ここで学んだのは、エージェントは「直す案」を網羅的に出すのが得意で、「何を変えずに済ませるか」の選択は苦手だということです。minSdk を上げれば、古い端末のユーザーを手放すことになります。それはコードの問題ではなく、運営の判断です。

私は一行の案を選び、他の案は却下の理由と一緒にメモへ残しました。

✦

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦読後に、自分の古いリポジトリで「エージェントに渡してよい作業」と「手元に残す作業」を三つの問いで仕分けできるようになる
✦読後に、エージェントが善意で消してしまう回避策コードを守る、3〜4文の文脈メモを書けるようになる
✦読後に、段階公開(5%→25%→50%→100%)の各段階で見るべき数値と止める基準を、リリース前に決められるようになる
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Antigravity Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

▣ アプリ開発2026-05-21
Firebase Remote Config と Antigravity Agent で AdMob 配置を実運用しながら微調整する設計
壁紙アプリの AdMob 収益が頭打ちになった経験から、Firebase Remote Config と Antigravity Agent を組み合わせて広告配置を実運用中に少しずつ最適化する仕組みをまとめます。
▣ アプリ開発2026-10-15
immutable を付けた資産を同じ URL で差し替えたら、利用者のブラウザだけが古いままでした
長期キャッシュを付けた JS を同じ URL で差し替えても、CDN をパージしてもブラウザは取り直しません。同じ URL・no-cache・クエリ付き・内容ハッシュ名の 4 方式を Chromium で並べて比べ、ビルドの最後にハッシュを付ける完全なスクリプトまでをまとめました。
▣ アプリ開発2026-09-29
Cloudflare をパージしても古い壁紙が届き続けた原因は、オリジン側で JPEG を握っていた XPageSpeed
同じ URL に上書きした壁紙画像が、Cloudflare をパージしても古いまま届き続けた運用の記録です。ローカル・オリジン・エッジの三者を突き合わせて層を名指しする検査、プレフィックスパージの使いどころ、Xserver の XPageSpeed を .htaccess で安全に切る書き方まで扱います。