史上最詳細(xì)的Android原生APP中添加ReactNative 進(jìn)行混合開(kāi)發(fā)教程

背景

React Native出來(lái)已經(jīng)一段時(shí)間了匿垄,相對(duì)來(lái)說(shuō)也算穩(wěn)定了嚣州,在很多的企業(yè)中都實(shí)際使用他們亿乳,混合開(kāi)發(fā)已經(jīng)是未來(lái)的一種趨勢(shì)硝拧,混合開(kāi)發(fā)中使用的技術(shù)很多径筏,不外乎Html5、JS框架通過(guò)一定的技術(shù)和原始交互障陶,目前主流混合開(kāi)發(fā)React Native滋恬、Cordova、APICloud抱究、MUI恢氯、AppCan、Sencha Touch鼓寺、jQuery Mobile等等(其他的小伙伴們自己收集)勋拟,目前網(wǎng)上寫教程的人很多,但是React Native更新速度很快妈候,根據(jù)他們的教程敢靡,中間會(huì)遇到各種問(wèn)題,今天我和大家一起踩踩各種坑苦银,讓小伙伴們快速集成到自己的APP中啸胧。后續(xù)持續(xù)更新,反饋發(fā)郵件411437734@qq.com共同探討幔虏。

集成的小伙伴一定要注意圖片中標(biāo)注和備注哦纺念,不然有可能會(huì)走彎路哦

集成步驟

參考官方文檔->react native 文檔
本文使用開(kāi)發(fā)環(huán)境 Android studio
注意最新的React Native支持的最新的SDK為16(android4.1)
npm環(huán)境想括,小伙伴們自己安裝 nodeJS自己安裝瑟蜈,可以參考官方文檔安裝環(huán)境焙格,有問(wèn)題可以發(fā)411437734@qq.com溝通

創(chuàng)建Android項(xiàng)目(已有項(xiàng)目跳過(guò))

  1. 打開(kāi)Android studio


    14752189589833.jpg
  2. 輸入項(xiàng)目名稱,選擇項(xiàng)目目錄,點(diǎn)擊next


    14752190447690.jpg

    14752191238908.jpg

    14752192158859.jpg

    14752193112367.jpg

至此項(xiàng)目創(chuàng)建完成(需要注意的是最新的React Native支持最新SDK版本為16 android4.1)

React Native集成到上面我們創(chuàng)建的ReactNativeAPPDemo中

參考Facebook react native文檔

  1. 進(jìn)入項(xiàng)目根目錄刑顺,添加JS到項(xiàng)目中-點(diǎn)擊Android studio中的Terminal(如下圖)
    14752200412681.jpg

分別執(zhí)行一下語(yǔ)句

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

init 主要根據(jù)提醒生成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

查看項(xiàng)目中有node_modules,說(shuō)明react和react native 安裝完成

14752214758622.jpg

在項(xiàng)目根目錄添加.flowconfig

參考下圖


14752216108448.jpg

也可以手動(dòng)創(chuàng)建在瀏覽器打開(kāi)https://raw.githubusercontent.com/facebook/react-native/master/.flowconfig網(wǎng)址復(fù)制內(nèi)容創(chuàng)建文件

14752217925862.jpg

ReactNativeAppDemo配置相關(guān)內(nèi)容

  1. 添加"start": "node node_modules/react-native/local-cli/cli.js start" 到package.json 文件下 scripts標(biāo)簽 修改前
    14752220951994.jpg

    修改后
    14752221462812.jpg
  1. 添加index.android.js文件到項(xiàng)目中


    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中的衅檀,因?yàn)槲覀兪褂玫氖俏覀儽镜豱ode_modules中的计济,注意最新版本中支持的是23,appcompat-v7:23.0.1,暫時(shí)沒(méi)有試24的api

14752229775637.jpg

  1. 整個(gè)工程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,如果出現(xiàn)請(qǐng)檢查

  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

到時(shí)最新版本中提供了更加簡(jiǎn)單的方式,沒(méi)錯(cuò)就是繼承坯沪。

14752258065933.jpg

在這里我們也需要自定義一個(gè)Application否則 運(yùn)行時(shí)會(huì)報(bào)錯(cuò),不信的小伙伴可以試一試


14752259787709.jpg
14752260351714.jpg

到此為止,ReactNative 集成到已有項(xiàng)目中完成i谩!瘪弓!迫不及待的運(yùn)行試試吧!!

14752261248709.jpg

在Terminal中運(yùn)行 npm start,看到下圖表示啟動(dòng)成功

14752261852021.jpg

運(yùn)行以后發(fā)現(xiàn)如下錯(cuò)誤


14752468221176.jpg

react-native報(bào)錯(cuò):Could not get BatchedBridge, make sure your bundle is packaged correctly
莫緊張诫咱,這是因?yàn)閎undle沒(méi)有打包好竟痰。找不到編譯打包后的js文件凯亮。其實(shí)就是android studio默認(rèn)的尋找js文件地址和react-native自己的工具編譯所使用的地址不同。

解決方法
方法一

進(jìn)入項(xiàng)目臼予,在android/app/src/main下新建assets目錄粘拾。執(zhí)行以下命令

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

在項(xiàng)目根目錄下執(zhí)行

<!--$> (cd android/ && ./gradlew assembleDebug)-->
$> (cd 項(xiàng)目名稱/ && ./gradlew assembleDebug)

