從「原廠不更新」到「闖進 F-Droid 上架地獄」:我寫了一個 100% 離線的 Android 嘸蝦米輸入法

日期:2026-09-20 | 作者:SoloMan | 標籤: 輸入法 嘸蝦米 F-Droid 開源 Kotlin Android

如果你也是嘸蝦米的重度使用者,大概懂那種痛:電腦上打字快得像切豆腐,到了 Android 手機上卻像斷了雙臂。

行易官方 Android 版早就停止更新,新系統、大螢幕上不是版面錯亂,就是各種相容性問題。市面上雖然有輸入法能載入字根檔,但套用起來總覺得不夠順手,有的還偷偷綁了一堆權限跟廣告。

身為每天都要打字的工程師,既然市面上找不到順手的,那就自己刻一個吧。

自己的痛點,自己不解,難道等別人來解?


🔧 自己的痛點,自己用 Kotlin 解決

這款輸入法(璦閣輸入法 / IgG BoshiamyIME)的出發點很純粹:極致流暢、100% 離線、絕對安全。

  • 純 Kotlin:沒有肥大的商業 SDK、沒有第三方追蹤模組,啟動快、記憶體省。
  • 完全離線:拆字、組字、聯想、學習全在本機完成,連網路權限都不給——打字紀錄根本沒有出得去的門。
  • 貼合現代 Android:老輸入法在新系統上的水土不服,一概修掉。

寫完之後自己用了好一陣子,打字的節奏感終於回來了。工具放著也是放著,不如開源無償分享給有緣的蝦米同好。

開源軟體沒有廚房門。任何人都可以走進來看。

本來以為:Code 放上 GitHub、APK 丟個 Release,這件事就算功德圓滿了。直到我腦袋一熱——

「既然都開源了,不如上架到 F-Droid,讓大家更方便搜尋和下載吧!」

這就是我掉進 F-Droid 上架地獄的開始。


😤 F-Droid 上架大作戰:Pipeline 重跑 21 次的血淚史

沒送過 F-Droid 的人,總以為就跟 Google Play 一樣「辦個帳號、填填資料、傳個 APK」就結束了。

踏進去才發現,差遠了。

  • 不能直接傳包:你不能交編譯好的 APK,得在 fdroiddata 倉庫提交一份 YML 設定檔,讓 F-Droid 的 Build Server 直接抓你的 Git commit,從零開始編。
  • 零閉源依賴:專案裡不能有任何非自由開源的二進位檔或第三方 SDK,連字根檔與版權聲明都得嚴格合規。
  • 對決 CI Pipeline:每次改設定、修 build script,就是發 PR 回去,讓他們的 Docker CI 跑一遍。

Google Play 驗的是「上傳的人是不是你」;F-Droid 驗的是「程式碼是不是真的像你說的那麼乾淨」。

為了讓 fdroid build 通過,我推了 7 個 commits,跟 CI 機器人結結實實跑了 21 次 Pipelines。中間看著一排紅色的 Failed,真的幹了無數次:「我到底幹嘛找事做?直接放 GitHub Release 不就好了嗎?」

但工程師的執著(跟不服輸)終究佔了上風。一項一項修、一個 bug 一個 bug 踩,最後終於看見 Pipeline 吐出代表通過的綠色勾勾。

有兩場仗特別值得講,免得你以為這只是「改兩行設定就過關」:

第一場:神秘的 META-INF/version-control-info.textproto

APK 一直比對不過,兩邊 build 出來的東西「就是差一咪咪」。抓了好久才發現:AGP 會把 build 環境的 git 資訊嵌進 META-INF/version-control-info.textproto——本機 build 有 git 所以有內容,F-Droid 的 build server 沒有 git 環境,那段直接變成空的。解法是關掉 VCS 資訊嵌入;重跑兩次乾淨 build,APK 才終於逐位元一模一樣。

第二場:為了一個「空行」重做好幾輪

fdroid rewritemeta 的規範龜毛到一個境界:Repo:Binaries: 之間不能有空行Binaries: 續行尾要有空格、檔尾要有換行。對,就是一場「空白字元」的戰爭。但後來我想通了:F-Droid 龜毛,是因為它替所有安裝的人把關——這種嚴格,正是它跟 Google Play 不一樣的地方。


🎉 成果與無償分享

嘸蝦米在現代算是相對小眾,但我相信依然有一群對打字效率有極致追求的人。

如果你也在 Android 上苦尋不著順手的離線嘸蝦米,歡迎體驗看看:

  • GitHub 專案庫:Solo-man-IGG/IgG-BoshiamyIME
  • F-Droid 申請紀錄:Merge Request #49249

完全無償、開源(GPL-3.0)。試用後覺得順手,歡迎回報 bug,或直接開 PR,一起讓這支輸入法變得更好。

最後補一句真心話:把 Code 丟上 GitHub 很容易,通過別人的檢驗很難。 但正是這道難關,讓「開源」兩個字有了重量。