从Xcode中的动态库中剥离不需要的架构

自从发布iOS 8以来,开发人员已经能够利用动态库的优势进行iOS开发。

对于一般开发,为所有需要的体系结构提供一个动态库是一件很棒的事,这样您就可以在所有设备和iOS Simulator上运行而无需进行任何更改。

在我的项目及其各种扩展中,我使用了Reactive Cocoa,并将它作为预编译的动态库包含在我的项目中,其中包含Simulator 和设备的i386和x86_64slice 。armv7arm64

但是,这种方法有一个缺点-因为它们是在运行时链接的,所以当动态库单独编译到最终运行的应用程序时,就无法确定实际需要哪种架构。因此,Xcode只会在编译时将整个内容复制到您的应用程序包中。除了浪费磁盘空间之外,从理论上讲,这没有真正的缺点。但是实际上,iTunes Connect不喜欢我们添加未使用的二进制切片:

提交AppStore 提示Unsupported Architectures. Your executable contains unsupported architectures ‘[X86_64, i386]’.

解决

那么,我们如何解决这个问题?

  1. 我们可以改用静态库。但是,在我的项目中有多个目标和扩展,用相同库的副本膨胀我的所有可执行文件似乎很愚蠢。

  2. 我们可以每次从源代码编译该库,从而生成一个新的动态库,其中仅包含每个构建所需的架构。有两件事让我感到困扰-首先,一直都在重新编译所有不变的代码似乎很浪费,第二是我喜欢保持依赖关系为静态,并且每次都进行新的构建意味着我没有必须再运行稳定的代码,尤其是如果我开始在Xcode Beta中四处乱搞的时候。如果更改编译器导致库中出现奇怪的错误怎么办?这是非常罕见的事情,但是确实发生了,而且我不知道该库的代码库足以调试它。

  3. 如果我们没有开始的源头,那么,我们有点不走运。

  4. 我们可以在构建时弄清楚如何处理它,然后再也不必考虑它。听起来更像!

脚本解决

今天,我整理了一些构建时脚本来处理此问题,因此我不必再在意它了。

在我的项目文件夹中:

$ lipo -info Vendor/RAC/ReactiveCocoa.framework/ReactiveCocoaArchitectures in the fat file: ReactiveCocoa are:i386 x86_64 armv7 arm64

按下“ build”后:

$ lipo -info Cascable.app/Frameworks/ReactiveCocoa.framework/ReactiveCocoaArchitectures in the fat file: ReactiveCocoa are:armv7 arm64

事不宜迟,这里是脚本。在构建步骤中添加一个“运行脚本”步骤,将其放置在嵌入框架的步骤之后,将其设置为“使用”,/bin/sh然后输入以下脚本:

APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"# This script loops through the frameworks embedded in the application and
# removes unused architectures.
find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK
doFRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"echo "Executable is $FRAMEWORK_EXECUTABLE_PATH"EXTRACTED_ARCHS=()for ARCH in $ARCHSdoecho "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME"lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH"EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")doneecho "Merging extracted architectures: ${ARCHS}"lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}"rm "${EXTRACTED_ARCHS[@]}"echo "Replacing original executable with thinned version"rm "$FRAMEWORK_EXECUTABLE_PATH"mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH"done

该脚本将浏览您构建的应用程序的Frameworks文件夹,并确保每个框架中仅存在要构建的体系结构。

好多了!现在,我可以在项目中添加大量动态库,其中包含我将需要的所有体系结构,并且构建过程将处理在任何给定时刻适合哪些体系结构。

参考

https://stackoverflow.com/questions/30547283/submit-to-app-store-issues-unsupported-architecture-x86

http://ikennd.ac/blog/2015/02/stripping-unwanted-architectures-from-dynamic-libraries-in-xcode/

