CLAUDE LABJP
FORK — Claude Code 2.1.212 changes what /fork does: it copies your conversation into a new background session with its own row in claude agents, so you can keep working. The old in-session subagent is now /subtaskLIMITS — WebSearch calls are now capped at 200 per session by default, and subagent spawns get the same 200 ceiling, so a runaway search or delegation loop stops on its ownMCPBG — MCP tool calls running past two minutes now move to the background automatically, keeping the session usable. Tune the threshold with CLAUDE_CODE_MCP_AUTO_BACKGROUND_MSPLANFIX — Fixed plan mode auto-running file-modifying Bash commands such as touch and rm without a permission prompt or an SDK canUseTool callbackSONNET5 — Claude Sonnet 5 is running on introductory pricing of $2 per million input tokens and $10 per million output. After August 31 it moves to $3 and $15IPO — Bankers are reportedly lining up investor meetings for Anthropic ahead of a possible public listing as soon as OctoberFORK — Claude Code 2.1.212 changes what /fork does: it copies your conversation into a new background session with its own row in claude agents, so you can keep working. The old in-session subagent is now /subtaskLIMITS — WebSearch calls are now capped at 200 per session by default, and subagent spawns get the same 200 ceiling, so a runaway search or delegation loop stops on its ownMCPBG — MCP tool calls running past two minutes now move to the background automatically, keeping the session usable. Tune the threshold with CLAUDE_CODE_MCP_AUTO_BACKGROUND_MSPLANFIX — Fixed plan mode auto-running file-modifying Bash commands such as touch and rm without a permission prompt or an SDK canUseTool callbackSONNET5 — Claude Sonnet 5 is running on introductory pricing of $2 per million input tokens and $10 per million output. After August 31 it moves to $3 and $15IPO — Bankers are reportedly lining up investor meetings for Anthropic ahead of a possible public listing as soon as October
Articles/Claude Code
Claude Code/2026-05-27Advanced

11 Days in Crashlytics: A Claude Code Debug Loop on a 50M-Download Android App

After shipping Beautiful Wallpapers v2.0.0 and Ukiyo-e Wallpapers v1.7.0 in early May, Crashlytics and Play Console threw more than 30 new issues at me in 11 days. This is the operations log of how I drove the fix list down to v2.1.1 / v1.8.1 using Claude Code as a triage partner.

claude-code129crashlyticsandroid9debugging8indie-dev14maintenance

Premium Article

On the evening of May 19, after I had just about finished writing the v2.1.1 hotfix for one of my Android wallpaper apps, I checked Play Vitals while making coffee. The "user-perceived crash rate" had climbed to 1.08%. Google's "bad behaviour" threshold sits at 1.09%. 0.01% to spare.

I am Masaki Hirokawa. I've been building iOS and Android apps as an indie developer since 2014, with about 50 million downloads in total across the catalogue. The two flagship wallpaper apps (Beautiful 4K/HDR Wallpapers and Ukiyo-e Wallpapers) had just gone through a major refresh in early May (v2.0.0 / v1.7.0), and Crashlytics afterwards looked like a fireworks display of new issues. Over 11 days I worked through 30+ stack traces, committed fixes for 13 of them, and parked 6 as "won't fix" because they live inside the OS or third-party SDKs. This article is the working log of that period, told through how I used Claude Code as a triage partner.

If you keep Crashlytics open every morning but feel a quiet pile of "I'll get to it later" stack traces accumulating, or you've ever scrambled a hotfix because Play Vitals nearly tripped on you, this is for you.

The 11-day map — what got fixed, what didn't

Here's the high-level path from v2.0.0 release through v2.1.1 submission.

  • 5/12 (Day 1) — Triaged 12 new Crashlytics issues post-v2.0.0. Found RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline IOOBE climbing through 50+ users over 28 days
  • 5/13 (Day 2) — Caught j.u.function.Supplier NoClassDefFoundError killing every Android 6.0.1 user 3 seconds into the app. Single-line fix: enable coreLibraryDesugaringEnabled
  • 5/13 (Day 2, afternoon) — Untangled Gallery.onResume's nested back-press logic, where rewarded-ad inducement was always beating regular interstitials on back
  • 5/14–18 (Day 3–7) — Shipped v2.1.0, observation window. BW-015 (PageJumpSlider NPE) climbed from 1 user to 9. BW-009 (R8 strict mode + density split stripping a drawable) kept firing
  • 5/19 (Day 8) — The 1.08% spike. Killed ViewPager2 internal RecyclerView fling-time IOOBE (BW-017) with two lines of setItemAnimator(null) + setHasFixedSize(true). Replaced a 220KB JPG Glide placeholder with an XML ColorDrawable to kill the synchronous decode ANR (BW-027)
  • 5/22 (Day 11) — Reproduced an API 37 emulator silent UX bug where Material You's overlay regeneration recreated CategoryActivity to a blank screen, and added graceful finish() fallback
  • 5/25 (Day 14) — Re-audited Play Console + Crashlytics end to end. Pulled the hotfix forward instead of waiting for the July targetSdk 37 bundle
  • 5/27 (Today) — Submitted v2.1.1 / v1.8.1 for Play Store review

