CLAUDE LABJP
MCP — Support for the 2026-07-28 spec is rolling out across Claude. The protocol moves from bidirectional and stateful to request/response, so MCP servers can now live on serverless and edge infrastructureEXTENSIONS — Three official extensions have landed: MCP Apps for server-rendered UI, Tasks for async and long-running work, and Enterprise Managed Auth for IdP-based org-wide provisioningADOPTION — MCP passed 400 million monthly SDK downloads, roughly 4x growth this year, settling into its role as the standard way to connect agents to applicationsQUOTA — Today, August 19, is the last day of the 50 percent weekly usage boost for Claude Code subscribers. If you have long agent runs queued, this is the windowPRICING — Claude Sonnet 5's introductory rate of $2 per million input tokens and $10 output ends August 31; standard pricing of $3 and $15 takes over on September 1, twelve days outFIX — A bug where MCP v2 connections endlessly reopened subscriptions against servers with fixed timeouts is resolved, and a forward_user_identity setting was added for user attributionMCP — Support for the 2026-07-28 spec is rolling out across Claude. The protocol moves from bidirectional and stateful to request/response, so MCP servers can now live on serverless and edge infrastructureEXTENSIONS — Three official extensions have landed: MCP Apps for server-rendered UI, Tasks for async and long-running work, and Enterprise Managed Auth for IdP-based org-wide provisioningADOPTION — MCP passed 400 million monthly SDK downloads, roughly 4x growth this year, settling into its role as the standard way to connect agents to applicationsQUOTA — Today, August 19, is the last day of the 50 percent weekly usage boost for Claude Code subscribers. If you have long agent runs queued, this is the windowPRICING — Claude Sonnet 5's introductory rate of $2 per million input tokens and $10 output ends August 31; standard pricing of $3 and $15 takes over on September 1, twelve days outFIX — A bug where MCP v2 connections endlessly reopened subscriptions against servers with fixed timeouts is resolved, and a forward_user_identity setting was added for user attribution
Articles/Claude Code
Claude Code/2026-05-27Advanced

11 Days in Crashlytics: A Claude Code Debug Loop Across Two Android Wallpaper Apps

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.

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. Solo development means the same person does the triage, the implementation, and the call on whether to ship. 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 for triaging 100+ Crashlytics issues per month solo, plus the 21÷affected-users rule that tells you the date you are actually allowed to call a fix confirmed
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 →