是否可以使用bitcode创建通用iOS框架? [英] Is it possible to create a universal iOS framework using bitcode?
问题描述
根据我的理解, bitcode 允许使用中间二进制格式生成二进制文件。所以这是编译到ARM或x64架构之前的步骤。
From what I understood, bitcode allows to generate binaries with an intermediary binary format. So it is the step before compiling to an ARM or x64 architecture.
可以创建真实 .framework
iOS 8以来的iOS文件。但是,默认情况下,框架文件仅针对一种体系结构进行编译(模拟器,iPhone)。当想要分发 .framework
文件时,最好提供与iOS模拟器兼容的文件,并且还可以部署到iPhone。可以使用 lipo
找到不同的脚本示例来创建这样的胖文件。
It is possible to create "real" .framework
file for iOS since iOS 8. However, framework files are compiled for only one architecture by default (emulator, iPhone). When one wants to distribute a .framework
file, it is better to provide a file compatible with the iOS emulator and also deployable to an iPhone. Different examples of scripts can be found to create such a fat file using lipo
.
但是,是否可以只分发编译为bitcode的 .framework
而不必创建具有不同体系结构的胖文件?
However, would it be possible to only distribute a .framework
compiled as bitcode without having to create a fat file with different architectures?
不幸的是,即使为我的 .framework
启用了bitcode:
Unfortunately, even with bitcode enabled for my .framework
:
- 默认情况下会创建不同的文件根据目标架构
- 即使为框架目标启用了存档菜单,我也无法找到结果,即使在我的管理器视图中也是如此。
我是否误解了 bitcode 的概念,或者我错过了什么?
Do I misunderstand something in the concept of bitcode, or do I miss something?
推荐答案
您需要提供通用的平面框架。这是由 lipo
创建的。
You need to provide a universal flat framework. Which is created by lipo
.
- 启用Bitcode,
目标 - >构建设置 - >启用Bitcode
到是
-
添加构建目标创建通用框架
- Enable Bitcode,
Targets->Build Setting->Enable Bitcode
toYes
Add build target to create universal framework
创建聚合
目标并将以下脚本复制到构建短语 - >运行脚本
:
Create a Aggregate
target and copy following script to Build Phrase -> Run Script
:
######################
# Options
######################
#verbose
set -x
REVEAL_ARCHIVE_IN_FINDER=false
FRAMEWORK_NAME="${PROJECT_NAME}"
SIMULATOR_LIBRARY_PATH="${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${FRAMEWORK_NAME}.framework"
DEVICE_LIBRARY_PATH="${BUILD_DIR}/${CONFIGURATION}-iphoneos/${FRAMEWORK_NAME}.framework"
UNIVERSAL_LIBRARY_DIR="${BUILD_DIR}/${CONFIGURATION}-iphoneuniversal"
FRAMEWORK="${UNIVERSAL_LIBRARY_DIR}/${FRAMEWORK_NAME}.framework"
######################
# Build Frameworks
######################
# Build for simulator
xcodebuild -target ${PROJECT_NAME} -sdk iphonesimulator -configuration ${CONFIGURATION} ARCHS="i386 x86_64" ONLY_ACTIVE_ARCH=NO clean build CONFIGURATION_BUILD_DIR=${BUILD_DIR}/${CONFIGURATION}-iphonesimulator
# Build for device
xcodebuild -scheme ${PROJECT_NAME} -sdk iphoneos -configuration ${CONFIGURATION} ARCHS="armv7 armv7s arm64" ONLY_ACTIVE_ARCH=NO clean archive CONFIGURATION_BUILD_DIR=${BUILD_DIR}/${CONFIGURATION}-iphoneos
######################
# Create directory for universal
######################
rm -rf "${UNIVERSAL_LIBRARY_DIR}"
mkdir "${UNIVERSAL_LIBRARY_DIR}"
mkdir "${FRAMEWORK}"
######################
# Copy files Framework
######################
cp -r "${DEVICE_LIBRARY_PATH}/." "${FRAMEWORK}"
######################
# Make an universal binary
######################
lipo "${SIMULATOR_LIBRARY_PATH}/${FRAMEWORK_NAME}" "${DEVICE_LIBRARY_PATH}/${FRAMEWORK_NAME}" -create -output "${FRAMEWORK}/${FRAMEWORK_NAME}" | echo
# For Swift framework, Swiftmodule needs to be copied in the universal framework
if [ -d "${SIMULATOR_LIBRARY_PATH}/Modules/${FRAMEWORK_NAME}.swiftmodule/" ]; then
cp -f ${SIMULATOR_LIBRARY_PATH}/Modules/${FRAMEWORK_NAME}.swiftmodule/* "${FRAMEWORK}/Modules/${FRAMEWORK_NAME}.swiftmodule/" | echo
fi
if [ -d "${DEVICE_LIBRARY_PATH}/Modules/${FRAMEWORK_NAME}.swiftmodule/" ]; then
cp -f ${DEVICE_LIBRARY_PATH}/Modules/${FRAMEWORK_NAME}.swiftmodule/* "${FRAMEWORK}/Modules/${FRAMEWORK_NAME}.swiftmodule/" | echo
fi
######################
# On Release, copy the result to release directory
######################
OUTPUT_DIR="${PROJECT_DIR}/build/${FRAMEWORK_NAME}-${CONFIGURATION}-iphoneuniversal/"
rm -rf "$OUTPUT_DIR"
mkdir -p "$OUTPUT_DIR"
cp -r "${FRAMEWORK}" "$OUTPUT_DIR"
if [ ${REVEAL_ARCHIVE_IN_FINDER} = true ]; then
open "${OUTPUT_DIR}/"
fi
注意
-
bitcode仅打包在iphoneos sdk的
archive
build
otool -l -arch arm64< yourframework_binary> | grep __LLVM
检查是否包含bitcode ,如果你没有指定 arch
参数,那么将没有 __ LLVM
,因为 otool
只打印一个主机拱门(模拟器)。
otool -l -arch arm64 <yourframework_binary>|grep __LLVM
to check whether bitcode is included, if you don't specify the arch
parameter, there will be no __LLVM
, since otool
just print one host arch(simulator).
这篇关于是否可以使用bitcode创建通用iOS框架?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!