网易首页 > 网易号 > 正文 申请入驻

一键集成!原生 Android 工程智能打包 React Native Bundle 的终极脚本

0
分享至

在当前混合开发盛行的 Android 项目中,越来越多的团队将 React Native(以下简称 RN)作为 UI 层的补充组件。而如何高效、稳定地将 RN 工程的 JS Bundle 自动同步到原生项目中,并完成打包,成为一项重要的工程实践。

今天,我们将通过一个实际案例,一步步打造一个“能判断是否有提交变更、自动生成 JS Bundle、并集成到原生 APK 构建流程”的脚本,彻底告别手动操作,让你从容应对构建上线流程!

✅ 背景需求

在我们的项目中,存在两个工程:

  • A 工程:Android 原生项目,用于最终打包 APK;

  • B 工程:React Native 项目,负责业务模块的 JS 编写和资源管理。

需求如下:

当 A 工程执行打包时,先判断 B 工程是否有 Git 提交变更,如果有,则生成 JS Bundle 并拷贝到 A 工程中,再执行 APK 打包。

注意,这个流程必须自动化处理,不能依赖人工判断或手动复制。

✅ 技术要点

  • Git 提交变更检测:通过记录上一次提交的 commit hash,判断是否有更新;

  • 自动拉取 B 工程:如果首次执行,还没有拉取 RN 项目,则自动 clone;

  • 自动生成 JS Bundle:调用react-native bundle命令生成资源;

  • 拷贝资源文件:将生成的 bundle 和 assets 拷贝到 A 工程对应目录;

  • 执行 A 工程打包命令

  • 支持 Gradle/CI 工具集成

完整终极脚本:pre_build_rn_sync.sh
你只需要将它放在 A 工程根目录,一次配置,终身使用。

#!/bin/bash 
set -e

# ==== 配置区域 ====
A_PROJECT_DIR=$(cd "$(dirname "$0")"; pwd)
B_PROJECT_DIR="$A_PROJECT_DIR/rn_module"   # B 工程(RN)目录
B_REPO_URL="https://your.git.repo/B.git"  # ️ 替换为真实的 RN 工程仓库地址
B_BRANCH="main"                           # B 工程使用的分支
LAST_COMMIT_FILE="$A_PROJECT_DIR/.last_rn_commit"

ASSETS_DIR="$A_PROJECT_DIR/app/src/main/assets"
RES_DIR="$A_PROJECT_DIR/app/src/main/res"
# ===================

echo "==========================="
echo " [1] 检查 B 工程是否存在"
echo "==========================="

if [ ! -d "$B_PROJECT_DIR/.git" ]; then
  echo " 未找到 B 工程,正在 clone..."
  git clone -b "$B_BRANCH" "$B_REPO_URL" "$B_PROJECT_DIR"
else
  echo "✅ B 工程已存在,拉取最新代码..."
  cd "$B_PROJECT_DIR"
  git fetch origin
  git checkout "$B_BRANCH"
  git pull origin "$B_BRANCH"
fi

echo ""
echo "=============================="
echo " [2] 检查 RN 提交是否更新"
echo "=============================="

cd "$B_PROJECT_DIR"
CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
LATEST_COMMIT=$(git rev-parse "$CURRENT_BRANCH")

if [ -f "$LAST_COMMIT_FILE" ]; then
  LAST_COMMIT=$(cat "$LAST_COMMIT_FILE")
else
  LAST_COMMIT=""
fi

echo " 当前分支: $CURRENT_BRANCH"
echo " 最新提交: $LATEST_COMMIT"
echo " 上次构建: $LAST_COMMIT"

if [ "$LATEST_COMMIT" != "$LAST_COMMIT" ]; then
  echo ""
  echo "================================"
  echo "⚙️  [3] 检测到更新,准备打包 JS Bundle"
  echo "================================"

  yarn install

  # 确保目标目录存在
  mkdir -p "$ASSETS_DIR"
  mkdir -p "$RES_DIR"

  npx react-native bundle \
    --platform android \
    --dev false \
    --entry-file index.js \
    --bundle-output "$ASSETS_DIR/index.android.bundle" \
    --assets-dest "$RES_DIR"

  echo "$LATEST_COMMIT" > "$LAST_COMMIT_FILE"

  echo "✅ JS Bundle 生成完成"
