[心得] adb編譯,啟動!解救慢吞吞的老Android!
大家好,我的主力機是還沒換過電池的原汁原味2018年旗艦Galaxy Note 9 (台版Exynos 6GB/128GB),用到現在第六年,應該比版上多數人的主力機都老了XD
究竟當年的旗艦機現在有多慢呢?隨便開任何一個App都可以等十秒,結帳永遠是我卡住大家......剩下的說多了都是淚QQ
前陣子研究了三星官方提供的Galaxy App Booster之後,搭配版友的討論、網路上的文件、其他人的討論等,整理了以下的一些心得,希望可以幫助跟我一樣同樣身陷在垃圾效能手機當中的人~
【Galaxy App Booster的原理?】
(注意這段比較長,想要直接實踐出真知的人,可以跳到下一段:
【如何手動進行編譯】)
Android的app預設並不是用底層硬體可以直接執行的機器語言 (Machine code,人通常看不懂) 儲存的,而是以比較高階 (人看得懂) 的程式語言形式儲存在手機內部的。機器終究不是人,看不懂人類寫的程式語言,只能讀懂機器語言的一條條指令。高階的程式語言,會需要先翻譯為低階的機器語言才能執行,可以類比為:
- 程式語言:買一包最便宜的米
- 機器語言:找錢包→帶錢包→出門→走到某家量販店→走到米的走道→反覆比較找到最便
宜的米→把米拿起來→去結帳→走回家
可見機器語言所佔用的空間較大,但對機器而言是不可或缺的。在遠古的Android 2.2時代,機器語言是透過Dalvik編譯的,它只會在執行app的時候同步監測最常反覆出現的指令,並且將這些反覆出現的指令編譯為機器語言,這種做法稱為JIT (Just-in-time)。這樣做的好處是佔用空間少,壞處就是執行效能差、耗電 (因為每次點開app後都要重新編譯)。
到了Android 4.4、5.0的時代,Google一改以往的做法,推出了Android Runtime (ART) 取代了Dalvik。ART的革命之處在於除了JIT以外,也支援對整個app提前編譯為機器語言。這種做法稱為AOT (Ahead-of-time),會佔用較多的系統空間,但好處是AOT編譯後就不需要JIT再編譯一次了,可以直接上手,大幅增進了效率,對使用者而言就是手機的速度變快、耗電變低了。在手機的Android系統升級後,第一次開機都會出現「更新應用程式... (1/500)」的進度條,就是在執行ART的AOT編譯。
理論上在安裝時就進行完整編譯是最好的選項,但是這樣做耗時會太久,因此Android 7以後的系統,在首次安裝時並不會完整執行AOT編譯,只有在手機閒置且充電時會在背景默默進行「較為完整」的AOT編譯。說是「較為完整」,是由於編譯整個App消耗的空間太大、時間太久,因此Android預設並不會將整個App都進行編譯,會搭配使用App時同步監測的成果(稱為profile),再對部分程式語言執行編譯與最佳化,力圖在速度與儲存空間上取得平衡點。
然而......對老手機而言,這個平衡點就是App要花十秒才跑得出來XD,因此三星的GalaxyApp Booster就是手動觸發手機的AOT編譯機制,讓手機提前把程式語言編譯為機器語言後儲存起來,讓下次使用時的速度得以提升。
對一個App進行AOT編譯的比例 (稱作Compiler filters) 由少到多,可以分成許多種 (各家廠商不同):
- verify
- interpret-only
- quicken
- space-profile、space
- speed-profile、speed
- everything-profile、everything
越下面的模式,編譯比例越高,編譯的耗時也越久,編譯後的App執行速度理論上較快。而帶有profile字樣的代表雖然是同種方法,但只會針對同步監測的結果進行編譯,編譯耗時較短,但是之後執行會比不帶有profile字樣的更慢。
Android 8~11預設似乎都是quicken (但各家廠商會有不同),Galaxy App Booster則是以speed-profile進行編譯。聰明的你一定發現了,那為何不用everything編譯呢?這樣速度豈不是會更快?我自己實測了之後,發現還真的有變快!
【如何手動進行編譯】
理論上,Android 7以後的系統都支援手動編譯,只需要電腦連接與adb即可,不需要root權限。
1. 先開啟手機的「開發人員選項」,並且啟用「USB 偵錯」。
2. 將手機連接上電腦,輸入指令「adb devices」以啟動adb並確認連接。
(1) 連接完成後,會跳出類似這樣的內容,最後有「device」字樣即為連接完成:
List of devices attached
424947564e473498 device
(2) 若最後為「unauthorized」,請你在手機上點「允許這台電腦進行USB偵錯」:
List of devices attached
424947564e473498 unauthorized
(3) 若最後為「unauthorized」,但手機並未跳出訊息,請依序輸入以下兩條指令重新啟動adb服務 (感謝kkkk1234版友提供):
adb kill-server
adb start-server
3. 輸入指令,以everything模式重新編譯程式
注意這個步驟最為關鍵!將所有程式以everything模式重新編譯需要數小時的時間。輸入指
令後,手機就會開始在背景編譯,此時無論拔掉傳輸線、重開機都無法阻止 (我試過了XD),所以會有幾個小時手機會發熱、變慢、耗電增加,也無法更新或安裝其他程式
(會顯示安裝失敗)。
(1) 若要強制對所有程式重新編譯 (適用於第一次執行):
adb shell pm compile -m everything -f -a
(2) 若只對尚未編譯的程式進行編譯 (適用於程式更新後):
adb shell pm compile -m everything -a
(3) 若只要強制對特定程式進行編譯 (將<package_name>取代為程式的套件名稱,例如Spotify為com.spotify.music):
adb shell pm compile -m everything -f <package_name>
(4) 如果跳出以下錯誤:
Error: Unknown command 'compile'
可能是Android版本太新的緣故!(感謝Pisces與a123444556版友回報)
請把上述指令中的pm改為cmd package,再試一次即可。
(5) 如果有跑成功,但結束時跳出以下錯誤訊息:
Failure: the following packages could not be compiled: ......
這是正常的,列出的是因某些原因而無法編譯的程式,如果不是系統程式的話,有可能是因為手機剩餘空間不夠喔。只要清出空間後,再執行一次 (2) 適用於程式更新後的編譯就OK了!
4. (可跳過) 輸入指令,重新編譯UI的圖像資源
(1) 若要強制對所有程式重新編譯:
adb shell pm compile --compile-layouts -f -a
(2) 若僅對未編譯的程式進行編譯:
adb shell pm compile --compile-layouts -a
這個指令會編譯UI的圖像資源,理論上也會加速程式啟動,但我感覺不出編譯的效果XD
【如何手動移除編譯】
1. 輸入指令:adb shell pm compile -f -a -r install
這個指令會將所有程式回復為安裝時的編譯初始值。要注意這其實是將所有程式用比較簡略的模式重新編譯一遍,所以還是會花到不少時間!
【實測?】
(1) 實測我的Galaxy Note 9上有768個程式:
- 移除編譯:59分鐘
- 手動編譯:大約4小時,只有幾個程式無法編譯
- 編譯圖像資源:大約2分鐘,跳出一堆無法編譯的程式XD
整體編譯完成後,空間多佔據了5.2 GB,不過打開app馬上就能發現順滑很多!
差異是從「我明天就想換手機」變成「可以再戰一年」的程度,非常推薦!
(2) 推文版友abc0922001的Sony 1ii有500多個程式:
- 手動編譯:睡前啟動,起床收工,多佔據了約17 GB的空間
希望以上可以幫助到同樣在使用老手機的各位版友,如果有錯誤的話也請不吝指正,謝謝!
【參考資料】
- 版友的討論:
#1VrNHVPE (MobileComm)
- Google官方的文件:
https://bit.ly/4kR6mzn
- 中國CSDN文章:
https://bit.ly/4hBoc6O
- 對Galaxy App Booster反編譯的探討文章:
https://bit.ly/4kQRdhw
- Google官方的adb工具 (感謝abc0922001版友提供):
https://ggle.io/7KHk
- XDA論壇上網友提供的非官方Minimal ADB and Fastboot
(提取Google官方的adb工具的,我以前刷機都用這個XD):
https://bit.ly/4bT8XVB
- Reddit論壇上的指令參考:
https://bit.ly/4kWmlfM
另外Reddit這篇討論串裡面,網友還會再輸入這個指令:
adb shell pm bg-dexopt-job
這個指令會啟動手機背景運作的編譯最佳化程序,不過前面既然已經編譯過了,而且編譯最佳化也不是以everything模式運作 (需要root才能改),所以我認為是多餘的XD
--
Sent from my Samsung Galaxy Note 9
○ PiTT // PHJCI
--
問題是老手機容量也很少吧,要犧牲容量的話就沒用
可惜我的J7 2016,只裝幾個基本軟體和LINE剩下不到
300MB,每天要照三餐清快取
容量的問題真的無解QQ 我第一次跑也是因為手機容量不夠跳錯誤, 後來把照片什麼先備份後全部刪掉才過關的……
aot 的缺點就是用空間來犧牲語言一致性與dalvik的
靈活性
的確,不過作為使用者,實際上手的體驗才是真的XD
那種老手機我都拿來做導航 摔了受潮都不心疼
你手中的導航機,是某些人的主力機QQ
好酷
請問用galaxy booster 多久要跑一次呢
有更新過程式的話就可以再跑一次, 因為他執行的指令不是強制重新編譯, 而是只對未編譯的程式進行編譯。 不過你懶的話就等手機卡的時候再跑就好了XD
順便說一下 如果遇到unauthorized 手機又沒跳出授
權視窗的話 這是個老問題了
請輸入下面指令來重開電腦上的adb
adb kill-server
adb start-server
謝謝大大補充~我沒想過有這個問題XD
請問這個事前編譯是不是可以延長FLASH的壽命
不太確定,要請其他版友解答XD 理論上沒有事前編譯,因而反覆寫入是不好啦。 不過事前編譯也會寫入一大堆數據, 同樣是在消耗ROM的壽命。 前者是寫入次數大,但數據量不一定比較大; 後者是寫入數據量大,不確定哪一個比較糟糕。 而且空間剩餘太少時也會影響ROM的壽命, 不論有無事前編譯,空間剩太少都不是好事QQ 另外以上的邏輯是以電腦SSD為背景推測的, 我不確定手機的eMMC、UFS等ROM晶片會不會有差異XD
推,用各種方法來延續手機的年限,精神可嘉
各廠牌手機都可以直接ADB試試看行不行嗎?
可以的喔~真的不行也不會怎麼樣 除非你的廠商有特別鎖adb (有些中國小廠會這樣做), 不然這個跟Android版本比較有關, 另外就是剩餘空間至少要有幾個GB才有空間讓他做事XD
flash影響不大,讀取大小差異對flash壽命來說差異
很小
我的意思是先編好,就不用每次編譯寫入FLASH,這樣
樓上, 理論上是的, 問題是 flash 壽命以現在手機對
是不是有幫助,還是一般編譯是寫到RAM,所以沒差
flash 操的程度, 基本上很少人會用到 flash 讀寫到
掛掉, 操心讀寫次數對目前手機而言都還是多慮了
感謝提供 舒服
未看先推。感覺很有幫助!
感覺我的Nexus 7 2013有救了?
推
安卓錶也可以哦 一樣方法
java/kotlin用編譯器轉位元組碼(如優化過的dex),
再用art虛擬機轉機器碼,obj-c/swift用編譯器轉機
器碼,不用虛擬機,跨硬體支援與效率無法兩全,仍
要做出以時間換空間或以空間換時間的妥協
推大大,感謝分享,我其實不太明白這邊實作虛擬機跟非虛擬機的差異在哪XD
有看有推!
感覺很猛
長知識推個
推精神
感恩
推。可惜我的程度只會安裝一個全自動的booster
Booster也很好用啦~我也是因為Booster才研究了這件事XD
對岸開發的SCENE有編譯功能
謝謝大大分享!剛剛查了一下, 似乎需要root權限才能啟動,比較不方便 是說有root的話其實上面提到的指令都可以直接在android上執行XD
推
推一個以免認為我看不懂
推好文分享!這篇真的該M起來
對較新的手機有差嗎,還是用App Booster就可以了?
每代Android都對ART編譯器有更新,效能都有在進步, 因此如果你是比較新的系統(比如Android 12), 感受可能不會那麼明顯。 覺得用adb很麻煩的話,當然也可以先試試看App Booster就好!
推,之前常用,但後來覺得心理因素居多就沒再用了
每次跑完,app就給我更新
那大大很幸運,原廠調校就不錯, 不過我自己也是覺得Galaxy App Booster效果不明顯就是了……
容量問題只能靠刷機來解 原廠系統RAM/ROM佔用太多
可以直接先輸入adb shell直接進入shell
後續就只需直接打必要指令
謝謝大大分享,我沒注意過這件事欸! 只記得每次進到Python的shell裡面都不知道怎麼退出XD
其實ADB官方工具大小才6.38MB根本不用特地提取
小時候玩刷機不懂, 以為要裝adb一定要安裝整套的Android Studio, 佔用超多空間很麻煩,當時應該很多人跟我有一樣的困擾, 應該是這樣才有人自己提取出來分享XD
好文推推
推 好文
好酷 原來還有這種玩法
桌面的時間,氣象都去掉
家裡退休的老機也拿出來玩玩 從note4到10+
酷喔
教學仔細,謝謝分享
技術分析文,有看新增知識
推一個!! 找機會試試
感謝教學
請問asus 5z也適用嗎?
剛查了一下,如果是2018年那隻, 那出廠是Android 8,可升級至Android 10,都適用喔 我的Note 9一樣卡在Android 10上不去XD
推
這樣是不是app更新後,就要重跑一次?
是的,但是不需要全部重新跑,只要跑有更新的程式就OK了 請執行3. (2) 適用於程式更新後的指令, 手機會自動判斷哪些程式需要編譯
學到了,推一個
都用 adb 了,如果容量不夠應該可以砍掉一些預設安
裝的 app 吧?
大大說的對,我沒想到XD 不過不同廠商能砍的程式略有不同,砍錯可能會無法開機, 這部分我沒有研究,要請有研究的版友分享了
推,謝謝分享
專業
推用心整理
看文章才知道拔掉傳輸線也會繼續背景編譯,所以睡前
試了一下,容量竟然多了 17G XDDD
請問你拿的是哪隻手機,怎麼差這麼多XD
推
不是 我是說J7 2016那種rom明顯不足的
畢竟這邊沒有華強北 找不到人改手機
推推
推 經典note9
真的是經典,沒挖洞的螢幕、LED通知燈、SD卡擴充、耳機孔 這些2025年的手機都找不到了QQ 也是還沒換機的一部分原因
推 刻意寫的一般人較能懂
我有努力想一下怎麼寫比較通俗XD 謝謝支持!
為什麼官方不弄個按鈕給人按就好?
我也很不懂……應該是大部分廠商都重視硬體,沒那麼重視軟體吧
不是 你應用有700多個 慢不是正常的嗎XD
其實系統App就蠻多的了, 另外一大半都是什麼會員App, 我也很想刪但是又不想到時候花時間重新登入==
再戰五年
Sony 1ii 阿,執行的時候好像說有500多個
索尼大法好,想當年我也是Xperia Go → Xperia ZL用了好幾年
近代旗艦有用嗎 例如s23以後
你可以試試看,但效果我猜不會有老手機明顯 一來是現代手機性能比較好了,JIT速度比老手機快 二來是Android的ART也更進步了,不完整AOT編譯的效能越來越接近完整AOT編譯
原來上次在全聯排隊結帳 就是你在拖大家的時間!
這我,抱歉
果然一編譯後,LINE就給我推更新了
Play商店推更新的邏輯也讓人摸不透XD 我手動全部更新後,馬上又跳出好幾個沒更新的==
※ 編輯: tom282f3 (140.112.24.178 臺灣), 03/24/2025 15:18:45※ 編輯: tom282f3 (140.112.24.178 臺灣), 03/24/2025 15:24:33
三星旗艦跑跑Galaxy App Booster就足夠了…省空間
推
gw4c靠這方法變快好多
只用Galaxy App Booster 感覺變快也沒那麼燙了
推
跑everything適合系統已不給更新的老機再戰
出現Failure的App如果不多
可以針對那幾個指定改跑speed-profile就好
非三星想用Galaxy App Booster可試試2.0.00.7舊版
謝謝大大分享,我不知道新版的App Booster竟然非三星不能用了XD
用心推
指定打3.(1)跳出Error:unknow command 'compile'
*指令
同上+1,有下載最新sdk工具,也是出現找不到compile
指令
樓上 我跑去問Copilot 好像要打cmd package compile
完整指令是3.(1)的pm改cmd package 剛剛試了正在跑
感謝大大回報! 我查了一下,據說是Android新版本的改動, compile從pk (套件管理器,package-manager) 裡面移除了== 目前官方的文件裡面,pm也沒有pm compile這個用法, 不過我的Android 10都還可以用,也查不到確切的移除時間XD 我在內文裡面補充了,謝謝你! 能請問你們有碰到問題的Android版本是多少嗎?
謝謝分享
※ 編輯: tom282f3 (140.112.24.205 臺灣), 03/25/2025 00:43:56
adb 啟動
S9/Note9 刷NOBLE ROM 4.3 OneUI 6.1.1 不香嗎?
CSC: STH(Singapore) // #1,641 suggests:UK CSC
重刷 時間應該遠小於編譯時間。
[RECOVERY][OFFICIAL][3.6.1-x] TWRP for Galaxy S9
S10+ 又可以戰一年,太感謝您了
用在電子閱讀器也有效,有感變快
回報 S7edge android8 要用cmd package指令才能執行
好強
Asus ZF3跑完後速度有提升,唯獨line還是那死樣子
line是那個爛樣子無解 頂多清data, cache啊
45
[問題] 三星的Galaxy App Booster是什麼原理?三星手機有個叫Galaxy Labs的官方外掛 知名度比另一個官方外掛Good Lock低一些 共通點是台灣的三星應用商城都沒上架 Galaxy Labs不像Good Lock那樣複雜 裡面總共只有四個功能42
[心得] 製作第三方ROM LineageOS製作自己的Android ROM就像吃早午餐一樣,編譯指令分別爲breakfast → lunch→ brunch ,最後製作出bacon! 因為想修改Android的Linux核心(kernel),便順便學習如何編譯LineageOS ROM。 手機為Sony Xperia 5 II (pdx206),更新二個Android版本後就被放生的旗艦機。XDA上有u38
[心得] 編譯修改Android Kernel修改Android kernel(內核)可以開啟一些隱藏的功能,也意味著要從頭編譯kernel,要懂一 點C語言。 先從簡單的開始: 刷入自己修改過的kernel後,會在手機核心版本顯示自己的名字。 網誌好讀版:21
[心得] 更難偵測的Root權限,KernelSU編譯安裝KernelSU為一種新型Root方案,把Root權限放在Linux核心運作。 KernelSU最初由维术提出,他曾開發過VirtualXposed和太極(免root跑Xposed的程式)。 KernelSU相較原版Magisk更難被偵測,躲避Root偵測能力可跟Magisk Alpha/Delta(不是 病毒名)一較高下。14
[心得] 免iTunes存取iPhone的照片/影片/檔案因蘋果不喜歡企鵝系統,所以就有開發者做了跨平台工具跟蘋果裝置連接。 本文介紹免透過iTunes,也無需iMazing或iTools這類閉源軟體,就能從電腦存取 iPhone/iPad檔案的開源工具。甚至可以繞過iTunes做全機備份,不需要越獄。 透過這些開源命令行工具,我們就可以還原iTools這類軟體七八成的功能,而無需購買軟11
[心得] Termux GPU加速第二式:virgl玩電腦遊戲一年前在板上文章「3D硬體加速的Proot Linux」分享過用印度人修改的Zink驅動,在 Termux的Linux容器達成GPU硬體加速,用於執行3D程式。 不過編譯實在麻煩,加上新版Clang導致編譯出來的Zink驅動半殘,因此不是很滿意該方 案。 而最近幾個月Reddit網友eNB256分享了新的Termux GPU硬體加速方法,8
[心得] 3D硬體加速的Proot Linux## 一、目的 嘗試在Android手機執行Linux桌面程式,自行編譯驅動,觀看1080p影片和玩3D遊戲,外接 螢幕和鍵鼠操作。 網誌好讀版: 實際測試程式:5
Re: [問題] 為什麼Google app占這麼多空間?10年前後不可同日而語 10年前大多數手機的CPU也才32位元,App也32位元 現在App多數64位元,光是架構的不同就會造成程式大小的不同 為了能夠發揮64位元CPU的效能,記憶體相關定址空間被拉長,進而導致程式大小變大 而其中一部分也跟Android 4.4測試,並在Android 5.0後正式採用的ART虛擬機有關3
[iAPP] iSH Shell,在手機上執行Linux指令軟體名稱: iSH Shell 軟體分類: 開發者工具 軟體連結: 安裝方式: App Store或AltStore 適用韌體: iOS 11或以上版本2
把自己寫的俄羅斯方塊放到 steam deck 玩由於自己寫了一個俄羅斯方塊, 類似決戰俄羅斯, 只是我的是文字 GUI, 畫面醜了不只一點, 想把這個遊戲放到 steam deck 上玩, 可以嗎? 應該沒什麼問題吧! 這個程式由於很簡單, 只需要 c++ library 就可以編譯/執行, 但為了避免麻煩, 還是用 static link, 確保程式執行沒問題, 後來發現 dynamic 編譯也可以執行。