React Native 开发环境准备

作者:zh_xuan日期:2026/2/24

一、环境准备

我的环境:

二、建立独立RN工程

1、初始化创建工程

npx react-native init RNApp --version 0.73.4 --skip-install 这个命令提示:

��️ The `init` command is deprecated.

E:\android\projects\RNDemo4>cd RNApp

- Switch to npx @react-native-community/cli init for the identical behavior.

- Refer to the documentation for information about alternative tools: https://reactnative.dev/docs/getting-started

Exiting...

提示命令过时了,执行调用 :

npx @react-native-community/cli init RNApp --version 0.73.4 --skip-install

执行完显示:

现在目录结构如下:

2、进入RN工程目录,安装依赖

# 进入CLI自动生成的RN工程目录(内层RNApp)

cd E:/android/projects/RNDemo4/RNApp/RNApp

# 安装依赖(淘宝镜像加速)

npm install --registry=https://registry.npm.taobao.org

上面这个命令卡住了,清空缓存重试:

# 1. 进入内层RNApp目录(必选,确保路径正确)

cd E:/android/projects/RNDemo4/RNApp/RNApp

# 2. 清空npm缓存(--force强制清空)

npm cache clean --force

# 3. 重新安装(改用更稳定的镜像,同时限制网络超时)

npm install --registry=https://registry.npmmirror.com --timeout=600000

执行完验证是否安装成功:

或者看下面:

Ok. RN工程依赖安装成功。

三、新建安卓原生工程 (上面这个Metro服务启动成功的窗口先保持,不关闭)

最小sdk 我选29. jdk版本17.

libs.versions.toml 文件修改如下:

1[versions]
2agp = "8.2.0"
3kotlin = "1.9.20"
4coreKtx = "1.10.1"
5junit = "4.13.2"
6junitVersion = "1.1.5"
7espressoCore = "3.5.1"
8lifecycleRuntimeKtx = "2.6.1"
9
10[libraries]
11androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
12junit = { group = "junit", name = "junit", version.ref = "junit" }
13androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" }
14androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" }
15androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycleRuntimeKtx" }
16
17[plugins]
18android-application = { id = "com.android.application", version.ref = "agp" }
19kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }

模块级build.gradle修改为:

1plugins {
2    alias(libs.plugins.android.application)
3    alias(libs.plugins.kotlin.android)
4}
5
6android {
7    namespace 'com.example.androidapp'
8    compileSdk 34
9
10    // 引入本地libs(兜底,若Gradle依赖仍有问题)
11    repositories {
12        flatDir {
13            dirs 'libs'
14        }
15    }
16
17    defaultConfig {
18        applicationId "com.example.androidapp"
19        minSdk 29
20        targetSdk 34
21        versionCode 1
22        versionName "1.0"
23
24        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
25        ndk {
26            abiFilters 'armeabi-v7a', 'x86', 'x86_64', 'arm64-v8a'
27        }
28    }
29
30    buildTypes {
31        release {
32            minifyEnabled false
33            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
34        }
35    }
36    compileOptions {
37        sourceCompatibility JavaVersion.VERSION_17
38        targetCompatibility JavaVersion.VERSION_17
39    }
40    kotlinOptions {
41        jvmTarget = '17'
42    }
43    packaging {
44        resources {
45            excludes += ["META-INF/LICENSE.md", "META-INF/LICENSE-notice.md"]
46        }
47    }
48}
49
50dependencies {
51    // 原生基础依赖
52    implementation libs.androidx.core.ktx
53    implementation libs.androidx.lifecycle.runtime.ktx
54    testImplementation libs.junit
55    androidTestImplementation libs.androidx.junit
56    androidTestImplementation libs.androidx.espresso.core
57
58    // 🔴 核心修复:用react-android替代react-native(适配0.70+拆分版)
59    implementation "com.facebook.react:react-android:0.73.4"
60    implementation "com.facebook.react:hermes-android:0.73.4" // 可选,Hermes引擎
61    implementation "com.facebook.soloader:soloader:0.10.5" // RN必需
62}

