包大小优化

240 阅读2分钟

开启use_frameworks!

16710936056520.jpg

AFNetworking: Mach-O 64-bit dynamically linked shared library arm64

使用动态库主app的mach-o没有包含这些三方库,如果使用静态库,则三方库会跟主mach-o绑定到一起 image.png

通过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

16710938413523.jpg

AFNetworking: current ar archive

关闭use_frameworks!

16710933797321.jpg

可以看到使用的三方库转换成了libAFNetworking.a ar -t libAFNetworking.a 可以查看.a中包含多少.o文件

mach-o大小对比

:linkage => :static 这个跟注释use_frameworks! 效果相同,都是静态库

16711531482184.jpg

段迁移

经过测试,Download Size 和 Install Size 都没有减少,可能跟项目太小有关,压缩文件大小减少了17MB, 通过tf后台查看如下:

image.png

使用链接时优化 LTO

Link-Time Optimization 链接时优化,是 Xcode 自带的一个编译/链接参数。根据 WWDC 2016 《What's New in LLVM》[4]的介绍,LTO 对包大小和运行效率都有正向影响

image.png

结论

  • 如果三方库为静态framework,是不参与编译的,DerivedData中找不到编译产物
  • app上线最好使用静态库,最好关闭use_frameworks!,或者 :linkage => :static,经过测试发现使用静态库install size减少了10MB
  • 使用静态库对启动有提升

参考

mp.weixin.qq.com/s/oyqAa8wKd…

iOS 包大小二进制优化,一行代码减少 60 MB 下载大小