V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cosfun
V2EX  ›  程序员

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

  •  
  •   cosfun · 2021-01-12 01:38:31 +08:00 via Android · 8454 次点击
    这是一个创建于 1410 天前的主题,其中的信息可能已经有所发展或是发生改变。
    今天才知道 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 分钟搞定整个系统编译😊
    l4ever
        15
    l4ever  
       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   ·   实用小工具   ·   3021 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 00:36 · PVG 08:36 · LAX 16:36 · JFK 19:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.