📝 Today’s focus: Joyframe proved reusable beyond BoatBrawl, and BoatBrawl itself was adapted for Fire TV Stick with Kotlin-first, data-driven design.
🔧 Performance: Muffle moved to GeofencingClient, while Punish and Coinly stress testing real release builds, background transitions, and OEM power limits.
🏗 Architecture: Posts compare MVI vs MVVM and gRPC vs REST, and also cover a personal Kotlin stack, JCOReflector, TBEG, and a multiplatform date picker.
✅ Quality: Coinly, Punish, and the content-container crash all show that passing debug tests does not guarantee safe release behavior.
🚀 Language: Kotlin 2.4 discussion centers on stable context parameters, explicit backing fields, and clearer function capabilities for future development.
01
Two 3D games in two hours, and our boat game on Fire TV: life after Shipaton with Kotlin Multiplatform
Dev.to Kotlin作者:Rehaan Cubes發布:10-06 09:03
Two 3D Games in Two Hours, and BoatBrawl on Fire TV: Life After Shipaton with Kotlin Multiplatform
Shipaton is over, but Joyframe is not a hackathon project.
重點摘要
Joyframe powered two new games, Island Panic and SkyFall, each built in about an hour with Claude Code.
BoatBrawl was adapted to run on Amazon Fire TV Stick with a dedicated low-power profile.
The post details Joyframe’s plain-Kotlin scene model, generated art and audio, off-screen rendering, and controller support.
展開詳細摘要
This post looks at life after RevenueCat’s Shipaton for BoatBrawl and its supporting library, Joyframe. Joyframe was tested by building two unrelated games, Island Panic and SkyFall, both created in about an hour with Claude Code, showing that the library can handle non-boat games too. The article also describes how BoatBrawl was brought to Amazon Fire TV Stick by adding a low-power profile that lowers render resolution, limits effects, moves simulation work, and fixes remote-input handling. Along the way, it explains Joyframe’s Kotlin-first approach: data-driven scenes, generated models and sound, off-screen rendering for verification, and phones as controllers.
两小时做出两款 3D 游戏,并把 BoatBrawl 带到 Fire TV:Kotlin Multiplatform 在 Shipaton 之后
Shipaton 已经结束,但 Joyframe 不是一个黑客松项目。
重點摘要
Joyframe 被用来在大约一小时内完成 Island Panic 和 SkyFall 两款新游戏。
BoatBrawl 新增了 Amazon Fire TV Stick 支持,并切换到专用的低功耗配置文件。
5 Android bugs my tests didn't catch while shipping an expense tracker
Dev.to Kotlin作者:Rao Asad發布:10-06 10:58
5 Android bugs my tests didn't catch while shipping an expense tracker
These five bugs all reached real builds—and a couple reached real users—despite a reasonable test suite.
重點摘要
Gson fields renamed by R8 can silently deserialize to defaults in release builds.
StateFlow.value can stay at the initial value unless the flow is actually collected.
SharedFlow with replay = 0 can drop navigation events when the app is not foregrounded.
展開詳細摘要
Over several months shipping Coinly, an Android expense tracker built with Kotlin, MVVM, coroutines, Flow, Room, Gson, and R8, the author hit five production bugs that tests never caught. They included Gson fields broken by R8 renaming, StateFlow values stuck at their initial state because nothing collected them, and a splash screen that could hang forever when a one-shot navigation event was dropped. Other issues came from Android App Bundle language splitting and a Crashlytics report caused by Google Play’s pre-launch robot. The post argues that debug tests and screen-only smoke checks are not enough, and recommends testing minified release builds, installing from Play, exercising background/foreground transitions, and paying attention to device names in crash reports.
If you fail, you owe money to the cause you hate most. So every screen-time bug in my app is a billing bug
Dev.to Kotlin作者:Itai Hoffman發布:10-06 11:21
If You Fail, You Owe Money to the Cause You Hate Most
So every screen-time bug in my app is a billing bug.
重點摘要
Punish charges users when they exceed a self-set screen-time goal and donates the stake through every.org.
The Android implementation prefers under-counting; unknown states are reported as unknown instead of zero.
The app combines UsageStatsManager, event-stream walking, accessibility-based browser tracking, and watchdog logic to handle platform quirks.
展開詳細摘要
This article describes Punish, an Android app that turns screen-time limits into financial penalties for causes users dislike. Because an inaccurate count could wrongly send money or weaken the deterrent, the app’s guiding rule is to under-count when unsure and report unknown when measurement fails. The author explains several Android pitfalls: UsageStatsManager overcounts foreground time, STOPPED events arrive late, midnight boundaries and device shutdowns need special handling, and missing permissions can look like zero usage. For web tracking, the app reads browser address bars through an AccessibilityService, throttles content events, and treats browser detection and URL parsing carefully. Since accessibility services can die silently, the app records coverage windows so missed time is treated as unmeasured, not used.
Yet another personal project. I over-engineered it on purpose
Dev.to Kotlin作者:Théo Verdiere發布:10-06 14:00
Yet Another Personal Project, Deliberately Over-Engineered
A personal project with no deadline and no boss is the easiest place in the world to over-engineer.
重點摘要
Built an oversized Kotlin side project on purpose, not as a startup or monetized side hustle
Started with backend, Android app, CI, infrastructure, and deployment for a very small audience
Used deliberate over-engineering to learn hexagonal architecture, DDD, and real infrastructure
展開詳細摘要
This post describes a long-running personal Kotlin project built deliberately beyond what it strictly needed. The author wanted to explore a real backend, Android app, CI, and infrastructure on something personally owned, rather than inside systems constrained by work. Over about 22 months, the project grew in stages: backend first, then Android with Jetpack Compose, CI with Dagger.io, infrastructure with Pulumi and KinD, and finally a small k3s cluster on a Hetzner VPS. Some choices were intentional overkill, while others were course corrections, such as dropping Karate E2E tests, moving from multiple repos to a monorepo, and replacing Elasticsearch with Meilisearch. The result is a live app with a small first user base and a public codebase split across several repositories.
A correct Android answer can still fail the interview
Medium Kotlin作者:Mike Salari發布:10-06 12:01
A Correct Android Answer Can Still Fail the Interview
Two answers to the same Android question, both correct, scored completely differently.
重點摘要
Two correct answers to one Android question received very different scores.
The article points to what senior interview loops evaluate beyond correctness.
The full piece continues on Medium.
展開詳細摘要
The article argues that in Android interviews, a technically correct answer may still not perform well if it misses what the interview loop is actually assessing. Using two correct responses to the same question that were scored very differently, it suggests that senior-level interviews often measure more than factual accuracy alone. The piece points readers to a broader explanation of what those loops are looking for once basic correctness is established.
正确的 Android 答案,也可能在面试中失利
同一个 Android 问题的两个答案都正确,却得到了完全不同的评分。
重點摘要
同一道 Android 题的两个正确答案,评分差异很大。
文章指出,资深面试环节评估的不只是答案是否正确。
完整内容可在 Medium 上继续阅读。
展開詳細摘要
文章指出,在 Android 面试里,技术上正确的答案并不一定会得到好结果,关键还在于它是否符合面试流程真正考察的重点。作者以同一道题的两个正确回答却被打出截然不同分数为例,说明资深面试往往不只看事实是否正确,也会关注候选人的思路与表达方式。本文目前只是导读,完整文章可在 Medium 上继续阅读。
正確的 Android 答案,仍可能在面試中失利
兩個回答同一個 Android 問題的答案都正確,卻得到截然不同的評分。
重點摘要
同一個 Android 問題的兩個正確答案,評分差異很大。
文章指出,資深面試流程評估的重點不只是真正確。
全文內容可在 Medium 繼續閱讀。
展開詳細摘要
文章指出,在 Android 面試中,技術上正確的答案不一定能拿到好評分,關鍵在於它是否回應了面試流程真正想測試的能力。作者以同一題的兩個正確回答卻得到截然不同的結果為例,說明資深面試往往不只看事實是否正確,也會看應試者如何思考與表達。本文只是導讀,完整內容可在 Medium 上繼續閱讀。
JCOReflector: bringing .NET APIs to the JVM — and now with experimental generics
Medium Kotlin作者:Mario Mastrodicasa發布:10-06 12:15
JCOReflector: bringing .NET APIs to the JVM, now with experimental generics
A real CLR inside a JVM process, with the .NET API surface exposed as Java—and by extension Scala, Kotlin, and Clojure.
重點摘要
Runs a real CLR inside a JVM process
Exposes the .NET API surface as Java APIs
Adds experimental generics support
展開詳細摘要
JCOReflector brings a real CLR into a JVM process and exposes the .NET API surface as Java APIs, which can then be used by Scala, Kotlin, and Clojure as well. The article highlights that the project now includes experimental generics support. No further implementation details, limitations, or performance claims are provided in the source text.
I blamed a launch crash on the phone in August. My next app crashed the same way 9 times in 15
Medium Kotlin作者:Muhammad Azhar發布:10-06 12:42
“Window couldn’t find content container view”: Why Google’s consent form waits for your window
I blamed a launch crash on the phone in August. My next app crashed the same way 9 times in 15
重點摘要
A launch crash was traced to the message “Window couldn’t find content container view.”
The article examines why Google’s consent form waits for a window.
The same crash pattern reappeared across another app multiple times.
展開詳細摘要
The article centers on a launch-time crash associated with the error “Window couldn’t find content container view,” and connects it to the behavior of Google’s consent form, which must wait until a window is available. The author frames the discussion around a prior incident in August, then notes that a subsequent app crashed in the same way nine times within 15 attempts. The piece focuses on understanding the timing and window-related conditions behind the crash rather than claiming a broader fix or unsupported cause.
“Window couldn’t find content container view”:为什么 Google 的同意表单要等到你的窗口
MVI vs MVVM in Jetpack Compose: what is less likely to harm in the future?
Medium Kotlin作者:AndroidLab by Andre發布:10-06 13:33
MVI vs MVVM in Jetpack Compose: Which Is Less Likely to Cause Problems Later?
I have shipped both, here is how I prefer to reason about trade-offs during a real Android app development.
重點摘要
The author has used both MVI and MVVM in shipped apps.
The article frames the comparison around trade-offs in real Android development.
It focuses on choosing the approach that is less likely to cause future harm.
展開詳細摘要
The article compares MVI and MVVM in the context of Jetpack Compose, with an emphasis on long-term trade-offs rather than abstract ideology. The author says they have shipped apps using both approaches and explains how they prefer to think about the decision during real Android app development. Based on the available text, the piece appears to focus on which architecture is less likely to create problems in the future, instead of claiming that one pattern is universally superior.
Kotlin Functions Every Android Developer Should Understand
Medium Kotlin作者:Anil Kumar發布:10-06 13:42
Kotlin Functions Every Android Developer Should Understand
Kotlin provides several powerful features that make functions more expressive, concise, and flexible.
重點摘要
Introduces Kotlin function features for Android developers
Focuses on making functions more expressive and concise
Presents Kotlin’s flexibility in function design
展開詳細摘要
This article introduces Kotlin function features that Android developers should understand. It emphasizes that Kotlin provides several powerful capabilities that make functions more expressive, concise, and flexible. The post is presented as a guide for readers who want to work more effectively with Kotlin functions in Android development.
Kotlin 2.4 Is Out. The Interesting Part Is What Comes Next
Medium Kotlin作者:AndroidLab by Andre發布:10-06 13:42
Kotlin 2.4 Is Out. What Matters Is What Comes Next
Stable context parameters, explicit backing fields, and the Kotlin 2.4.20 shifts I’m betting on.
重點摘要
Stable context parameters are now part of the discussion.
Explicit backing fields are highlighted as a notable direction.
The author points to Kotlin 2.4.20 as the next shift to watch.
展開詳細摘要
Kotlin 2.4 is out, but the article’s focus is on what may matter next. It highlights stable context parameters, explicit backing fields, and the Kotlin 2.4.20 changes the author is betting on. The piece is presented as a forward-looking note rather than a detailed feature roundup, emphasizing the upcoming direction of the language and the specific shifts the author expects to be important.
I Can Get Code in Seconds Now. So Why Do I Understand Less?
Medium Kotlin作者:Mugumya Ali發布:10-06 13:48
I Can Get Code in Seconds Now. So Why Do I Understand Less?
Writing code was never the hard part of software engineering.
重點摘要
The article questions whether code generation has made understanding harder.
It reflects on what the real challenge in software engineering actually is.
The post is a brief Medium piece that points readers to continue reading there.
展開詳細摘要
The author reflects on a growing tension in software engineering: code can now be produced in seconds, yet understanding may feel weaker. The piece argues that writing code was never the hardest part, and asks what the real difficulty in software engineering actually has been. As presented here, it is a short introductory post that directs readers to continue on Medium rather than offering a full argument in the excerpt.
我现在几秒就能拿到代码,那为什么我反而更不理解了?
写代码从来都不是软件工程最难的部分。
重點摘要
文章提出疑问:代码生成更快,是否让理解变得更难。
作者重新思考软件工程真正的难点是什么。
这篇内容只是 Medium 的开头,正文需到原文继续阅读。
展開詳細摘要
作者反思软件工程中的一个矛盾:如今几秒钟就能生成代码,但对系统的理解却可能变得更弱。文章认为,写代码从来不是最难的部分,并进一步追问软件工程真正困难的到底是什么。就目前提供的内容来看,这只是 Medium 上的一段简短开头,主要作用是引导读者到原文继续阅读。
我現在幾秒就能產出程式碼,那為什麼我反而更不理解了?
寫程式碼從來就不是軟體工程最困難的部分。
重點摘要
文章質疑:程式碼產出更快,是否讓理解變得更困難。
作者重新思考軟體工程真正困難的地方是什麼。
這篇內容只是 Medium 的開頭,正文需到原文繼續閱讀。
展開詳細摘要
作者反思軟體工程中的一個矛盾:現在幾秒內就能生成程式碼,但對系統的理解卻可能變得更薄弱。文章主張,寫程式碼從來不是最困難的部分,並進一步追問軟體工程真正的難點到底是什麼。就目前提供的內容來看,這只是 Medium 上的短篇開頭,主要功能是引導讀者前往原文繼續閱讀。
How gRPC works on top of HTTP/2 and Protocol Buffers, where it beats REST for internal services, and how to build a Kotlin server.
重點摘要
gRPC runs on top of HTTP/2 and Protocol Buffers.
It can be a better fit than REST for internal services.
The article covers building a Kotlin server.
展開詳細摘要
This article explains how gRPC is built on HTTP/2 and Protocol Buffers, and why it can be a strong choice for internal services compared with REST. It also points readers toward the practical side by discussing how to build a Kotlin server. The piece frames gRPC as an implementation and architecture topic rather than a general API design overview.
How gRPC is built on top of HTTP/2 and Protocol Buffers, how it differs from REST, and how to connect a server and client in Kotlin with Gradle.
重點摘要
Explains the gRPC stack over HTTP/2 and Protocol Buffers
Compares gRPC with REST
Shows how to set up server and client in Kotlin with Gradle
展開詳細摘要
This article explains how gRPC is built on top of HTTP/2 and Protocol Buffers, and what that means in practice. It contrasts gRPC with REST, highlighting the architectural differences rather than claiming any universal advantage. The post also covers how to assemble a server and client in Kotlin using Gradle, making it a practical introduction for developers who want to understand the communication model and basic project setup.
Simple code is easier to understand, test, debug, and maintain.
重點摘要
Keep code simple.
Improves readability and testing.
Easier to debug and maintain.
展開詳細摘要
The article highlights the KISS principle in Android development: keep code simple. It argues that simpler code is easier for developers to understand, test, debug, and maintain. The main takeaway is that avoiding unnecessary complexity helps make Android code more practical and manageable.
Android 中的 KISS 原则:保持简单
简单的代码更容易理解、测试、调试和维护。
重點摘要
保持代码简单。
提升可读性和可测试性。
更容易调试与维护。
展開詳細摘要
本文介绍了 Android 开发中的 KISS 原则,即让代码保持简单。作者指出,简单的代码更容易被理解、测试、调试和维护。核心观点是避免不必要的复杂度,能让 Android 代码更实用,也更容易管理。
Android 中的 KISS 原則:保持簡單
簡單的程式碼更容易理解、測試、除錯與維護。
重點摘要
保持程式碼簡單。
提升可讀性與測試性。
更容易除錯與維護。
展開詳細摘要
本文介紹 Android 開發中的 KISS 原則,也就是讓程式碼保持簡單。作者指出,簡單的程式碼更容易被理解、測試、除錯與維護。核心觀點是避免不必要的複雜度,能讓 Android 程式更實用,也更容易管理。
Geofencing without the Battery Drain: Lessons from Muffle
Dev.to Kotlin作者:Haseeb發布:10-06 00:52
Geofencing Without Battery Drain: Lessons from Muffle
Designing for the background is hard, but the payoff for the user is an app that actually solves the problem rather than becoming another chore.
重點摘要
Switched from continuous polling to Google Play Services GeofencingClient for efficiency.
Used JobIntentService, AudioManager, and a WakeLock only during trigger events.
OEM battery optimizations and background limits caused missed triggers and required extra keep-alive checks.
展開詳細摘要
This article describes the building of Muffle, an Android app that automates sound profiles based on location and time without draining the battery. The author first tried continuous location polling, but moved to GeofencingClient so the OS could handle location monitoring more efficiently. Reliability also required JobIntentService, careful AudioManager and Do Not Disturb handling, and a WakeLock only for trigger events. The piece highlights how OEM power management can kill background work even when standard Android guidance is followed, and recommends using native APIs, testing on aggressive devices, and keeping background automation simple.
不耗电的地理围栏:来自 Muffle 的经验教训
为后台场景设计很难,但对用户而言,真正有价值的是能解决问题、而不是增加负担的 app。
重點摘要
改用 Google Play Services 的 GeofencingClient,避免持续轮询带来电量消耗。
Stop writing Excel reports cell by cell - bind data to templates instead (Kotlin/Java)
Dev.to Kotlin作者:황용호發布:10-06 06:43
Stop Writing Excel Reports Cell by Cell — Bind Data to Templates Instead (Kotlin/Java)
TBEG solves this at the root: design the report in Excel, then bind your data.
重點摘要
Template-based Excel report generation for JVM apps
Supports variable binding, repeated rows, images, formulas, charts, and formatting
Generation-only library with Spring Boot support and large-scale processing
展開詳細摘要
This article introduces TBEG (Template Based Excel Generator), a JVM library for generating Excel reports by binding data to predesigned Excel templates. Instead of writing spreadsheets cell by cell with Apache POI, developers place markers such as ${variableName} in an Excel file and pass data from code. TBEG handles variable substitution, repeated data expansion, image insertion, automatic cell merging, formula range updates, conditional formatting duplication, and chart data reflection. The post also outlines performance claims, shows common Excel download API usage in Spring Boot, and provides Kotlin and Java quick-start examples. It is intended for report generation only, not Excel file reading or parsing.
别再逐格写 Excel 报表,改为绑定模板中的数据(Kotlin/Java)
TBEG 从根本上解决这个问题:先在 Excel 里设计报表,再把数据绑定进去。
重點摘要
面向 JVM 的模板式 Excel 报表生成库
支持变量绑定、重复数据展开、图片、公式、图表和格式处理
仅用于生成,不用于读取或解析 Excel,并支持 Spring Boot 集成
展開詳細摘要
本文介绍了 TBEG(Template Based Excel Generator),这是一个 JVM 库,通过把数据绑定到预先设计好的 Excel 模板来生成报表。相比使用 Apache POI 逐格创建报表,开发者只需在模板中放入 ${variableName} 之类的标记,并在代码中提供数据。TBEG 会自动处理变量替换、列表数据展开、图片插入、单元格自动合并、公式范围调整、条件格式复制以及图表数据反映。文章还展示了性能说明、Spring Boot 导出 API 的常见用法,以及 Kotlin 和 Java 的快速开始示例;该工具仅用于生成 Excel,不支持读取或解析文件。
別再逐格撰寫 Excel 報表,改用模板綁定資料(Kotlin/Java)
TBEG 從根本解決問題:先在 Excel 中設計報表,再把資料綁上去。
重點摘要
適用於 JVM 的 Excel 報表模板式產生工具
支援變數綁定、重複資料展開、圖片、公式、圖表與格式
僅用於產生,不支援 Excel 讀取/解析,並提供 Spring Boot 整合
展開詳細摘要
本文介紹 TBEG(Template Based Excel Generator),這是一個 JVM 函式庫,透過將資料綁定到預先設計好的 Excel 模板來產生報表。相較於用 Apache POI 逐格建立報表,開發者只要在模板中放入 ${variableName} 之類的標記,程式端提供資料即可。TBEG 會自動處理變數替換、清單資料展開、圖片插入、自動合併儲存格、公式範圍調整、條件式格式複製與圖表資料反映。文章也說明其效能、Spring Boot 匯出 API 的常見用法,以及 Kotlin 與 Java 的快速上手範例;此工具僅用於產生 Excel,不支援讀取或解析檔案。
Publishing one Kotlin Multiplatform library to six places: Maven Central, SPM, pub.dev,
Medium Kotlin作者:Shiva Thapa發布:10-06 04:06
Publishing One Kotlin Multiplatform Library to Six Places: Maven Central, SPM, pub.dev
I started Nepali Date Picker to solve one problem: give Android and iOS a Bikram Sambat date picker that feels exactly like the Material 3…
重點摘要
A Kotlin Multiplatform library is being published to multiple package registries.
The project begins with Nepali Date Picker for Android and iOS.
The article introduces a Bikram Sambat date picker styled like Material 3.
展開詳細摘要
The article introduces Nepali Date Picker, a Kotlin Multiplatform library created to address a specific need: providing Android and iOS apps with a Bikram Sambat date picker that feels like Material 3. From the available excerpt, the focus is on the motivation behind the project and the fact that the library is being published in multiple places, including Maven Central, SPM, and pub.dev. The text does not provide implementation details or broader comparisons, so the main takeaway is the project’s cross-platform publishing goal and its user-facing date-picker use case.
Staging Never Gave My Kotlin Project 500. My AI Agent Does.
Medium Kotlin作者:Yudistiro Septian Dwi Saputro發布:10-06 04:55
Staging Never Gave My Kotlin Project 500. My AI Agent Does.
Every sprint, Chucker is open on my device before I touch the ticket.
重點摘要
Chucker is opened before the author starts on each ticket.
It shows every request the app sends and every response it receives.
The article is a short teaser that continues on Stackademic.
展開詳細摘要
The post is a brief teaser introducing the author’s debugging routine: before working on a ticket each sprint, Chucker is already open on the device to inspect all network requests and responses made by the app. The headline contrasts a staging environment that never produced a 500 error for the author’s Kotlin project with an AI agent that does, but the excerpt itself only provides the setup and points readers to continue on Stackademic. No further technical details or root cause are included in the provided text.