项目根目录build.gradle文件内容:

1buildscript {
2    ext {
3        buildToolsVersion = "34.0.0"
4        minSdkVersion = 29
5        compileSdkVersion = 34
6        targetSdkVersion = 34
7        reactNativeVersion = "0.73.4"
8    }
9    repositories {
10        google()
11        mavenCentral()
12        maven { url "https://maven.aliyun.com/repository/central" }
13    }
14}
15
16plugins {
17    alias(libs.plugins.android.application) apply false
18    alias(libs.plugins.kotlin.android) apply false
19}
20
21allprojects {
22    repositories {
23        google()
24        mavenCentral()
25        maven { url "https://maven.aliyun.com/repository/public/" }
26        // RN官方Maven仓库(兜底)
27        maven { url "https://repo1.maven.org/maven2/" }
28    }
29}
30
31task clean(type: Delete) {
32    delete rootProject.buildDir
33}

settings.gradle内容如下:

1pluginManagement {
2    repositories {
3        google {
4            content {
5                includeGroupByRegex("com\\.android.*")
6                includeGroupByRegex("com\\.google.*")
7                includeGroupByRegex("androidx.*")
8            }
9        }
10        mavenCentral()
11        gradlePluginPortal()
12        // 1. 新增:添加阿里云镜像(解决插件下载慢/失败)
13        maven { url "https://maven.aliyun.com/repository/public/" }
14    }
15}
16dependencyResolutionManagement {
17    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
18    repositories {
19        google()
20        mavenCentral()
21        // 2. 新增:添加RN依赖的本地仓库路径(和根build.gradle的allprojects一致)
22        maven { url "E:/android/projects/RNDemo4/RNApp/RNApp/node_modules/react-native/android" }
23        maven { url "E:/android/projects/RNDemo4/RNApp/RNApp/node_modules/jsc-android/dist" }
24        // 新增:阿里云镜像(加速RN依赖下载)
25        maven { url "https://maven.aliyun.com/repository/public/" }
26    }
27}
28
29rootProject.name = "AndroidApp"
30include ':app'
31

gradle-wrapper.properties文件内容如下:

1#Tue Feb 17 21:48:50 CST 2026
2distributionBase=GRADLE_USER_HOME
3distributionPath=wrapper/dists
4#distributionSha256Sum=a17ddd85a26b6a7f5ddb71ff8b05fc5104c0202c6e64782429790c933686c806
5#distributionUrl=https\://services.gradle.org/distributions/gradle-9.1.0-bin.zip
6#distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip
7distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.5-bin.zip
8# ?????????SHA256???
9distributionSha256Sum=9d926787066a081739e8200858338b4a69e837c3a821a33aca9db09dd4a41026
10networkTimeout=10000
11validateDistributionUrl=true
12zipStoreBase=GRADLE_USER_HOME
13zipStorePath=wrapper/dists
14

MainApplication代码如下:

1package com.example.androidapp 
2
3import android.app.Application
4import com.facebook.react.ReactApplication // 保留接口
5import com.facebook.react.ReactNativeHost
6import com.facebook.react.ReactPackage
7import com.facebook.react.defaults.DefaultReactNativeHost
8import com.facebook.react.shell.MainReactPackage
9import com.facebook.soloader.SoLoader
10import java.util.ArrayList
11
12// 实现ReactApplication接口(匹配抽象属性定义)
13class MainApplication : Application(), ReactApplication {
14    // 🔴 核心修改:把方法改为接口要求的抽象属性(val)
15    override val reactNativeHost: ReactNativeHost = object : DefaultReactNativeHost(this) {
16        override fun getPackages(): List<ReactPackage> {
17            val packages = ArrayList<ReactPackage>()
18            packages.add(MainReactPackage()) // RN核心包
19            return packages
20        }
21
22        override fun getJSMainModuleName(): String {
23            return "index"
24        }
25
26        // 调试模式开启(直接返回true,避免BuildConfig问题)
27        override fun getUseDeveloperSupport(): Boolean {
28            return true
29        }
30
31        // 关闭新架构,避免额外依赖
32        override val isNewArchEnabled: Boolean
33            get() = false
34        override val isHermesEnabled: Boolean
35            get() = true
36    }
37
38    override fun onCreate() {
39        super.onCreate()
40        SoLoader.init(this, false)
41    }
42}

