android 系统编译一次要几小时? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
cosfun
V2EX    程序员

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

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

    我的工作就是调整 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
        16
    Flywith24  
       2021-01-12 08:29:20 +08:00
    看机器,全编一个小时,单独模块五分钟
    tianyamomo
        17
    tianyamomo  
       2021-01-12 08:39:57 +08:00
    那种大公司有分布式编译的,而且只改一点点的话又不会全部编译
    binsys
        18
    binsys  
       2021-01-12 09:00:02 +08:00
    之前的公司出 OTA 都是 jenkins + docker 的 build server,一次平均 40 分钟左右。
    本地 SSD,最快的貌似也就 25 分钟。
    besto
        19
    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
        20
    shelterz  
       2021-01-12 09:21:10 +08:00
    @l4ever Build manager?
    northeastwolf
        21
    northeastwolf  
       2021-01-12 09:38:27 +08:00
    对于特定模块,可以单独编译之后再打包 image 刷机验证,比如 framework 相关的修改就是这样操作,不必整体编译一次
    当然前提是之前已经完整编译过一次之后,有了缓存才可以单独编译
    具体操作命令可以参考 google 文档
    https://source.android.google.cn/setup/build/building#build-the-code
    aheadlead
        22
    aheadlead  
       2021-01-12 09:53:09 +08:00 via iPhone
    以前在某手机厂修手机,公司配的台式机配置如下:

    [email protected]
    16G 2400Mhz
    4T 的机械盘( SMR )

    编译完整的 ROM 第一次大概得 5-6h 。仅供参考。
    CFM880
        23
    CFM880  
       2021-01-12 10:21:05 +08:00
    macbook pro 15 款 16G,2.2 GHz 虚拟机里全编 Android11,5 个半小时
    yinzhili
        24
    yinzhili  
       2021-01-12 10:25:02 +08:00
    以前看同事做安卓机顶盒固件编译的时候都是拿服务器来编译的,而即便是服务器的 CPU 也要几小时才能编译完
    mygame
        25
    mygame  
       2021-01-12 10:37:10 +08:00
    第一次编译久点, 一般公司都会有 40 核左右的编译服务器, 一小时以内吧. 这是我在 wsl2 虚拟机上编译 aosp 11 的记录, hqw700.github.io/2021/01/01/aosp-build/, i5-9600k 耗时 3 小时. 调试的话单编模块 push 就行. 这是我今年计划写的一个博客, 主要介绍 android 系统相关的技巧, 问题分析, 源码解读什么的, 欢迎大家关注.
    12101111
        26
    12101111  
       2021-01-12 12:50:46 +08:00
    c/c++代码可以用 ccache, 基本上没有变动的代码编译速度=io 速度
    java 代码可以单独打包
    zzzmh
        27
    zzzmh  
       2021-01-12 14:42:10 +08:00
    我不懂安卓,但我知道 3970x 一定可以缩短编译时间 [doge]
    bytesfold
        28
    bytesfold  
       2021-01-12 18:44:45 +08:00
    lineageos 好像可以看到服务器的编译版本进度
    orannge
        29
    orannge  
       2021-01-12 21:10:19 +08:00
    都是服务器编译,几十核+上百 G 内存+固态(容量不够机械凑,毕竟编出来一个项目一两百 G),第一次全量编译后可以增量编译,改动涉及的模块越少编译越快。
    jjpprrrr
        30
    jjpprrrr  
       2021-01-13 08:10:55 +08:00
    R5 3600 + 64GB 内存,AOSP android-11.0.0_r28 tag 加上 CAF 的一些 vendor 部件,kernel 开了 ThinLTO,有 ccache 的情况下,make clean 之后编译大概是四十多分钟,make installclean 之后大概是七八分钟。更改 framework 之后 make installclean 大概十几分钟不到二十分钟,单独编译 framework-res 十分钟以下,其他的小组件就更快了。熟悉 android 的话,大多数代码改动不需要完整编译。
    user0
        31
    user0  
       2021-01-13 08:45:09 +08:00 via Android
    高通 android q 引入了 qssi 编译特别慢 10700 要编译 4 个小时
    zzukylin
        32
    zzukylin  
       2021-01-13 09:49:22 +08:00
    i7-10510U+16GB 内存,编译 Android 10 需要至少 4 个小时!
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2583 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World ispowered by solitude
    VERSION: 3.9.8.5 31ms UTC 11:40 PVG 19:40 LAX 03:40 JFK 06:40
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86