随着动态库的流行,静态库越来越少了(关于动态库和静态库的介绍请点击),但是不排除项目中有些依赖的第三方还是使用的静态库。那么这种情况下就可以考虑,将第三方静态库做一个二次封装。一来和业务代码进行隔离,方便以后第三方库的升级,二来将静态库封装进动态库里便于管理和利用动态库的优势。一般情况下,用动态库封装静态库很简单,就是将静态库直接拖进动态库的工程里,直接编译即可。但是有一种情况下这么做是不行的,需要暴露静态库的头文件,也就是虽然静态库放在动态库里面了,但是静态库的头文件还要提供给上层应用调用。
下面以封装百度地图为例,介绍如何将第三方静态库封装进动态库。
百度地图根据业务不同,划分了很多不同的包,大概包括基础包、定位包、地图包、搜索包、工具包、全景包等。如下图所示:

首先,新建一个动态库工程,直接将这些包拖入到工程中。


第一种,用代码将百度地图库封装一层。
也就是自己代码调用百度地图库,然后将自己代码对外暴露,供应用层调用。这是最好的一种思路,不仅能解决问题,还能将第三方库和自己的项目业务隔离去耦合。对于一般的库(比较小的库),非常推荐这种思路。但是对于百度地图来说,不好执行,因为百度地图的API太多太复杂了,如果一点一点去封装,工作量太大了。当然有人说,不一定要将所有的API都重新封装,用到哪些才封装哪些,这样当然是可以的。不过还是挺困难的,百度地图里面定义的类型太多了,哪怕是只用地图这一个功能的API,工作量都挺大。
第二种,将百度地图的.framework包拆开为.a和.h文件。
上面提到,在.framework里面的头文件没办法对外暴露,那么把.framework这层壳去掉呢?

第三种,为百度地图的.framework包额外添加.h头文件。
上面讨论了,对.framework拆包这种方式不适用于百度地图,所以还得想其他办法。比如,.framework包不动,然后在.framework包外再额外加一份头文件呢?事实证明,这样完全是可以的。
最终就是以这种方式解决问题。方法虽然很简单,但是需要想法。所以思路和想法非常重要。最终封装的形式如下图所示,demo请点击。

网友评论