android 系统编译一次要几小时?

2021-01-12 01:38:31 +08:00
 cosfun
今天才知道 android 系统编译一次要好几个小时,那平常做 android 系统和 rom 开发的人如果写了一个 bug,岂不是就要花几个小时才能验证,还是说有类似热更新一样的调试方法?
8549 次点击
所在节点    程序员
32 条回复
Android2MCU
2021-01-12 01:42:03 +08:00
全编译的话看设备性能,普通的话就 1 、2 个小时,所以就不能改一行代码就全编一次,很多模块都可以单编,再更新进去,这样就很快了,性能好的话,可能几秒就编好了。
cosfun
2021-01-12 01:47:59 +08:00
@Android2MCU 大佬好,一直对 android 系统挺感兴趣的,就是不知道要怎么入门,如何编译如何单编这种有什么书会系统讲解的吗
irytu
2021-01-12 02:49:11 +08:00
没做过安卓 但是编译的话可以分模块 把每个模块先编译成一个 lib 后面更新的话 只需要重新链接 lib 就行
irytu
2021-01-12 02:53:13 +08:00
补充一个关键字:分离编译
nerocc
2021-01-12 02:54:05 +08:00
别说是系统了,大一点的项目一次也都是好几个小时。这种规模的项目不是说改一行就跑一次来检查写的对不对。都是有各种单元测试,然后部署到服务器上面统一编译测试的。当然个人开发者自己写的情况下,很多人爱咋咋地。我还记得我第一次接触一个大项目,编译一次一个小时。我问同事编译的时候干什么,他说站起来走一走。。。我那个时候真的就是,每天改 8 行代码,这一天就过去了。
js8510
2021-01-12 06:43:08 +08:00
取决于你改了多少,你 devserver 多大还有你有没有强大的 remote build service. 我很多年前实习的时候,在 16GB 的 devserver 上冷编译一次是 4 小时。就是说我一天啥也不敢,编译两次就下班了。 但是其实你不用每次都全部重新编译的,你往往只改某一个模块。可以依赖 unittest.另外像在 google, 都有 build service. 你只用 publish 一个 diff 就可以等 build service 给你 build.build service 都有 in memory cache 等各种优化,所以也要不了几个小时了。
js8510
2021-01-12 06:49:41 +08:00
“那平常做 android 系统和 rom 开发的人如果写了一个 bug,岂不是就要花几个小时才能验证” 几个小时是非常快的了。。几个月都是有的。code base 大了系统复杂了以后 debug 难度会指数级增长。尤其是 AOSP 或者是非常抽象的 backend service. 如果缺乏合适的测试,bug 又难以在单机复现,往往靠的就是经验和大量读代码。我遇到的最难的 bug 往往都是( 1 ) 很难重现 没有 log, 没有 stack trace.( 2 ) 很难验证。 一旦发现了问题,修市场就是一两行。我修过一个 AOSP bug, 花了两个月。最后 fix 就是加一个 “*”
fengshuo211
2021-01-12 06:54:59 +08:00
工程师都用很强的台式吧,那种 64G 内存,最好的 CPU 的那种,这种编译器来应该快。
numgao
2021-01-12 06:55:06 +08:00
@js8510 哪像你这样的 工资得老高了吧
hinzer
2021-01-12 07:26:10 +08:00
可以但独编译模块。整编的话,增量编译也挺快的
chenluo0429
2021-01-12 07:39:54 +08:00
很久没编译过了,在我的机器上,第一次整编,6.0 以前大概要 50 分钟,7.0 要接近两个小时。之后再整编大概要十来分钟。单编模块根据规模时间在几十秒到一两分钟不等吧
azenk
2021-01-12 07:48:38 +08:00
上 3990x,然后 make -j100 手动狗头
rpw
2021-01-12 07:56:12 +08:00
双 CPU,128 核心服务器,256G 内存,编译 Android 10 大概三四十分钟,11 要一到两个小时
illusionist
2021-01-12 08:09:39 +08:00
11 的话引入了高通 QSSI 和一些 MTK 方案会慢一些,原生 AOSP 的话最新 master 分支用 Macbook 16 寸 VM 虚拟机,i9 8 核 16G 内存大概两个半小时可以编译好。大部分时候可以单编某个路径下的模块。我之前我 32 核的 AMD 线程撕裂者配合 32 内存和 2T 固态,28 分钟搞定整个系统编译😊
l4ever
2021-01-12 08:13:19 +08:00
我司是一家生产行业专用设备的厂商,方案有三星和瑞芯微两种,共七八个产品。

我的工作就是调整 android 系统,集成第三方 apk 和自己公司开发的 apk 。

编译时间:
全编译一次三星方案大约 30 分钟,瑞芯微大约 45 分钟。这个看编译服务器的性能。(三星也没有给我们 kernel 源代码,都是他们编译好我们直接用的)

单独调试,大致是这样:
source build/envsetup.sh
lunch
cd frameworks/base/packages/
mmm SystemUI
这样 SystemUI 就单独编译好了,这时候
adb push 到机器上。

adb shell su -c killall com.android.systemui
杀掉进程,让他自动启动新版


编译的包分 user oem 和 debug 版。
user oem 版做了调整
打不开开发者选项。

修复 bug:
代码都是方案商给的,有 bug,
但很少要自己改,都是让他们改好我合并即可。

增加需求:
这就很多了,大部分是集成第三方软件啊,system ui 调整啊,倒也简单

提测:
我会编译 user oem 包和 debug 包上传 svn
走流程提测->测试部测试->发布到生产 svn->生产使用新的系统固件烧录。
Flywith24
2021-01-12 08:29:20 +08:00
看机器,全编一个小时,单独模块五分钟
tianyamomo
2021-01-12 08:39:57 +08:00
那种大公司有分布式编译的,而且只改一点点的话又不会全部编译
binsys
2021-01-12 09:00:02 +08:00
之前的公司出 OTA 都是 jenkins + docker 的 build server,一次平均 40 分钟左右。
本地 SSD,最快的貌似也就 25 分钟。
besto
2021-01-12 09:16:29 +08:00
1,见 18 楼,40+核强一点的 server 30 分钟
2,只有第一次需要全编译(还有验证 release 的时候)
3,对于 so 类,可以只编译单独 so,几十秒,比较慢的是改了 Android.mk(Android.bp)
4,对于 kernel 等在 boot 分区上的,可以只生成 boot 分区,只烧录 boot 分区
5,即使是需要重新整个 image 来验证的 bug,在完成第一次编译之后,也只是打包 image 的时间+烧录时间
shelterz
2021-01-12 09:21:10 +08:00
@l4ever Build manager?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/744028

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX