1. 程式人生 > >Android原生專案整合React Native

Android原生專案整合React Native

剛建立的React Native 微信公眾號,歡迎微信掃描關注訂閱號,每天定期會分享react native 技術文章,移動技術乾貨,精彩文章技術推送。同時可以掃描我的微信加入react-native技術交流微信群。歡迎各位大牛,React Native技術愛好者加入交流!


今天分享一篇關於混合開發的文章: 如何在現有的Android專案中整合React Native。

我會以流水賬的形式來向大家詳細介紹如何實現,仔細看清楚步驟即可。

1.建立Android工程:ReactNativeApp

    關於如何建立Android工程就不再多述了。

2.工程建立完畢後,切換到Android Studio左下角的Terminal視窗,執行npm init命令。

   

   

   

    npm init 命令的作用是生成package.json檔案,即RN的配置檔案,當輸入npm init命令回車後,會提示讓你輸入一些基本的資訊,選擇填寫即可。

3.執行npm install --save react react-native 命令

  

   install --save react react-native命令用於安裝 React、React Native 相關檔案。

4.建立.flowconfig檔案

   .flowconfig檔案可以facebook的github上覆制,然後在工程的根目錄建立.flowconfig檔案,將其內容複製進去即可

   

5.此時,你的工程中已經生成了package.json檔案,然後將“start": "node node_modules/react-native/local-cli/cli.js start"新增到scripts節點下

   

6.新增index.android.js檔案,也就是你的RN介面到根目錄下

   

7.在App的build.gradle檔案下新增facebook react 依賴包

   

    注意最新版本中支援的是23,即需要你修改編輯SDK的版本為23,以及appcompat-v7:23.0.1,同時將minSDK改為16.

8.在project的build.gradle檔案下新增如下

  

9.新增網路許可權管理

  

10.新增NDK的支援

  

  

11.在App的build.gradle檔案的android節點下新增:

12.以上配置完成後,React Native就算整合到了我們現有的專案,接下來需要用Activity來展示RN,所以需要編寫如下程式碼:

     RN舊版本中,主要使用了兩個類來完成介面的渲染工作:ReactRootView,ReactInstanceManager。顧名思義,ReactRootView代表了載入進來的RN介面,ReactInstanceManager用來構建React執行環境,管理React的屬性配置。

有兩點需要注意:

        (1)除錯模式下,需要將setUseDeveloperSupport的值設定為true,否則報錯。

        (2)startReactApplication中的第二個引數,名稱需要與index.android.js中AppRegister的名稱相同。

新版本RN中只需要自定義一個Activity,並繼承ReactActivity,實現getMainComponentName方法,在getMainComponentName方法中返回RN註冊的名稱即可,名稱需要與index.android.js中AppRegister的名稱相同。通過原始碼可以看到,其實在ReactActivity中已經幫助我們實現了ReactRoow的新增和ReactInstanceManager的預設配置。
/**
 * Created by Song on 2017/2/13.
 */
public class MyReactActivity extends ReactActivity {

    @Nullable
    @Override
    protected String getMainComponentName() {
        return "HotRN";
    }

}
然後建立Application,去初始化ReactNativeHost。自定義Application需要繼承ReactApplication,在原始碼loadApp方法中,會將當前Activity的Application強轉為ReactApplication,所以這是必須的步驟。
public class MainApplication extends Application implements ReactApplication {

    private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
        @Override
        protected boolean getUseDeveloperSupport() {
            return BuildConfig.DEBUG;
        }

        @Override
        protected List<ReactPackage> getPackages() {
            return Arrays.<ReactPackage>asList(
                    new MainReactPackage()
            );
        }

    };

    @Override
    public ReactNativeHost getReactNativeHost() {
        return mReactNativeHost;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        SoLoader.init(this,false);
    }

}

OK,如果以上步驟整合順利的話,那麼就大功告成啦!!

13.繼續切換到Terminal視窗,執行npm start來啟動

      如果出現錯誤,則基本可以定位為沒有bundle檔案。此時需要我們手動來生成bundle檔案,並放在assets目錄下(app/src/main/assets)。

      手動生成bundle檔案,需要我們執行如下命令:

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

       (1)--platform:平臺

       (2)--dev:開發模式

       (3)--entry-file:條目檔案

       (4)--bundle-output:bundle檔案生成的目錄

       (5)--assets-dest:資原始檔生成的目錄

    

