[心得] adb編譯,啟動!解救慢吞吞的老Android!
大家好,我的主力機是還沒換過電池的原汁原味2018年旗艦Galaxy Note 9 (台版Exynos 6G
B/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編譯後就不需要JI
T再編譯一次了,可以直接上手,大幅增進了效率,對使用者而言就是手機的速度變快、耗
電變低了。在手機的Android系統升級後,第一次開機都會出現「更新應用程式... (1/500)
」的進度條,就是在執行ART的AOT編譯。
理論上在安裝時就進行完整編譯是最好的選項,但是這樣做耗時會太久,因此Android 7以
後的系統,在首次安裝時並不會完整執行AOT編譯,只有在手機閒置且充電時會在背景默默
進行「較為完整」的AOT編譯。說是「較為完整」,是由於編譯整個App消耗的空間太大、時
間太久,因此Android預設並不會將整個App都進行編譯,會搭配使用App時同步監測的成果
(稱為profile),再對部分程式語言執行編譯與最佳化,力圖在速度與儲存空間上取得平衡
點。
然而......對老手機而言,這個平衡點就是App要花十秒才跑得出來XD,因此三星的Galaxy
App 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則是以sp
eed-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
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 223.140.219.142 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/MobileComm/M.1742738316.A.B4E.html
→
03/23 22:00,
1天前
, 1F
03/23 22:00, 1F
推
03/23 22:02,
1天前
, 2F
03/23 22:02, 2F
→
03/23 22:03,
1天前
, 3F
03/23 22:03, 3F
容量的問題真的無解QQ
我第一次跑也是因為手機容量不夠跳錯誤,
後來把照片什麼先備份後全部刪掉才過關的……
→
03/23 22:06,
1天前
, 4F
03/23 22:06, 4F
→
03/23 22:06,
1天前
, 5F
03/23 22:06, 5F
的確,不過作為使用者,實際上手的體驗才是真的XD
→
03/23 22:12,
1天前
, 6F
03/23 22:12, 6F
你手中的導航機,是某些人的主力機QQ
推
03/23 22:20,
1天前
, 7F
03/23 22:20, 7F
推
03/23 22:20,
1天前
, 8F
03/23 22:20, 8F
有更新過程式的話就可以再跑一次,
因為他執行的指令不是強制重新編譯,
而是只對未編譯的程式進行編譯。
不過你懶的話就等手機卡的時候再跑就好了XD
→
03/23 22:24,
1天前
, 9F
03/23 22:24, 9F
→
03/23 22:24,
1天前
, 10F
03/23 22:24, 10F
→
03/23 22:24,
1天前
, 11F
03/23 22:24, 11F
→
03/23 22:24,
1天前
, 12F
03/23 22:24, 12F
→
03/23 22:24,
1天前
, 13F
03/23 22:24, 13F
→
03/23 22:24,
1天前
, 14F
03/23 22:24, 14F
謝謝大大補充~我沒想過有這個問題XD
推
03/23 22:55,
1天前
, 15F
03/23 22:55, 15F
不太確定,要請其他版友解答XD
理論上沒有事前編譯,因而反覆寫入是不好啦。
不過事前編譯也會寫入一大堆數據,
同樣是在消耗ROM的壽命。
前者是寫入次數大,但數據量不一定比較大;
後者是寫入數據量大,不確定哪一個比較糟糕。
而且空間剩餘太少時也會影響ROM的壽命,
不論有無事前編譯,空間剩太少都不是好事QQ
另外以上的邏輯是以電腦SSD為背景推測的,
我不確定手機的eMMC、UFS等ROM晶片會不會有差異XD
推
03/23 22:57,
1天前
, 16F
03/23 22:57, 16F
推
03/23 22:58,
1天前
, 17F
03/23 22:58, 17F
可以的喔~真的不行也不會怎麼樣
除非你的廠商有特別鎖adb (有些中國小廠會這樣做),
不然這個跟Android版本比較有關,
另外就是剩餘空間至少要有幾個GB才有空間讓他做事XD
→
03/23 22:58,
1天前
, 18F
03/23 22:58, 18F
→
03/23 22:58,
1天前
, 19F
03/23 22:58, 19F
推
03/23 23:01,
1天前
, 20F
03/23 23:01, 20F
→
03/23 23:01,
1天前
, 21F
03/23 23:01, 21F
→
03/23 23:01,
1天前
, 22F
03/23 23:01, 22F
→
03/23 23:02,
1天前
, 23F
03/23 23:02, 23F
→
03/23 23:03,
1天前
, 24F
03/23 23:03, 24F
※ 編輯: tom282f3 (223.140.219.142 臺灣), 03/23/2025 23:08:52
推
03/23 23:12,
1天前
, 25F
03/23 23:12, 25F
※ 編輯: tom282f3 (223.140.219.142 臺灣), 03/23/2025 23:12:38
推
03/23 23:18,
1天前
, 26F
03/23 23:18, 26F
→
03/23 23:38,
1天前
, 27F
03/23 23:38, 27F
推
03/23 23:47,
1天前
, 28F
03/23 23:47, 28F
推
03/23 23:51,
1天前
, 29F
03/23 23:51, 29F
→
03/23 23:57,
1天前
, 30F
03/23 23:57, 30F
還有 47 則推文
還有 13 段內文
推
03/24 11:36,
1天前
, 78F
03/24 11:36, 78F
我有努力想一下怎麼寫比較通俗XD 謝謝支持!
推
03/24 12:35,
1天前
, 79F
03/24 12:35, 79F
我也很不懂……應該是大部分廠商都重視硬體,沒那麼重視軟體吧
推
03/24 13:00,
1天前
, 80F
03/24 13:00, 80F
其實系統App就蠻多的了,
另外一大半都是什麼會員App,
我也很想刪但是又不想到時候花時間重新登入==
推
03/24 13:29,
1天前
, 81F
03/24 13:29, 81F
→
03/24 13:30,
1天前
, 82F
03/24 13:30, 82F
索尼大法好,想當年我也是Xperia Go → Xperia ZL用了好幾年
推
03/24 13:47,
1天前
, 83F
03/24 13:47, 83F
你可以試試看,但效果我猜不會有老手機明顯
一來是現代手機性能比較好了,JIT速度比老手機快
二來是Android的ART也更進步了,不完整AOT編譯的效能越來越接近完整AOT編譯
→
03/24 14:29,
1天前
, 84F
03/24 14:29, 84F
這我,抱歉
推
03/24 14:35,
1天前
, 85F
03/24 14:35, 85F
Play商店推更新的邏輯也讓人摸不透XD
我手動全部更新後,馬上又跳出好幾個沒更新的==
※ 編輯: tom282f3 (140.112.24.178 臺灣), 03/24/2025 15:18:45
※ 編輯: tom282f3 (140.112.24.178 臺灣), 03/24/2025 15:24:33
推
03/24 15:43,
1天前
, 86F
03/24 15:43, 86F
推
03/24 17:02,
1天前
, 87F
03/24 17:02, 87F
推
03/24 17:27,
1天前
, 88F
03/24 17:27, 88F
推
03/24 17:31,
1天前
, 89F
03/24 17:31, 89F
推
03/24 17:35,
1天前
, 90F
03/24 17:35, 90F
推
03/24 18:51,
1天前
, 91F
03/24 18:51, 91F
推
03/24 18:55,
1天前
, 92F
03/24 18:55, 92F
→
03/24 18:55,
1天前
, 93F
03/24 18:55, 93F
推
03/24 19:00,
1天前
, 94F
03/24 19:00, 94F
謝謝大大分享,我不知道新版的App Booster竟然非三星不能用了XD
推
03/24 19:33,
1天前
, 95F
03/24 19:33, 95F
推
03/24 21:22,
1天前
, 96F
03/24 21:22, 96F
→
03/24 21:22,
1天前
, 97F
03/24 21:22, 97F
推
03/24 21:29,
1天前
, 98F
03/24 21:29, 98F
→
03/24 21:29,
1天前
, 99F
03/24 21:29, 99F
推
03/24 22:04,
23小時前
, 100F
03/24 22:04, 100F
→
03/24 22:06,
23小時前
, 101F
03/24 22:06, 101F
感謝大大回報!
我查了一下,據說是Android新版本的改動,
compile從pk (套件管理器,package-manager) 裡面移除了==
目前官方的文件裡面,pm也沒有pm compile這個用法,
不過我的Android 10都還可以用,也查不到確切的移除時間XD
我在內文裡面補充了,謝謝你!
能請問你們有碰到問題的Android版本是多少嗎?
推
03/24 22:47,
23小時前
, 102F
03/24 22:47, 102F
※ 編輯: tom282f3 (140.112.24.205 臺灣), 03/25/2025 00:39:38
※ 編輯: tom282f3 (140.112.24.205 臺灣), 03/25/2025 00:43:56
→
03/25 10:23,
11小時前
, 103F
03/25 10:23, 103F
推
03/25 12:48,
8小時前
, 104F
03/25 12:48, 104F
→
03/25 12:49,
8小時前
, 105F
03/25 12:49, 105F
→
03/25 12:52,
8小時前
, 106F
03/25 12:52, 106F
→
03/25 12:52,
8小時前
, 107F
03/25 12:52, 107F
MobileComm 近期熱門文章
PTT數位生活區 即時熱門文章