从Xcode中的动态库中剥离不需要的架构 Submit to App Store issues: Unsupported Architecture X86_64, i386相关推荐

  1. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 获取注入的 libbridge.so 动态库中的 load 函数地址 并 通过 远程调用 执行该函数 )

    文章目录 一.dlsym 函数简介 二.获取 目标进程 linker 中的 dlsym 函数地址 三.远程调用 目标进程 linker 中的 dlsym 函数 获取 注入的 libbridge.so ...

  2. iOS中创建动态库及调用方法

    去年因需要用到动态库,自己就找了好多一些 资料,最终找到了一套方法,怎么创建与使用动态库,记录一下: Xcode提供了在iOS工程中创建静态库的功能,和在MAC上创建动态库和静态库的功能. 但是没有提 ...

  3. Linux中的动态库和静态库(.a/.la/.so/.o)

    为什么80%的码农都做不了架构师?>>>    Linux中的动态库和静态库(.a/.la/.so/.o) Linux中的动态库和静态库(.a/.la/.so/.o) C/C++程序 ...

  4. 【C 语言】动态库封装与设计 ( 动态库调用环境搭建 | 创建应用 | 拷贝动态库相关文件到源码路径 | 导入头文件 | 配置动态库引用 | 调用动态库中的函数 )

    文章目录 一.在 Visual Studio 2019 中创建 " 控制台应用 " 程序 二.拷贝 xxx.lib.xxx.dll.xxx.h 到源码路径 三.导入 xxx.h 头 ...

  5. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 三 | 等待远程函数执行完毕 | 寄存器获取返回值 )

    文章目录 前言 一.等待远程进程 mmap 函数执行完毕 二.从寄存器中获取进程返回值 三.博客资源 前言 前置博客 : [Android 逆向]Android 进程注入工具开发 ( 注入代码分析 | ...

  6. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 二 | 准备参数 | 远程调用 mmap 函数 )

    文章目录 一.准备 mmap 函数的参数 二.mmap 函数远程调用 一.准备 mmap 函数的参数 上一篇博客 [Android 逆向]Android 进程注入工具开发 ( 注入代码分析 | 远程调 ...

  7. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 一 | mmap 函数简介 )

    文章目录 一.mmap 简介 二.mmap 函数作用 一.mmap 简介 mmap 函数的作用是 将 文件 映射到 内存中 , 映射的单位必须是 PAGE_SIZE ; mmap 函数引入头文件 : ...

  8. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 获取 远程 目标进程 中的 /system/lib/libc.so 动态库中的 mmap 函数地址 )

    文章目录 一.获取 远程 目标进程 中的 /system/lib/libc.so 动态库中的 mmap 函数地址 二.从 /proc/pid/maps 文件中获取 指定 进程 中的 /system/l ...

  9. 【Android 逆向】逆向修改游戏应用 ( 分析应用结构 | 定位动态库位置 | 定位动态库中的修改点 | 修改动态库 | 重打包 )

    文章目录 一.应用结构分析 二.定位动态库位置 三.定位动态库中的修改点 四.修改动态库 五.重打包 一.应用结构分析 分析上一篇博客 [Android 逆向]逆向修改游戏应用 ( APK 解析工具 ...

  10. 【Android NDK 开发】NDK 交叉编译 ( Ubuntu 中交叉编译动态库 | Android Studio 中配置使用第三方动态库 )

    文章目录 I . 动态库 与 静态库 II . 编译动态库 III. Android Studio 使用第三方动态库 IV . Android Studio 关键代码 V . 博客资源 I . 动态库 ...

最新文章

  1. 接口重复提交解决方案
  2. MFC Initinstance中DoModal()返回-1
  3. 余额宝 vs. P2P网贷,谁更有生命力?
  4. 如何查看Eclipse版本
  5. php中finally不能用,php-什么时候以及为什么`finally`有用?
  6. 因为虚拟机导致的错误
  7. Plain text, flat file, 及flat-file database 如何翻译
  8. postman测试工具中的js代码中的sendRequest()使用详解
  9. as button onitemclicklistener为null_为vue3.0的学习TS解读高级类型
  10. 【开源工程】之YUVPlayer1.6
  11. RTT设置删除空闲钩子函数想到函数指针和回调函数
  12. 【FIRST USE】第一次用git把代码上传到github
  13. PDO NOsuch file 将DNHOST修改
  14. 机器学习5-支持向量机
  15. (Singleton)单例模式的Java实现
  16. Android使用okhttp加载图片
  17. 计算机基础知识ppt图文,计算机基础知识讲解ppt课件.ppt
  18. 服装行业个性化服务:订阅电商鼻祖Stitch Fix商业模式中的个性化推荐分析
  19. 违反GPL协议赔偿50万,国内首例!
  20. 精致简约的高速下载神器 - Motrix~~高速下载百度网盘资源!

热门文章

  1. 多维动态数组c语言,C语言多维动态数组的实现
  2. springcloud feign负载均衡_SpringCloud学习笔记(2)——Ribbon
  3. android 新版本gradle,Android:更新到新版本的gradle后出现“Manife...
  4. 《网页设计技巧》系列之一 浅谈文本排版
  5. Android-path类整理
  6. 网页端实时音视频服务架构与实践
  7. 远程登录服务器时,提示未被授予终端服务器登录权限?
  8. oracle11g服务项及其启动顺序
  9. 深入理解JavaScript系列(31):设计模式之代理模式
  10. 23. SQL -- SQL Server安装,运行架构,管理SQL