📝 Today’s Focus
Kdrant MCP ships as one static binary for Qdrant, and stdout logging can break the protocol; Compose shifts UI thinking to state, while mixed Java/Kotlin codebases keep adding migration debt.
🔧 Performance Tuning
AlertSpot and Muffle lean on local geofencing, caching, and adaptive polling for battery savings, reliability, and privacy; LiteRT-LM enables offline LLMs on CPU or GPU, but token handling and packaging risks remain.
🏗 Architecture Design
A headless KMP engine, Navigation 3, AGP 9.4, tvOS forks, and OEM Android differences all stress explicit boundaries so multi-platform builds and integrations do not break under change.
✅ Testing and Quality
A seven-month Compose slider bug was fixed through deletion-heavy refactoring and AI code review; Jackson deserialization, Compose @Immutable/@Stable, and Android AI availability checks all point to more predictable behavior.
🚀 Language Evolution
Kotlin 2.4 brings context parameters, stabilized UUID APIs, and Java 26 support, while 2.4.20 adds allDistinctBy/allEqualBy and keeps context-sensitive resolution moving toward cleaner when expressions.
01
Give your agent a vector database without giving it a Python runtime
Dev.to Kotlin作者:AS發布:09-14 08:20
Give your agent a vector database without giving it a Python runtime
Kdrant 2.3.0 ships kdrant-mcp, which is one static binary.
重點摘要
kdrant-mcp replaces the old Python MCP server with a single static binary
The MCP server exposes six read-only tools by default, with writes behind --allow-writes
Kdrant’s Kotlin client emphasizes REST, coroutines, and a smaller dependency footprint
展開詳細摘要
The article introduces Kdrant 2.3.0’s kdrant-mcp, a single static binary that lets an agent talk to Qdrant without spawning a Python runtime, virtualenv, or dependency tree. By default it exposes six read-only MCP tools, while write operations remain disabled unless the server is started with --allow-writes. The piece also explains a Kotlin logging pitfall for MCP servers: anything written to stdout can corrupt the protocol stream, so logs should be redirected to stderr. Beyond the server, it highlights the coroutine-first Kdrant client, its REST and gRPC options, native-image support, and measured performance tradeoffs versus the official client.
Jetpack Compose Changed How I Think About Building UI
The biggest change wasn't the syntax—it was the mental model behind UI.
重點摘要
Compose treats UI as a function of state.
User actions should flow as events in one direction through the app.
Compose helps with declarative UI, but it does not replace good architecture.
展開詳細摘要
Working with Jetpack Compose changed the author’s mindset more than its syntax did. Instead of thinking in terms of finding and mutating views, Compose encourages a state-driven model where UI is a function of state and user actions flow upward as events. The article explains how to model screen state with a single UiState object, why recomposition is expected, and how state ownership should be kept close to where it is needed. It also emphasizes that Compose does not solve architecture problems by itself: developers still need clear separation of concerns and should avoid pushing database, network, and business logic into composables.
AlertSpot: An open-source, battery-friendly transit alarm for Android
Dev.to Kotlin作者:Vasanth K發布:09-14 12:06
AlertSpot: An Open-Source, Battery-Friendly Transit Alarm for Android
To solve this, I built AlertSpot — a lightweight, completely free, and open-source Android app that fires high-priority audio and full-screen alerts when you enter a destination geofence.
重點摘要
Uses OSMDroid to avoid Google Maps API billing and keys
Adapts GPS polling to reduce battery drain while preserving detection
Designed for privacy, with no accounts, analytics, or telemetry
展開詳細摘要
AlertSpot is a privacy-first Android transit alarm built to help riders avoid missing their stop. The app uses Kotlin, Jetpack Compose, OSMDroid, and Google Play Services geofencing to deliver alerts when users enter a destination area. To keep costs and power use down, it avoids Google Maps API billing, caches OpenStreetMap tiles locally, and adjusts location polling based on proximity to active geofences. It also combines foreground service behavior, full-screen intents, wake locks, and reboot recovery to improve reliability through Doze mode and device restarts. The project is fully open source, stores data locally, and has no accounts, analytics, or telemetry.
Kotlin 2.4 Just Made Half My Dependency Injection Code Disappear
Medium Kotlin作者:Sixtin - Mobile App Developer發布:09-14 08:14
Kotlin 2.4 Makes Half of My Dependency Injection Code Disappear
Context parameters, a stabilized UUID API, and Java 26 support — here’s what actually changes for Android developers.
重點摘要
Context parameters reduce boilerplate in dependency injection.
The UUID API is now stabilized.
Kotlin 2.4 adds support for Java 26.
展開詳細摘要
Kotlin 2.4 introduces changes that can simplify Android development, with the article highlighting context parameters as the main reason dependency injection code may shrink. It also notes that the UUID API has been stabilized and that Java 26 is supported. The piece focuses on what these updates mean in practice for Android developers, while avoiding claims beyond the stated language and platform changes.
Jetpack Compose 1.12 Just Closed the Gap Android Devs Have Been Waiting Years For
Medium Kotlin作者:Sixtin - Mobile App Developer發布:09-14 08:21
Jetpack Compose 1.12 Closes a Long-Waited Gap for Android Developers
Mesh gradients, HDR color, Credential Manager autofill, and finally startup performance that matches old-school Views.
重點摘要
Adds mesh gradients and HDR color support
Includes Credential Manager autofill
Aims for startup performance comparable to Views
展開詳細摘要
The article frames Jetpack Compose 1.12 as an update that addresses several long-standing Android development gaps. It highlights support for mesh gradients and HDR color, adds Credential Manager autofill, and points to startup performance that finally matches traditional Views. The text is a brief teaser rather than a full technical breakdown, but it suggests Compose 1.12 brings both visual capabilities and practical app-launch improvements that Android developers have wanted for years.
Building an Enterprise Headless Kotlin Multiplatform (KMP) Engine: Powering Android, iOS, and…
Medium Kotlin作者:Dinakar Maurya發布:09-14 08:43
Building an Enterprise Headless Kotlin Multiplatform (KMP) Engine: Powering Android, iOS, and More
Why stopping at the Use Case layer (“logic-native-ui”) is the architectural sweet spot for mobile enablement, zero UI compromise, and…
重點摘要
Focuses on a headless KMP engine for enterprise mobile enablement
Argues for stopping at the Use Case layer as the architectural boundary
Emphasizes avoiding UI compromise while supporting Android and iOS
展開詳細摘要
The article introduces an enterprise headless Kotlin Multiplatform (KMP) engine designed to support mobile platforms such as Android and iOS. Its main architectural point is that stopping at the Use Case layer, described as a “logic-native-ui” approach, is the sweet spot for enabling mobile applications without compromising the user interface. The piece frames this as an enterprise-oriented strategy for building a shared engine that powers multiple platforms while keeping UI concerns separate.
为什么停在 Use Case 层(“logic-native-ui”)才是兼顾移动赋能、零 UI 妥协与架构平衡的最佳点……
重點摘要
聚焦企业级无头 KMP 引擎的移动赋能
主张架构边界应停留在 Use Case 层
强调支持 Android、iOS 且不牺牲 UI
展開詳細摘要
本文介绍了一种面向企业的无头 Kotlin Multiplatform(KMP)引擎,用于支撑 Android、iOS 等移动平台。文章强调,架构应停在 Use Case 层,即所谓的“logic-native-ui”方式,这样才能在不妥协用户界面的前提下实现移动端赋能。作者将其视为一种适合企业共享引擎的架构思路,使多平台能够复用核心能力,同时保持 UI 的独立性。
為什麼停在 Use Case 層(「logic-native-ui」)才是兼顧行動裝置賦能、零 UI 妥協與架構平衡的最佳點……
重點摘要
聚焦於企業級無頭 KMP 引擎的行動賦能
主張架構邊界應停在 Use Case 層
強調支援 Android、iOS 同時不犧牲 UI
展開詳細摘要
本文介紹一個企業級無頭 Kotlin Multiplatform(KMP)引擎,目標是支援 Android、iOS 等行動平台。文章的核心觀點是:架構應停留在 Use Case 層,也就是所謂的「logic-native-ui」做法,才能在不犧牲使用者介面的前提下,達成行動端賦能。作者將這種做法描述為一種適合企業共享引擎的架構策略,讓多平台共用核心能力,同時保留 UI 的獨立性。
Android Gradle Plugin 9.4: The Quiet Update That’s Actually a Warning Shot
Medium Kotlin作者:AndroidLab by Andre發布:09-14 08:46
Android Gradle Plugin 9.4: A Quiet Update That Signals Caution
A minor version bump on paper, but if you’ve got dynamic feature modules or you’re still on the old Variant API, this one’s worth reading.
重點摘要
Presented as a minor release, but with implications for some projects
Dynamic feature modules may need attention
Projects still using the old Variant API should read carefully
展開詳細摘要
The article frames Android Gradle Plugin 9.4 as a small version bump that may still matter for certain projects. It specifically calls out teams using dynamic feature modules or the older Variant API, suggesting they should pay close attention to the update. Rather than announcing broad new capabilities, the piece warns that seemingly minor changes can have practical impact for builds that rely on older integration patterns.
Navigation 3 in 2026: Is It Finally Time to Ditch Navigation Compose?
Medium Kotlin作者:AndroidLab by Andre發布:09-14 08:52
Navigation 3 in 2026: Is It Finally Time to Ditch Navigation Compose?
A hands-on look at whether Google’s new navigation library is worth the migration headache or just more churn.
重點摘要
Evaluates Google’s new Navigation 3 library.
Focuses on whether migration is worth the effort.
Frames the discussion around churn versus practical value.
展開詳細摘要
This article takes a hands-on look at Google’s new Navigation 3 library and asks whether it is worth migrating away from Navigation Compose. Rather than assuming the new option is automatically better, it frames the question around the real cost of change, the potential migration headache, and whether the update represents meaningful progress or simply more churn. The piece is presented as an evaluation of practical tradeoffs, with the main concern being whether developers should adopt the new library or wait.
Dependency boundaries shaped the cost of the transition.
展開詳細摘要
This article describes how an Android app migration can become harder when Java and Kotlin coexist for too long. The author points to nullability, coroutines, Compose, and dependency boundaries as the main sources of migration debt. Rather than treating the move as a simple language switch, the piece shows how mixed codebases can accumulate friction and make later changes more difficult. It frames the lesson as one about planning boundaries and managing Kotlin adoption carefully so that coexistence does not become a long-term problem.
What an afternoon lost to four lines of code taught me about Ktor, Koin and Exposed
重點摘要
A small code change led to an afternoon of troubleshooting.
The experience exposed how Ktor, Koin, and Exposed fit together.
The article argues for a more explicit Kotlin stack.
展開詳細摘要
This article reflects on a frustrating debugging session triggered by just four lines of code, which became a lesson in how Ktor, Koin, and Exposed interact in a Kotlin application. Rather than relying on hidden behavior or “magic,” the author uses the experience to argue for a stack that is more explicit and easier to reason about. The piece centers on the practical impact of framework integration and the value of making application wiring clearer.
@Immutable vs @Stable in Jetpack Compose: What Are We Actually Telling Compose?
Medium Kotlin作者:Mahesh Ambekar發布:09-14 13:31
@Immutable vs @Stable in Jetpack Compose: What Are We Actually Telling Compose?
If you’ve worked with Jetpack Compose, you’ve probably come across these annotations.
重點摘要
The article introduces @Immutable and @Stable in Jetpack Compose.
It frames the topic as a question of what these annotations tell Compose.
The provided excerpt is only an opening line and points to the full Medium article.
展開詳細摘要
The excerpt introduces a Jetpack Compose article comparing @Immutable and @Stable, asking what these annotations are actually telling Compose. However, the provided text contains only the opening sentence and a link to continue reading on Medium, so no deeper technical claims, examples, or conclusions are available in the supplied content. The safest summary is that the article’s focus is on understanding the meaning and use of these Compose annotations, but the excerpt itself does not provide the full explanation.
Resolving Exception: Cannot Deserialize From Object Value (No Delegate- Or Property-Based Creator)
Baeldung作者:Martin Blažević發布:09-14 04:21
Resolving the Cannot Deserialize From Object Value (No Delegate- or Property-Based Creator) Exception
Jackson needs a suitable mechanism to create the Notification instance.
重點摘要
Add a no-argument constructor for mutable classes.
Use @JsonCreator and @JsonProperty for immutable constructors or factory methods.
Discover constructor parameter names with ParameterNamesModule or ParanamerModule in Jackson 2.x.
展開詳細摘要
Jackson may fail to deserialize JSON into a class even when the field names match, if it cannot determine how to create the target instance. This article reproduces the InvalidDefinitionException with an immutable Notification class and shows several fixes: add a default constructor for mutable types, annotate a constructor or factory method with @JsonCreator and @JsonProperty, or let Jackson infer constructor parameter names via ParameterNamesModule or ParanamerModule in Jackson 2.x. It also notes that Jackson 3.x supports parameter-name discovery by default and that Paranamer is limited to Jackson 2.x.
解决 Cannot Deserialize From Object Value(No Delegate- or Property-Based Creator)异常
Architecting for Privacy: Building a 100% Offline Geofencing Engine on Android
Dev.to Kotlin作者:Haseeb發布:09-14 01:52
Architecting for Privacy: Building a 100% Offline Geofencing Engine on Android
I committed to a 100% offline architecture.
重點摘要
Kept geofencing and rules entirely on-device to avoid cloud tracking and protect privacy.
Used GeofencingClient, Room, ForegroundService, and boot re-registration to handle overlapping rules and background limits.
Combined location-based geofencing with prayer-time calculations as a fallback for better reliability.
展開詳細摘要
The author describes building Muffle, an Android app designed to silence a phone automatically without sending location data to the cloud. To support overlapping rules and background reliability, the system uses GeofencingClient, a local Room database, a ForegroundService, and reboot re-registration via ACTION_BOOT_COMPLETED. Because GPS alone can fail indoors, the design also combines geofencing with prayer-time calculations from the Adhan library. The article emphasizes that reliability and privacy are more important than clever features, and that keeping data local helps build user trust.
Gemini Nano Isn't on Most of Your Users' Phones. Here's the Feature-Detection Pattern That Doesn't Embarrass You in Production
Dev.to Kotlin作者:YADNYESH RANA發布:09-14 03:41
Gemini Nano Isn’t on Most Users’ Phones: A Feature-Detection Pattern That Avoids Production Failures
Treat on-device AI capability as first-class state, with a real fallback path—not a spinner over a dead end.
重點摘要
Do not assume Gemini Nano is available on every Android device.
Model availability as sealed states such as Unavailable, NeedsDownload, and Ready.
Fallback to cloud only when the user is actively waiting; re-check availability over time.
展開詳細摘要
On-device AI on Android should not be treated as always available. The article explains that many devices lack the right chipset, OS version, provisioning, or Google support, so apps that assume Gemini Nano can run locally often crash or fail silently. Instead of wrapping calls in try/catch, developers should model capability as explicit state, detect features before building UI, and distinguish unsupported devices from those that only need a download. The article also recommends a thoughtful fallback strategy: use cloud inference only for user-initiated requests, not background speculation, and re-check availability because the device state can change while the app is running.
Gemini Nano 并不在大多数用户的手机上:一种不会在生产环境出丑的功能检测模式
把端侧 AI 能力视为一等状态,并配上真正的兜底路径,而不是用加载动画掩盖死路。
重點摘要
不要假设所有 Android 设备都支持 Gemini Nano。
用 Unavailable、NeedsDownload、Ready 等封装状态表示可用性。
仅在用户主动等待结果时才回退云端,并在合适时机重新检测。
展開詳細摘要
Android 端侧 AI 不能默认可用。文章指出,许多设备会因为芯片不匹配、系统版本过旧、AICore 未预配,或尚未进入 Google 支持名单,而无法运行 Gemini Nano;如果应用直接假定本地推理可用,就可能崩溃或静默失效。作者建议不要只用 try/catch,而应在构建 UI 前先做功能检测,并用封装状态区分“永远不可用”和“下载后可用”。同时,云端回退只适用于用户明确需要立即响应的场景,后台推理则不应悄悄变成云端成本。
Gemini Nano 並不在大多數使用者手機上:一種不會在正式環境出糗的功能偵測模式
把裝置端 AI 能力視為第一級狀態,並搭配真正的備援流程,而不是用轉圈圈遮住死路。
重點摘要
不要假設所有 Android 裝置都能使用 Gemini Nano。
用 Unavailable、NeedsDownload、Ready 等封裝狀態描述可用性。
僅在使用者明確等待結果時才回退雲端,並在適當時機重新檢查。
展開詳細摘要
Android 裝置端 AI 不能直接假設可用。文章指出,許多手機會因晶片不符、系統版本過舊、AICore 尚未佈署或尚未列入支援名單,而無法使用 Gemini Nano;若應用程式直接呼叫,可能當機或無聲失敗。作者建議不要只用 try/catch,而要在建立 UI 前先做功能偵測,並以封裝狀態區分「永遠不可用」與「可下載後使用」。同時,雲端回退應只用在使用者明確要求立即回應的情境,背景推論則不應悄悄轉成雲端成本。
Animated Speed Dial FAB in Compose Multiplatform (Android & iOS)
Medium Kotlin作者:Abhiraj Khare發布:09-14 00:14
Animated Speed Dial FAB in Compose Multiplatform (Android & iOS)
When building modern mobile applications, screen real estate is at a premium.
重點摘要
Focuses on a compact mobile UI pattern.
Covers Compose Multiplatform for Android and iOS.
Introduces an animated speed dial FAB concept.
展開詳細摘要
The article introduces an animated speed dial floating action button pattern for modern mobile apps built with Compose Multiplatform. It frames the topic around a common mobile constraint: limited screen space and the need for a clean interface while keeping actions easy to reach. Based on the available text, the piece appears to present a UI approach for Android and iOS rather than broader platform claims or performance comparisons. The excerpt does not provide implementation details, benchmark data, or specific Kotlin advantages, so the summary stays limited to the stated topic and context.
27/28: Why Your App Behaves Differently on Different Phones
Medium Kotlin作者:Pramod Patel發布:09-14 00:31
Why Your App Behaves Differently on Different Phones
How OEMs fork AOSP, and what it breaks
重點摘要
Explains how OEMs modify AOSP
Focuses on the breakages caused by those forks
Points readers to continue on Medium
展開詳細摘要
This article introduces the idea that Android apps can behave differently across phones because OEMs fork AOSP and change it in ways that may break assumptions developers make. The short excerpt does not provide technical details, examples, or specific issues, but it clearly frames the topic as the relationship between OEM customizations and app behavior. Readers are directed to continue reading on Medium for the full explanation.
为什么你的应用在不同手机上的表现不一样
OEM 如何分支 AOSP,以及它会破坏什么
重點摘要
说明 OEM 如何分支 AOSP
聚焦这些分支可能造成的破坏
引导读者到 Medium 继续阅读
展開詳細摘要
文章开头指出,Android 应用在不同手机上表现不一致,与各家 OEM 对 AOSP 的分支和修改有关,这些改动可能打破开发者原本的假设。由于原文只提供了简短片段,没有给出具体案例或技术细节,但主题已经明确聚焦于 OEM 定制如何影响应用行为。作者也引导读者前往 Medium 继续阅读完整内容。
為什麼你的應用程式在不同手機上的表現不一樣
OEM 如何分支 AOSP,以及它會破壞什麼
重點摘要
說明 OEM 如何分支 AOSP
聚焦這些分支可能造成的破壞
引導讀者到 Medium 繼續閱讀
展開詳細摘要
本文開頭指出,Android 應用在不同手機上表現不一致,與各家 OEM 對 AOSP 的分支與修改有關,這些變更可能打破開發者原先的假設。由於原文僅提供簡短片段,未列出具體案例或技術細節,但主題已清楚聚焦在 OEM 客製化如何影響應用行為。作者並引導讀者前往 Medium 繼續閱讀完整內容。
The Thumb That Ran Ahead of the Finger: Anatomy of a Compose Slider Bug
Medium Kotlin作者:Vitaliy Gribko發布:09-14 04:19
The Thumb That Ran Ahead of the Finger: Anatomy of a Compose Slider Bug
A bug report sat in the backlog for seven months.
重點摘要
The bug report remained unresolved for seven months.
The fix took one day and removed a third of the slider logic.
It was nearly shipped before being fully caught and addressed.
展開詳細摘要
A bug report about a Compose slider stayed in the backlog for seven months before being fixed. According to the article’s brief description, the fix took only a day, removed a third of the slider’s logic, and was nearly shipped in its flawed state. The post promises an anatomy of the bug rather than a full technical breakdown in the excerpt, highlighting how long-standing issues can persist before a relatively small but impactful correction is made.
The Thumb That Ran Ahead of the Finger: Anatomy of a Compose Slider Bug
ProAndroidDev作者:Vitaliy Gribko發布:09-14 04:19
The Thumb That Ran Ahead of the Finger: Anatomy of a Compose Slider Bug
The best fixes remove code.
重點摘要
A Compose slider bug was caused by a ported View-era snapping behavior.
Two offsets created a mismatch between finger position and thumb rendering.
Removing mid-drag snapping fixed the bug and exposed a separate lifecycle issue caught in review.
展開詳細摘要
A seven-month-old bug in a custom Compose slider made the thumb move ahead of the user’s finger during slow drags. The cause was not a random defect but a behavior faithfully ported from the old View-based slider: snapping to the nearest tick during drag. By removing mid-drag snapping and moving all snapping to gesture end, the fix deleted a large amount of code and eliminated a related race condition. The article also describes a separate reset bug caused by re-keying remembered state without re-keying a LaunchedEffect, which an AI code reviewer caught in the diff. The story argues for porting intent rather than implementation and for preferring one source of truth over coordinated state.
跑到手指前面的拇指:Compose Slider Bug 剖析
最好的修复,往往是删除代码。
重點摘要
Compose 滑块的问题源于从 View 时代保留下来的拖动中吸附逻辑。
rawOffset 和 snappedRawOffset 两个状态同时存在,导致拇指先于手指显示。
把吸附移到手势结束时后,问题和相关竞态一起被消除。
展開詳細摘要
一个在 backlog 里放了七个月的 Compose 滑块 bug,表现为用户缓慢拖动时,拇指会跑到手指前面。根因并不是偶发故障,而是从旧版 View 滑块完整移植了“拖动过程中吸附到最近刻度”的行为。作者将吸附改为在手势结束时执行,删除了大量中间状态、动画和协程相关代码,也消除了一个伴随的竞态问题。文章还讲到一个重置后 remembered state 与 LaunchedEffect 脱节的隐藏 bug,最终由 AI code reviewer 在 diff 中发现。整篇文章强调:要移植意图,不要照搬实现;最好的一类修复,往往是删代码。
Focused on networking as the topic of this installment.
The provided content is only an index and a continuation link.
展開詳細摘要
This entry is labeled “Part 9 — Networking” in an Android interview preparation series by AB nay. The available content does not include the full article; it only shows the series index line “Android Interview Prep — Complete Index” and a prompt to continue reading on Stackademic. As a result, the post’s substantive networking discussion is not present in the provided text, and no additional technical claims can be confirmed from this excerpt.
Build Setup: Targets, Source Sets and buildSrc for tvOS in a Compose Multiplatform Fork
ProAndroidDev作者:Sajid Ali發布:09-14 04:24
Build Setup: Targets, Source Sets, and buildSrc for tvOS in a Compose Multiplatform Fork
In Kotlin Multiplatform, a target is not a flag you flip at the end.
重點摘要
tvOS support starts at the build layer, where targets and source sets determine what compiles.
A shared uiKitMain layer reduces duplication between iOS and tvOS while keeping platform-specific code separate.
The fork updates Skiko support, Xcode settings, and resource handling so tvOS targets can build and publish correctly.
展開詳細摘要
This article explains the build-layer changes needed to make a Compose Multiplatform fork work on tvOS. The author describes how targets and source sets were wired so tvOS could compile alongside iOS, using a shared uiKitMain layer to minimize duplication while keeping tvOS-specific code isolated. It also covers buildSrc and build-fork.gradle mechanics, which let the fork preserve upstream build files and reduce rebase conflicts. On the helper-library side, the Xcode project and Gradle configuration were adjusted for tvOS SDKs, destinations, and linker settings. Finally, the Compose Gradle plugin was updated to decode tvOS resources and recognize tvOS targets. The post closes by noting that the build now compiles, and the next work is rendering.
Kotlin 2.4.20 gives your collections opinions, and 2.2’s compiler finally learns to read the room.
重點摘要
Kotlin 2.4.20 adds new collection-related behavior.
Kotlin 2.2 includes compiler changes.
The article highlights long-awaited Kotlin features.
展開詳細摘要
This article points to new Kotlin features that developers may have been waiting for, with a brief teaser mentioning Kotlin 2.4.20 and its collection-related changes, as well as compiler updates in Kotlin 2.2. The wording is playful, but the core message is that recent Kotlin releases are bringing noteworthy improvements to both collections and the compiler. The excerpt does not provide technical details beyond that high-level preview.
Koko, KMP Starter Kit — Part 3: Publishing: Your App in the Stores
ProAndroidDev作者:Mirzamehdi Karimov發布:09-14 04:48
Koko, KMP Starter Kit — Part 3: Publishing Your App in the Stores
Publishing is mostly a checklist, and the kit ships the checklist as a script.
重點摘要
Check store requirements, accounts, IDs, and configuration before release.
Prepare signing, icons, screenshots, and store metadata for Google Play and App Store.
Push a git tag to let GitHub Actions build, sign, and upload releases.
展開詳細摘要
This third part of the KMP Starter Kit series explains how to get an app ready for Google Play and the App Store, and how to publish it from GitHub without a Mac. It frames release work as a checklist, with scripts that verify privacy links, contact emails, AI keys, configuration, signing, icons, screenshots, and other store requirements. The post also covers store account setup, immutable app IDs, Android keystore handling, iOS signing through GitHub Actions and fastlane match, and the store-specific metadata each platform asks for. Finally, it shows how tagged releases trigger automated builds and uploads, and notes common issues such as Google sign-in fingerprints and review rejections.
Koko,KMP Starter Kit — 第 3 部分:将你的 App 发布到商店
发布其实大多只是检查清单,而套件已经把这份清单做成了脚本。
重點摘要
先确认商店账号、App ID、配置和隐私页面等必要项。
完成签名、图标、截图与商店素材,满足 Google Play 和 App Store 要求。
通过 GitHub 标签与 Actions,自动构建、签名并上传发布版本。
展開詳細摘要
本文是 KMP Starter Kit 系列的第三篇,介绍如何把已完成的 App 准备上架到 Google Play 和 App Store,并可在没有 Mac 的情况下通过 GitHub 发布。作者将发布流程视为一份检查清单,套件提供脚本用来检查隐私政策、联系邮箱、AI 密钥、配置、签名、图标和截图等常见项目。文章还整理了两大商店所需的账号、不可更改的 App ID、Android keystore、iOS 签名与 fastlane match 的设置方式,以及各平台要求的商店信息。最后说明通过 git tag 触发 GitHub Actions 自动构建与上传,并提醒 Google 登录 fingerprint 和审核被拒等常见问题。
Koko,KMP Starter Kit — 第 3 部分:將你的 App 發佈到商店
發佈其實多半只是檢查清單,而套件已把這份清單做成腳本。
重點摘要
先確認商店帳號、App ID、設定與隱私頁面等必要項目。
完成簽章、圖示、截圖與商店素材,符合 Google Play 與 App Store 要求。
透過 GitHub 標籤與 Actions,自動建置、簽署並上傳發佈版本。
展開詳細摘要
本文是 KMP Starter Kit 系列第三篇,說明如何將已完成的 App 準備上架到 Google Play 與 App Store,並可透過 GitHub 在沒有 Mac 的情況下發佈。作者把發佈流程視為一份檢查清單,套件提供腳本來檢查隱私權政策、聯絡信箱、AI 金鑰、設定值、簽章、圖示與截圖等常見項目。文章也整理了兩大商店所需的帳號、不可變更的 App ID、Android keystore、iOS 簽章與 fastlane match 的設定方式,以及各平台要求的商店資訊。最後說明以 git tag 觸發 GitHub Actions 自動建置與上傳,並提醒 Google 登入 fingerprint 與審核退件等常見問題。
LiteRT-LM removes the genuinely hard parts of running an LLM on-device — KV-cache management, token streaming, backend selection — but it doesn’t remove your job so much as relocate it.
重點摘要
Engine owns the model and backend; Session owns conversation state and is disposable.
maxNumTokens is a combined input-plus-output token budget, not output-only.
System prompts, tool calls, multimodal input, and thinking mode are built with model-specific text conventions.
展開詳細摘要
This article explains why LiteRT-LM is useful for running LLMs fully on-device, especially for multi-turn chat, streaming responses, and explicit CPU/GPU selection. It contrasts the runtime with cloud APIs, emphasizing privacy, offline operation, and the tradeoff that developers must manage sampling, token budgets, and prompt formatting themselves. The post then walks through the Engine/Session model, warns about a native library collision that can trigger SIGSEGV if the wrong .so is packaged, and shows how to implement streaming generation, system prompts, tool calling, multimodal input, and thinking mode. It also covers CPU-versus-GPU benchmarking, common anti-patterns, and ends with a developer-friendliness rating.
Kotlin 2.4.20 gives your collections opinions, and 2.2’s compiler finally learns to read the room
重點摘要
allDistinctBy and allEqualBy simplify collection checks in Kotlin 2.4.20.
Context-sensitive resolution reduces repetition in when expressions.
Both features are experimental and still require caution before production use.
展開詳細摘要
Kotlin 2.4.20 adds allDistinctBy and allEqualBy, which make common collection checks shorter and clearer than mapping, deduplicating, and comparing sizes. These APIs work with Iterable, Sequence, and arrays, use structural equality, and remain experimental. The article also revisits context-sensitive resolution, introduced experimentally in Kotlin 2.2, which lets the compiler infer enum or sealed-type members in when expressions and omit type qualifiers. It can improve readability, but it is still experimental, may introduce ambiguity, and is best suited to projects that are comfortable adopting Kotlin’s newer compiler features.