此時執行你的Android工程,可以看到RN已經被我們完美的整合進來啦~


可以明顯看到,第一次進入的時候,由於載入JsBundle,導致有一些延遲,但是當我們第二次進入的時候,就會瞬間載入完成並顯示出來。此類問題的解決方案我單獨寫了一篇部落格來介紹:

如果你的專案要開啟混淆策略,可以在proguard下新增如下

# React Native

# Keep our interfaces so they can be used by other ProGuard rules.
# See http://sourceforge.net/p/proguard/bugs/466/
-keep,allowobfuscation @interface com.facebook.proguard.annotations.DoNotStrip
-keep,allowobfuscation @interface com.facebook.proguard.annotations.KeepGettersAndSetters
-keep,allowobfuscation @interface com.facebook.common.internal.DoNotStrip

# Do not strip any method/class that is annotated with @DoNotStrip
-keep @com.facebook.proguard.annotations.DoNotStrip class *
-keep @com.facebook.common.internal.DoNotStrip class *
-keepclassmembers class * {
    @com.facebook.proguard.annotations.DoNotStrip *;
    @com.facebook.common.internal.DoNotStrip *;
}

-keepclassmembers @com.facebook.proguard.annotations.KeepGettersAndSetters class * {
  void set*(***);
  *** get*();
}

-keep class * extends com.facebook.react.bridge.JavaScriptModule { *; }
-keep class * extends com.facebook.react.bridge.NativeModule { *; }
-keepclassmembers,includedescriptorclasses class * { native <methods>; }
-keepclassmembers class *  { @com.facebook.react.uimanager.UIProp <fields>; }
-keepclassmembers class *  { @com.facebook.react.uimanager.annotations.ReactProp <methods>; }
-keepclassmembers class *  { @com.facebook.react.uimanager.annotations.ReactPropGroup <methods>; }

-dontwarn com.facebook.react.**

# okhttp

-keepattributes Signature
-keepattributes *Annotation*
-keep class okhttp3.** { *; }
-keep interface okhttp3.** { *; }
-dontwarn okhttp3.**

# okio

-keep class sun.misc.Unsafe { *; }
-dontwarn java.nio.file.*
-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
-dontwarn okio.**

OK,今天的內容就到這裡了,下一篇部落格我將和大家分享如何實現熱更新,敬請期待!

原始碼已分享到github,感興趣的大家可以flow,star哈~

原始碼下載

相關推薦

Android原生專案整合React Native

剛建立的React Native 微信公眾號,歡迎微信掃描關注訂閱號,每天定期會分享react native 技術文章,移動技術乾貨,精彩文章技術推送。同時可以掃描我的微信加入react-native技術交流微信群。歡迎各位大牛,React Native技術愛好者加入

Android原生專案整合React Native踩坑記

最近在學習React Native,將Android原生專案整合React Native實現混合開發。參考官網和其他一些相關資料,自己動手一步一步操作,發現真的是一步步踩坑再填坑的過程,此文章記錄整合React Native的步驟和出現的問題,方便以後查閱。

最新iOS原生專案整合React-Native

       大樓不是一天所建成,是時間慢慢積累起來滴,原先用原生寫的專案,沒辦法將專案中所有的程式碼都換成RN,而且我也不認為全換成RN就是好的,所以準備先將專案中的一些頁面改成RN開發。由於我們並沒有使用Cocoapods,因為Cocoapods管理第三方依賴的時候會

React-Native開發二 Android 已有專案整合React-Native

1 前言 之前寫過一篇RN的環境搭建教程和新建一個新的RN專案的文章 https://blog.csdn.net/qiyei2009/article/details/78820207 但是其實在實際開發中,在已有的android專案中整合RN情況更普遍,這篇文章就是一個怎麼在已有

window下Android專案整合React Native的正確姿勢

      React Native的專案中分為Android與IOS,但是若在現有的Android專案中,整合RN,不能按照那個包結構來,我們統一在app資料夾下處理。 一、整合步驟:    1.新增js檔案   &n

