Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
React Native Inside - Android Edition -
Slide 2
Slide 2 text
React Native ?
Slide 3
Slide 3 text
React Native
Slide 4
Slide 4 text
React Native
Slide 5
Slide 5 text
react-native init AwesomeProject ├── android/ ├── ios ├── index.android.js ├── index.ios.js ├── node_modules/ └── package.json
Slide 6
Slide 6 text
react-native init AwesomeProject
Slide 7
Slide 7 text
Agenda 1. アプリ起動後の処理 2. 仮想DOMの実装 3. ネイティブコード連携箇所の実装
Slide 8
Slide 8 text
1.アプリ起動後の処理
Slide 9
Slide 9 text
● ローカルのサーバーからjsを読み込んで起動 ● jsをその場でリロード可 react-native run android
Slide 10
Slide 10 text
Android Project structure
Slide 11
Slide 11 text
ReactActivity ● ReactInstanceManager の保持 ● ReactRootView の生成 https://github.com/facebook/react- native/blob/master/ReactAndroid/src/main/j ava/com/facebook/react/ReactActivity.java ReactActivity -mReactInstanceManager: ReactInstanceManager +createReactInstanceManager(): ReactInstanceManager +createRootView(): ReactRootView +getBundleAssetName(): String +getJSBundleFile(): String Activity
Slide 12
Slide 12 text
ReactActivity#onCreate 1. ReactActivity#createReactInstanceManager() 2. ReactActivity#createRootView() 3. ReactRootViewr#startReactApplication()
Slide 13
Slide 13 text
ReactActivity#onCreate 1. ReactActivity#createReactInstanceManager() 2. ReactActivity#createRootView() 3. ReactRootViewr#startReactApplication()
Slide 14
Slide 14 text
ReactActivity#createReactInstanceManager() ● DeveloperSupportの有無 ○ (DUBUG実行ではON) ● JSBundle
Slide 15
Slide 15 text
● 開発時にJSBundleをサーバーから配信する機能 DeveloperSupport
Slide 16
Slide 16 text
JSBundleファイル ● Jsをサーバーから取得せず、ファイルとしてアプリに同梱 ● アプリをリリースするときはこっち Running On Device – React Native https://facebook.github.io/react-native/docs/running-on-device-ios.html
Slide 17
Slide 17 text
ReactInstanceManager ● ReactApplicationContextの管理 ● CatalystInstanceの管理 https://github.com/facebook/react- native/blob/master/ReactAndroid/src/main/jav a/com/facebook/react/ReactInstanceManagerI mpl.java ReactInstanceManagerImpl -mCurrentReactContext: ReactApplicationContext -mLifecycleState: LifecycleState -mAttachedRootViews: List -createReactContext(): ReactApplicationContext
Slide 18
Slide 18 text
初期化処理の大部分が行われる 1. NativeModuleRegistry, JavaScriptModulesConfigの初期化 2. CatalystInstanceの初期化 3. native/jsモジュールの読み込み a. ReactInstanceManagerImpl#processPackage 4. JSBundleの実行 a. catalystInstance.runJSBundle(); (だいぶ省略してます ) ReactInstanceManager#createReactContext
Slide 19
Slide 19 text
CatalystInstance NativeとJSのつなぎ込み ● JSModule, NativeModuleの管理 ● CatalystInstanceImpl +runJSBundle(): void incrementPendingJSCalls
Slide 20
Slide 20 text
CatalystInstance#runJSBundle
Slide 21
Slide 21 text
UI, JS, Nativeモジュールの実行スレッドを持つ https://github.com/facebook/react- native/blob/master/ReactAndroid/src/main/java/com/facebook/react/bridge/qu eue/ReactQueueConfigurationImpl.java#L20 ReactQueueConfiguration
Slide 22
Slide 22 text
MessageQueueThread#callOnQueue
Slide 23
Slide 23 text
再び、ReactActivity#onCreate 1. ReactActivity#createReactInstanceManager() 2. ReactActivity#createRootView() ○ (newしてるだけ) 3. ReactRootViewr#startReactApplication()
Slide 24
Slide 24 text
ReactRootView#startReactApplication mReactInstanceManager.attachMeasuredRootView(this);
Slide 25
Slide 25 text
ReactInstanceManager#attachMeasuredRootViewToInstance catalystInstance.getJSModule(AppRegistry.class).runApplication (jsAppModuleName, appParams);
Slide 26
Slide 26 text
JavaScriptModuleRegistry#getJavaScriptModule
Slide 27
Slide 27 text
Proxy.newProxyInstance java.lang.reflect.Proxy 動的プロキシを作る時に使われる メソッドの処理を動的に変更できる http://qiita. com/obaQ/items/e401d41059d81149da52
Slide 28
Slide 28 text
Libraries/ ● Libraries/ 以下にライブラリのjsファイルが ● こいつらがProxy越しに動的に呼ばれる ※インタフェースのjavaファイルは別途存在する
Slide 29
Slide 29 text
Overview MainActivity ReactActivity ReactInstanceManager ReactRootView ReactApplicationContext CatalystInstance NativeModuleRegistry
Slide 30
Slide 30 text
Oops!!
Slide 31
Slide 31 text
本日はここまで 1. アプリ起動後の処理 2. 仮想DOMの実装 次回!! 3. ネイティブコード連携箇所の実装 次回!!
Slide 32
Slide 32 text
To be continued...