MainActiivty代码如下:

1package com.example.androidapp
2
3import com.facebook.react.ReactActivity
4import com.facebook.react.ReactActivityDelegate
5import com.facebook.react.defaults.DefaultReactActivityDelegate
6
7class MainActivity : ReactActivity() {
8    // 必须和RN工程package.json的name一致(RNApp)
9    override fun getMainComponentName(): String {
10        return "RNApp"
11    }
12
13    override fun createReactActivityDelegate(): ReactActivityDelegate {
14        return DefaultReactActivityDelegate(this, mainComponentName, false)
15    }
16}

AndroidManifest文件内容如下:

1<?xml version="1.0" encoding="utf-8"?>
2<manifest xmlns:android="http://schemas.android.com/apk/res/android">
3    <uses-permission android:name="android.permission.INTERNET" />
4
5    <application
6        android:name=".MainApplication"
7        android:allowBackup="true"
8        android:icon="@mipmap/ic_launcher"
9        android:label="@string/app_name"
10        android:roundIcon="@mipmap/ic_launcher_round"
11        android:supportsRtl="true"
12    android:theme="@style/AppTheme">
13        <activity
14            android:name=".MainActivity"
15            android:exported="true"
16            android:launchMode="singleTask"
17        android:theme="@style/AppTheme">
18            <intent-filter>
19                <action android:name="android.intent.action.MAIN" />
20                <category android:name="android.intent.category.LAUNCHER" />
21            </intent-filter>
22        </activity>
23        <activity
24            android:name="com.facebook.react.devsupport.DevSettingsActivity"
25            android:exported="false" />
26    </application>
27</manifest>

styles.xml文件内容如下:

1<?xml version="1.0" encoding="utf-8"?>
2<resources>
3    <!-- 🔴 核心修改:自定义样式名改为AppTheme(唯一,不冲突) -->
4    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
5        <!-- 可选:自定义主题属性(比如背景色) -->
6        <item name="android:windowBackground">@android:color/white</item>
7        <item name="android:statusBarColor">@android:color/white</item>
8    </style>
9</resources>

然后同步成功。

四、安卓RN工程依赖

提示有一些漏洞,修复漏洞:

启动Metro服务:

adb reverse tcp:8081 tcp:8081

npx react-native start --port 8081

运行起来加载RN页面失败。尝试了各种方式失败,比如在RN页面摇一摇,设置调试的ip和端口号都没用,关闭防火墙都没用。

五、尝试离线bundle方案:

  1. 打包RN离线文件,在RN工程目录执行

cd /d E:\android\projects\RNDemo4\RNApp\RNApp

# 生成bundle和资源(仅依赖本地RN环境,无需下载Gradle)

npx react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res/

发现创建了以下目录和文件:

但是assets文件夹没有生成。手动新建该目录。再重新执行命令生成bundle 文件:

cd /d E:\android\projects\RNDemo4\RNApp\RNApp

npx react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res/

执行完后可以看到生成了bundle文件。

2、将该bundle文件复制到安卓原生工程的对应目录:

3、修改下MainApplication:

