美文网首页iOS集合
iOS 类冲突之 .a .framework静态库瘦身

iOS 类冲突之 .a .framework静态库瘦身

作者: 037e3257fa3b | 来源:发表于2018-06-19 15:17 被阅读0次

    今天在海外SDK的开发中,遇到Google登录SDK与Google分析SDK有冲突的问题,于是才有了本篇文章的出现。当我们使用别人提供的SDK进行开发时,时常会遇到两个静态库有相同类而发生冲突的问题。如果我们自己能够通过技术解决这个问题,那当然是最好的。

    问题分析:iOS中并不是像Android中存在命名空间这一说法,命名空间的存在是为了防止不同人编写类库发送命名冲突而设计的。因此,iOS中在两个静态库中,如果存在相同的类,则会发生冲突的问题。

    例如:

    First.framework

    FirstViewController.o

    SecodeViewController.o

    ThirdViewController.o

    FourViewController.o

    Secode.framework

    FourViewController.o

    FiveViewController.o

    SixViewController.o

    SevenViewController.o

    当这两个静态库的framework放在同一个工程下时,则会出现冲突的问题。

    duplicate_symbol.png

    解决思路:

    1.修改其中一个framework中的冲突类名;

    2.删除其中一个framework中的冲突类;

    下面简单操作一下删除First.framework中的冲突类(FourViewController.o),灵感来自Google登录与分析SDK的冲突

    前提:前提是被"瘦身"的framework必须是一个"胖"的framework。所谓瘦身就是删除其中的部分内容,所谓胖也就是该framework支持多位CPU架构。(armv7 i386 x86_64 arm64)

    architectrues.png

    0.打开终端,进入First.framework目录

    $ cd xxxx/First.framework
    

    1.查看First.framework支持的架构

    $ lipo -info First
    

    如图:


    1.png

    2.获得“瘦”的.a文件

    $ lipo -thin armv7 First -output armv7.a
    $ lipo -thin i386 First -output i386.a
    $ lipo -thin x86_64 First -output x86_64.a
    $ lipo -thin arm64 First -output arm64.a
    

    如图:


    2.png

    3.将不同的架构移动到不同的文件夹下(自行创建文件夹)

    如图:


    3.png

    4.进入对应文件夹并从瘦文件中提取对象文件(*.o)

    $ cd armv7
    $ ar -x armv7.a
    $ cd ../i386
    $ ar -x i386.a
    $ cd ../x86_64
    $ ar -x x86_64.a
    $ cd ../arm64
    $ ar -x arm64.a
    
    

    如图:


    4.png

    5.删除冲突的对象文件(.o文件)与对应的.a文件

    6.将对应文件夹中的内容合并成新的瘦文件

    $ cd armv7
    $ libtool -static *.o -o armv7-new.a
    $ cd ../i386
    $ libtool -static *.o -o i386-new.a
    $ cd ../x86_64
    $ libtool -static *.o -o x86_64-new.a
    $ cd ../arm64
    $ libtool -static *.o -o arm64-new.a
    

    如图:


    5.png

    7.将瘦文件合并成一个胖文件

    将上面生成的四个 -new.a文件放到一个新的文件夹中,进入该文件夹,执行以下命令得到一个First胖文件,替换工程中First.framework中的First文件即可。

    $ cd new
    $ lipo -create armv7-new.a i386-new.a x86_64-new.a arm64-new.a -output First
    

    如图:

    至此,framework的静态库瘦身到此结束。

    对于.a静态库的瘦身在于如何将.a静态库文件生成多个架构的.a文件。

    假设存在First.a静态库文件

    lipo -thin i386 First.a -output First.i386.a
    lipo -thin x86_64 First.a -output First.x86_64.a
    lipo -thin armv7 First.a -output First.armv7.a
    lipo -thin arm64 First.a -output First.arm64.a
    

    其他步骤与framework类似。

    相关文章

      网友评论

        本文标题:iOS 类冲突之 .a .framework静态库瘦身

        本文链接:https://www.haomeiwen.com/subject/ibiaeftx.html