Stay Put 開源防盜警報:手機一拔線就響,解除要過指紋

Stay Put 是零網路權限的開源 Android 拔線警報 app,插上電源按下布防,充電線被拔掉就播便利商店防盜門等級的警報音,要關掉得先通過指紋或螢幕鎖驗證。裝之前先弄懂它的三道防線設計、一年半只保養不加功能的維護史,以及兩個還開著的穩定性問題。

用 AI 摘要這篇文章:

在圖書館、青旅或機場把手機放在插座旁充電,人離開一下,心裡總有一絲不安。把手機帶走吧,充電就斷了;留著吧,就是賭經過的人裡面沒有順手牽羊的。這個場景有一個老派但有效的解法:讓手機在電源被拔掉的那一刻大聲尖叫,嚇那個拿走的人一跳,也讓整個空間的目光轉過去。Stay Put 就是做這一件事的開源 Android app:插上電源、按下布防,之後只要充電線被拔掉,警報聲立刻響起,要關掉它得先通過你的指紋或螢幕鎖。

先把結論講完。這個 app 值得裝的條件很明確:你經常在公共場合把手機放著充電,而且你願意跨出 Google Play 的安裝習慣。它有三個在同類 app 裡少見的乾淨特徵,整支 app 的權限清單裡連網路權限都沒有、警示音量被調低時會自動拉高、解除警報必須過生物辨識。但它也有兩個你裝之前必須知道的坑:有使用者通報 app 在背景時拔線不會響,以及螢幕關掉之後解除按鈕可能失效,這兩個問題在 2026 年 9 月都還開著沒有解。這篇文章的依據是它在 Codeberg 上的全部原始碼、清單文件、12 個版本的發布說明、議題區的對話紀錄,以及 F-Droid 套件庫的頁面;我沒有實際安裝操作,警示聲的實際音量與各機型的表現請當成待驗證項目。

一件事做到底的程式:整支 app 只有八個檔案

Stay Put 的原始碼攤開來看會嚇一跳地簡單:全部的 Kotlin 檔案只有八個,一個主活動、三個畫面片段、一個前景服務、一個常數檔、一個通知輔助類別,加上一個除錯用的檔案日誌器,倉庫裡其餘的一百多個檔案大多(約三分之二)是圖示、版面與各語言翻譯,剩下是建置腳本與發布中繼資料。這個專案在 2026 年 9 月有 28 顆星、1 個 fork,屬於那種用量不大但被穩定照顧的長尾專案。它的作者 y20k 是德國斯圖加特的開發者,一個人維護著五個 Android 開源 app,收音機、播客播放器、離線語音輸入鍵盤、位置記錄都有,五個專案在 2026 年 9 月全都還有提交紀錄,Stay Put 是其中程式碼最小的一個。

運作機制用三句話可以講完。app 布防時會啟動一個前景服務,監聽系統的充電狀態廣播;充電線被拔掉的廣播一到,就用 MediaPlayer 播放內建警報音,循環播放直到你解除;解除的唯一途徑是系統的 BiometricPrompt 對話框,通過指紋、臉部或螢幕鎖的驗證才會停。有個工程細節值得點出來:警報音掛的是 Android 的鬧鐘音流(程式碼裡的 USAGE_ALARM 標記),照 Android 平台的慣例,這個音流不受一般靜音模式影響,所以把手機調成靜音不會讓它在關鍵時刻閉嘴。這是從程式碼與平台慣例推出的判斷,不同廠牌的客製化系統偶爾有例外,裝好後建議自己先測一輪。

Stay Put 的 Android 主畫面,中央是 Stay Put 布防按鈕,介面為英文Pin
官方畫面:主畫面只有一個布防鈕,設計極簡

內建的警報音有兩種可選,這個選擇透露了作者的幽默感:一種是便利商店防盜門的「嗶嗶嗶」音效,另一種是鴨子叫。兩個音檔都取自 freesound.org 的創用授權素材,原始碼裡附了完整的出處與授權連結。防盜門音效標示為禁止商業使用的 CC BY-NC 4.0;鴨子叫在 freesound 站上標示為可商用的 CC BY 4.0,不過程式碼註解把它也寫成 BY-NC,註解附的連結其實指向 BY 4.0,兩種說法自相矛盾,保守起見兩個都當非商業素材看待最穩。app 本體是 MIT 授權,愛怎麼改怎麼散布都行,但內建音效的授權條件不同,如果你打算拿它二次製作影片或改作散布,記得換掉音檔。

連網路權限都沒有:無追蹤宣稱的架構級證據

「不追蹤、不收集資料」這句話在 app 商店裡聽到爛了,Stay Put 特別的地方是這句話不需要信任,可以驗證。打開它的 AndroidManifest,宣告的權限總共七項:前景服務(兩項)、通知、全螢幕通知、精確鬧鐘、生物辨識、解除鎖屏,清單上標示為安裝即自動授予的一般權限等級。清單裡沒有 INTERNET。一支沒有網路權限的 app 在作業系統層面被禁止建立任何網路連線,想偷傳資料也沒有路。翻遍八個 Kotlin 檔也看不到任何網路呼叫,這層宣稱做到了架構級的乾淨。

