Daily Digest

每日新聞摘要

2026年08月29日

01

jOOQ codegen from Flyway migrations, with no database

Dev.to Kotlin 作者:Behzod Halil 發布:08-29 15:18

不用資料庫,直接從 Flyway migration 產生 jOOQ codegen

當建置步驟需要 schema 時,優先使用已經版本化的描述,而不是必須另外啟動的服務。

重點摘要

使用 jOOQ 的 DDLDatabase 直接讀取 Flyway SQL 檔案。
將 `sort` 設為 `flyway`、`defaultNameCase` 設為 `lower`,避免順序與命名不一致。
新增建置測試,檢查重複 migration 版本與檔名格式錯誤。

這篇文章說明如何在沒有資料庫、Docker 或 Postgres 的 CI 環境中,仍然讓 jOOQ 產生程式碼。做法是利用 jOOQ meta extensions 的 DDLDatabase,直接讀取與 Flyway 共用的 migration SQL 檔案,而不是連到正式資料庫或再定義一份 schema。設定上只需指定 scripts、將排序方式改成 flyway,並把命名大小寫調整為符合 Postgres。這樣可以避免第二份 schema 的同步成本,也不需要服務容器。不過,這種方式只能處理 parser 看得懂的 DDL,無法發現 production 被手動改動的漂移;因此作者另外加上測試,防止重複版本號與檔名拼寫錯誤。

02

From kotlin to Android app — The Full Android Compilation pipeline

Medium Kotlin 作者:Kaito and droid 發布:08-29 15:25

從 Kotlin 到 Android App:完整的 Android 編譯流程

當你在 Android Studio 按下「Run」時,有沒有想過 Kotlin 原始碼到手機上的 App 啟動之間到底發生了什麼?

重點摘要

說明 Android 編譯流程的完整路徑
聚焦 Android Studio 按下 Run 之後的處理過程
串起 Kotlin 原始碼到可執行 App 的轉換

本文以「按下 Android Studio 的 Run 之後發生了什麼」為切入點,介紹 Android 的完整編譯流程。根據目前可見內容,文章將帶出 Kotlin 原始碼如何經由建置與編譯步驟,轉換成可在手機上啟動的 Android App。這篇內容適合想建立整體開發流程心智模型的讀者,幫助理解工具鏈如何把程式碼一步步變成可執行的應用程式。

03

How I Built ECHO

Medium Kotlin 作者:Meet Dabhi 發布:08-29 17:24

我如何打造 ECHO

Continue reading on Medium »

重點摘要

提供的內容只有標題與前往 Medium 繼續閱讀的提示。
內文未隨原始資料一併提供。
在缺少正文的情況下,無法補充未確認的細節。

輸入內容僅包含文章標題、作者、連結,以及「Continue reading on Medium »」字樣,沒有提供文章正文。因此,無法從現有資料得知 ECHO 的用途、建置過程或作者的具體經驗,也不能憑空補寫細節。就目前資訊而言,能確定的只有這是一篇由 Meet Dabhi 撰寫、題為〈How I Built ECHO〉的文章,完整內容需前往 Medium 閱讀。

04

JOOQ code from Flyway migration, with no database

Medium Kotlin 作者:Behzod Halil 發布:08-29 18:53

不使用資料庫,從 Flyway migration 產生 jOOQ 程式碼

jOOQ 會根據 schema 產生程式碼,因此在建置階段必須有某種方式保存 schema。

重點摘要

jOOQ 產生程式碼需要在建置時取得 schema。
一般做法是使用資料庫作為 schema 來源。
本文探討如何不依賴實際資料庫,改由 Flyway migration 產生 jOOQ 程式碼。

jOOQ 一般是根據資料庫 schema 產生程式碼,因此在建置階段必須先有可用的 schema。傳統做法是直接連到資料庫,但本文介紹另一種思路:把 Flyway migration 當成 schema 的來源,進而在不使用實際資料庫的情況下產生 jOOQ 程式碼。這種方式可讓建置流程更貼近遷移腳本,也可能讓開發與維護更簡潔。

05

How I Built an In-Place Android Screen Translator with Jetpack Compose, ML Kit, and Gemini Vision

Dev.to Kotlin 作者:navidseyedain 發布:08-29 13:29

我如何用 Jetpack Compose、ML Kit 與 Gemini Vision 打造 Android 即時畫面內翻譯器

ALST 會直接在原始座標上顯示翻譯結果,讓使用者不用離開目前的 App。

重點摘要

Gemini Vision 可單次完成語境翻譯並回傳文字框座標
支援雲端 Gemini 與完全離線的 ML Kit 雙引擎
重視零記憶體洩漏、覆蓋層繪製與 Android 14+ 相容性

本文介紹 ALST(AI Live Screen Translation),一款開源的 Android 畫面即時翻譯工具,可直接在原 App 上方依原座標顯示譯文,避免手動截圖、切換應用或被 OCR 卡片遮住內容。專案採 Clean Architecture 與 MVVM/MVI,將擷取、OCR、翻譯、覆蓋層、服務、資料與 UI 分模組設計。雲端模式使用 Gemini 3.6 Flash 進行單次多模態翻譯,能同時理解語境並回傳 bounding box;離線模式則結合 ML Kit 文字辨識與裝置端翻譯。作者也說明了 Android 14+ 的記憶體管理、浮動視窗座標對應、前景服務與 Quick Settings 整合,以及以 BYOK 為核心的隱私設計。

