← Back to Blog

Week in Review: Apr 20 - Apr 26, 2026

3 min read By Charles

This week was all about getting our development environment back on track after a series of issues with our emulators and build process. The biggest win was finally resolving the emulator boot issue that had been plaguing us for days, which involved a deep dive into the intricacies of Android emulation and CPU coordination.

Emulator Troubleshooting

The journey to getting our emulators up and running was not an easy one. Initially, we were stuck with 0 out of 4 emulators online, and the error messages were not very helpful. After some digging, I discovered that the issue was related to the way we were launching the emulators using budtmo/docker-android. Specifically, the -gpu swiftshader_indirect flag was causing the emulator to get stuck pre-boot. Switching to -gpu swiftshader and adding a few other flags (-no-snapshot, -wipe-data) did the trick. I also created a new script bring-up-emulator.sh that automates the process of booting up an emulator, which has been wired into our verify-app.sh script.

One of the interesting challenges we faced was coordinating CPU resources between our emulators and other build processes. To address this, I implemented an adaptive load-wait mechanism using with-emulator.sh, which pauses our video processing service (tdarr) and holds gradle build slots to prevent concurrent builds from starving the emulator. This approach has been working well so far, with emu-1, emu-2, and emu-3 booting up successfully in around 60 seconds each.

AdMob Integration

Another significant area of focus this week was resolving AdMob integration issues across several of our apps. We had a batch of 11 apps that were crashing due to unregistered AdMob IDs, which I was able to fix by swapping out the IDs with Google sample IDs (~3347511713). This temporary fix allowed us to get the apps up and running, but we’ll need to register each package in the AdMob console before pushing them to production.

I also spent some time debugging a specific issue with our tally-counter app, which was experiencing an IllegalStateException due to an unregistered AdMob ID. After fixing this issue, I noticed another bug related to React hooks ordering, which is still pending resolution.

Infrastructure Cleanup

In addition to the emulator and AdMob work, we did some much-needed infrastructure cleanup. Our cron daemon had died after 8 hours of downtime, causing several jobs to miss their scheduled runs. After re-running the missed jobs, I noticed that our heartbeat.sh script was silently exiting due to a pipefail issue. Adding a simple || true fix resolved this problem and allowed us to complete all 15 checks.

We also took care of some container configuration issues, setting unless-stopped on 12 containers to prevent them from staying down after an Unraid reboot. This should help improve the overall stability of our development environment.

Looking Ahead

As we head into the next week, my top priority is to tackle the remaining infrastructure issues, including getting emu-4 up and running and resolving the intentional production push for v1.0.0+. I’ll also be diving deeper into the React hooks ordering issue in tally-counter and exploring ways to optimize our build process further.

In terms of new features and apps, we have several projects in the pipeline that are nearing completion. One of these is a new utility app that’s been undergoing testing on our emulators, which I’m excited to share more about soon. We’re also making progress on a game side project, where we’re experimenting with AI content generation techniques to create more engaging gameplay experiences.

Overall, it’s been a productive week at GriswoldLabs, and I’m looking forward to tackling the challenges ahead and sharing more updates with our community in the weeks to come.

Enjoyed this post?

Subscribe to get notified when I publish new articles about homelabs, automation, and development.

No spam, unsubscribe anytime. Typically 2-4 emails per month.

Related Posts