1package com.example.androidapp // 替换为你的实际包名
2
3import android.app.Application
4import com.facebook.react.ReactApplication
5import com.facebook.react.ReactNativeHost
6import com.facebook.react.ReactPackage
7import com.facebook.react.defaults.DefaultReactNativeHost
8import com.facebook.react.shell.MainReactPackage
9import com.facebook.soloader.SoLoader
10import java.util.ArrayList
11
12class MainApplication : Application(), ReactApplication {
13    // 恢复默认的ReactNativeHost写法,仅修正Bundle路径
14    override val reactNativeHost: ReactNativeHost = object : DefaultReactNativeHost(this) {
15        override fun getPackages(): List<ReactPackage> {
16            val packages = ArrayList<ReactPackage>()
17            packages.add(MainReactPackage())
18            return packages
19        }
20
21        override fun getJSMainModuleName(): String {
22            return "index"
23        }
24
25        override fun getUseDeveloperSupport(): Boolean {
26            return true
27        }
28
29        override val isNewArchEnabled: Boolean
30            get() = false
31        override val isHermesEnabled: Boolean
32            get() = true
33
34        // 🔴 改用RN 0.73兼容的assets路径写法(核心修复)
35        override fun getBundleAssetName(): String {
36            return "index.android.bundle"
37        }
38
39        // 注释掉getJSBundleFile,改用getBundleAssetName
40        // override fun getJSBundleFile(): String {
41        //     return "android_asset/index.android.bundle"
42        // }
43    }
44
45    override fun onCreate() {
46        super.onCreate()
47        SoLoader.init(this, false)
48    }
49}

4、运行安卓原生工程,显示页面:

ok. 显示的这个页面就是RN工程中的App.tsx这个页面。


React Native 开发环境准备》 是转载文章,点击查看原文


相关推荐


【C++】模拟实现 红黑树(RBTree)
yuuki2332332026/2/16

前言: 在掌握 AVL 树的严格平衡机制后,我们发现其虽能将树高严格控制在 O(logN),但「高度差≤1」的强约束也带来了明显代价:插入 / 删除操作中频繁的旋转(最多两次双旋)大幅增加了写操作的开销,且每个节点需额外存储平衡因子和父指针,空间利用率较低。 为解决这一问题,红黑树(Red-Black Tree)作为一种近似平衡的二叉搜索树应运而生 —— 它放弃了 AVL 树 “严格平衡” 的要求,转而通过「节点颜色标记 + 5 条核心规则」实现 “黑高一致” 的弱平衡,将任意根到叶子的路径


Git常用操作指令
stu_kk2026/2/7

