从Xcode中的动态库中剥离不需要的架构 Submit to App Store issues: Unsupported Architecture X86_64, i386
从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]’.
解决
那么,我们如何解决这个问题?
我们可以改用静态库。但是,在我的项目中有多个目标和扩展,用相同库的副本膨胀我的所有可执行文件似乎很愚蠢。
我们可以每次从源代码编译该库,从而生成一个新的动态库,其中仅包含每个构建所需的架构。有两件事让我感到困扰-首先,一直都在重新编译所有不变的代码似乎很浪费,第二是我喜欢保持依赖关系为静态,并且每次都进行新的构建意味着我没有必须再运行稳定的代码,尤其是如果我开始在Xcode Beta中四处乱搞的时候。如果更改编译器导致库中出现奇怪的错误怎么办?这是非常罕见的事情,但是确实发生了,而且我不知道该库的代码库足以调试它。
如果我们没有开始的源头,那么,我们有点不走运。
我们可以在构建时弄清楚如何处理它,然后再也不必考虑它。听起来更像!
脚本解决
今天,我整理了一些构建时脚本来处理此问题,因此我不必再在意它了。
在我的项目文件夹中:
$ lipo -info Vendor/RAC/ReactiveCocoa.framework/ReactiveCocoa→ Architectures in the fat file: ReactiveCocoa are:i386 x86_64 armv7 arm64
按下“ build”后:
$ lipo -info Cascable.app/Frameworks/ReactiveCocoa.framework/ReactiveCocoa→ Architectures 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相关推荐
- 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 获取注入的 libbridge.so 动态库中的 load 函数地址 并 通过 远程调用 执行该函数 )
文章目录 一.dlsym 函数简介 二.获取 目标进程 linker 中的 dlsym 函数地址 三.远程调用 目标进程 linker 中的 dlsym 函数 获取 注入的 libbridge.so ...
- iOS中创建动态库及调用方法
去年因需要用到动态库,自己就找了好多一些 资料,最终找到了一套方法,怎么创建与使用动态库,记录一下: Xcode提供了在iOS工程中创建静态库的功能,和在MAC上创建动态库和静态库的功能. 但是没有提 ...
- Linux中的动态库和静态库(.a/.la/.so/.o)
为什么80%的码农都做不了架构师?>>> Linux中的动态库和静态库(.a/.la/.so/.o) Linux中的动态库和静态库(.a/.la/.so/.o) C/C++程序 ...
- 【C 语言】动态库封装与设计 ( 动态库调用环境搭建 | 创建应用 | 拷贝动态库相关文件到源码路径 | 导入头文件 | 配置动态库引用 | 调用动态库中的函数 )
文章目录 一.在 Visual Studio 2019 中创建 " 控制台应用 " 程序 二.拷贝 xxx.lib.xxx.dll.xxx.h 到源码路径 三.导入 xxx.h 头 ...
- 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 三 | 等待远程函数执行完毕 | 寄存器获取返回值 )
文章目录 前言 一.等待远程进程 mmap 函数执行完毕 二.从寄存器中获取进程返回值 三.博客资源 前言 前置博客 : [Android 逆向]Android 进程注入工具开发 ( 注入代码分析 | ...
- 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 二 | 准备参数 | 远程调用 mmap 函数 )
文章目录 一.准备 mmap 函数的参数 二.mmap 函数远程调用 一.准备 mmap 函数的参数 上一篇博客 [Android 逆向]Android 进程注入工具开发 ( 注入代码分析 | 远程调 ...
- 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 一 | mmap 函数简介 )
文章目录 一.mmap 简介 二.mmap 函数作用 一.mmap 简介 mmap 函数的作用是 将 文件 映射到 内存中 , 映射的单位必须是 PAGE_SIZE ; mmap 函数引入头文件 : ...
- 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 获取 远程 目标进程 中的 /system/lib/libc.so 动态库中的 mmap 函数地址 )
文章目录 一.获取 远程 目标进程 中的 /system/lib/libc.so 动态库中的 mmap 函数地址 二.从 /proc/pid/maps 文件中获取 指定 进程 中的 /system/l ...
- 【Android 逆向】逆向修改游戏应用 ( 分析应用结构 | 定位动态库位置 | 定位动态库中的修改点 | 修改动态库 | 重打包 )
文章目录 一.应用结构分析 二.定位动态库位置 三.定位动态库中的修改点 四.修改动态库 五.重打包 一.应用结构分析 分析上一篇博客 [Android 逆向]逆向修改游戏应用 ( APK 解析工具 ...
- 【Android NDK 开发】NDK 交叉编译 ( Ubuntu 中交叉编译动态库 | Android Studio 中配置使用第三方动态库 )
文章目录 I . 动态库 与 静态库 II . 编译动态库 III. Android Studio 使用第三方动态库 IV . Android Studio 关键代码 V . 博客资源 I . 动态库 ...
最新文章
- 接口重复提交解决方案
- MFC Initinstance中DoModal()返回-1
- 余额宝 vs. P2P网贷,谁更有生命力?
- 如何查看Eclipse版本
- php中finally不能用,php-什么时候以及为什么`finally`有用?
- 因为虚拟机导致的错误
- Plain text, flat file, 及flat-file database 如何翻译
- postman测试工具中的js代码中的sendRequest()使用详解
- as button onitemclicklistener为null_为vue3.0的学习TS解读高级类型
- 【开源工程】之YUVPlayer1.6
- RTT设置删除空闲钩子函数想到函数指针和回调函数
- 【FIRST USE】第一次用git把代码上传到github
- PDO NOsuch file 将DNHOST修改
- 机器学习5-支持向量机
- (Singleton)单例模式的Java实现
- Android使用okhttp加载图片
- 计算机基础知识ppt图文,计算机基础知识讲解ppt课件.ppt
- 服装行业个性化服务:订阅电商鼻祖Stitch Fix商业模式中的个性化推荐分析
- 违反GPL协议赔偿50万,国内首例!
- 精致简约的高速下载神器 - Motrix~~高速下载百度网盘资源!
热门文章
- 多维动态数组c语言,C语言多维动态数组的实现
- springcloud feign负载均衡_SpringCloud学习笔记(2)——Ribbon
- android 新版本gradle,Android:更新到新版本的gradle后出现“Manife...
- 《网页设计技巧》系列之一 浅谈文本排版
- Android-path类整理
- 网页端实时音视频服务架构与实践
- 远程登录服务器时,提示未被授予终端服务器登录权限?
- oracle11g服务项及其启动顺序
- 深入理解JavaScript系列(31):设计模式之代理模式
- 23. SQL -- SQL Server安装,运行架构,管理SQL