iOS: prebuilt React, ReactNativeDependencies and hermesvm frameworks ship unstripped, adding 9.3 MB to Release apps

オープン
#59,772 コメント 3 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 2 日以内に返信

まだ誰も着手していません。

評価

難易度
4/5
見積もり時間
3〜5日
初心者へのやさしさ
48/100
issue の種類
バグ
明瞭さ
おおむね明確
活発さ
活発
技術スタック
ios, macos, react-native

調査の方向性

Start by tracing how the Release iOS framework artifacts for React Native 0.88.1 and Hermes are linked and packaged; the issue does not name the relevant build files or entry points. Run the supplied macOS reproducer against the published artifacts and compare the binary sizes before and after strip -x. Done means the shipped Release frameworks no longer retain the removable symbols and debug map described in the issue.

索引モデルが issue の本文から書いたものです。

説明

Needs: Attention Needs: Repro Platform: iOS
Description

The Release artifacts of the prebuilt iOS frameworks keep their local symbols and a debug map, and an app's Release archive embeds them as they are. strip -x removes 9.3 MB, 48% of the three binaries (ios-arm64 slice, React Native 0.88.1):

Framework Published After strip -x
React 11,894,280 6,370,280 (-46%)
hermesvm 6,360,048 3,002,976 (-53%)
ReactNativeDependencies 1,258,544 828,712 (-34%)

The debug maps point to object files on the build machine, such as /Users/runner/work/react-native/react-native/packages/react-native/.build/output/spm/Release/Build/Intermediates.noindex/... and /Users/runner/work/hermes/hermes/build_iphoneos/.... The artifacts ship no dSYMs. Our app uses the prebuilt frameworks, the default in 0.88. In its Xcode archive the three binaries are byte-identical to the published ones, because Xcode strips only the targets it builds.

Likely cause: the Release artifacts are linked without the strip step that an Xcode archive applies to its own targets.

Related: meta/hermes#1920 (hermesvm size against the 15 MB App Clip limit).

We found this while tracking the Release sizes of the React Native example apps of Evolu (https://evolu.dev), a local-first platform.

Steps to reproduce

On macOS, run:

base=https://repo.reactnative.dev/maven2/com/facebook
for path in \
  react/react-native-artifacts/0.88.1/react-native-artifacts-0.88.1-reactnative-core-release.tar.gz \
  react/react-native-artifacts/0.88.1/react-native-artifacts-0.88.1-reactnative-dependencies-release.tar.gz \
  hermes/hermes-ios/260318099.0.5/hermes-ios-260318099.0.5-hermes-ios-release.tar.gz; do
  dir=$(mktemp -d) && curl -sSfL "$base/$path" | tar -xz -C "$dir"
  for framework in $(find "$dir" -path '*/ios-arm64/*.framework' -type d); do
    binary="$framework/$(basename "$framework" .framework)"
    cp "$binary" "$dir/stripped" && strip -x "$dir/stripped"
    echo "$(basename "$binary"): $(stat -f %z "$binary") -> $(stat -f %z "$dir/stripped") bytes after strip -x"
  done
done
React Native Version

0.88.1

Affected Platforms

Runtime - iOS, Build - MacOS

Output of npx @react-native-community/cli info
Not app-specific: the script reads the published Maven artifacts. macOS 26.6.2, Xcode 27.2.
Stacktrace or Logs
React: 11894280 -> 6370280 bytes after strip -x
ReactNativeDependencies: 1258544 -> 828712 bytes after strip -x
hermesvm: 6360048 -> 3002976 bytes after strip -x
MANDATORY Reproducer

The script in Steps to reproduce: it reads the published artifacts, no app needed

Screenshots and Videos

No response

主要言語
C++
スター
127k
フォーク
25.5k
平均マージ
3日 18時間
マージ済み PR(30日)
188

環境構築

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

react/react-native のほかの issue

react/react-native の issue をすべて見る

似ている issue

C++ の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。