ios动态库编译
Ⅰ iOS 静态库和动态库打包framework流程(纯swift版/swift、OC混编版)
选择 iOS -- Framework&Library , 点击 next
如果打包文件中使用了第三方库,建议pod管理,并告知用户使用pod安装,避免用户重复导入。跟平时开发逻辑一样,打开 .xcworkspace 工程。
操作完之后工程目录显示
把打包需要的文件添加到项目中。 如果想要这个类或类里面的方法被外面使用,需要配合pubic修饰供外面使用
由于以上获取的framework只能在对应的版本上运行(即真机只能在设备上运行模拟器版本只能在模拟器上面运行使用),所以需要合并framework版本。
合并framework版本:
sudo lipo -create (此处请填写真机AppVest文件路径) (此处填写模拟器AILLSDK文件路径) -output 自定义合成文件存储路径(合成文件的名字AILLSDK)
因为真机版本和模拟器版本的framework都存在arm64架构,导致架构重复,不出意外,会提示合并失败。如下
处理合并失败的问题
最后,将 XX.framework(真机或者模拟器framework都可)文件夹 拷贝出来,替换AILLSDK(本文使用的)为刚才合并的新文件。
查看替换后的framework支持全部真机模拟器架构。
我在合并binary文件之后,仅拷贝出 Release-iphoneos 文件夹下的 XXX.framework ,并替换掉AILLSDK二进制文件。导入项目中使用模拟器运行,报错,显示找不到架构。
解决方案
拷贝所有的moles到
再替换掉AILLSDK二进制文件,导入项目,如果framework中内含第三方库,需要在所在的工程中使用pod加载,否则会提示编译失败。
至此,编译成功。🎉🎉🎉🎉🎉
不管是在framework封装的内部,内部swift类调用内部的OC类,还是内部的OC类使用内部的swift类,还是外部工程swift类使用framework内部OC类,还是外部工程OC类使用framework内部swift类。原理是一致的,以下来介绍下:
在 AILLSDK.h(你自己创建framework时候生成的.h文件) 中添加import导入
#import <AILLSDK/OC类名.h>
在oc的 .m 或 .h 文件中,导入 #import <AILLSDK/AILLSDK-Swift.h> , 也就是 你自己framework名-Swift.h
Ⅱ 百度APP iOS端包体积50M优化实践(七)编译器优化
网络APP iOS端包体积优化系列文章深入探讨了包体积优化的整体方案、图片优化、资源优化、代码优化、无用类优化、HEIC图片优化实践以及无用方法清理。本篇将着重于编译器优化在网络APP实践中的应用。
编译器优化
编译器优化包括GCC语言编译优化、Swift编译优化、LTO优化、剥离调试符号、剥离符号表、剔除未引用的代码、Asset优化、C++虚函数优化和三方SDK编译器方向瘦身。
2.1 方案综述
2.2 GCC语言编译优化
2.2.1 综述
通过GCC编译优化,可以生成体积更小的二进制产物,对Objective C、C、C++均有效。
2.2.2 Objective C++编译优化
在XCode中编辑和编译Objective C++代码时,优化配置路径为:Build Settings -> Apple Clang -> Code Generation。可选参数包括:
默认优化等级为-Os,但我们使用-Oz优化方式。WWDC 2019《What's New in Clang and LLVM》详细解释了这种优化原理,它通过识别跨函数的相同代码序列减少代码大小。重复的连续机器指令被外联为函数,原始代码序列被替换为外联函数,虽然增加函数调用栈深度,但在当前高配置的iPhone设备上,这种性能损失是可以接受的。
实践表明,编译优化参数 -Oz对Objective C++代码有10%体积收益,对C和C++代码有30%收益。
2.2.3 C/C++编译优化
对于底层模块(如网络库、播放内核、视觉处理和端智能),常使用C和C++实现。这些模块支持跨平台,采用Cmake和GN编译。对于C++语言,cppFlags选项设置为'-Oz';对于C语言,cFlags选项设置为"-Oz"。
2.3 Swift编译优化
Swift优化包括Optimization Level和Compilation Mode,配置路径为:Build Settings -> Swift Compiler -> Code Generation。
Optimization Level可选参数值有:Optimize for Size,其核心原理与GCC语言编译优化类似,通过外联和复用重复的连续机器指令降低大小。Compliation Mode可选参数值有:Optimize for Size[-Osize]和Whole Mole,同时开启可减少10%的Swift包体积大小。
2.4 LTO优化
LTO是苹果官方提出的一种优化策略,通过在链接阶段进行跨模块优化,减少代码大小和提高执行效率。配置路径为:Build Settings -> Apple Clang -> Code Generation -> Link-Time Optimization,设置为Incremental。
LTO优化体现在:函数内联化、去除无用代码、全局优化。但负面影响包括:降低Link Map的可读性、增加编译和链接时间。
2.5 剥离调试符号
默认设置Symbols Hidden by Default为YES,可减少包大小。动态库设置为NO,否则会引发链接错误。
2.6 剥离符号表
配置路径为:Build Settings -> Strip Linked Proct。选择属性值为YES。
Strip Linked Proct用于去除不必要的符号信息,去除后只能使用dSYM文件进行符号化,因此需将"Debug Information Format"修改为"DWARF with dSYM file"。
2.7 剔除未引用的代码
配置路径为:Build Settings -> Dead Code Stripping。选择属性值为YES。
该优化主要在链接时剔除C、C++、Swift等静态语言的无用代码,但在处理Objective-C时无效,因其基于Runtime机制编译。
2.8 Asset优化
配置路径为:Build Settings -> Asset Catalog Compiler -> Optimization。选择Space以优化包大小,收益较小。
2.9 C++减少虚函数的使用
减少虚函数使用可减少虚函数表占用空间,最终减小程序包大小。
2.10 三方SDK编译器瘦身
需对每个框架进行优化配置和微调,确保库和依赖项也正确配置,以确保与编译器优化兼容。
网络APP内部集成了众多第三方SDK,需优化SDK以实现应用瘦身。
指令集架构优化
支持arm64和x86_64架构,通过优化指令集架构减小上传到AppStore的包体积。
3.2 指令集架构设置
使用lipo命令从旧的framework中拆分指定架构的二进制文件,合并后替换老的framework的mach-o文件。
3.3 去除无用架构
通过验证AbcArm64和AbcArmX86_64架构信息。
XCode升级优化
苹果Xcode版本持续优化,如Xcode 14,提供更强大的并行编译能力,显着提高构建速度,优化包体积。
Swift内置动态库优化
自2014年发布以来,Swift语言发展迅速,成为iOS开发的首选语言。优化Swift内置动态库,只需将APP支持的最低版本修改为12.2。
优化后,网络APP包体积减少30M+,提交AppStore后,有显着收益。
编译器优化在网络APP包体积优化中的ROI最高,但影响范围广泛。通过实践,成功减少了30M的包体积,实现了自身库的全部收益,同时优化了前15个三方SDK。
总结了网络APP的编译器优化方案,包括多种优化手段,后续将继续深入探讨其他优化方法。