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