开启use_frameworks!
AFNetworking: Mach-O 64-bit dynamically linked shared library arm64
使用动态库主app的mach-o没有包含这些三方库,如果使用静态库,则三方库会跟主mach-o绑定到一起
通过otool工具查看
otool -L xxxx
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 1300.36.0)
/usr/lib/libicucore.A.dylib (compatibility version 1.0.0, current version 70.1.0)
/usr/lib/libresolv.9.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libsqlite3.dylib (compatibility version 9.0.0, current version 346.0.0)
/usr/lib/libxml2.2.dylib (compatibility version 10.0.0, current version 10.9.0<img src=")" alt="" width="70%" />
/System/Library/Frameworks/AppTrackingTransparency.framework/AppTrackingTransparency (compatibility version 1.0.0, current version 1.0.0, weak)
@rpath/Ares.framework/Ares (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/CoreMedia.framework/CoreMedia (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/CoreMotion.framework/CoreMotion (compatibility version 1.0.0, current version 2780.0.27)
/System/Library/Frameworks/CoreServices.framework/CoreServices (compatibility version 1.0.0, current version 1228.0.0)
/System/Library/Frameworks/CoreTelephony.framework/CoreTelephony (compatibility version 1.0.0, current version 0.0.0)
@rpath/FLAnimatedImage.framework/FLAnimatedImage (compatibility version 1.0.0, current version 1.0.0)
@rpath/FMDB.framework/FMDB (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/Foundation.framework/Foundation (compatibility version 300.0.0, current version 1953.255.0)
@rpath/GCDWebServer.framework/GCDWebServer (compatibility version 1.0.0, current version 1.0.0)
@rpath/GKPhotoBrowser.framework/GKPhotoBrowser (compatibility version 1.0.0, current version 1.0.0)
@rpath/HJLogTool.framework/HJLogTool (compatibility version 1.0.0, current version 1.0.0)
@rpath/IQKeyboardManager.framework/IQKeyboardManager (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/ImageIO.framework/ImageIO (compatibility version 1.0.0, current version 1.0.0)
@rpath/IngeekDK.framework/IngeekDK (compatibility version 1.0.0, current version 1.0.0)
@rpath/JQFMDB.framework/JQFMDB (compatibility version 1.0.0, current version 1.0.0)
@rpath/JXCategoryView.framework/JXCategoryView (compatibility version 1.0.0, current version 1.0.0)
@rpath/JXPagingView.framework/JXPagingView (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/JavaScriptCore.framework/JavaScriptCore (compatibility version 1.0.0, current version 614.3.6, weak)
@rpath/MBProgressHUD.framework/MBProgressHUD (compatibility version 1.0.0, current version 1.0.0)
@rpath/MJExtension.framework/MJExtension (compatibility version 1.0.0, current version 1.0.0)
@rpath/MJRefresh.framework/MJRefresh (compatibility version 1.0.0, current version 1.0.0)
@rpath/Masonry.framework/Masonry (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/MobileCoreServices.framework/MobileCoreServices (compatibility version 1.0.0, current version 1228.0.0)
/System/Library/Frameworks/QuartzCore.framework/QuartzCore (compatibility version 1.2.0, current version 1.11.0)
@rpath/Reachability.framework/Reachability (compatibility version 1.0.0, current version 1.0.0)
@rpath/SDCycleScrollView.framework/SDCycleScrollView (compatibility version 1.0.0, current version 1.0.0)
@rpath/SDWebImage.framework/SDWebImage (compatibility version 1.0.0, current version 1.0.0)
@rpath/SDWebImageWebPCoder.framework/SDWebImageWebPCoder (compatibility version 1.0.0, current version 1.0.0)
@rpath/SGQRCode.framework/SGQRCode (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/Security.framework/Security (compatibility version 1.0.0, current version 60420.60.20)
@rpath/SocketRocket.framework/SocketRocket (compatibility version 1.0.0, current version 1.0.0)
use_frameworks! :linkage => :static
AFNetworking: current ar archive
关闭use_frameworks!
可以看到使用的三方库转换成了libAFNetworking.a ar -t libAFNetworking.a 可以查看.a中包含多少.o文件
mach-o大小对比
:linkage => :static
这个跟注释use_frameworks! 效果相同,都是静态库
段迁移
经过测试,Download Size 和 Install Size 都没有减少,可能跟项目太小有关,压缩文件大小减少了17MB, 通过tf后台查看如下:
使用链接时优化 LTO
Link-Time Optimization 链接时优化,是 Xcode 自带的一个编译/链接参数。根据 WWDC 2016 《What's New in LLVM》[4]的介绍,LTO 对包大小和运行效率都有正向影响
结论
- 如果三方库为静态framework,是不参与编译的,DerivedData中找不到编译产物
- app上线最好使用静态库,最好关闭use_frameworks!,或者 :linkage => :static,经过测试发现使用静态库install size减少了10MB
- 使用静态库对启动有提升