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

一键集成!原生 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.

相关推荐
热点推荐
阿根廷神级预言家,1000多幅预言画几乎全中?未来世界3国主导?

阿根廷神级预言家,1000多幅预言画几乎全中?未来世界3国主导?

飞云如水
2024-08-01 21:28:13
重庆重要人事调动

重庆重要人事调动

白衣海盗
2026-01-09 10:00:22
深夜英特尔狂飙超8%,中概股下挫,油价、白银拉升

深夜英特尔狂飙超8%,中概股下挫,油价、白银拉升

21世纪经济报道
2026-01-10 00:03:07
央视怒批,人民日报点名封杀,这5位目无法纪的大网红,彻底凉凉

央视怒批,人民日报点名封杀,这5位目无法纪的大网红,彻底凉凉

一娱三分地
2025-12-04 17:00:33
“大尺度”新年挂历火了!活菩萨椰树怂了

“大尺度”新年挂历火了!活菩萨椰树怂了

李东阳朋友圈
2026-01-09 20:01:49
橘玛丽:从“大G御姐”到百变女王,这位姐的逆袭剧本太顶了!

橘玛丽:从“大G御姐”到百变女王,这位姐的逆袭剧本太顶了!

碧波万览
2026-01-10 03:55:03
美女打屁股大赛,火了

美女打屁股大赛,火了

微微热评
2025-10-08 22:10:24
数据新闻丨3046公里!这是塔克拉玛干的大漠锁边记

数据新闻丨3046公里!这是塔克拉玛干的大漠锁边记

闪电新闻
2026-01-09 15:09:00
偌大的海南岛面积足有3.4万平方公里,为啥却少有大型港口呢?

偌大的海南岛面积足有3.4万平方公里,为啥却少有大型港口呢?

向航说
2025-12-12 00:40:02
三星掌门人北京逛街,穿“老头马甲”秒售罄!有钱男人为啥爱马甲

三星掌门人北京逛街,穿“老头马甲”秒售罄!有钱男人为啥爱马甲

商务范
2026-01-07 17:57:48
天生富贵命!这 3 对生肖夫妻,招财旺家一辈子,子孙后代都享福

天生富贵命!这 3 对生肖夫妻,招财旺家一辈子,子孙后代都享福

人閒情事
2026-01-09 22:03:34
阿隆索:西蒙尼的行为不是一个优秀的体育人士该有的

阿隆索:西蒙尼的行为不是一个优秀的体育人士该有的

懂球帝
2026-01-09 10:05:11
国内首例!万吨桥梁成功转体跨越上海磁浮线

国内首例!万吨桥梁成功转体跨越上海磁浮线

看看新闻Knews
2026-01-09 09:53:01
2019年17岁女孩找大叔偷情,缠绵时给大叔下药,透支大叔卡上的钱

2019年17岁女孩找大叔偷情,缠绵时给大叔下药,透支大叔卡上的钱

谈史论天地
2026-01-09 13:20:03
AI的尽头是医疗!AMD苏姿丰最新对话:开发药物,将像造iPhone一样简单!

AI的尽头是医疗!AMD苏姿丰最新对话:开发药物,将像造iPhone一样简单!

智药局
2026-01-07 19:40:48
越南当年为何敢和中国开战?黎笋长子多年后说出了核心真相

越南当年为何敢和中国开战?黎笋长子多年后说出了核心真相

古书记史
2025-12-22 19:21:12
国乒奥运阵容浮出水面,21岁新星弯道超车,4人稳固,1主力被冷落

国乒奥运阵容浮出水面,21岁新星弯道超车,4人稳固,1主力被冷落

知轩体育
2025-12-08 01:23:52
色字头上一把刀!沈阳一男子追求00后女生“霸王硬上弓”,被判刑

色字头上一把刀!沈阳一男子追求00后女生“霸王硬上弓”,被判刑

火山詩话
2026-01-09 08:45:32
若中日再次爆发战争,结局会如何?俄罗斯和美国看法一致

若中日再次爆发战争,结局会如何?俄罗斯和美国看法一致

老谢谈史
2025-12-01 20:40:13
许晴一看就老了,竟然还没张凯丽显年轻!

许晴一看就老了,竟然还没张凯丽显年轻!

草莓解说体育
2026-01-07 09:12:50
2026-01-10 06:11:00
君伟说
君伟说
分享职场故事
357文章数 48关注度
往期回顾 全部

科技要闻

市场偏爱MiniMax:开盘涨42%,市值超700亿

头条要闻

媒体称委内瑞拉代总统计划13日访问华盛顿 委方回应

头条要闻

媒体称委内瑞拉代总统计划13日访问华盛顿 委方回应

体育要闻

金元时代最后的外援,来中国8年了

娱乐要闻

关晓彤鹿晗风波后露面 不受影响状态佳

财经要闻

投资必看!瑞银李萌给出3大核心配置建议

汽车要闻

助跑三年的奇瑞 接下来是加速还是起跳?

态度原创

健康
教育
旅游
数码
房产

这些新疗法,让化疗不再那么痛苦

教育要闻

震惊!556分上211?合肥工大统计学真香

旅游要闻

想看雾凇别瞎跑!吉林阿什哈达这 5 个观赏秘诀,帮你避开空跑遗憾

数码要闻

铭凡CES 2026新闻稿提及英特尔酷睿Ultra 9 290HX Plus处理器

房产要闻

66万方!4755套!三亚巨量房源正疯狂砸出!

无障碍浏览 进入关怀版