OC & Swift & flutter混编工程动态库转静态库

背景介绍

为什么要把静态库转成动态库呢?因为苹果官方建议的动态库数量为6个,而且有明确说到新增加1个动态库,启动速度就会降低一些。而在我们项目当中已经存在了89个动态库,其中23个系统swift动态库,66个自定义动态库。

问题分析:

首先针对我们自定义的66个动态库进行分析后发现,其中AFN、SDKWebImage、YYKit等等常用第三方开源库居然都是动态库,这种状态就完全不合理,原因是苹果在之前根本不支持动态库上架App Store的,所以对于这些开源库来说,是不可能强制把自己打成动态库给别人使用的。那么这种状态就肯定是工程中的某些配置导致的把这些未明确标注自己是什么库的开源库都打成了动态库。

由于我们项目是OC & Swift & flutter混编工程,早期的OC和swift混编过程中,是必须要在Podfile文件中标识use_frameworks!的,因为早期的swift是不能依赖静态库的,使用这个标识是把所有的源码依赖库都标识成了动态库,这是早期做 OC & swift 混编必走的道路。

如何明确的验证这个问题呢?我这边创建了一个空的工程,引用了AFN,只使用OC进行简单编码,编译打包后查看AFN的库类型,发现其为静态库。

根据分析可知,由于早期做 OC & swift 混编的原因,导致第三方的开源库都被打成了动态库。

解决办法:

1、use_frameworks! :linkage => :static替代use_frameworks!。

  • 从 Xcode 9 开始 Swift 就开始支持静态库,而 CocoaPods 1.9.0 开始,引入了 use_frameworks! :linkage => :static 来支持有静态库和 Framework 的情况。如果源码依赖库不想被打成动态库,只需在podspec文件中设置 s.static_framework = false,该优先级最高。

2、使用上述指令后出现的问题 -- 数据库不能用了

报错信息如下:

[logging] API call with invalid database connection pointer
[logging] misuse at line 134561 of [9ff244ce07]
[WCDB][DEBUG]Code:21, Type:SQLiteGlobal, Msg:library routine called out of sequence
DB Error: 21 "library routine called out of sequence"
DB Query: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name=?
DB Path: /var/mobile/Containers/Data/Application/F6486DF5-ECE9-4944-B9A1-7A7030B1CA94/Documents/1/SLDataBase.db

解决方案:
build settings --> Other Linker Flags添加

-framework
"WCDBSwift"
-framework
"sqliterk"
-force_load
$(BUILT_PRODUCTS_DIR)/WCDBOptimizedSQLCipher/sqlcipher.framework/sqlcipher

你可能感兴趣的:(OC & Swift & flutter混编工程动态库转静态库)