你们编译 iOS Framework 会用 Archive 模式吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
pheyer
V2EX    iDev

你们编译 iOS Framework 会用 Archive 模式吗?

  •  1
     
  •   pheyer 2022-02-18 11:59:06 +08:00 10338 次点击
    这是一个创建于 1332 天前的主题,其中的信息可能已经有所发展或是发生改变。

    手头上有一个 iOS 动态库项目,因为想要自动编译生成 XCFramework ,在网上找了一个脚本生成 XCFramework ,结果发现生成的 XCFramework 库(arm64+armv7 架构)比平常生成的 framework 大多了,前者是 23.1M, 后者是 4.7M

    上面用的生成 XCFramework 脚本是 How to make XCFramework / Fat Framework in Xcode 里的第 1 个脚本

    研究了一下,发现这个脚本里是用 Archive 生成目标 framework 的,而我们平常都是直接用 Run+Release 模式编译的。查问题手动进行 Archive 编译时,发现生成的 Products 目录还是空的。搜了一下在 Build Setting 中设置 SKIP_INSTALL 为 NO ,就能成功 Archive 出 framework 了,大小跟前面脚本生成的一致了,是 23.1M 。

    另外发现把 BitCode 改为 NO 后,手动 Archive 生成的 framework 大小变为 6.3 MB 了。

    这个 Framework 项目里用到了 OpenSSL 的 libssl.a 和 libcrypto.a 库,可能是这个原因,前者是 21.4M ,后者是 4.3M ,可能是这两个库的原因导致 Archive 生成的库比较大?感觉不太像。

    同样都是 BitCode 为 YES 的情况下,为什么用 Run+Release 模式生成的 framework 就小很多呢,有人知道原因吗?

    20 条回复    2022-02-25 11:37:36 +08:00
    04BxPLXu2M6UKH6Z
        1
    04BxPLXu2M6UKH6Z  
       2022-02-18 13:00:11 +08:00
    Run+Release 模式下,应该会命中符号优化吧,比如 -Oz 之类的
    xuzhongzhou
        2
    xuzhongzhou  
       2022-02-18 13:18:46 +08:00 via iPhone   2
    run 和 release 没有特别配置的情况下,bitcode 并没有真的加进去。

    在 Build Options 中启用 BitCode ,且使用 Build 而非 Archive 编译时,Xcode 会自动添加编译选项-fembed-bitcode-marker ,这个选项的意思大概就是说:如果 BitCode 开启的话,这里本来应当是放 bitcode 的,实际上没放。
    pheyer
        3
    pheyer  
    OP
       2022-02-18 14:05:02 +08:00
    @xuzhongzhou 还真是的,原来直接用 Run+Release 模式得到的 Framework 是假 Bitcode ,估计是为了方便真机测试吧。archive 模式就是用 -fembed-bitcode 参数的
    搜了一下,发现有办法判断生成的 framework 是用 -fembed-bitcode-marker 还是用 -fembed-bitcode 参数编译生成的。可以参考 https://www.jianshu.com/p/9a081d681967 这篇文章。
    icyalala
        4
    icyalala  
       2022-02-18 14:22:33 +08:00
    遇到这种 macho 问题,可以用 MachOExplorer 或者 XMachOViewer 打开看看,
    对比能看到那个大的里面多了个 __LLVM 段,里面就是 bitcode ,没有就说明 bitcode 没打包进去。
    pheyer
        5
    pheyer  
    OP
       2022-02-18 14:32:46 +08:00
    @xuzhongzhou
    @icyalala 估计是因为第三方也没用 BitCode ,所以没发现我们提供的库有 BitCode 问题的。这么一看,要用 BitCode 的话,还非得用 Archive 编译 Framework 不可。
    我还想知道的是,除了这个 BitCode 差异,以及 dSym 差异,Run+Release 模式编译和 Archive 编译生成的 Framework 还有没有其它的类似差异,你们知道吗
    rrubick
        6
    rrubick  
       2022-02-18 14:49:05 +08:00
    收藏了,我一直用的 build+release 去生成 framework 的,而且一直以为 bitcode 开启后 framework 会小。。。
    准备查查资料学习下,感谢~
    CaffreySun
        7
    CaffreySun  
       2022-02-18 15:32:34 +08:00
    自己写了打包 XCFramework 的脚本,用 xcodebuild archive 命令生成 xcarchive ,然后再用 xcarchive 合并成 XCFramework
    CaffreySun
        8
    CaffreySun  
       2022-02-18 15:40:34 +08:00
    我看你提到的脚本中合成 XCFramework 是这样 `xcodebuild -create-xcframework -framework xxxx.xcarchive/Products/Library/Frameworks/xxxx.framework`
    其实可以不用这样拼接路径 /Products/Library/Frameworks/xxxx.framework

    优雅一点的做法 `xcodebuild -create-xcframework -archive xxx.xcarchive -framework xxxx.framework`

    如果哪天 xcarchive 里的目录有调整,拼接路径的方法就无法运行了。
    pheyer
        9
    pheyer  
    OP
       2022-02-18 16:03:13 +08:00
    @CaffreySun 感谢提醒
    icyalala
        10
    icyalala  
       2022-02-18 16:34:59 +08:00
    @pheyer macho 文件多了个 LC_SEGMENNT(__LLVM) 和 LC_ENCRYPTION_INFO 这两个 LOAD command 。
    其他直接拿 diff 工具比如 Kaleidoscope 看一下就有了。
    xuzhongzhou
        11
    xuzhongzhou  
       2022-02-18 23:30:50 +08:00
    验证可以用 @icyalala 说的工具,更简单的方法可以直接用这个命令:
    `otool -l yourBinaryLib | grep __LLVM`
    有 __LLVM 段就是有 bitcode 。-configuration

    Run+Release 和 Archive 在输出库上的差异可能要跑下自己对比下完整的编译命令的差异了。实际上 Archive 用的也是 Release 的 config ,应该就是 bitcode 的差别。
    rrubick
        12
    rrubick  
       2022-02-24 15:28:56 +08:00
    @pheyer
    请教大佬,为什么 SKIP_INSTALL 为 NO 还是无法 archive 生成 framework 呢?
    pheyer
        13
    pheyer  
    OP
       2022-02-25 09:39:23 +08:00
    @magic3584 这个就不知道了,你用上面链接中的第 1 个脚本能生成 xcframework 吗,它里面也是用 archive 的?
    rrubick
        14
    rrubick  
       2022-02-25 10:11:18 +08:00
    @pheyer #13
    脚本没有尝试,archive 后导出后能找到 framework 了,但是 Xcode 中的 Products 下面还是没有。
    而且我测试了一下,Bitcode 为 NO 时,archive 比 build 要小,但是 Bitcode 为 YES 时,archive 比 build 要大。

    请问楼主知道为什么了吗?求分享资料
    pheyer
        15
    pheyer  
    OP
       2022-02-25 10:39:51 +08:00
    @magic3584 archive 后 Xcode 中的 Products 下面就是没有的,Archive 完自动显示的列表中选择刚的包右键选择 show in finder ,里面的 Products 就是你要找的 framework
    开启 Bitcode 包会变大,这与 BitCode 的原理相关,网上很多的,你搜一下就行
    rrubick
        16
    rrubick  
       2022-02-25 10:45:18 +08:00
    @pheyer #15
    Bitcode 为 YES 时候包大我了解了,但是不清楚为什么 archive 和 build 相比一会大一会小
    pheyer
        17
    pheyer  
    OP
       2022-02-25 11:24:32 +08:00
    @magic3584 archive 和 build 相比一会大一会小这个问题上面都说到了啊,可以理解为设置了 BitCode 后,Archive 模式是真 Bitcode ,Build 模式是假 Bitcode
    rrubick
        18
    rrubick  
       2022-02-25 11:31:12 +08:00
    @pheyer #17
    大佬您的意思是 archive 理应比 build 小吗?在 Bitcode 为 YES 时 archive 反而大是因为加入了 bitcode ?
    pheyer
        19
    pheyer  
    OP
       2022-02-25 11:36:44 +08:00
    @magic3584 在 Bitcode 为 YES 时 archive 反而大是因为加入了 bitcode这个是这样的,而且是大很多。BitCode 为 No 时看你的 Build 是 Debug 模式还是 Release 模式吧,另外还要看 Build Setting 中的优化选项,这种情况下与 Archive 后的包比较大小没有绝对答案,纠结这个没意义
    rrubick
        20
    rrubick  
       2022-02-25 11:37:36 +08:00
    @pheyer #19
    明白了,感谢大佬
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2399 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 15:39 PVG 23:39 LAX 08:39 JFK 11:39
    Do have faith in what you're doing.
    ubao 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