android 架構之整合react native框架js混編APP

本篇文章主要總結一下現在APP當中使用的js、webView混編架構和技術。 什麼是 js 混編? js混編簡單說就是使用JavaScript開發APP程式。 android應用使用的是java,Kotlin 、c/c++ 為主的語言開發,ios使用的ob

Android 原生應用嵌入React-Native模組開發-環境配置及填坑記

1.Can't find variable: __fbBatchedBridge 還是在專案的根資料夾下,命令列執行如下命令,啟動測試伺服器。$ npm start 但是部分Android 6.0的機

Android原生整合react-native(二)-熱更新

使用code-push 和code-push-server 實現熱更新 1.安裝code-push-server: npm install code-push-server -g 2.初始化mySQL資料庫: code-push-server-db init --dbhost l

Android原生整合react-native(-)

1.初始化,在Android terminal中鍵入: npm init 2:安裝相關mudule npm install react react-native 可以看到工程根目錄下多了個node_modules目錄,同時package.json中添加了配置資訊

iOS原生專案(Objective-C)整合React Native(0.57.3版本)圖文教程--(3)style的全部有效屬性

iOS原生專案(Objective-C)整合React Native(0.57.3版本)圖文教程–(3)style的全部有效屬性 Valid style props: [ "alignContent", "alignItems", "alignSelf", "aspe

iOS原生專案(Objective-C)整合React Native(0.57.3版本)圖文教程--(2)整合過程

iOS原生專案(Objective-C)整合React Native(0.57.3版本)圖文教程–(1)基本環境 iOS原生專案(Objective-C)整合React Native(0.57.3版本)圖文教程–(2)整合過程 文章目錄 iOS原生

iOS原生專案(Objective-C)整合React Native(0.57.3版本)圖文教程--(1)基本環境

文章目錄 iOS原生專案(Objective-C)整合React Native(0.57.3版本)圖文教程--(1)基本環境 1. Homebrew 2. Node 3. Yarn 4. react-nat

Android原生專案引入最新的React Native

做一個記錄,解決androidstudio無法下載最新的React Native問題 在你的 android/app/build.gradle新增程式碼 compile 'com.facebook.react:react-native:<your_version_h

Android原生整合react native

react native使用方式有兩種: 1:直接新建一個react native專案 2:在已經存在的原生專案中整合react native專案。 今天主要講解第二種方式的步驟。 1:新建Android原生專案 2:在原生專案的根目錄下執行npm i

原生整合react-native(二)-熱更新

使用code-push 和code-push-server 實現熱更新 1.安裝code-push-server: npm install code-push-server -g 2.初始化mySQL資料庫: code-push-server-db init --db

Android整合 React Native 的經驗分享

在之前的一篇部落格中,Allen已經為大家介紹了React Native在Glow的應用以及大體架構。由於React Native庫本身的一些原因,其在Android的成熟度遠不及iOS,因此也給在Android的應用帶來了更多的挑戰。 在本文中,給大家分享一下在Android平臺

React-NativeAndroid:原生介面與React介面的相互呼叫

這裡原生介面是指用佈局檔案實現或Java程式碼實現view的Activity,React介面是指用ReactJS實現的介面的Activity。 從某種角度看,React只是充當了Android裡的view層,因此原生介面與React介面的相互呼叫及資料傳遞同原生介面之間的互

Android Studio打開React Native創建的項目

inf mage eight 分享 post 分享圖片 技術 blog width 1、點擊 Import project 2、找到項目下android文件夾,選擇build.gradle文件,open Android Studio打開React Nat

Xcode原生專案整合Unity匯出的工程

注:成功的前提:Unity匯出的Xcode工程可以編譯。 1、 建立好工程之後,將Unity匯出的Xcode工程的以下資料夾複製到我們新建的工程中。 Unity匯出:  新建工程: 複製到我們新建的工程中(Command + C

配置android開發環境、安裝Android studio、Android sdk(配置react nativeAndroid環境)

配置react native的Android環境的步驟比較多,所以單獨提取出來記錄: 提示:如果是想搭建android開發環境安裝Android studio,本記錄貼也適用的 1. 安裝 Android Studio,配置sdk 2.建立一個android專案並執行測試