在Xcode中從動態庫剝離不需要的架構

weixin_34321977發表於2017-04-11

自從iOS 8釋出以來,開發人員已經能夠利用動態庫對iOS開發的好處。對於一般開發,為所有需要的架構設定一個單一的動態庫是非常好的,所以您可以在所有裝置和iOS模擬器上執行,而無需更改任何東西。然而,這種方法有一個缺點 - 因為它們在執行時連結,當一個動態庫被單獨編譯到最終應用程式時,不可能知道實際需要哪些架構。因此,Xcode將在編譯時將整個事物複製到應用程式包中。除了浪費的磁碟空間,理論上沒有真正的缺點。但是實際上,iTunes Connect不喜歡我們新增未使用的二進位制切片:這時候,打包上傳Appstore會報如下錯誤:



那麼,我們如何解決這個問題呢?
步驟如下:



在Build Phases中加入run script。在裡面新增Shell指令碼,
APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"
find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK
do
  FRAMEWORK_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 $ARCHS
  do
    echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME"
    lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH"
    EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")
done

echo "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資料夾,並確保只有您正在構建的架構存在於每個框架中。
好多了!現在我可以在我的專案中新增包含我所需要的所有架構的胖動態庫,而我的構建過程將會在任何給定的時刻處理哪些架構。

相關文章