美文网首页RN
reacr-native CodePush和AMap3DMap冲

reacr-native CodePush和AMap3DMap冲

作者: HT_Jonson | 来源:发表于2019-03-31 15:59 被阅读0次

    RN 集成 react-native-code-push 和 react-native-amp3d ios中出现了 报重复的问题
    具体信息如下

    duplicate symbol _aes_encrypt_key128 in:
        /Users/你的路径/ios/Pods/AMap3DMap/MAMapKit.framework/MAMapKit(MAMapKit-arm64-master.o)
        /Users/用户名/Library/Developer/Xcode/DerivedData/项目名-glwntomwiklumuenkcnbghlorvtj/Build/Products/Debug-iphoneos/libCodePush.a(aeskey.o)
    duplicate symbol _aes_decrypt_key128 in:
        /Users/用户名/Work/项目名/ios/Pods/AMap3DMap/MAMapKit.framework/MAMapKit(MAMapKit-arm64-master.o)
        /Users/用户名/Library/Developer/Xcode/DerivedData/项目名-glwntomwiklumuenkcnbghlorvtj/Build/Products/Debug-iphoneos/libCodePush.a(aeskey.o)
    ld: 2 duplicate symbols for architecture arm64
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
    

    出现linker command failed with exit code 1 (use -v to see invocation) 大家就应该知道一定是有什么包或者文件重复了

    这里简单看下错误就知道是MAMapKit的问题 还有就是codepush

    我的 CodePush 是通过 link 安装的
    AMap3DMap 是通过 pod 安装的
    但是我的解决办法应该是通用的

    解决iOS第三方SDK与本地静态库之间重复的symbols问题


    image.png

    大家要注意的是这里是2个问题 图片里的是arm包的问题 上面报错是x86包的问题
    请大家看仔细 自己报错的包是什么 请对应命令行自己修改.
    我的项目是修改了2次 模拟器和真机都可以编译通过了,并且正常运行

    这里有两个重复的symbols,分别是_aes_decrypt_key128和_aes_encrypt_key128

    1.MAMapKit.framework中的MAMapKit拷贝到桌面,然后打开终端并用指令”cd desktop”切换到桌面,


    image.png image.png

    先使用lipo -info MAMapKit指令看看MAMapKit有什么类型的包

    image.png
    这是一个fat file,包含类型armv7,i386,x86_64和arm64这4种类型的文件,再结合本文第一张报错图,可以发现重复的只是x86_64这个类型的文件,故只需分离出x86_64文件即可。

    使用指令 lipo -thin arm64 MAMapKit -output MAMapKit.x86_64可以从MAMapKit中拷贝出类型为arm64的文件,命名为MAMapKit.x86_64,如下图:

    image.png

    桌面会出现MAMapKit.x86_64文件

    用指令nm -j MAMapKit.arm64 | grep aes > symbols获取MAMapKit.arm64文件中以_zip为前缀的所有符号,生成符号列表并存于symbols文件中。( -j 选项控制只输出符号名),如下图

    image.png

    打开如下:


    image.png

    用指令ar -x MAMapKit.x86_64 将MAMapKit.x86_64文件分解成3个文件如下图

    image.png

    这时候会多出3个文件(我忘记截图了,大搞就是这3个吧 大家对应下就行了)


    image.png

    用指令ld -x -r -unexported_symbols_list symbols MAMapKit-x86_64-master.o -o MAMapKit-arm64-master.o.strip可将symbols文件中的符号列表在MAMapKit-xarm64-master.o文件中删除掉,并生成一个新的文件MAMapKit-x86_64-master.o.strip,过程如下图

    image.png

    先将原来的15.8M大小的MAMapKit.arm64移走
    最后将删除了重复符号的文件和原来的另外两个文件合并,命令是
    ar -r MAMapKit.x86_64 MAMapKit-x86_64-master.o.strip Pods-MAMapKit-dummy.o

    image.png
    image.png

    删除了重复符号后瘦身了些许
    最后再将新生成的MAMapKit.x86_64替换了原来MAMapKit中x86_64类型的文件,指令为lipo MAMapKit -replace x86_64 MAMapKit.x86_64 -output MAMapKitTest如下图:


    image.png image.png

    最后将MAMapKitTest改名为MAMapKit,并替换MAMapKit.framework中的MAMapKit即可引入工程

    相关文章

      网友评论

        本文标题:reacr-native CodePush和AMap3DMap冲

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