[心得] adb编译,启动!解救慢吞吞的老Android!

楼主: tom282f3 (学妹战士)   2025-03-23 21:58:26
大家好,我的主力机是还没换过电池的原汁原味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
作者: Hohenzollern   2025-03-24 14:29:00
原来上次在全联排队结帐 就是你在拖大家的时间!

Links booklink

Contact Us: admin [ a t ] ucptt.com