最近给公司小伙伴安排了一下git培训,写了个常用指令,记录一下 一、配置与初始化(首次使用/新建仓库) 指令 功能说明 git config --global user.name "你的姓名" 配置全局用户名(会显示在提交记录中) git config --global user.email "你的公司邮箱" 配置全局用户邮箱 `git config --list 查看配置


Prometheus+Grafana构建云原生分布式监控系统(十)_prometheus的服务发现机制(一)
牛奶咖啡132026/1/29

Prometheus+Grafana构建云原生分布式监控系统(九)_pushgateway的使用https://blog.csdn.net/xiaochenXIHUA/article/details/157392956 一、prometheus的服务发现机制  1.1、prometheus的服务发现机制概述         prometheus是基于拉(pull)模式抓取监控数据,首先要能够发现需要监控的目标对象target,那么prometheus如何获监控目标呢?有两种方式【静态手动配


Polyfill方式解决前端兼容性问题:core-js包结构与各种配置策略
漂流瓶jz2026/1/20

简介 在之前我介绍过Babel:解锁Babel核心功能:从转义语法到插件开发,Babel是一个使用AST转义JavaScript语法,提高代码在浏览器兼容性的工具。但有些ECMAScript并不是新的语法,而是一些新对象,新方法等等,这些并不能使用AST抽象语法树来转义。因此Babel利用core-js实现这些代码的兼容性。 core-js是一个知名的前端工具库,里面包含了ECMAScript标准中提供的新对象/新方法等,而且是使用旧版本支持的语法来实现这些新的API。这样即使浏览器没有实现标准


一文搞懂机器学习中的特征降维!
aicoting2026/1/12

推荐直接网站在线阅读:aicoting AI算法面试学习在线网站 特征工程(Feature Engineering) 是机器学习流程中将原始数据转换为适合模型学习的特征的关键步骤。它直接决定了模型能否高效捕捉数据中的规律。好的特征可以显著提升模型性能,而差的特征即使模型再复杂也难以取得好效果。 特征工程的核心目标是: 提取有效信息:将原始数据中有价值的信号转化为模型可以理解的特征; 减少冗余与噪声:去掉无关或多余的特征,使模型更简洁、更泛化; 增强表达能力:通过构造、组合或降维生成新的特征,


Day 12:Git配置详解:用户信息、编辑器、颜色等配置
CNRio2026/1/4

“你有没有遇到过这样的尴尬:提交代码时,Git显示’Author: Unknown’,然后你发现是自己写的代码,却不知道是谁提交的?别担心,这就像你写了一封信,却没写署名一样!” 🌟 为什么说Git配置是"代码身份证"? 想象一下,你正在写一本小说,每章都署名"匿名作者"。读者会怎么想?他们可能会怀疑这本书是不是真的由你写的。Git配置就是你的"代码身份证",它告诉世界"这代码是我写的"。 正如《Pro Git》中所说: “Git的配置系统是分层的,有三个层次:系统级、全局级和本地级。系统


LeetCode 热题100 --- 双指针专区
谎言西西里2025/12/26

283. 移动零 - 力扣(LeetCode) 题目分析: 题目要求将数组 nums 中所有 0 移动至数组末尾,同时保持其他非零元素的相对顺序不变,并且要求在原数组上进行操作。 核心要求: 0 要移动至数组末尾 非零元素相对位置不变 在原数组上进行操作 解法一(暴力使用数组方法) 遍历数组将其中所有为 0 的数直接使用splice删除并且记录 0 的个数,最后通过push填入“移动”的 0 var moveZeroes = function(nums) { let n = 0;


【大前端】【Android】 Android 手机上导出已安装 App 的 APK
柯南二号2025/12/17

根据是否有 root / adb / 仅手机操作,常见有 4 种靠谱方式。按「实用度 + 成本」整理👇 一、最推荐:ADB 导出(无需 Root,最稳定)⭐️ 适合开发者、抓包、逆向、分析三方 APK 1️⃣ 开启 USB 调试 设置 → 关于手机 → 连续点击“版本号” → 开发者模式 开发者选项 → USB 调试 2️⃣ 找到 APK 路径 adb shell pm list packages | grep wechat 例如: package:com.tence


Agent 入门科普:从"人工智障"到"数字打工人"的进化史
无限大62025/12/9

🤖 Agent 入门科普:从"人工智障"到"数字打工人"的进化史 大家好,欢迎来到无限大的博客,这个专栏是新开的,打算讲一讲Agent,其实早就有学习的打算了 近期在逛github的时候看到一个高star项目,叫做Hello-Agents,项目地址是[github.com/datawhalech…] 我的文章也是参考了这个内容写的,这个系列更新比较慢,因为我也是边学边写的,所以会比较慢,但是我会尽量写的详细一些,用更多贴近生活的抽象案例来讲解,希望能帮助到大家 引言:当 AI 开始自己"打


为什么C语言拒绝函数重载?非要重载怎么做?
码事漫谈2025/11/29

在我们学习C++、Java或C#时,函数重载(Function Overloading)是一个再自然不过的概念:允许两个或多个函数使用相同的名字,只要它们的参数列表(参数的类型、个数或顺序)不同即可。编译器会根据调用时传入的实参,自动选择最匹配的那个函数。 然而,当我们回到C语言的世界,这条规则却失效了。如果你定义了两个同名的函数,即使参数列表不同,编译器也会毫不留情地报出一个“重定义”错误。 那么,为什么C语言的设计者,要“剥夺”这个看似非常实用的特性呢? 答案并非“不能”,而是“不为”。这背

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 XYZ博客