美文网首页React NativeReact NativeReact Native
史上最详细的Android原生APP中添加ReactNative

史上最详细的Android原生APP中添加ReactNative

作者: 天空oo7 | 来源:发表于2016-10-02 15:17 被阅读26392次

    背景

    React Native出来已经一段时间了,相对来说也算稳定了,在很多的企业中都实际使用他们,混合开发已经是未来的一种趋势,混合开发中使用的技术很多,不外乎Html5、JS框架通过一定的技术和原始交互,目前主流混合开发React Native、Cordova、APICloud、MUI、AppCan、Sencha Touch、jQuery Mobile等等(其他的小伙伴们自己收集),目前网上写教程的人很多,但是React Native更新速度很快,根据他们的教程,中间会遇到各种问题,今天我和大家一起踩踩各种坑,让小伙伴们快速集成到自己的APP中。后续持续更新,反馈发邮件411437734@qq.com共同探讨。

    集成的小伙伴一定要注意图片中标注和备注哦,不然有可能会走弯路哦

    集成步骤

    参考官方文档->react native 文档
    本文使用开发环境 Android studio
    注意最新的React Native支持的最新的SDK为16(android4.1)
    npm环境,小伙伴们自己安装 nodeJS自己安装,可以参考官方文档安装环境,有问题可以发411437734@qq.com沟通

    创建Android项目(已有项目跳过)

    1. 打开Android studio


      14752189589833.jpg
    2. 输入项目名称,选择项目目录,点击next


      14752190447690.jpg
      14752191238908.jpg
      14752192158859.jpg
      14752193112367.jpg

    至此项目创建完成(需要注意的是最新的React Native支持最新SDK版本为16 android4.1)

    React Native集成到上面我们创建的ReactNativeAPPDemo中

    参考Facebook react native文档

    1. 进入项目根目录,添加JS到项目中-点击Android studio中的Terminal(如下图) 14752200412681.jpg

    分别执行一下语句

      npm init
      npm install --save react react-native
      curl -o .flowconfig https://raw.githubusercontent.com/facebook/react-native/master/.flowconfig
    

    init 主要根据提醒生成package.json文件
    install --save react react-native 安装React 和React Native
    curl -o .flowconfig https://raw.githubusercontent.com/facebook/react-native/master/.flowconfig 下载.flowconfig文件
    参考图片

    14752207192510.jpg

    查看项目中有node_modules,说明react和react native 安装完成

    14752214758622.jpg

    在项目根目录添加.flowconfig

    参考下图


    14752216108448.jpg

    也可以手动创建在浏览器打开https://raw.githubusercontent.com/facebook/react-native/master/.flowconfig网址复制内容创建文件

    14752217925862.jpg

    ReactNativeAppDemo配置相关内容

    1. 添加"start": "node node_modules/react-native/local-cli/cli.js start" 到package.json 文件下 scripts标签 修改前
      14752220951994.jpg
      修改后
      14752221462812.jpg
    1. 添加index.android.js文件到项目中


      14752222197635.jpg
        'use strict';
        import React from 'react';
        import {
          AppRegistry,
          StyleSheet,
          Text,
          View
        } from 'react-native';
        class HelloWorld extends React.Component {
          render() {
            return (
              <View style={styles.container}>
                <Text style={styles.hello}>Hello, World</Text>
              </View>
            )
          }
        }
        var styles = StyleSheet.create({
          container: {
            flex: 1,
            justifyContent: 'center',
          },
          hello: {
            fontSize: 20,
            textAlign: 'center',
            margin: 10,
          },
        });
        AppRegistry.registerComponent('HelloWorld', () => HelloWorld);
    

    至此React native配置基本完成

    1. App build.gradle配置
    dependencies {
        ...
        compile "com.facebook.react:react-native:+" // From node_modules.
    }
    

    这里注意不要使用maven中的,因为我们使用的是我们本地node_modules中的,注意最新版本中支持的是23,appcompat-v7:23.0.1,暂时没有试24的api

    14752229775637.jpg
    1. 整个工程build.gradle配置
    allprojects {
        repositories {
            ...
            maven {
                // All of React Native (JS, Android binaries) is installed from npm
                url "$rootDir/node_modules/react-native/android"
            }
        }
        ...
    }
    
    14752256546683.jpg
    1. 添加<uses-permission android:name="android.permission.INTERNET" />AndroidManifest.xml:
    2. 确定External Libraries


      14752240537114.jpg
      14752241070972.jpg

    确定是下是最新的,例如确定是0.34.1而不是0.20.1,如果出现请检查

      maven {
                `url "$rootDir/../node_modules/react-native/android"`//地址是否正确
            } 
     修改url "$rootDir*/..*/node_modules/react-native/android"为url "$rootDir/node_modules/react-native/android"
    

    添加native code

    官方给出的


    14752232872479.jpg

    到时最新版本中提供了更加简单的方式,没错就是继承。

    14752258065933.jpg

    在这里我们也需要自定义一个Application否则 运行时会报错,不信的小伙伴可以试一试


    14752259787709.jpg 14752260351714.jpg

    到此为止,ReactNative 集成到已有项目中完成!!!迫不及待的运行试试吧!!

    14752261248709.jpg

    在Terminal中运行 npm start,看到下图表示启动成功

    14752261852021.jpg

    运行以后发现如下错误


    14752468221176.jpg

    react-native报错:Could not get BatchedBridge, make sure your bundle is packaged correctly
    莫紧张,这是因为bundle没有打包好。找不到编译打包后的js文件。其实就是android studio默认的寻找js文件地址和react-native自己的工具编译所使用的地址不同。

    解决方法
    方法一

    进入项目,在android/app/src/main下新建assets目录。执行以下命令

    $> react-native start > /dev/null 2>&1 &  
    $> curl "http://localhost:8081/index.android.bundle?platform=android" -o
    > "app/src/main/assets/index.android.bundle"
    

    在项目根目录下执行

    <!--$> (cd android/ && ./gradlew assembleDebug)-->
    $> (cd 项目名称/ && ./gradlew assembleDebug)
    

    把创建的apk安装到android设备

    方法二

    进入项目,在android/app/src/main下新建assets目录
    启动服务器

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

    在assets文件夹下会生成index.android.bundle文件,把创建的apk文件安装到android设备

    方法三

    进入项目,在android/app/src/main下新建assets目录
    在package.json中配置下面代码

    "scripts": {
        "start": "node node_modules/react-native/local-cli/cli.js start",
        "bundle-android": "react-native bundle --platform android --dev false --entry-file index.android.js --bundle-output app/src/main/assets/index.android.bundle --sourcemap-output app/src/main/assets/index.android.map --assets-dest android/app/src/main/res/"
      },
    

    个人推荐使用方法三,方法三解决不了推荐方法二 手动执行
    修改刚刚的package.json文件


    14752486039953.jpg

    如果真机(模拟器)需要执行

    adb reverse tcp:8081 tcp:8081
    

    一定要确定连接网络哦!!

    14752520319630.jpg 14752520729313.jpg

    开心的进行开发吧!

    其他可能遇到的问题

    ReactNative兼容64位Android手机

    libgnustl_shared.so" is 32-bit instead of 64-bit类似错误

    解决方法
    1. 在项目的根目录的 gradle.properties 里面添加一行代码
    1. build.gradle 文件里添加以下代码
    android {
        ...
        defaultConfig {
            ...
            ndk {
                abiFilters "armeabi-v7a", "x86"
            }
    
            packagingOptions {
                exclude "lib/arm64-v8a/librealm-jni.so"
            }
        }
    }
    

    最后感谢

    http://majing.io/questions/589
    http://www.cnblogs.com/tony-yang-flutter/p/5864578.html
    https://blog.yourtion.com/update-react-native-029-bug.html
    http://stackoverflow.com/questions/38870710/error-could-not-get-batchedbridge-make-sure-your-bundle-is-packaged-properly/38874952
    http://blog.csdn.net/b992379702b/article/details/52234479

    
            ######   Genymotion模拟器运行显示没有连接到developement server如下图
    
    ![Paste_Image.png](http:https://img.haomeiwen.com/i1018012/afeaad419ff40114.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    
    1. 先检查是否连接到网络
    2. 点击模拟器中Menu菜单弹出下面图片,点击Dev Settings
    ![Paste_Image.png](http:https://img.haomeiwen.com/i1018012/024b1022595244ee.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    3. 点击Debugging 下面的`Debug Server host & port for device`填写地址和端口
    ![Paste_Image.png](http:https://img.haomeiwen.com/i1018012/e2bce20ef25911b9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    ![Paste_Image.png](http:https://img.haomeiwen.com/i1018012/4008a5d1c3b7f4ec.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    
    
    
    >上文中使用到的项目ReactNativeAPPDemo链接: https://pan.baidu.com/s/1i4GkeKt 密码: vwym
    
    
    最近小伙伴反馈0.39.0上面没有ReactApplication接口,请看我的截图有问题QQ联系我共同探讨
    >我的项目中依然可以看到,是不是有的小伙伴gradle文件配置的问题,仔细检查下,确实有问题的小伙伴,请加QQ私聊
    ![Paste_Image.png](http:https://img.haomeiwen.com/i1018012/d1fbebf0e6df6f66.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    
    
    
    ###### 升级ReactNative
    > 由于ReactNative 更新比较频繁,有的时候我们的项目需求根据情况,需要升级到最新或者指定版本的ReactNative,下面给大家介绍下。
    
    
    1. 安装git(如果安装git请求跳过)
        > 下载并安装[git](https://git-scm.com/downloads)
    2. 在命令行执行命令
        > npm install -g react-native-git-upgrade
        > react-native-git-upgrade
    3. 更新项目ReactNative依赖
        > 通过命令:npm info react-native 查看ReactNative版本
        > npm install --save react-native@X.Y 安装指定版本,X.Y是npm info react-native 查看到的ReactNative版本
    4. 更新 react-native upgrade
    
    ### 发布Demo 到github Demo  欢迎大家提问交流
      > [ReactNativeAppDemo](https://github.com/zdl411437734/ReactNativeAppDemo)
    > [提问](https://github.com/zdl411437734/ReactNativeAppDemo/issues)
    
    关注公众号获取更多内容和反馈沟通
    ![Paste_Image.png -w200](http:https://img.haomeiwen.com/i1018012/c8bfc8d8d233e9eb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    
    >转载请注明出处:http://www.jianshu.com/p/22aa14664cf9

    相关文章

      网友评论

      • 土豆啊你个马铃薯:E:\workspace\MyRNPorjectDemo>npm start

        > rndemo.lsjz.com.myrnporjectdemo@1.0.0 start E:\workspace\MyRNPorjectDemo
        > node node_modules/react-native/local-cli/cli.js start

        Scanning folders for symlinks in E:\workspace\MyRNPorjectDemo\node_modules (25ms)
        Loading dependency graph...npm ERR! code ELIFECYCLE
        npm ERR! errno 11
        npm ERR! rndemo.lsjz.com.myrnporjectdemo@1.0.0 start: `node node_modules/react-native/local-cli/cli.js start`
        npm ERR! Exit status 11
        npm ERR!
        npm ERR! Failed at the rndemo.lsjz.com.myrnporjectdemo@1.0.0 start script.
        npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

        npm ERR! A complete log of this run can be found in:
        npm ERR! D:\Program Files\nodejs\node_cache\_logs\2018-07-03T09_05_57_542Z-debug.log
        土豆啊你个马铃薯:怎么解决这种错误啊
      • 土豆啊你个马铃薯:怎么在Android原生代码上套一个RN的壳啊?球指教
      • e2f11fd62dd4:为什么运行了adb reverse tcp:8081 tcp:8081,端口也设置了还是无法连接到服务器呢,但是网页打开是正常的:sweat:
        天空oo7:看看是不是在同一个局域网,多试几次
      • Bleoo:请问大佬知道load js 后,显示Bundling 'index.android.js' ... done 但是界面空白的问题么
        天空oo7:能描述的更清楚吗?可以的话发截图到我邮箱411437734@qq.com
      • 泠牙:小白入门在terminal敲入 npm init,'npm' 不是内部或外部命令,也不是可运行的程序
        ,卒
        天空oo7:@泠牙 安装nodejs和配置环境了吗,mac直接安装nodejs 运行 npm就可以了,win需要自己配置环境变量和java配置类似
      • 20062c166da1:install --save react react-native,为啥我到这一步就报错了,Windows环境下配置。
        npm ERR! Windows_NT 6.1.7601
        npm ERR! argv "C:\\Program Files\\nodejs\\node.exe" "C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js" "install" "--save" "react" "react-native"
        npm ERR! node v4.1.1
        npm ERR! npm v2.14.4
        npm ERR! code ETIMEDOUT
        npm ERR! errno ETIMEDOUT
        npm ERR! syscall connect
        天空oo7:@北欧神话_f305 配置node环境好着没有
      • 赵伙子:我想问下 意思是按照这种方法 可以直接在as里面写js 文件 rn的代码是吗
        天空oo7:写代码什么工具都可以,文本编辑器都写,只要你能按照rn语法写。个人推荐rn的工具 Atom, Webstorm(as就是这家企业的开源版本修改的)、vs code都可以。
      • 1dc65ed3ab8a:为什么我在执行curl -o .flowconfig https://raw.githubusercontent.com/facebook/react-native/master/.flowconfig这行代码的时候一直提示的都是‘curl’不是内部或外部的命令呢
        1dc65ed3ab8a:@天空oo7 不哦不哦 是0.34.1 我的 External Libraries目录下面啥文件都没有
        1dc65ed3ab8a:请问那个 External Libraries里面的react-native-0.20.1是自动生成的还是自己下载的?
        天空oo7:@G_Pig 没有安装 curl window电脑自己安装 配置好环境变量
      • hehe_Android:我今天出现了一个问题白屏什么都不显示,原来是版本和lock的不对应
      • fe84c5744706:真机调试 reload 报错error: bundling: UnableToResolveError: Unable to resolve module `react/lib/ReactDebugCurrentFrame` f
      • fe84c5744706:为什么 我运行不了watchman 'watchman' 不是内部或外部命令,也不是可运行的程序
        或批处理文件。
      • fe84c5744706:AppRegistry.registerComponent('HelloWorld', () => HelloWorld); 这个HelloWorld是什么意思 可以自己定义吗?
        天空oo7:@jinchou 可以
      • c166c90a10d8:上面的都可以运行,但是我改了index.android.js里面的内容,再运行还是原来的hello world?
        天空oo7:@代码有毒_9fe0 重新编译 bundle了吗?主要看看这个
      • 2e0307b0b596:第一步:添加JS 到项目中,直接在Android Studio 中的终端 输入项目+json$ 就会报 项目名不是内部命令,楼主请说明一下,第一步是 npm init 呢还是干嘛呢
      • 攻城哥:能加个qq 吗,有几个地方想问你一下 我的QQ 342622023 谢谢
        天空oo7:@攻城哥 411437734 添加我吧
        :smile:
      • 菩提丶:非常感谢,成功了,但其中出现一个问题Conflict with dependency 'com.google.code.findbugs:jsr305'. Resolved version,不知道其他人会不会,百度了下解决办法
        解决方法:

        在项目的app根目录中build.gradle中的

        Android{

        ……


        configurations.all {
        resolutionStrategy.force 'com.google.code.findbugs:jsr305:1.3.9'
        }

        }

        天空oo7:@菩提丶 这个是你配置什么东西了
      • 2e0307b0b596:有没有QQ群交流
        2e0307b0b596:@天空oo7 QQ群是好多呢
        天空oo7:@2e0307b0b596 我下面创建一个
      • 余木up:问下现有的app下,部分页面使用rn,加入rn依赖的东西,打包后app大小是不是会多了几M呢
        天空oo7:@caniuse 你打包对比下,会多
      • Clendy:非常详细!一步到位运行成功!多谢楼主分享!!
      • w4lle:mark
      • Bill灬zhang:你好 按照你的配置 但是一直报错,求帮助!!!!万分感谢
        Application ReactNative has not been registered. This is either due to a require() error during initialization or failure to call AppRegistry.registerComponent., stack:
        天空oo7:@zhang灬Allen 仔细看下图片中,配置有问题,没有注册成功组件
      • 94d304dd0eb3:您好,按照你的方法,为什么晃动手机弹不出Reload的那个dialog,也就是不能reload。这个问题怎么解决?谢谢
        天空oo7:@星辰o幸福 你看看配置 设置的activity了吗
      • 逗哥笔记:请知道问servce host&port可以在代码里面修改么?或者说我正常要上一个项目在哪里写server地址?
      • 肥朝:期待讲解一下混合后两者的事件交互 :heart_eyes:
      • dccbe5532c96:谢谢你的分享,但我还是遇到了一个很奇怪的问题,就是添加Native Code的时候,我照你说的通过直接继承的方式,没有用React Native教程上的那种方式,发觉能正常显示,但是就是弹不出Reload的那个dialog,也就是不能reload,用React Native教程上的那种方式是可以弹出Reload的Dialog的,很奇怪不知道为什么。
        love_cai:我也是同样的问题,无法弹出调试的dialog
        dccbe5532c96:@天空oo7 我解决了,要按照官方文档那样重写 onKeyUp方法,其他方法可以不用重写。
        天空oo7:@GodsWill 我下来有空看下,最好发封邮件给我看下,我好参考
      • 不再罚篮:请问作者,我现在按照您的网址下载的是0.38的版本在application new mainReactPackage()报错。请问您知道是怎么回事么?
        天空oo7:@肖a 编译代码 Reload了吗? 这个npm主要用在动态编译 bundle文件,做到修改reload就可以看到效果
        5621282d5bbc:E:\DipperLive\MyReactNativeProject>npm start

        > myfirstrnapp@1.0.0 start E:\DipperLive\MyReactNativeProject
        > node node_modules/react-native/local-cli/cli.js start

        Scanning 431 folders for symlinks in E:\DipperLive\MyReactNativeProject\node_modules (15ms)
        ┌──────────────────────────────────────────────────────────────────────
        ──────┐
        │ Running packager on port 8081. │
        │ │
        │ Keep this packager running while developing on any JS projects. Feel │
        │ free to close this tab and run your own packager instance if you │
        │ prefer. │
        │ │
        │ https://github.com/facebook/react-native │
        │ │
        └──────────────────────────────────────────────────────────────────────
        ──────┘
        Looking for JS files in
        E:\DipperLive\MyReactNativeProject

        Loading dependency graph...
        React packager ready.

        Loading dependency graph, done.

        就在这里一直不变了,是什么情况呢
        天空oo7:@不再罚篮 请看下 最后更新的,参考图片中标红的地方,是否和我的项目一致,是否有可能中间步骤出现问题了。请检查下,要是还解决不了,欢迎叫我QQ,私聊呵呵
      • 善良的老农:ReactApplication 没有这个接口啊 我们用的0.3.8版本的。
        天空oo7:@f10f1ec8c863 请看下 最后更新的,我更新项目到0.39.0依然有 ReactApplication接口
        天空oo7:@f10f1ec8c863 我晚上看下
      • e5b5e10ec78d:我也是唉,没有ReactApplication的接口出现啊
        天空oo7:@刘静静一静 请看下 最后更新的,我更新项目到0.39.0依然有 ReactApplication接口
      • harvey_hui:正需要
      • leiiiooo:火前留名
      • leiiiooo:npm start 之后 一直在这里,没有打包 安装,请问您能帮着指点下吗~
        React packager ready.

        [2016-11-04 16:19:37] <START> Initializing Packager
        [2016-11-04 16:19:37] <START> Building in-memory fs for JavaScript
        [2016-11-04 16:19:37] <END> Building in-memory fs for JavaScript (189ms)
        [2016-11-04 16:19:37] <START> Building Haste Map
        [2016-11-04 16:19:38] <END> Building Haste Map (140ms)
        [2016-11-04 16:19:38] <END> Initializing Packager (428ms)
        leiiiooo:@天空oo7 嗯嗯 :no_mouth: :blush:
        天空oo7:@leiiiooo npm start 用来开发中实时同步使用的,是一直运行着,打包安装是你自己用打包安装的,直接点击Android Studio 运行就好了
        天空oo7:@leiiiooo 411437734 添加QQ 我看看 我没有理解你想问的内容 :smile:
      • kukey89:很好,非常适合新手
      • 天空oo7:有的小伙伴 忘记添加 app中 build.gradle下面
        dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        compile 'com.android.support:appcompat-v7:23.0.1'
        compile "com.facebook.react:react-native:+" // From node_modules
        }
        造成 一直没有出现react-native项目jar
      • aiyoLZH:昨天刚刚集成 发现ReactApplication已经找不到了,好惆怅啊,咋整
        天空oo7:@aiyoLZH 请看下 最后更新的,我更新项目到0.39.0依然有 ReactApplication接口
        天空oo7:@aiyoLZH 你使用的哪个版本,ReactApplication是接口,在你自己的Application中实现接口就好了:smile::smile:
      • 7ff35fdfb50f:虽然有些看不懂,看别人的解决了,但还是谢谢你给我的启蒙
        天空oo7:@南京丶 哪里有问题,看不明白,我们讨论一下:smile::smile:
      • 天空oo7:
        使用Dev Seting时需要添加
        <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
      • 爱孔孟: :smile: 真详细
      • 9f379392be88:先收藏 回去慢慢看
      • fendo:赞一个!!
      • 4d36afc0287f:很清楚很详细很简单

      本文标题:史上最详细的Android原生APP中添加ReactNative

      本文链接:https://www.haomeiwen.com/subject/xysryttx.html