else
  echo "✅ 没有新提交,跳过 JS Bundle 打包"
fi

echo ""
echo "============================"
echo " [4] 开始打包 A 工程 APK"
echo "============================"

cd "$A_PROJECT_DIR"
./gradlew clean assembleRelease

echo ""
echo "✅ 全部流程完成:APK 打包成功"
使用说明
  1. 将脚本保存为pre_build_rn_sync.sh,放入 A 工程根目录;

  2. 替换脚本中的B_REPO_URL为你实际的 RN 项目地址;

  3. 赋予执行权限:

chmod +x pre_build_rn_sync.sh
  1. 使用方式:

./pre_build_rn_sync.sh
高级用法:集成到 Gradle 构建中

app/build.gradle中加入:

tasks.whenTaskAdded { task ->
    if (task.name == "preBuild") {
        task.doFirst {
            println " 正在同步 RN 工程..."
            exec {
                commandLine 'bash', "${rootDir}/pre_build_rn_sync.sh"
            }
        }
    }
}

这样,在你执行./gradlew assembleRelease的时候,系统会自动帮你检查并生成 bundle,无需再手动运行脚本。

注意事项

  • 请确保rn_module是一个合法的 RN 工程,结构完整;

  • node,yarn,npx必须已安装并在 PATH 中可用;

  • bundle-outputassets-dest目录路径要与实际项目结构匹配;

  • 若你使用 CI 工具(如 Jenkins),可直接将此脚本加入流水线前置任务。

结语

一个优雅的脚本,胜过无数的手动操作。这个脚本既能检测 Git 提交变更,又能自动化地集成 React Native 与原生工程的打包流程,极大提升了构建效率和团队协作体验

如果你也在做 Hybrid 架构,不妨收藏此脚本,或动手为团队搭建一套构建自动化流程!

如果这篇文章对你有帮助,欢迎转发、点赞或留言交流。你也可以评论告诉我你项目中遇到的实际构建问题,我将为你继续定制优化方案

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
詹皇正负值-16!东契奇半场19分带不动,罚球多一倍,裁判尽力了

詹皇正负值-16!东契奇半场19分带不动,罚球多一倍,裁判尽力了

嘴炮体坛
2026-01-05 11:58:47
用假苹果17讹店主后续:女子正脸曝光,五大疑点流出,疑早有预谋

用假苹果17讹店主后续:女子正脸曝光,五大疑点流出,疑早有预谋

凡知
2026-01-04 14:21:22
饺子拒绝金鸡奖,揭开内娱最大笑话:154亿票房,不配一个奖?

饺子拒绝金鸡奖,揭开内娱最大笑话:154亿票房,不配一个奖?

花心电影
2025-11-17 12:00:18
马杜罗被抓,为什么依然不慌

马杜罗被抓,为什么依然不慌

臧启玉律师
2026-01-04 12:20:10
员工节假日嫖娼遭行政拘留,隐瞒7年后被银行发现并辞退!男子不服官司一路打到高院,法院:辞退决定合法有效

员工节假日嫖娼遭行政拘留,隐瞒7年后被银行发现并辞退!男子不服官司一路打到高院,法院:辞退决定合法有效

扬子晚报
2026-01-04 17:30:03
47岁梁静茹厦门开演唱会,脸肿腰粗还有双下巴,状态老到不敢认

47岁梁静茹厦门开演唱会,脸肿腰粗还有双下巴,状态老到不敢认

小咪侃娱圈
2026-01-05 10:11:16
其实大家真的错怪沈佳润了这次唱歌跑调又气短,根本不是能力不行

其实大家真的错怪沈佳润了这次唱歌跑调又气短,根本不是能力不行

