适配iOS 18:检测并移除三方库中的 bitcode 部分

适配iOS 18:检测并移除三方库中的 bitcode 部分

四月份开始,AppStore 不再接收 Xcode 16 之下的 Xcode 构建,而新版本,必须移除项目中的 bitcode 支持。

shell 复制代码
#!/bin/bash
# 
# 检测 bitcode 脚本

if [[ -z $1 ]]; then
	echo "参数1: 项目目录,或 framework 路径,或 .a/.ipa/.app 路径"
	echo "参数2: 是否移除 bitcode"
	exit 1;
fi

readonly RemoveBitcode="$2";

TestBitcode() {
	local libPath="$1"
	local libName="$2"
	# 判断静态库与动态库
	local libType=$(file "$libPath")
	# 库支持的架构
	local libInfo=$(lipo -info "$libPath")
	# 库支持的架构
	IFS=' ' read -r -a libArch <<< "${libInfo#*re: }"

	if [[ "$libType" =~ "dynamically" ]]; then
		libType="\033[31m动态库\033[0m"
	else
		libType="\033[32m静态库\033[0m"
	fi

	for arch in $libArch; do
		# 静态库检测 bitcode
		local bitcode1=$(otool -arch "$arch" -l "$libPath" | grep -q __bitcode | wc -l | tr -d ' ')
		if [[ $bitcode1 > 0 ]]; then
			echo "$(printf "%-50s" "$libName") $libType $(printf "%-4s" "$bitcode1") $libPath"
			# 移除 bitcode
			if [[ -n "$RemoveBitcode" ]]; then
				xcrun bitcode_strip -r "$libPath" -o "$libPath"
			fi
		fi
		# 动态库检测 bitcode
		local bitcode2=$(otool -arch "$arch" -l "$libPath" | grep -E '__LLVM' | wc -l | tr -d ' ')
		if [[ $bitcode2 > 0 ]]; then
			echo "$(printf "%-50s" "$libName") $libType $(printf "%-4s" "$bitcode2") $libPath"
			# 移除 bitcode
			if [[ -n "$RemoveBitcode" ]]; then
				xcrun bitcode_strip -r "$libPath" -o "$libPath"
			fi
		fi
	done

}

SearchPath() {
	if [[ -d "$1" ]]; then
		local name=$(basename "$1")
		if [[ "$name" =~ ".framework"$ ]]; then
			# framework 库
			local rawName="${name%.framework*}"
			TestBitcode "$1/$rawName" "$name"
		elif [[ "$name" =~ ".app"$ ]]; then
			# .app 包
			local rawName="${name%.app*}"
			TestBitcode "$1/$rawName" "$name"
			SearchPath "$1/Frameworks"
		else
			# 继续查找子目录
			for path in "$1"/*; do
				local name=$(basename "$path")
				if [[ -d "$path" ]]; then
					if [[ "$name" =~ ".framework"$ ]]; then
						local rawName="${name%.framework*}"
						TestBitcode "$path/$rawName" "$name"
					elif [[ "$name" =~ ".app"$ ]]; then
						local rawName="${name%.app*}"
						TestBitcode "$path/$rawName" "$name"
						SearchPath "$path"
					else
						SearchPath "$path"
					fi
				elif [[ -f "$path" ]]; then
					if [[ "$name" =~ ".a"$ ]]; then
						TestBitcode "$path" "$name"
					fi
				fi
			done
		fi
	elif [[ -f "$1" ]]; then
		if [[ "$1" =~ ".ipa"$ ]]; then
			echo "\n"
			echo "\033[32m解压缩文件:.ipa 需要解压后才能检测\033[0m"
			# ipa 包
		 	ipaName=$(basename "$1")
			rawName="${ipaName%.ipa*}"
			zipPath="$(dirname "$1")/$rawName"
			if [[ ! -d "$zipPath" ]]; then
				mkdir "$zipPath"
			fi
			unzip -o "$1" -d "$zipPath" # >> /dev/null
			echo "\033[32m解压缩完成\033[0m"
			echo "\n"

			echo "\033[32m开始检测:Bitcode\033[0m"
			SearchPath "$zipPath"
		elif [[ "$name" =~ ".a"$ ]]; then
			# .a 静态库
			TestBitcode "$path" "$name"
		fi
	fi
}

echo "\033[32m开始检测:包含 Bitcode 的构建将在下方输出\033[0m"
SearchPath "$1"
echo "\033[32m完成检测\033[0m"
相关推荐
初雪云4 小时前
UniApp 云打包拿到 IPA 后,真正的发布工作才刚开始
ios·自动化·编辑器·产品经理·iphone
Lancker6 小时前
没有 Mac 也能上架 iOS:GitHub Actions 全自动构建 + 签名 + TestFlight 送审实录
macos·ios·github
茶底世界之下6 小时前
晚霞要多暖?用 Awaking 只改色温做一次取舍
ios
酒神dnspup8 小时前
多地区网站可用性监控怎么做?DNSPup 从基线到告警的完整实战
运维·ios·云计算·iphone·dns·网络监控
福兮说20 小时前
浏览器里把 iPhone 的 HEIC 转成 JPG:Chrome 解不开、转完大了七成、拍摄时间全丢,六个坑实测
前端·javascript·图像处理·chrome·ios·iphone·heic
茶底世界之下1 天前
时间线效果层,为什么不能只复用一个处理器?
ios·swift
ZZH_AI项目交付1 天前
实时字幕负责快,本地录音负责不丢:一个 iOS 录音功能为什么需要两条链路
ios·ai编程
Cc.Y1 天前
Swift深度链接的极简之道
ios·cocoa·swift
AI砖家1 天前
iPhone Duo 上架新规:旧 App 怎么兼容,还能不能继续更新?
ios·cocoa·iphone·ios上架·ios上架新规
黑科技iOS上架1 天前
小蟹iOS混淆:Objective-C项目实战
ios·审核·ios混淆·执行程序差异化