06

Why capturing a long screenshot on Android is harder than it looks

Dev.to Kotlin 作者:Codnet Software Company 發布:08-29 13:55

為什麼在 Android 上擷取長截圖比想像中更困難

滾動截圖不是擷取,而是重建。

重點摘要

Android 沒有內建可一次擷取整個捲動內容的 API。
LongShot 以 MediaProjection 畫面與切片共識法重建長截圖。
透過串流輸出到磁碟、分區解碼,避免長截圖造成記憶體不足。

在 Android 上擷取長截圖之所以困難,是因為系統只提供可見畫面的 MediaProjection,沒有真正的捲動截圖 API。要做出長圖,必須一邊錄製、一邊讓使用者捲動,再將多張畫面精準拼接。若畫面中有影片、動畫或輸入提示,整張比對會失準,因此 LongShot 改用水平切片逐段估算位移,再以多數共識決定對齊位置。另一個關鍵是記憶體:長圖可能高達數萬像素,若整張留在記憶體中容易 OOM,所以應將結果直接串流寫入磁碟,讀回時也只分區載入。文中同時說明其離線處理與僅支援拉丁字元辨識的限制。

07

From the Run Button to the User’s Phone: The Complete Anatomy of the Android Build Process

Medium Kotlin 作者:TurkanAlizada 發布:08-29 11:05

從 Run 按鈕到使用者手機:Android 建置流程的完整剖析

你按下 Android Studio 裡的綠色 Run 按鈕,等上幾秒鐘(有時是幾分鐘),接著就會看到熟悉的啟動畫面。

重點摘要

說明 Android 建置流程的全貌
從 Android Studio 的 Run 按鈕開始
描述從本機建置到手機顯示的路徑

本文以你在 Android Studio 按下綠色 Run 按鈕後的流程作為切入點,帶出 Android 應用如何一路完成建置並送到使用者手機上。根據目前可見的內容,文章重點在於拆解這段從開發端到裝置端的完整流程,並以手機上熟悉的啟動畫面作為最終結果的起點,為後續更深入的建置機制說明鋪陳背景。

08

Stop Ignoring Compose Stability (Yes, Even with Strong Skipping Mode)

Medium Kotlin 作者:Shreyas Patil 發布:08-29 13:01

別再忽視 Compose 穩定性:即使啟用強制跳過模式也是如此

了解為什麼 Compose 的強制跳過模式,仍無法完全避免效能問題。

重點摘要

強制跳過模式無法消除穩定性問題。
Compose 穩定性仍與效能表現密切相關。
文章提醒不要誤以為跳過模式已經足夠。

本文指出,Jetpack Compose 的強制跳過模式並不能讓穩定性問題失去意義。即使啟用這項機制,不穩定的資料仍可能造成效能下降,因此開發者不能忽略 Compose 穩定性。文章把這視為一個常見陷阱:若以為只靠編譯器的跳過行為就能保住效能,往往會漏掉潛在的效率損耗。核心重點是,穩定性依然是 Compose 優化中不可忽視的因素。

09

How to Build a 3-Tier Android Subscription Model Without a Backend

Medium Kotlin 作者:Ali Ahmed 發布:08-29 13:45

如何在沒有後端的情況下建立三層 Android 訂閱模型

當開發者思考在行動應用程式中實作訂閱時,首先想到的通常就是後端。

重點摘要

介紹三層式 Android 訂閱模型
探討不依賴後端的訂閱實作方式
聚焦行動應用常見的訂閱實作思路

這篇文章從行動應用程式的訂閱設計切入,指出開發者在規劃訂閱功能時,往往第一個想到的是後端。依據目前可見內容,文章主題是如何在沒有後端支援的情況下,建立一個三層級的 Android 訂閱模型,並討論在客戶端處理訂閱的可能性。由於原文片段未提供完整技術細節,因此可確認的重點僅是:在 Android 設計訂閱方案時,後端並非唯一選項。

10

Architecting a Low-Power GPS Geofencing Engine for Android Background Services

Dev.to Kotlin 作者:Haseeb 發布:08-29 00:11

為 Android 背景服務打造低耗電 GPS 地理圍欄引擎

建立一個在背景監控世界、並自動調整手機音量的服務。

重點摘要

改用 GeofencingClient,避免持續輪詢造成電量災難。
以 ForegroundService、輕量 PendingIntent 與去抖動機制處理狀態切換。
必須面對 Doze、GPS 漂移、鬧鐘延遲與規則衝突等現實問題。

作者分享為 Muffle 開發 Android 背景自動化工具的過程,目標是依據地點、時間與行事曆,自動切換手機的靜音、震動與正常模式。由於持續定位會嚴重耗電,他改採 Google Play Services 的 GeofencingClient,並結合 ForegroundService 與輕量化 PendingIntent 來維持可靠性。文中也指出 Doze 模式、都市高樓造成的 GPS 漂移、AlarmManager 延遲,以及多條規則衝突等問題,強調開發者應順應系統限制,並在離線與省電情境下完整測試。