第三方套件庫給了第二層背書。Stay Put 收在 F-Droid(Android 開源軟體的獨立套件庫,所有收錄的 app 由庫方從原始碼自行編譯)裡,2026 年 9 月 15 日上架的 0.8.11 版是目前的最新版,頁面上沒有任何反特性標記。F-Droid 的反特性制度會誠實標出 app 含廣告、追蹤、推廣其他 app 等問題,零標記代表這些都沒有。在 Play 商店裡搜「anti theft alarm」出來的那些 app,打開多半是廣告與訂閱,兩相對照就是 Stay Put 的存在理由。

下載管道還有一個給謹慎使用者的小禮物:作者把 APK 簽章憑證的 SHA-256 指紋直接公布在說明文件裡。從任何管道抓到安裝檔之後,可以用這個指紋比對是不是作者本人簽的,防掉包的機制做得比很多商業軟體還實在。

三道防線的取捨:它防的是順手,不是蓄謀

把這個 app 的安全模型拆開,會看到三個互相咬合的設計,每個都在防特定的繞法。

最先擋人的是布防前的檢查。程式在主畫面上放了檢查卡:手機必須正在充電、必須設有螢幕鎖(PIN、圖形或生物辨識都算)、警示音量必須超過最大值的一半,三個條件都過,布防鈕才可用。手機沒設鎖的人直接被擋在外面,這個設計很誠實:Stay Put 自己不是鎖,它要求你的手機已經有鎖,它才有意義。試想沒有這道檢查的後果:小偷拔線、警報響、按掉 app、得手,全程五秒。有了它,警報響了之後的每一步都要先過你手機的鎖。

音量是另一個戰場。有一種先期的繞法是趁你不注意先把警示音量調低,等你布防之後警報就只是蚊子叫。Stay Put 的對策寫在服務程式碼裡:布防當下記住你目前的警示音量當基準,之後系統音量一有變動就檢查,只要低於基準就自動調高。這個功能是 2025 年 2 月的 0.8.2 版加上的,對應當時議題區有使用者通報音量被鎖在 50% 以下的要求,如今變成預設開啟的設定。

最有意思的一道取捨叫 Allow Re-Plug(允許重新接電),預設開啟。開著的時候,拔線後 app 會等整整一秒才響,這一秒內電源接上了就當沒事;關掉的時候,拔線的瞬間立刻響,沒有寬限。為什麼要等一秒?議題區 #33 有個真實案例:有人的 Pixel 6 充電埠接觸不良,電源會瞬斷又接上,如果瞬斷就響,一個晚上警報響到沒完。但這一秒的寬限也留了一個理論上的縫:動作快的人拔了線立刻接上行動電源,供電沒斷,警報就不響。作者在議題區答覆時把兩難講得很白,這一秒是給接觸不良的使用者的,防接力攻擊的方案是把 Allow Re-Plug 關掉,兩個需求本身互相矛盾,使用者自己選。這種把取捨攤開給使用者看的姿態,比宣稱「全方位防護」的行銷文案可信得多。

Stay Put 布防狀態的畫面,主按鈕變成 Disarm 解除Pin
官方畫面:布防後按鈕變為解除,需通過驗證才會停

還有一個所有潛在買家都要先想清楚的定位問題,作者自己也在發布說明裡寫了:Stay Put 不是萬無一失的防盜警報系統。它防的是順手牽羊的機會主義者,那個在青旅大廳看到無人手機順手拿走的人;它防不了蓄謀的、知道這個 app 存在、先關靜音再動手的人(雖然鬧鐘音流不受靜音影響,但直接關機或強制重開機能繞過大部分軟體警報)。手機真正的保險是 Android 內建的尋找裝置與遠端清除,Stay Put 是加在那之前的嚇阻層,不是替代品。

活著但沒有長大:一年半的版本史全是保養

看維護時間線可以先校準期待。這個 repo 在 2022 年 9 月就建立了,但第一個正式版 0.8.0 到 2025 年 1 月才發布,前面兩年多的時間軸上只有零星的準備痕跡,是個不趕進度的打磨型專案。2025 年 1 月到 2 月是一段爆發期,連發五個版本,音量攻防與自選警報音都是這段時間加的;然後是將近八個月的空窗,2025 年 10 月一次補了三個版本,之後的節奏穩定下來:2026 年 2 月一版、4 月一版、6 月一版、9 月一版。

有個觀察比版本頻率更誠實:從 0.8.2 之後的九個版本,沒有再加入任何新的防盜功能,改動是修相容性、換新主題、補翻譯與更新相依套件。0.8.3 修小米 MIUI 的相容性,0.8.5 支援 Android 16 與動態色彩,其餘多半是整頓建置環境。2026 年的提交紀錄裡最有意思的是一個叫 WORK_LOG 的檔案,作者用它記錄把建置系統一步步現代化的過程,格式是給規劃用的 AI 讀的工作日誌,一個人的業餘專案用 AI 副駕做枯燥的工程保養,這大概是 2026 年小型開源專案最典型的生存樣貌:app 本體早就夠用了,維護者的精力花在讓它持續能編譯、持續能過新系統的門檻。所以「活躍維護中」這個描述是對的,但它的意思是保養得很好,功能面則已經定型。