把創(chuàng)建的apk安裝到android設(shè)備

方法二

進(jìn)入項(xiàng)目追驴,在android/app/src/main下新建assets目錄
啟動(dòng)服務(wù)器

$>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文件夾下會(huì)生成index.android.bundle文件暇咆,把創(chuàng)建的apk文件安裝到android設(shè)備

方法三

進(jìn)入項(xiàng)目,在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/"
  },

個(gè)人推薦使用方法三,方法三解決不了推薦方法二 手動(dòng)執(zhí)行
修改剛剛的package.json文件


14752486039953.jpg

如果真機(jī)(模擬器)需要執(zhí)行

adb reverse tcp:8081 tcp:8081

一定要確定連接網(wǎng)絡(luò)哦2鸹印!

14752520319630.jpg
14752520729313.jpg

開(kāi)心的進(jìn)行開(kāi)發(fā)吧备禀!

其他可能遇到的問(wèn)題

ReactNative兼容64位Android手機(jī)

libgnustl_shared.so" is 32-bit instead of 64-bit類似錯(cuò)誤

解決方法
  1. 在項(xiàng)目的根目錄的 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模擬器運(yùn)行顯示沒(méi)有連接到developement server如下圖

![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1018012-afeaad419ff40114.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

1. 先檢查是否連接到網(wǎng)絡(luò)
2. 點(diǎn)擊模擬器中Menu菜單彈出下面圖片另患,點(diǎn)擊Dev Settings
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1018012-024b1022595244ee.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
3. 點(diǎn)擊Debugging 下面的`Debug Server host & port for device`填寫地址和端口
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1018012-e2bce20ef25911b9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1018012-4008a5d1c3b7f4ec.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)



>上文中使用到的項(xiàng)目ReactNativeAPPDemo鏈接: https://pan.baidu.com/s/1i4GkeKt 密碼: vwym


最近小伙伴反饋0.39.0上面沒(méi)有ReactApplication接口租冠,請(qǐng)看我的截圖有問(wèn)題QQ聯(lián)系我共同探討
>我的項(xiàng)目中依然可以看到骆姐,是不是有的小伙伴gradle文件配置的問(wèn)題繁仁,仔細(xì)檢查下,確實(shí)有問(wèn)題的小伙伴捻浦,請(qǐng)加QQ私聊
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1018012-d1fbebf0e6df6f66.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)



###### 升級(jí)ReactNative
> 由于ReactNative 更新比較頻繁钠四,有的時(shí)候我們的項(xiàng)目需求根據(jù)情況侣灶,需要升級(jí)到最新或者指定版本的ReactNative咏雌,下面給大家介紹下统倒。


1. 安裝git(如果安裝git請(qǐng)求跳過(guò))
    > 下載并安裝[git](https://git-scm.com/downloads)
2. 在命令行執(zhí)行命令
    > npm install -g react-native-git-upgrade
    > react-native-git-upgrade
3. 更新項(xiàng)目ReactNative依賴
    > 通過(guò)命令:npm info react-native 查看ReactNative版本
    > npm install --save react-native@X.Y 安裝指定版本,X.Y是npm info react-native 查看到的ReactNative版本
4. 更新 react-native upgrade

### 發(fā)布Demo 到github Demo  歡迎大家提問(wèn)交流
  > [ReactNativeAppDemo](https://github.com/zdl411437734/ReactNativeAppDemo)
> [提問(wèn)](https://github.com/zdl411437734/ReactNativeAppDemo/issues)

關(guān)注公眾號(hào)獲取更多內(nèi)容和反饋溝通
![Paste_Image.png -w200](http://upload-images.jianshu.io/upload_images/1018012-c8bfc8d8d233e9eb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

>轉(zhuǎn)載請(qǐng)注明出處:http://www.reibang.com/p/22aa14664cf9
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市左胞,隨后出現(xiàn)的幾起案子俭嘁,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件攒磨,死亡現(xiàn)場(chǎng)離奇詭異泻骤,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門欧芽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事√舜螅” “怎么了讯柔?”我有些...
    開(kāi)封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)护昧。 經(jīng)常有香客問(wèn)我魂迄,道長(zhǎng),這世上最難降的妖魔是什么惋耙? 我笑而不...
    開(kāi)封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任捣炬,我火速辦了婚禮,結(jié)果婚禮上绽榛,老公的妹妹穿的比我還像新娘湿酸。我一直安慰自己,他們只是感情好灭美,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布推溃。 她就那樣靜靜地躺著,像睡著了一般届腐。 火紅的嫁衣襯著肌膚如雪铁坎。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天犁苏,我揣著相機(jī)與錄音硬萍,去河邊找鬼。 笑死围详,一個(gè)胖子當(dāng)著我的面吹牛朴乖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼买羞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼袁勺!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起畜普,我...
    開(kāi)封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤魁兼,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后漠嵌,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體咐汞,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年儒鹿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了化撕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡约炎,死狀恐怖植阴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情圾浅,我是刑警寧澤掠手,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站狸捕,受9級(jí)特大地震影響喷鸽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜灸拍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一做祝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鸡岗,春花似錦混槐、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至揣苏,卻和暖如春悯嗓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背舒岸。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工绅作, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蛾派。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親洪乍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子眯杏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容