In that period I started 27 Claude Code sessions, 30 minutes to 2 hours each. One discipline I learned: don't mix "writing code" and "reading Crashlytics" inside the same session. More on that later.

How I shape a stack trace before showing it to Claude Code

A Crashlytics or Play Console crash detail page gives you 200–400 lines of raw stack. Pasting that wholesale burns context and produces vague hypotheses. I've settled on this 4-block format before I ever hit enter:

## Environment
- App: Beautiful Wallpapers v2.1.0 (vc=49)
- Device: Sharp AQUOS wish4 (DOCOMO SH-52E)
- OS: Android 15 (SDK 35)
- Impact: 117 events / 99 users in 7 days (74.4% of all crashes)
 
## Top 5 frames (only the ones I think matter)
RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline (line 7160)
LinearLayoutManager.scrollBy
RecyclerView.scrollHorizontallyBy
RecyclerView.scrollStep
RecyclerView$ViewFlinger.run
 
## Message
Inconsistency detected. Invalid item position 1(offset:1).state:1030
 
## My matching row in the known-patterns lookup
- "Fling-time IOOBE inside ViewPager2's internal RV"
- Candidate fixes: setItemAnimator(null), setHasFixedSize(true), kill Predictive Animation
 
## What I think I'd touch
In ThumbnailActivity, after mViewPager.setAdapter(...), grab
mViewPager.getChildAt(0) and tune the internal RecyclerView.
Apply preventively in Gallery too.

Writing my own 3-line hypothesis before pasting the trace tilts Claude Code's output away from "80% explanation, 20% code" toward "here is the patch." In maintenance work, the latter is what I need.

With that input shape, Claude Code reliably comes back with something like this:

// Inside ThumbnailActivity#ThumbnailPager.start()
mViewPager.setAdapter(mAdapter);
View inner = mViewPager.getChildAt(0);
if (inner instanceof RecyclerView) {
    RecyclerView rv = (RecyclerView) inner;
    rv.setItemAnimator(null);          // suppress Predictive Animation state drift
    rv.setHasFixedSize(true);          // skip notebook-style re-measurement
}

That is the exact patch I shipped in v2.1.1. Before: 117 events / 99 users in 7 days, 74.4% of total crashes. After: projected crash-free user rate to climb from 97.98% into >99% territory.

setItemAnimator(null) has side effects. In my case, the PageJumpSlider drag started calling setCurrentItem(largePosition, false) against a LayoutManager that now skipped remeasurement, and the wallpaper would silently stop changing (BW-032). Asking Claude Code "what changes when I disable ItemAnimator on a ViewPager2's internal RecyclerView, any side effects?" up front would have caught this in advance.

Thank you for reading this far.

Continue Reading

What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.

WHAT YOU'LL LEARN
A repeatable loop for pasting raw Crashlytics stack traces into Claude Code and grinding ViewPager2 internal RecyclerView IndexOutOfBoundsException and Glide synchronous-decode ANRs down to reproducible, fixable patterns
How to decide what goes into a hotfix and what gets deferred when Play Vitals user-perceived crash rate sits 0.01% below the 1.09% threshold — setItemAnimator(null), R8 keep.xml, and ColorDrawable placeholder choices explained from production data
A known-bugs-tracker pattern, distilled from a 50M-download portfolio, that lets one indie developer triage 100+ Crashlytics issues per month and decide which to fix, which to watch, and which are honestly the SDK's problem
Secure payment via Stripe · Cancel anytime

Unlock This Article

Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.

or
Unlock all articles with Membership →
Share

Thank You for Reading

Claude Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • Copy-paste ready implementation code
  • New advanced guides published daily
  • $5/mo or $10 for lifetime access
View Membership →

Related Articles

Claude Code2026-05-27
How Claude Code Helped Me Kill a Glide 5.0.5 Java 8 Crash with One Line
After Beautiful HD Wallpapers v2.0.0 shipped, every Android 6.0.1 user crashed within 3 seconds. The fix turned out to be a single missing line in build.gradle.kts — and Claude Code is what got me there.
Claude Code2026-05-16
How I Fixed Android RecyclerView Crashes in 28 Days Using Claude Code
After releasing v2.0.0 of Beautiful HD Wallpapers, RecyclerView IndexOutOfBoundsExceptions hit 50+ users over 28 days. Here's how a conversation with Claude Code uncovered the root cause — a defensive copy pattern.
Claude Code2026-06-12
Fixing Overlapping Paywall and Review Dialogs on Android with a Central ModalGate
How I fixed three dialogs — paywall, review prompt, and rewarded-ad promo — stacking on top of each other with a priority-based central gate, plus the three dismiss-leak paths a Claude Code design review uncovered.
📚RECOMMENDED BOOKS
Build a Large Language Model (From Scratch)
Sebastian Raschka
LLM Dev
Prompt Engineering for LLMs
Berryman & Ziegler
Prompting
AI Engineering
Chip Huyen
AI Eng
* Contains affiliate links
See all →