小光侃娱乐
2026-01-05 09:50:03
金宇彬与申敏儿西班牙度蜜月被偶遇,又高又帅,手上婚戒显眼

金宇彬与申敏儿西班牙度蜜月被偶遇,又高又帅,手上婚戒显眼

振华观史
2026-01-05 10:43:57
一江山岛之战有多惨:国民党司令被烧死,继任者杀了监军后投降

一江山岛之战有多惨:国民党司令被烧死,继任者杀了监军后投降

浩渺青史
2026-01-05 03:28:50
网传国内大厂全面放弃骁龙移动平台 发哥要崛起了?

网传国内大厂全面放弃骁龙移动平台 发哥要崛起了?

手机中国
2026-01-04 10:34:09
荷兰国王道歉背后:这个南美小国,用50年,把自己从天堂打入地狱

荷兰国王道歉背后:这个南美小国,用50年,把自己从天堂打入地狱

远方风林
2026-01-05 06:55:03
黄岩岛以东激烈对弈,无侦-10不顾阻扰,强行“加入”美航母军演

黄岩岛以东激烈对弈,无侦-10不顾阻扰,强行“加入”美航母军演

书纪文谭
2026-01-04 17:24:17
美媒:受委内瑞拉局势影响,莱昂纳多无法返回加州参加电影节颁奖礼

美媒:受委内瑞拉局势影响,莱昂纳多无法返回加州参加电影节颁奖礼

环球网资讯
2026-01-04 20:36:03
“帮领导买东西,领导问:“多少钱?我转给你”,千万别说“没多少钱,不用了”,聪明人这样回复!

“帮领导买东西,领导问:“多少钱?我转给你”,千万别说“没多少钱,不用了”,聪明人这样回复!

上海约饭局
2026-01-04 20:41:57
难怪年轻人都不爱过年!评论区共鸣万千。

难怪年轻人都不爱过年!评论区共鸣万千。

另子维爱读史
2026-01-04 21:21:44
千万不要过度体检?医生再三提醒:55岁后,这5种体检能不做就不做

千万不要过度体检?医生再三提醒:55岁后,这5种体检能不做就不做

神奇故事
2025-12-30 23:09:45
委内瑞拉最高法院命令副总统罗德里格斯代行总统职权

委内瑞拉最高法院命令副总统罗德里格斯代行总统职权

新京报
2026-01-04 10:34:11
辣眼睛!艾格努从队友背后,做出不雅动作,曾有同性恋史

辣眼睛!艾格努从队友背后,做出不雅动作,曾有同性恋史

跑者排球视角
2026-01-05 06:38:05
美债惊现世纪大抛售!中国持仓降至新低,美元霸权这次真的悬了?

美债惊现世纪大抛售!中国持仓降至新低,美元霸权这次真的悬了?

生活新鲜市
2026-01-04 15:47:48
各大卫视跨年晚会过后,终于意识到内娱真的完了

各大卫视跨年晚会过后,终于意识到内娱真的完了

星宿影视鸭
2026-01-02 15:11:22
2026-01-05 12:28:49
君伟说
君伟说
分享职场故事
355文章数 48关注度
往期回顾 全部

科技要闻

雷军新年首播:确认汽车业务降速

头条要闻

委内瑞拉代总统致信:诚邀美国政府共同制定合作议程

头条要闻

委内瑞拉代总统致信:诚邀美国政府共同制定合作议程

体育要闻

女子世界第一,9年前在咖啡店洗碗

娱乐要闻

黄宗泽夺双料视帝,泪洒颁奖台忆往昔

财经要闻

李迅雷:扩内需要把重心从"投"转向"消"

汽车要闻

不是9S是8X!极氪全新高性能旗舰SUV命名官宣

态度原创

教育
家居
艺术
旅游
公开课

教育要闻

家长晒孩子,网友:养废了!这要是我儿子,能打到他找不着北

家居要闻

白色大理石 奢华现代

艺术要闻

19幅 列宾美院学生优秀毕业作品

旅游要闻

乌拉圭记者感叹:中国旅游胜地令人心驰神往

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版