feat(runtime): 新增 MultipleReactActivityDelegate 以支持分包加载- 添加 MultipleReactActivityDelegate 类,用于处理多个 React 活动
- 实现 ReactHostHelper 类,辅助加载bundle - 修改 BuzActivity 和 MainApplication 以支持新的分包加载逻辑 - 更新 App.tsx,添加新功能按钮 - 在 package.json 中添加 --active-arch-only 参数以优化性能 - 在 gradle.properties 中启用配置缓存
这个提交包含在:
父节点
dfa3180cec
当前提交
bf61fdc1ac
@ -0,0 +1,4 @@
|
||||
__d(function(g,r,i,a,m,e,d){var n=r(d[0]),p=r(d[1]),t=n(r(d[2]));p.AppRegistry.registerComponent(r(d[3]).Apps.App,function(){return t.default})},10000000,[5,3,10000001,491]);
|
||||
__d(function(g,_r,_i,a,m,_e,d){Object.defineProperty(_e,"__esModule",{value:!0}),_e.default=void 0;var e=_r(d[0]),t=(function(e,t){if("function"==typeof WeakMap)var n=new WeakMap,r=new WeakMap;return(function(e,t){if(!t&&e&&e.__esModule)return e;var o,i,u={__proto__:null,default:e};if(null===e||"object"!=typeof e&&"function"!=typeof e)return u;if(o=t?r:n){if(o.has(e))return o.get(e);o.set(e,u)}for(var s in e)"default"!==s&&{}.hasOwnProperty.call(e,s)&&((i=(o=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,s))&&(i.get||i.set)?o(u,s,i):u[s]=e[s]);return u})(e,t)})(_r(d[1])),n=t,r=_r(d[2]);var o=e.StyleSheet.create({container:{flex:1}});_e.default=function(){var i='dark'===(0,e.useColorScheme)();return(0,r.jsxs)(e.View,{style:o.container,children:[(0,r.jsx)(e.StatusBar,{barStyle:i?'light-content':'dark-content'}),(0,r.jsx)(e.View,{style:{height:100}}),(0,r.jsx)(e.Button,{title:'\u8fdb\u5165\u4e92\u8054\u7f51\u533b\u9662',onPress:function(){n.pushByName('hospital',{})}}),(0,r.jsx)(e.View,{style:{height:15}}),(0,r.jsx)(e.Button,{title:'\u8fdb\u5165\u533b\u7f51\u7b7e',onPress:function(){n.pushByName(t.Apps.Ywq,{})}})]})}},10000001,[3,491,243]);
|
||||
__r(108);
|
||||
__r(10000000);
|
||||
文件差异因一行或多行过长而隐藏
|
之前 宽度: | 高度: | 大小: 64 KiB 之后 宽度: | 高度: | 大小: 64 KiB |
|
之前 宽度: | 高度: | 大小: 63 KiB 之后 宽度: | 高度: | 大小: 63 KiB |
@ -0,0 +1,4 @@
|
||||
__d(function(g,r,i,a,m,e,d){var t=r(d[0]),n=r(d[1]),p=t(r(d[2]));n.AppRegistry.registerComponent(r(d[3]).Apps.Hospital,function(){return p.default})},10000000,[5,3,10000001,491]);
|
||||
__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t=r(d[0]),n=r(d[1]);var o=t.StyleSheet.create({container:{flex:1}});e.default=function(){var l='dark'===(0,t.useColorScheme)();return(0,n.jsxs)(t.View,{style:o.container,children:[(0,n.jsx)(t.StatusBar,{barStyle:l?'light-content':'dark-content'}),(0,n.jsx)(t.View,{style:{height:100}}),(0,n.jsx)(t.Text,{children:"\u4e92\u8054\u7f51\u533b\u9662"}),(0,n.jsx)(t.Button,{title:'\u8fd4\u56de',onPress:function(){(0,r(d[2]).pop)()}})]})}},10000001,[3,243,491]);
|
||||
__r(108);
|
||||
__r(10000000);
|
||||
@ -0,0 +1,4 @@
|
||||
__d(function(g,r,i,a,m,e,d){var n=r(d[0]),t=r(d[1]),p=n(r(d[2]));t.AppRegistry.registerComponent(r(d[3]).Apps.Ywq,function(){return p.default})},10000000,[5,3,10000001,491]);
|
||||
__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t=r(d[0]),n=r(d[1]);var o=t.StyleSheet.create({container:{flex:1}});e.default=function(){var l='dark'===(0,t.useColorScheme)();return(0,n.jsxs)(t.View,{style:o.container,children:[(0,n.jsx)(t.StatusBar,{barStyle:l?'light-content':'dark-content'}),(0,n.jsx)(t.View,{style:{height:100}}),(0,n.jsx)(t.Button,{title:'onConfirm',onPress:function(){}})]})}},10000001,[3,243]);
|
||||
__r(108);
|
||||
__r(10000000);
|
||||
@ -0,0 +1,175 @@
|
||||
package com.facebook.react.runtime
|
||||
|
||||
import android.content.Intent
|
||||
import android.content.pm.ActivityInfo
|
||||
import android.content.res.Configuration
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.util.Log
|
||||
import android.view.KeyEvent
|
||||
import com.facebook.react.ReactActivity
|
||||
import com.facebook.react.ReactDelegate
|
||||
import com.facebook.react.ReactInstanceEventListener
|
||||
import com.facebook.react.ReactInstanceManager
|
||||
import com.facebook.react.ReactRootView
|
||||
import com.facebook.react.bridge.JSBundleLoader
|
||||
import com.facebook.react.bridge.ReactContext
|
||||
import com.facebook.react.common.annotations.DeprecatedInNewArchitecture
|
||||
import com.facebook.react.defaults.DefaultReactActivityDelegate
|
||||
import com.facebook.react.internal.featureflags.ReactNativeFeatureFlags.enableBridgelessArchitecture
|
||||
|
||||
class MultipleReactActivityDelegate(
|
||||
activity: ReactActivity,
|
||||
mainComponentName: String,
|
||||
fabricEnabled: Boolean,
|
||||
) : DefaultReactActivityDelegate(activity, mainComponentName, fabricEnabled) {
|
||||
private var mReactDelegate: ReactDelegate? = null
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
val helper = ReactHostHelper(reactHost as ReactHostImpl)
|
||||
|
||||
|
||||
val mainComponentName = this.mainComponentName
|
||||
val launchOptions = this.composeLaunchOptions()
|
||||
val activity = reactActivity
|
||||
if (Build.VERSION.SDK_INT >= 26 && this.isWideColorGamutEnabled) {
|
||||
activity.window.colorMode = ActivityInfo.COLOR_MODE_WIDE_COLOR_GAMUT
|
||||
}
|
||||
|
||||
if (enableBridgelessArchitecture()) {
|
||||
this.mReactDelegate =
|
||||
ReactDelegate(
|
||||
this.plainActivity,
|
||||
this.reactHost,
|
||||
mainComponentName,
|
||||
launchOptions,
|
||||
)
|
||||
|
||||
reactHost?.start()?.waitForCompletion()
|
||||
val result =
|
||||
helper.loadBundle(
|
||||
JSBundleLoader.createAssetLoader(this.reactActivity, "assets://index.android.bundle", false),
|
||||
)
|
||||
|
||||
Log.i("TestApp", "load biz bundle ==> $result")
|
||||
this.loadApp(mainComponentName)
|
||||
} else {
|
||||
this.mReactDelegate =
|
||||
object : ReactDelegate(
|
||||
this.plainActivity,
|
||||
this.reactNativeHost,
|
||||
mainComponentName,
|
||||
launchOptions,
|
||||
this.isFabricEnabled,
|
||||
) {
|
||||
override fun createRootView(): ReactRootView {
|
||||
var rootView: ReactRootView? = this@MultipleReactActivityDelegate.createRootView()
|
||||
if (rootView == null) {
|
||||
rootView = super.createRootView()
|
||||
}
|
||||
|
||||
return rootView!!
|
||||
}
|
||||
}
|
||||
|
||||
reactNativeHost.reactInstanceManager.addReactInstanceEventListener(
|
||||
object : ReactInstanceEventListener {
|
||||
override fun onReactContextInitialized(context: ReactContext) {
|
||||
Log.i("TestApp", "Multiple onReactContextInitialized")
|
||||
|
||||
val instance = reactNativeHost.reactInstanceManager.currentReactContext?.catalystInstance
|
||||
instance?.loadScriptFromAssets(context.assets, "assets://index.android.bundle", false)
|
||||
Log.i("TestApp", "loaded biz bundle")
|
||||
if (mainComponentName != null) {
|
||||
try {
|
||||
this@MultipleReactActivityDelegate.loadApp(mainComponentName)
|
||||
} catch (e: Exception) {
|
||||
Log.e("TestApp", "load app $mainComponentName")
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
)
|
||||
reactNativeHost.reactInstanceManager.createReactContextInBackground()
|
||||
}
|
||||
}
|
||||
|
||||
private fun loadAppOldWay() {
|
||||
}
|
||||
|
||||
override fun getReactDelegate(): ReactDelegate = mReactDelegate!!
|
||||
|
||||
@DeprecatedInNewArchitecture(message = "Use getReactHost()")
|
||||
override fun getReactInstanceManager(): ReactInstanceManager = mReactDelegate!!.reactInstanceManager
|
||||
|
||||
override fun loadApp(appKey: String?) {
|
||||
mReactDelegate!!.loadApp(appKey)
|
||||
plainActivity.setContentView(mReactDelegate!!.reactRootView)
|
||||
}
|
||||
|
||||
override fun onUserLeaveHint() {
|
||||
if (mReactDelegate != null) {
|
||||
mReactDelegate!!.onUserLeaveHint()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onPause() {
|
||||
mReactDelegate!!.onHostPause()
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
mReactDelegate!!.onHostResume()
|
||||
// if (mPermissionsCallback != null) {
|
||||
// mPermissionsCallback!!.invoke()
|
||||
// mPermissionsCallback = null
|
||||
// }
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
mReactDelegate!!.onHostDestroy()
|
||||
}
|
||||
|
||||
override fun onActivityResult(
|
||||
requestCode: Int,
|
||||
resultCode: Int,
|
||||
data: Intent?,
|
||||
) {
|
||||
mReactDelegate!!.onActivityResult(requestCode, resultCode, data, true)
|
||||
}
|
||||
|
||||
override fun onKeyDown(
|
||||
keyCode: Int,
|
||||
event: KeyEvent?,
|
||||
): Boolean = mReactDelegate!!.onKeyDown(keyCode, event)
|
||||
|
||||
override fun onKeyUp(
|
||||
keyCode: Int,
|
||||
event: KeyEvent?,
|
||||
): Boolean = mReactDelegate!!.shouldShowDevMenuOrReload(keyCode, event)
|
||||
|
||||
override fun onKeyLongPress(
|
||||
keyCode: Int,
|
||||
event: KeyEvent?,
|
||||
): Boolean = mReactDelegate!!.onKeyLongPress(keyCode)
|
||||
|
||||
override fun onBackPressed(): Boolean = mReactDelegate!!.onBackPressed()
|
||||
|
||||
override fun onNewIntent(intent: Intent?): Boolean = mReactDelegate!!.onNewIntent(intent)
|
||||
|
||||
override fun onWindowFocusChanged(hasFocus: Boolean) {
|
||||
mReactDelegate!!.onWindowFocusChanged(hasFocus)
|
||||
}
|
||||
|
||||
override fun onConfigurationChanged(newConfig: Configuration?) {
|
||||
mReactDelegate!!.onConfigurationChanged(newConfig)
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the current [ReactContext] from ReactHost or ReactInstanceManager
|
||||
*
|
||||
*
|
||||
* Do not store a reference to this, if the React instance is reloaded or destroyed, this
|
||||
* context will no longer be valid.
|
||||
*/
|
||||
override fun getCurrentReactContext(): ReactContext = mReactDelegate!!.currentReactContext!!
|
||||
}
|
||||
@ -0,0 +1,24 @@
|
||||
package com.facebook.react.runtime
|
||||
|
||||
import com.facebook.react.bridge.JSBundleLoader
|
||||
import com.facebook.react.interfaces.TaskInterface
|
||||
import com.facebook.react.runtime.internal.bolts.Task
|
||||
import kotlin.coroutines.Continuation
|
||||
import kotlin.jvm.internal.Intrinsics
|
||||
|
||||
class ReactHostHelper(
|
||||
private val delegate: ReactHostImpl,
|
||||
) {
|
||||
fun loadBundle(bundleLoader: JSBundleLoader): Boolean? {
|
||||
Intrinsics.checkNotNullParameter(bundleLoader, "bundlerLoader")
|
||||
val task = delegate.loadBundle(bundleLoader)
|
||||
|
||||
|
||||
task.waitForCompletion()
|
||||
|
||||
return task.getResult()
|
||||
}
|
||||
fun getOrCreateReactInstance() {
|
||||
delegate.isInstanceInitialized
|
||||
}
|
||||
}
|
||||
@ -6,6 +6,7 @@ import com.trust.ywx.specs.navigation.NavigationHelper
|
||||
import com.facebook.react.ReactActivityDelegate
|
||||
import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.fabricEnabled
|
||||
import com.facebook.react.defaults.DefaultReactActivityDelegate
|
||||
import com.facebook.react.runtime.MultipleReactActivityDelegate
|
||||
|
||||
class BuzActivity : ReactActivity() {
|
||||
|
||||
@ -20,7 +21,11 @@ class BuzActivity : ReactActivity() {
|
||||
* which allows you to enable New Architecture with a single boolean flags [fabricEnabled]
|
||||
*/
|
||||
override fun createReactActivityDelegate(): ReactActivityDelegate =
|
||||
DefaultReactActivityDelegate(this, mainComponentName, fabricEnabled)
|
||||
if (BuildConfig.BUILD_TYPE == "debug") DefaultReactActivityDelegate(
|
||||
this,
|
||||
mainComponentName,
|
||||
fabricEnabled
|
||||
) else MultipleReactActivityDelegate(this, mainComponentName, fabricEnabled)
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
|
||||
@ -21,7 +21,11 @@ class MainApplication : Application(), ReactApplication {
|
||||
add(NavigationPackage())
|
||||
}
|
||||
|
||||
override fun getJSMainModuleName(): String = "index"
|
||||
override fun getJSMainModuleName(): String =
|
||||
if (BuildConfig.BUILD_TYPE == "debug") "index" else "commom"
|
||||
|
||||
override fun getBundleAssetName(): String =
|
||||
if (BuildConfig.BUILD_TYPE == "debug") "index.android.bundle" else "common.android.bundle"
|
||||
|
||||
override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG
|
||||
|
||||
|
||||
@ -37,3 +37,4 @@ newArchEnabled=true
|
||||
# Use this property to enable or disable the Hermes JS engine.
|
||||
# If set to false, you will be using JSC instead.
|
||||
hermesEnabled=true
|
||||
org.gradle.configuration-cache=true
|
||||
@ -1,4 +0,0 @@
|
||||
__d(function(g,r,i,a,m,e,d){var n=r(d[0]),t=r(d[1]),p=n(r(d[2]));t.AppRegistry.registerComponent("app",function(){return p.default})},10000000,[5,3,10000001]);
|
||||
__d(function(g,_r,_i,a,m,_e,d){Object.defineProperty(_e,"__esModule",{value:!0}),_e.default=void 0;var e=_r(d[0]),t=(function(e,t){if("function"==typeof WeakMap)var n=new WeakMap,r=new WeakMap;return(function(e,t){if(!t&&e&&e.__esModule)return e;var o,i,u={__proto__:null,default:e};if(null===e||"object"!=typeof e&&"function"!=typeof e)return u;if(o=t?r:n){if(o.has(e))return o.get(e);o.set(e,u)}for(var l in e)"default"!==l&&{}.hasOwnProperty.call(e,l)&&((i=(o=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,l))&&(i.get||i.set)?o(u,l,i):u[l]=e[l]);return u})(e,t)})(_r(d[1])),n=_r(d[2]);var r=e.StyleSheet.create({container:{flex:1}});_e.default=function(){var o='dark'===(0,e.useColorScheme)();return(0,n.jsxs)(e.View,{style:r.container,children:[(0,n.jsx)(e.StatusBar,{barStyle:o?'light-content':'dark-content'}),(0,n.jsx)(e.View,{style:{height:100}}),(0,n.jsx)(e.Button,{title:'\u8fdb\u5165\u4e92\u8054\u7f51\u533b\u9662',onPress:function(){console.log('>>>>',t),t.pushByName('hospital',{})}})]})}},10000001,[3,491,243]);
|
||||
__r(108);
|
||||
__r(10000000);
|
||||
@ -3,7 +3,7 @@
|
||||
"version": "0.0.1",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"android": "react-native run-android",
|
||||
"android": "react-native run-android --active-arch-only",
|
||||
"ios": "react-native run-ios",
|
||||
"lint": "eslint .",
|
||||
"start": "react-native start",
|
||||
|
||||
@ -28,6 +28,7 @@ function App() {
|
||||
navigation.pushByName('hospital', {});
|
||||
}}
|
||||
/>
|
||||
<View style={{ height: 15 }} />
|
||||
<Button
|
||||
title={'进入医网签'}
|
||||
onPress={() => {
|
||||
|
||||
正在加载...
在新工单中引用
屏蔽一个用户