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

go 编译 andriod .so 文件体积太大怎么解决呢

  •  
  •   aladdinding · 15 天前 · 3056 次点击

    加了 -ldflags="-s -w" 这样的参数

    func Hello() {
    	fmt.Println("hello world")
    }
    

    一个 hello world 出来都要 2MB 多,更别说要写些业务代码了

    32 条回复    2025-02-10 10:08:55 +08:00
    warlock
        1
    warlock  
       15 天前
    你引入了 fmt 包
    bagel
        2
    bagel  
       15 天前
    一是用了 fmt ,static link 进去了一大堆东西,二是 go 有 runtime 。2MB 都嫌大那只能试试 Rust 或者 C
    yplam
        3
    yplam  
       15 天前 via Android
    运行时的最低开销,后续业务代码不会增加得那么恐怖,简单 APP 打包出来估计二十 MB 吧
    aladdinding
        4
    aladdinding  
    OP
       15 天前
    目前打包出来是 6MB 多
    sardina
        5
    sardina  
       15 天前
    正常 我用 go 编译的 so 用 zip 压缩了还有 14m
    iyear
        6
    iyear  
       15 天前   ❤️ 2
    这里 2MB 主要体积都在 runtime 上了,其实你再往上添很多代码也不会加太多体积的。可以用 https://github.com/Zxilly/go-size-analyzer 分析下体积
    iyear
        7
    iyear  
       15 天前
    而且安卓现在的包个顶个的大,这个感觉都不算啥占用了……
    gam2046
        8
    gam2046  
       15 天前   ❤️ 1
    对于空间如此敏感的话,只有用 C/C++了,可以引用系统动态库。体积骤减。
    lveye
        9
    lveye  
       15 天前   ❤️ 1
    有个可执行文件压缩工具 upx ,可以试试
    lysShub
        10
    lysShub  
       15 天前
    2MB 还大啊?现在没见过哪个 app 低于 50MB 的
    jeesk
        11
    jeesk  
       15 天前 via Android
    @lysShub 兼容 x86 ,32 位,armv7 就成 8m 了。 体积还是用纯 cpp 或者 c 好点来控制吧
    zoharSoul
        12
    zoharSoul  
       15 天前
    @warlock #1
    @bagel #2
    有什么办法解决这个 fmt 的问题吗? 求问大佬
    w568w
        13
    w568w  
       15 天前   ❤️ 1
    我再补充一点:不像其他编译语言,go 设计的时候就没有关注二进制体积,也没有考虑性能优化,甚至都没有给用户任何能微调这些偏好的编译选项。它唯一保证的就是静态链接或者说 standalone executable 。比如就算某次更新后编译体积暴涨,go team 也不会觉得这是 bug 。

    如果体积和性能是你的主要焦点,还是换其他语言比较好。
    lysShub
        14
    lysShub  
       15 天前
    非要打包在一起、8m 也不多,没人关心几十 m 的大小;不要纠结于这种问题
    lisongeee
        15
    lisongeee  
       15 天前
    如果应用需要接入两个不同 go 项目程序编译的 so 文件,是不是会存在两个额外的 go runtime ?
    GeekGao
        16
    GeekGao  
       14 天前
    我欣然接受 100M 以内的包,因为我是千兆网 LOL
    hanxiV2EX
        17
    hanxiV2EX  
       14 天前 via Android
    用 lua runtime ,很小
    GuangXiN
        18
    GuangXiN  
       14 天前 via Android
    习惯了 Go 编译出来十几 MB 的文件,那天 deno compile 了一下直接 150MB 起跳。
    bruce0
        19
    bruce0  
       14 天前
    go 编译的二进制文件就是大, 我们现在编译的二进制, 不加 -s -w 是 100M, 加了 70M 左右
    TrigVon
        20
    TrigVon  
       14 天前
    再用 upx 压缩下
    xssshell
        21
    xssshell  
       14 天前
    用 strip 去除一下符号信息和调试信息
    sir283
        22
    sir283  
       14 天前 via Android
    用安卓的原生 Java 开发啊,一个 apk 就几 KB ,加上 jni 的 arm64 only ,体积也不会太大的。
    murmurkerman
        23
    murmurkerman  
       14 天前 via iPhone
    不用焦虑安装包大小,该要的代码得加上。毕竟是个草台班子。
    aladdinding
        24
    aladdinding  
    OP
       14 天前
    @iyear 看了下 runtime 大概 1mb ,然后用了 net 包 ,占 1mb ,crypto 占了 1mb
    flyqie
        25
    flyqie  
       14 天前
    有点好奇,为什么要用 go 做 android 。。

    是某些组件不方便移植吗?

    感觉貌似 go 在 android 这块用的似乎不是很多?
    debuggeeker
        26
    debuggeeker  
       14 天前
    直接用默认的 as 工具开发不好吗,就是 c++那套( ndk )
    mogging
        27
    mogging  
       14 天前
    @bagel 确实 go 有 runtime 这反而是他的精华,大部分场景可以不依赖 libc ,这点磁盘空间不算事
    aladdinding
        28
    aladdinding  
    OP
       14 天前
    @flyqie 有些网络方面的包 go 写方便一些
    debugman66
        29
    debugman66  
       13 天前
    换个编译器:tinygo
    nicevar
        30
    nicevar  
       13 天前
    用 go 来写 so 库不是什么好的选择,c/c++就是最优方案,你要说网络方面的,java 一点不比 go 差
    jim9606
        31
    jim9606  
       13 天前
    这些带重型 runtime 的语言你比较 hello world 肯定吃亏。
    想轻量要么用系统带的 runtime ,例如 java ,或者直接写 C ,或者用系统 webview 跑,反正安装后下载的都不算进体积里。
    snowlyg
        32
    snowlyg  
       12 天前
    大很正常,go 本来就不是用来写 android 的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1639 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 16:35 · PVG 00:35 · LAX 08:35 · JFK 11:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.