兩個開著的坑:最需要它的場景正好是最不穩的場景

議題區有兩個未解的問題,直接關係使用體驗,裝之前應該知道。

#37 在 2026 年 4 月通報:app 在背景執行時,拔掉電源不會響,要等到把 app 切換到前景,警報才補響。通報者描述得具體,至今沒有作者的答覆。如果這個問題在你的手機上重現,它相當致命,因為這個 app 的設計使用方式就是布防之後把手機放著、螢幕暗掉,那正是背景狀態。

另一個是 2026 年 2 月通報的 #36:插電布防之後把螢幕關掉,拔線,警報正常響起,但畫面上的解除按鈕按了沒有反應,用指紋解鎖之後再按還是沒有反應,最後是把 app 整個重開才能解除。通報者的場景就是標準的使用情境,而最需要警報的時刻剛好是最難解除的時刻。

這兩個問題都還開著,可能只影響特定機型或特定系統版本,也可能隔幾個版本就修掉,但 9 月的 0.8.11 都還沒有碰到它們。議題區整體的樣貌也值得看一眼:十來個開著的議題裡,除了這兩個穩定性通報,其餘多半是功能請求(自訂警報音、紀錄檔、企業受管理的設定、上架其他套件庫),作者對功能請求的態度是挑著答覆、挑著做,2025 年 10 月那個充電瞬斷的一秒寬限就是從議題區長出來的。務實的做法是裝好之後照自己的使用情境演練一輪:布防、關螢幕、等個幾分鐘、拔線,看警報響不響、解除順不順,在你真的把手機留在圖書館之前把答案找出來。

台灣使用者的安裝現實:沒有 Play 商店,介面是簡體中文

Stay Put 不在 Google Play 上架,議題區有人問過,作者明確答覆不打算上架。安裝管道有三條:F-Droid 套件庫(最省事,裝了 F-Droid 客戶端,之後的版本會自動更新)、IzzyOnDroid 套件庫(性質類似),或直接從 Codeberg 的發布頁抓 APK 檔手動安裝。對台灣的使用者來說,這表示你得啟用「安裝未知來源應用程式」的權限,多半還要裝一個平時用不到的套件庫 app,門檻比 Play 商店高一截,這個門檻本身也篩掉了大部分的順手安裝。

介面語言是另一個現實。app 支援英文、德文、簡體中文等四種語言,簡體中文翻得相當完整(61 條字串對 63 條原文),但沒有繁體中文。好消息是這個 app 的字串量本來就少,畫面就是一個布防鈕與幾張檢查卡,看英文或看得懂簡體都能操作,設定項就三個:允許重新接電的開關、警報音選擇、音量自動調整的開關。

誰該裝它,誰不用麻煩

適合的人畫像很清楚:常在公共場合把手機放著充電的人。旅宿的公共插座、圖書館的桌面、機場的充電站、營區的浴室,這些是說明文件自己列的場景,也是這個 app 唯一想解決的問題。把手機放著三十分鐘去洗澡或上課的人,多一道會尖叫的防線,成本只是幾 MB 的儲存空間與一次套件庫的安裝學習。

已經有相近工具的人可以想想組合。Android 的開源小工具生態裡,把手機變成特定用途裝置是一個持續的主題:行車記錄器有 Alibi(同樣是零網路權限哲學的開源 app),大量清理簡訊有 Sms,螢幕投影到電腦有 Escrcpy。Stay Put 補上的是「放著充電時的看門狗」這一格,彼此不重疊,同一支舊手機可以按場合換角色。

不適合的人也直說:想要手機遺失後追蹤位置、遠端鎖定、遠端清除的人,這些是 Google 尋找裝置的功能,Stay Put 一律不做(也做不了,它沒有網路權限)。把它想成摩托車的龍頭鎖就好:它增加的是現場嚇阻力與作案的時間成本,失竊之後的定位與救援仍然要靠 Google 帳號那套尋找裝置。

最後一個判斷給還在猶豫的人。這個 app 的價值與它的限制來自同一個源頭:一個德國開發者用業餘時間照顧的小專案。因為小,所以八個檔案就讀得完、零網路權限驗得了、沒有廣告與訂閱的商業動機;也因為小,所以背景不響與解除失效的問題開了半年上下還沒有人力修。如果你的使用情境是低頻但真實的(一週幾次的公共充電),願意花二十分鐘走一次 F-Droid 的安裝流程並自己做一輪演練,它是一個設計誠實、程式碼經得起檢視的選擇;如果你要的是開箱即用、出事找得到人負責的商業級服務,這類一人開源專案從來就不是那個答案。

Sliven 褚崇名
Sliven 褚崇名

每日分享科技新知、免費資源以及 WordPress、虛擬主機相關主題,任何問題歡迎在科技月球下方留言,或是發送 Email 至 [email protected] 與我聯繫。

文章: 1603

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *


Share to...