
你的手機是不是每隔一段時間就彈出一條系統更新通知設置圖標的右上角是不是始終掛著一個怎么都消不掉的小紅點就算你把系統更新應用的通知權限關掉它過兩天又會換個方式彈出來可能是鎖屏界面可能是狀態欄橫幅也可能是打開設置時直接鋪一個全屏更新頁面。這個問題的根源不在“通知權限”而在系統里負責檢查 OTA 更新的一組服務。只要那組服務仍然在后臺運行它就一定會想方設法把“有新版本”這件事告訴你。本文要講的就是如何用一段一鍵安裝腳本在 Android 設備上禁用這些更新服務、清除設置存儲里的小紅點標記并從源頭攔截 OTA 更新彈窗。先給出一個明確判斷這個方法對動手能力有一定要求但它并不復雜。你不需要 Root不需要刷機只需要一臺 Windows / macOS / Linux 電腦、一根數據線和一份靠譜的腳本。最關鍵的并不是執行命令而是搞清楚你到底禁用了哪些包以及為什么有些包絕對不能動。我會先解釋這套機制再給出可直接運行的腳本最后列出最常見的坑和恢復辦法。1. 這篇文章真正要解決的問題很多人都會遇到這幾類情況系統更新彈窗頻繁而且每次彈出來都是“正在檢查更新”既占后臺資源又打斷當前操作。OTA 更新包已經下載好了但一直被擱置在存儲空間里占掉幾百 MB 甚至 1GB 以上清理又清理不掉。設置圖標出現紅點但點進去看完更新頁面紅點依然存在強迫癥非常難受。嘗試關閉“應用通知”或“禁用系統應用”結果發現很多系統包是灰的點不動或者重啟后恢復原樣。這些問題的本質是設備廠商預置的 OTA 更新鏈路沒有被切斷。OTA 更新的完整流程通常由三個部分組成負責聯網查詢的更新服務、負責下載安裝的更新應用以及負責展示“設置小紅點”和系統消息的 Setting 組件。只關掉其中一個其他兩個仍然會繼續工作彈窗自然就會出現。傳統方案大多是“關通知”“清緩存”“停用更新應用”但往往只能管幾天。原因是系統更新服務的包名因品牌、ROM 版本不同而有差異很多人在不清楚包名的情況下只能碰運氣。這篇文章會提供一個“自動識別候選包 備份原狀態 一鍵禁用 可恢復”的腳本讓你不用到處查包名也不需要反復試錯。但也要先說明邊界這篇文章的方法只推薦用在你自己的設備、測試設備或已被授權維護的設備上。禁用系統更新意味著你的設備不會自動獲得官方安全補丁長期使用會有安全風險。生產環境、工作主力機、涉及敏感業務的設備請務必先做備份并評估風險。對大多數普通用戶而言最穩妥的操作順序是先用備用機驗證效果再決定是否在主機上執行。2. 小紅點與 OTA 彈窗背后的技術機制2.1 設置小紅點是怎么產生的設置圖標的紅點本質上是 Android 的“通知角標”機制。當 Settings 或系統更新相關應用發送了一條高優先級的通知桌面的 Launcher 就會讀取到未讀狀態并在設置圖標右上角畫一個紅點。在部分 ROM 中這個紅點的數據會緩存在 SettingsProvider 中。即使你在通知欄里劃掉了那條更新通知角標數據也不會立刻清除需要清掉“設置存儲”或重啟 Launcher 才能消失。這就解釋了為什么很多人只是點開設置看看更新頁面紅點仍然存在。2.2 OTA 更新彈窗是從哪來的OTA 彈窗不是單一應用突然彈出來的而是由一條鏈路觸發的某個系統服務檢測到當前系統版本號和廠商服務器返回的最新版本號不一致。更新服務向用戶發送通知或者直接拉起更新應用。更新應用聯網下載更新包下載完成后發送“立即安裝”類提醒。如果更新包已經存在那么每次開機、解鎖或連接 Wi-Fi 時更新應用都會再次彈出提示。這里的核心不是“通知權限”而是負責查詢版本和下載安裝的進程。如果這些進程還在運行即使你關閉通知它們照樣會在后臺檢查進程一旦拿到更新包還是會用系統級彈窗來提醒你。2.3 為什么“關閉通知”不是長久之計相比普通第三方應用系統更新組件有幾個特殊權限部分系統應用的通知權限受保護用戶在設置界面無法直接關閉。廠商 ROM 可能會在每次系統進程重啟后重置用戶的數據或偏好。OTA 更新服務可能在更新包下載后用其他包名重新拉起導致你之前關閉的那個包不再生效。更有效的思路是直接“禁用用戶級更新服務”也就是通過pm disable-user讓相關包對當前用戶不可用。這樣既不需要 Root也不會影響系統其他模塊的正常啟動因為 Android 的包管理機制會在底層攔截這些包的運行。下面用一個表格來對比幾種常見處理方式的效果處理方式是否需要 Root效果風險關閉通知權限否短暫隱藏通知彈窗仍可能再次出現幾乎無風險清除設置存儲否小紅點可能暫時消失但更新服務仍會重新觸發會丟失部分本地設置禁用更新服務否能阻止大部分 OTA 彈窗可能誤禁相關系統組件Hosts 攔截是能阻止域名請求但部分更新走 IP 直連需要維護規則誤攔會影響其他服務Magisk 模塊是能組合多種策略效果持久設備必須 Root風險較高3. 環境準備與前置條件在開始之前你需要準備以下環境一臺 Android 設備。系統版本不限但建議 Android 8.0 及以上因為低版本系統的包管理行為有所不同。一臺 Windows / macOS / Linux 電腦用于執行 ADB 命令。一條能傳輸數據的數據線不是只充電的那種。在手機上開啟“開發者選項”和“USB 調試”。不同品牌開啟方式不同一般是在“設置 - 關于手機”里連點版本號 7 次。ADB 工具。如果你的電腦已經安裝了 Android Studio可以使用adb否則請單獨安裝 platform-tools。安裝平臺工具后可以在終端執行adb version驗證是否可用。只要命令能正常輸出版本號就說明環境沒問題。版本號建議不要太老新版本對禁用系統應用的支持更好。連接設備后先用以下命令檢查設備狀態adb devices -l如果輸出中出現unauthorized說明手機端還未授權請在手機屏幕上點擊“允許 USB 調試”。如果輸出中出現device則說明連接正常可以進入下一步。之后所有操作都在電腦終端中執行。腳本運行過程中需要網絡嗎一般不需要因為禁用的是本機包不依賴外網。4. 核心思路沒有 Root 和有 Root 時怎么做4.1 無 Root 方案ADB 禁用更新服務沒有 Root 的情況下我們依賴 Android 系統提供的pmpackage manager命令。它允許當前用戶對部分系統應用執行disable-user也就是“僅對當前用戶禁用”并不會卸載系統里的文件因此安全性相對較高。具體操作流程是掃描當前設備中包名包含update、updater、ota等關鍵字的包。排除明顯高危的包例如com.android.settings、com.google.android.gms、com.google.android.play.services等。將這些更新相關包記錄到備份文件中。執行pm disable-user --user 0禁止它們運行。重啟設備觀察效果。這個方案的優點是無 Root、可恢復、不破壞系統文件缺點是依賴廠商是否允許禁用這些包。部分 ROM 會將更新服務注冊為受保護應用disable-user會直接報錯這時就需要考慮 Root 方案。4.2 有 Root 方案凍結、Hosts、Magisk 模塊如果你已經 Root可以做的事情更多使用凍結工具如 AppManager、SD Maid把更新服務徹底凍結。通過 hosts 文件攔截 OTA 更新服務器的域名請求。制作一個 Magisk 模塊在開機時自動追加 hosts 規則或修改系統屬性。不過Root 方案雖然能力強風險也更高。修改系統屬性例如安全補丁日期可能影響應用兼容性攔截域名規則寫錯了可能讓其他應用無法聯網。因此下面我會把無 Root 的 ADB 方案作為主線Root / Magisk 作為進階補充。絕大多數人的需求用無 Root 方案就足夠了。5. 一鍵腳本實現ADB 方式完整代碼這一節是全文的核心。我會提供一個可直接運行的 Bash 腳本以及配套的恢復腳本。你需要把腳本保存為本地文件然后通過終端執行。5.1 禁用 OTA 更新腳本這里的腳本會完成以下工作檢查 ADB 是否可用檢查設備是否連接。掃描設備中與 OTA 更新相關的候選包。排除高風險系統包避免誤禁關鍵組件。將當前啟用狀態備份到本地。向用戶確認后逐個禁用更新服務。輸出后續驗證建議。先創建腳本文件。在電腦上新建一個文件命名為disable_ota_update.sh寫入以下內容#!/usr/bin/env bash set -euo pipefail # # disable_ota_update.sh # 用法: ./disable_ota_update.sh # 說明: 通過 ADB 禁用 Android 設備上的 OTA 更新相關組件 # 風險: 操作前請備份設備數據僅限本人設備使用 # ADB${ADB:-adb} # 1. 檢查 ADB if ! command -v $ADB /dev/null 21; then echo [錯誤] 未找到 adb 命令請先安裝 platform-tools。 exit 1 fi # 2. 檢查設備連接狀態 if ! $ADB get-state /dev/null 21; then echo [錯誤] 未檢測到已連接設備請先開啟 USB 調試并授權。 exit 1 fi # 3. 定義高風險包名這些包不建議禁用 DANGEROUS_PACKAGES( com.android.settings com.android.systemui com.google.android.gms com.google.android.gsf com.google.android.setupwizard com.android.providers.settings ) # 4. 掃描候選包 echo [信息] 正在掃描系統更新相關包... mapfile -t CANDIDATES ($ADB shell pm list packages | sed s/^package://g | grep -Ei update|updater|ota|systemupdate || true) if [[ ${#CANDIDATES[]} -eq 0 ]]; then echo [信息] 沒有找到明顯的 OTA 更新相關包。 echo [信息] 如果你的設備仍然彈窗請手動執行: adb shell pm list packages | grep -Ei update|ota exit 0 fi # 5. 過濾高風險包 FILTERED() for pkg in ${CANDIDATES[]}; do skip0 for danger in ${DANGEROUS_PACKAGES[]}; do if [[ $pkg $danger ]]; then echo [警告] 高危包 $pkg 將被跳過避免禁用系統設置或 GMS。 skip1 break fi done if [[ $skip -eq 0 ]]; then FILTERED($pkg) fi done if [[ ${#FILTERED[]} -eq 0 ]]; then echo [信息] 過濾高風險包后沒有可禁用的候選包。腳本結束。 exit 0 fi # 6. 打印候選包并要求確認 echo echo [信息] 以下包將被禁用: for pkg in ${FILTERED[]}; do echo - $pkg done echo read -r -p [確認] 是否繼續? (y/N) confirm if [[ ! $confirm ~ ^[Yy]$ ]]; then echo [信息] 用戶取消操作腳本退出。 exit 0 fi # 7. 備份當前啟用狀態到本地 BACKUP_DIR./ota_backup mkdir -p $BACKUP_DIR : $BACKUP_DIR/enabled_packages.txt echo [信息] 正在備份當前啟用的包狀態... for pkg in ${FILTERED[]}; do if $ADB shell pm list packages -e | sed s/^package://g | grep -qxF $pkg; then echo $pkg $BACKUP_DIR/enabled_packages.txt fi done echo [信息] 已備份到 $BACKUP_DIR/enabled_packages.txt # 8. 禁用相關包 echo for pkg in ${FILTERED[]}; do echo [信息] 正在禁用 $pkg ... if $ADB shell pm disable-user --user 0 $pkg; then echo [成功] $pkg 已禁用 else echo [失敗] $pkg 禁用失敗可能是受保護系統應用 fi done # 9. 驗證 echo echo [信息] 禁用操作完成。 echo [提示] 如果設置小紅點仍然存在可以執行: adb shell pm clear com.android.settings echo [提示] 恢復腳本將在需要時幫你重新啟用這些包。保存后在終端執行chmod x disable_ota_update.sh ./disable_ota_update.sh如果你的adb不在系統 PATH 中也可以用ADB/path/to/adb ./disable_ota_update.sh5.2 恢復 OTA 更新腳本為了避免誤操作后無法恢復建議在運行上面腳本之前先準備好恢復腳本。新建一個文件restore_ota_update.sh寫入以下內容#!/usr/bin/env bash set -euo pipefail # # restore_ota_update.sh # 用法: ./restore_ota_update.sh # 說明: 從 ota_backup/enabled_packages.txt 恢復禁用的系統包 # ADB${ADB:-adb} BACKUP_DIR./ota_backup if ! command -v $ADB /dev/null 21; then echo [錯誤] 未找到 adb 命令。 exit 1 fi if [[ ! -f $BACKUP_DIR/enabled_packages.txt ]]; then echo [錯誤] 沒有找到備份文件 $BACKUP_DIR/enabled_packages.txt exit 1 fi echo [信息] 開始恢復備份中的包... while IFS read -r pkg; do if [[ -z $pkg ]]; then continue fi echo [信息] 正在重新啟用 $pkg ... if $ADB shell pm enable $pkg; then echo [成功] $pkg 已恢復 else echo [失敗] $pkg 恢復失敗 fi done $BACKUP_DIR/enabled_packages.txt echo [信息] 恢復操作完成。建議重啟設備后確認系統更新是否恢復工作。5.3 手工執行方式如果你不想用完整腳本也可以手工執行關鍵命令。先掃描候選包adb shell pm list packages | grep -Ei update|updater|ota然后查看某個包是否處于啟用狀態adb shell pm list packages -e | grep -Ei update|updater|ota禁用某個明確的包adb shell pm disable-user --user 0 包名重新啟用adb shell pm enable 包名這里要特別提醒手工方式雖然簡單但容易因為你搞混包名而誤禁關鍵組件例如誤禁了com.android.settings。這會導致設置無法打開甚至桌面崩潰。所以更推薦使用上面帶過濾和備份的腳本。6. 進階利用 Hosts 攔截與 Magisk 模塊實現深度屏蔽如果你已經 Root可以考慮更深一層的屏蔽方案。但請注意這一步不是必須的也不適合所有人。6.1 Hosts 攔截的基本思路OTA 更新服務在聯網時通常會請求固定的服務器域名。如果將這些域名解析到本地回環地址127.0.0.1那么更新服務就無法下載新版本信息也就不會觸發彈窗。在傳統 Root 設備上可以直接編輯/system/etc/hosts但 Android 10 及以上使用動態分區系統分區只讀所以更推薦通過 Magisk 模塊在開機時追加規則。你需要先確認設備實際訪問哪些域名。方法有幾種在路由器上查看設備聯網日志。使用抓包工具在設備上抓取更新請求的域名。在更新服務被禁用前通過dumpsys或日志觀察。這里不會給出具體的廠商域名因為不同設備、不同地區差異很大。如果你寫錯了域名可能什么效果都沒有更危險的是如果誤把某個公共域名攔掉會影響其他聯網應用。6.2 Magisk 模塊骨架Magisk 模塊的本質是一個目錄里面包含module.prop和若干腳本。下面是一個最小模塊骨架用于在開機時追加 hosts 域名規則OTABlocker/ ├── module.prop ├── post-fs-data.sh └── block_hosts.txtmodule.prop內容idota_blocker nameOTA Blocker version1.0 versionCode1 authoryourname descriptionBlock OTA update domain requests on bootpost-fs-data.sh內容#!/system/bin/sh MODDIR${0%/*} if [ -f $MODDIR/block_hosts.txt ]; then cat $MODDIR/block_hosts.txt /system/etc/hosts fiblock_hosts.txt內容127.0.0.1 update.example.com 127.0.0.1 ota.example.net將整個目錄壓縮成 zip 后用 Magisk 內置的模塊安裝功能安裝即可。這個模塊只負責修改 hosts不會觸碰系統其他文件卸載也比較干凈。但我必須說明這個方案的實際效果取決于你能不能拿到準確的更新域名而且 OTA 更新請求不一定都走域名有些會走 IP 直連。若只是單純想消滅彈窗ADB 禁用更新服務通常是更簡單有效的方案Magisk 模塊更適合作為輔助手段。6.3 不建議使用的方式修改安全補丁日期有些教程會建議修改ro.build.version.security_patch為2099-12-31以中斷安全補丁檢查。這樣做確實能讓部分設備認為“已經是最新版本”也會讓設置里的小紅點消失但代價是部分應用在運行時讀取安全補丁日期一旦發現日期異常可能拒絕執行銀行類、支付類業務某些系統服務也會出現兼容問題。所以在本文中我不推薦這種方式。尤其是工作主力機更不要為了消滅彈窗而改寫系統安全屬性。7. 運行結果與效果驗證腳本執行完成后不能只看終端輸出“禁用完成”還要實際驗證效果。7.1 驗證更新服務是否被禁用執行下面的命令檢查已經被禁用的包是否包含你期待禁用的更新服務adb shell pm list packages -d | grep -Ei update|ota如果命令沒有任何輸出說明候選包沒有被禁用可能是廠商使用了其他命名也可能腳本中的disable-user沒有成功。此時需要回到第 5.3 節手動掃描包名。7.2 重啟設備后觀察結束 ADB 會話重啟設備。重啟后臨時保留更新應用的包通常也會被禁用除非廠商有保護機制。觀察以下現象設置圖標右上角的小紅點是否消失。下拉通知欄是否還有系統更新提醒。打開設置是否還會出現“系統更新”入口的角標。連接 Wi-Fi 后是否還會自動下載更新包。如果小紅點已經消失說明清除角標或禁用更新服務起了作用如果紅點還在繼續排查。7.3 清理“設置”存儲的補充操作對部分 ROM 來說設置小紅點的數據是歷史遺留緩存禁用更新服務后不會自動消失。這時需要清除 Settings 應用的數據adb shell pm clear com.android.settings注意這個命令會清除設置應用的本地數據包括你自定義的很多設置項例如通知偏好、顯示偏好、部分應用權限設置。執行前請先備份或在備用機上驗證。清除設置數據后桌面圖標通常會自動恢復正常但可能需要重新設置壁紙、鈴聲音量等偏好。清除之后再次執行adb shell pm list packages -d | grep -Ei update|ota確認更新服務仍處于禁用狀態。如果紅點又出現大概率是某個更新組件被重新開啟需要繼續排查。8. 常見問題與排查思路問題現象可能原因排查方式解決方案運行腳本后沒有任何候選包廠商更新服務包名不含常見關鍵字執行adb shell pm list packages并檢查含 update/ota 的包手動識別并添加到腳本候選列表禁用后重啟又被自動啟用系統存在受保護應用的自動恢復機制查看pm list packages -d是否恢復使用 Root 方案凍結或聯合 hosts 攔截設置小紅點仍然存在角標數據緩存在 SettingsProvider 或 Launcher清除設置存儲或桌面 Launcher 數據執行pm clear com.android.settings但要先備份禁用后系統設置閃退誤禁用了設置相關包查看 logcat 或崩潰提示執行adb shell pm enable 包名或運行恢復腳本Google Play 服務異常誤禁用了 GMS 相關包查看pm list packages -d恢復com.google.android.gms和com.google.android.gsf禁用包時提示not allowed受保護的廠商系統應用查看完整錯誤信息使用pm disable或 Root 方案更新包仍然在后臺下載更新服務被禁用但下載服務/連接服務還在查看當前運行的下載服務補禁對應組件或使用 hosts 攔截域名排查工作的第一步永遠是確認設備上實際存在的包名。不要憑經驗去猜因為你可能在 A 品牌設備上看到的是com.android.updater到 B 品牌設備上就變成了com.xx.updater。先掃描再行動是這套方法最重要的一步。9. 最佳實踐與工程建議9.1 不要盲目禁包系統更新服務通常只占所有系統包的一小部分。最理想的做法是只禁用包名中含update、updater、ota的包同時警惕高危包。禁用錯一個就可能讓系統設置無法打開甚至影響整個系統的穩定性。我的建議是腳本提供的過濾列表只是基礎你應該在實際執行前再人工確認一遍。如果你不確定某個包是什么可以在終端用adb shell dumpsys package 包名查看包信息或者先在網上搜索確認。9.2 一定要備份當前狀態腳本里的enabled_packages.txt備份文件非常重要。它記錄了你禁用了哪些包、這些包原本是否是啟用狀態。如果有一天你想要恢復系統更新只需運行恢復腳本不用再去回憶之前動了哪些東西。9.3 選擇正確的執行對象強烈建議不要在重要設備上立刻執行。先找一臺備用手機或者不常用的舊設備完整跑一遍腳本確認無異常后再操作主力機。這樣即使出現問題也不會影響正常使用。9.4 安全更新不能完全忽略禁用 OTA 更新意味著你不會自動收到安全補丁。如果你的設備用于支付、辦公或存儲敏感資料建議每隔一段時間手動開啟更新服務下載并安裝安全補丁然后再次禁用。不要因為彈窗煩惱就徹底放棄安全維護這是治標不治本的隱患。9.5 保留 ADB 調試入口執行完腳本后不建議立刻關閉 USB 調試。如果你需要恢復系統更新或者發現某個應用異常隨時可以用adb shell pm enable恢復相關包。一旦關閉 USB 調試再想恢復就會多一道解鎖步驟。9.6 面向不同 ROM 的通用策略每個廠商 ROM 的更新包名可能不一樣但這套方法的核心思路是通用的先掃描再備份然后禁用最后驗證。只要你愿意花幾分鐘看完輸出結果就能把“一鍵安裝”變成“按需定制”。如果某臺設備限制較多再考慮 Root 方案或 Magisk 模塊不需要在一開始就追求最復雜的手段。如果你在實機操作時遇到了腳本不認設備、找不到候選包、禁用后又被自動恢復這幾種情況先把本文第 8 節的表格再讀一遍。這套方案真正的門檻從來不是那幾行命令而是你愿不愿意在動手之前先把設備上的包名和自己的預期目標都搞清楚。