作者tom282f3 (小小年纪所向无敌)
看板MobileComm
标题[心得] adb编译,启动!解救慢吞吞的Android!
时间Sun Mar 23 21:58:26 2025
大家好,我的主力机是还没换过电池的原汁原味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://webptt.com/cn.aspx?n=bbs/MobileComm/M.1742738316.A.B4E.html
1F:→ leopika : 问题是老手机容量也很少吧,要牺牲容量的话就没用03/23 22:00
2F:推 fightclubgf : 可惜我的J7 2016,只装几个基本软体和LINE剩下不到03/23 22:02
3F:→ fightclubgf : 300MB,每天要照三餐清快取03/23 22:03
容量的问题真的无解QQ
我第一次跑也是因为手机容量不够跳错误,
後来把照片什麽先备份後全部删掉才过关的……
4F:→ kimi112136 : aot 的缺点就是用空间来牺牲语言一致性与dalvik的03/23 22:06
5F:→ kimi112136 : 灵活性03/23 22:06
的确,不过作为使用者,实际上手的体验才是真的XD
6F:→ justice2008 : 那种老手机我都拿来做导航 摔了受潮都不心疼03/23 22:12
你手中的导航机,是某些人的主力机QQ
7F:推 kkkk1234 : 好酷03/23 22:20
8F:推 aa8351489 : 请问用galaxy booster 多久要跑一次呢03/23 22:20
有更新过程式的话就可以再跑一次,
因为他执行的指令不是强制重新编译,
而是只对未编译的程式进行编译。
不过你懒的话就等手机卡的时候再跑就好了XD
9F:→ kkkk1234 : 顺便说一下 如果遇到unauthorized 手机又没跳出授03/23 22:24
10F:→ kkkk1234 : 权视窗的话 这是个老问题了03/23 22:24
12F:→ kkkk1234 : 请输入下面指令来重开电脑上的adb03/23 22:24
13F:→ kkkk1234 : adb kill-server03/23 22:24
14F:→ kkkk1234 : adb start-server03/23 22:24
谢谢大大补充~我没想过有这个问题XD
15F:推 fightclubgf : 请问这个事前编译是不是可以延长FLASH的寿命03/23 22:55
不太确定,要请其他版友解答XD
理论上没有事前编译,因而反覆写入是不好啦。
不过事前编译也会写入一大堆数据,
同样是在消耗ROM的寿命。
前者是写入次数大,但数据量不一定比较大;
後者是写入数据量大,不确定哪一个比较糟糕。
而且空间剩余太少时也会影响ROM的寿命,
不论有无事前编译,空间剩太少都不是好事QQ
另外以上的逻辑是以电脑SSD为背景推测的,
我不确定手机的eMMC、UFS等ROM晶片会不会有差异XD
16F:推 addison4869 : 推,用各种方法来延续手机的年限,精神可嘉03/23 22:57
17F:推 Yuwuen : 各厂牌手机都可以直接ADB试试看行不行吗?03/23 22:58
可以的喔~真的不行也不会怎麽样
除非你的厂商有特别锁adb (有些中国小厂会这样做),
不然这个跟Android版本比较有关,
另外就是剩余空间至少要有几个GB才有空间让他做事XD
18F:→ kimi112136 : flash影响不大,读取大小差异对flash寿命来说差异03/23 22:58
19F:→ kimi112136 : 很小03/23 22:58
20F:推 fightclubgf : 我的意思是先编好,就不用每次编译写入FLASH,这样03/23 23:01
21F:→ alex1973 : 楼上, 理论上是的, 问题是 flash 寿命以现在手机对03/23 23:01
22F:→ fightclubgf : 是不是有帮助,还是一般编译是写到RAM,所以没差03/23 23:01
23F:→ alex1973 : flash 操的程度, 基本上很少人会用到 flash 读写到03/23 23:02
24F:→ alex1973 : 挂掉, 操心读写次数对目前手机而言都还是多虑了03/23 23:03
※ 编辑: tom282f3 (223.140.219.142 台湾), 03/23/2025 23:08:52
25F:推 Yuwuen : 感谢提供 舒服03/23 23:12
※ 编辑: tom282f3 (223.140.219.142 台湾), 03/23/2025 23:12:38
26F:推 PenisDeMilo : 未看先推。感觉很有帮助!03/23 23:18
27F:→ ragwing : 感觉我的Nexus 7 2013有救了?03/23 23:38
28F:推 virdust2003 : 推03/23 23:47
29F:推 Xixiaofan : 安卓表也可以哦 一样方法03/23 23:51
30F:→ square4 : java/kotlin用编译器转位元组码(如优化过的dex),03/23 23:57
31F:→ square4 : 再用art虚拟机转机器码,obj-c/swift用编译器转机03/23 23:57
32F:→ square4 : 器码,不用虚拟机,跨硬体支援与效率无法两全,仍 03/23 23:57
33F:→ square4 : 要做出以时间换空间或以空间换时间的妥协 03/23 23:57
推大大,感谢分享,我其实不太明白这边实作虚拟机跟非虚拟机的差异在哪XD
34F:推 jay0215 : 有看有推!03/23 23:59
35F:推 aasssdddd : 感觉很猛03/24 00:03
36F:推 khastw : 长知识推个03/24 00:07
37F:推 keepkef : 推精神 03/24 00:13
38F:推 aa8351489 : 感恩 03/24 00:16
39F:推 ggirls : 推。可惜我的程度只会安装一个全自动的booster 03/24 00:19
Booster也很好用啦~我也是因为Booster才研究了这件事XD
40F:→ haveastar : 对岸开发的SCENE有编译功能03/24 00:25
谢谢大大分享!刚刚查了一下,
似乎需要root权限才能启动,比较不方便
是说有root的话其实上面提到的指令都可以直接在android上执行XD
41F:推 manpower9 : 推 03/24 00:29
42F:推 Mark87 : 推一个以免认为我看不懂03/24 00:38
43F:推 k9120303 : 推好文分享!这篇真的该M起来 03/24 00:53
44F:推 ikuiku1919 : 对较新的手机有差吗,还是用App Booster就可以了?03/24 00:54
每代Android都对ART编译器有更新,效能都有在进步,
因此如果你是比较新的系统(比如Android 12),
感受可能不会那麽明显。
觉得用adb很麻烦的话,当然也可以先试试看App Booster就好!
45F:推 abc0922001 : 推,之前常用,但後来觉得心理因素居多就没再用了03/24 01:06
46F:→ abc0922001 : 每次跑完,app就给我更新03/24 01:08
那大大很幸运,原厂调校就不错,
不过我自己也是觉得Galaxy App Booster效果不明显就是了……
47F:→ manbow77 : 容量问题只能靠刷机来解 原厂系统RAM/ROM占用太多03/24 01:10
48F:→ manbow77 : 可以直接先输入adb shell直接进入shell03/24 01:12
49F:→ manbow77 : 後续就只需直接打必要指令 03/24 01:12
谢谢大大分享,我没注意过这件事欸!
只记得每次进到Python的shell里面都不知道怎麽退出XD
50F:推 abc0922001 : 其实ADB官方工具大小才6.38MB根本不用特地提取03/24 01:14
小时候玩刷机不懂,
以为要装adb一定要安装整套的Android Studio,
占用超多空间很麻烦,当时应该很多人跟我有一样的困扰,
应该是这样才有人自己提取出来分享XD
52F:推 nobyE : 好文推推03/24 01:37
53F:推 mrfatworm : 推 好文03/24 01:40
※ 编辑: tom282f3 (42.70.217.253 台湾), 03/24/2025 01:47:47
54F:推 qwefghzxc : 好酷 原来还有这种玩法03/24 01:59
55F:推 whitefox : 桌面的时间,气象都去掉03/24 02:29
56F:→ gary8442 : 家里退休的老机也拿出来玩玩 从note4到10+03/24 02:58
57F:推 wres666 : 酷喔03/24 04:10
58F:推 a00561 : 教学仔细,谢谢分享 03/24 06:14
59F:推 pttSouthjin : 技术分析文,有看新增知识 03/24 06:51
60F:推 justej : 推一个!! 找机会试试03/24 07:20
61F:推 nrsair : 感谢教学03/24 07:37
62F:推 johnny90150 : 请问asus 5z也适用吗? 03/24 07:39
刚查了一下,如果是2018年那只,
那出厂是Android 8,可升级至Android 10,都适用喔
我的Note 9一样卡在Android 10上不去XD
63F:推 hongyi0402 : 推03/24 07:48
64F:推 amilkamilk : 这样是不是app更新後,就要重跑一次? 03/24 08:05
是的,但是不需要全部重新跑,只要跑有更新的程式就OK了
请执行3. (2) 适用於程式更新後的指令,
手机会自动判断哪些程式需要编译
65F:推 wumins : 学到了,推一个03/24 08:11
66F:推 mstar : 都用 adb 了,如果容量不够应该可以砍掉一些预设安03/24 08:15
67F:→ mstar : 装的 app 吧? 03/24 08:15
大大说的对,我没想到XD
不过不同厂商能砍的程式略有不同,砍错可能会无法开机,
这部分我没有研究,要请有研究的版友分享了
68F:推 hansom283 : 推,谢谢分享 03/24 08:16
69F:推 gaiaesque : 专业03/24 08:23
70F:推 qilar : 推用心整理03/24 08:39
71F:→ abc0922001 : 看文章才知道拔掉传输线也会继续背景编译,所以睡前03/24 09:04
72F:→ abc0922001 : 试了一下,容量竟然多了 17G XDDD03/24 09:04
请问你拿的是哪只手机,怎麽差这麽多XD
73F:推 hurompton : 推 03/24 09:40
74F:→ justice2008 : 不是 我是说J7 2016那种rom明显不足的03/24 09:52
75F:→ justice2008 : 毕竟这边没有华强北 找不到人改手机03/24 09:53
76F:推 xiaotee : 推推03/24 10:38
77F:推 jay920314 : 推 经典note903/24 11:07
真的是经典,没挖洞的萤幕、LED通知灯、SD卡扩充、耳机孔
这些2025年的手机都找不到了QQ 也是还没换机的一部分原因
78F:推 willy4907 : 推 刻意写的一般人较能懂03/24 11:36
我有努力想一下怎麽写比较通俗XD 谢谢支持!
79F:推 higger : 为什麽官方不弄个按钮给人按就好?03/24 12:35
我也很不懂……应该是大部分厂商都重视硬体,没那麽重视软体吧
80F:推 bust222 : 不是 你应用有700多个 慢不是正常的吗XD 03/24 13:00
其实系统App就蛮多的了,
另外一大半都是什麽会员App,
我也很想删但是又不想到时候花时间重新登入==
81F:推 WindSucker : 再战五年03/24 13:29
82F:→ abc0922001 : Sony 1ii 阿,执行的时候好像说有500多个03/24 13:30
索尼大法好,想当年我也是Xperia Go → Xperia ZL用了好几年
83F:推 phoque : 近代旗舰有用吗 例如s23以後 03/24 13:47
你可以试试看,但效果我猜不会有老手机明显
一来是现代手机性能比较好了,JIT速度比老手机快
二来是Android的ART也更进步了,不完整AOT编译的效能越来越接近完整AOT编译
84F:→ Hohenzollern: 原来上次在全联排队结帐 就是你在拖大家的时间! 03/24 14:29
这我,抱歉
85F:推 abc0922001 : 果然一编译後,LINE就给我推更新了03/24 14:35
Play商店推更新的逻辑也让人摸不透XD
我手动全部更新後,马上又跳出好几个没更新的==
※ 编辑: tom282f3 (140.112.24.178 台湾), 03/24/2025 15:18:45
※ 编辑: tom282f3 (140.112.24.178 台湾), 03/24/2025 15:24:33
86F:推 keigowei : 三星旗舰跑跑Galaxy App Booster就足够了…省空间 03/24 15:43
87F:推 abelyi100 : 推03/24 17:02
88F:推 kf740512 : gw4c靠这方法变快好多 03/24 17:27
89F:推 clover1211 : 只用Galaxy App Booster 感觉变快也没那麽烫了03/24 17:31
90F:推 A4P8T6X9 : 推03/24 17:35
91F:推 SPDY : 跑everything适合系统已不给更新的老机再战03/24 18:51
92F:推 SPDY : 出现Failure的App如果不多03/24 18:55
93F:→ SPDY : 可以针对那几个指定改跑speed-profile就好03/24 18:55
94F:推 SPDY : 非三星想用Galaxy App Booster可试试2.0.00.7旧版03/24 19:00
谢谢大大分享,我不知道新版的App Booster竟然非三星不能用了XD
95F:推 p2p8ppp : 用心推 03/24 19:33
96F:推 a123444556 : 指定打3.(1)跳出Error:unknow command 'compile'03/24 21:22
97F:→ a123444556 : *指令03/24 21:22
98F:推 Pisces : 同上+1,有下载最新sdk工具,也是出现找不到compile03/24 21:29
99F:→ Pisces : 指令03/24 21:29
100F:推 a123444556 : 楼上 我跑去问Copilot 好像要打cmd package compile03/24 22:04
101F:→ a123444556 : 完整指令是3.(1)的pm改cmd package 刚刚试了正在跑03/24 22:06
感谢大大回报!
我查了一下,据说是Android新版本的改动,
compile从pk (套件管理器,package-manager) 里面移除了==
目前官方的文件里面,pm也没有pm compile这个用法,
不过我的Android 10都还可以用,也查不到确切的移除时间XD
我在内文里面补充了,谢谢你!
能请问你们有碰到问题的Android版本是多少吗?
102F:推 randy061 : 谢谢分享03/24 22:47
※ 编辑: tom282f3 (140.112.24.205 台湾), 03/25/2025 00:39:38
※ 编辑: tom282f3 (140.112.24.205 台湾), 03/25/2025 00:43:56
103F:→ nrsair : adb 启动 03/25 10:23
104F:推 proton63 : S9/Note9 刷NOBLE ROM 4.3 OneUI 6.1.1 不香吗? 03/25 12:48
105F:→ proton63 : CSC: STH(Singapore) // #1,641 suggests:UK CSC 03/25 12:49
106F:→ proton63 : 重刷 时间应该远小於编译时间。 03/25 12:52
107F:→ proton63 : [RECOVERY][OFFICIAL][3.6.1-x] TWRP for Galaxy S9 03/25 12:52
108F:推 WeihsiuChen : S10+ 又可以战一年,太感谢您了 03/25 22:41
109F:推 cinnamo1208 : 用在电子阅读器也有效,有感变快 03/25 23:15
110F:推 Kietiary : 回报 S7edge android8 要用cmd package指令才能执行 03/26 12:48
111F:推 blueballer : 好强 03/26 22:32
112F:推 hurompton : Asus ZF3跑完後速度有提升,唯独line还是那死样子 03/27 14:34
113F:→ Louis430 : line是那个烂样子无解 顶多清data, cache啊 03/27 14:38
114F:推 T19871124 : 真浪漫 03/28 14:33
115F:推 rail02000 : 推教学!来玩玩看 03/28 22:13
116F:推 a0910bb : 有感 感谢 05/26 15:17