diff --git a/android/app/src/main/assets/app.android.bundle b/android/app/src/main/assets/app.android.bundle new file mode 100644 index 0000000..238457c --- /dev/null +++ b/android/app/src/main/assets/app.android.bundle @@ -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); \ No newline at end of file diff --git a/bundle/common.android.bundle b/android/app/src/main/assets/common.android.bundle similarity index 99% rename from bundle/common.android.bundle rename to android/app/src/main/assets/common.android.bundle index 8358b91..ba34d69 100644 --- a/bundle/common.android.bundle +++ b/android/app/src/main/assets/common.android.bundle @@ -529,7 +529,7 @@ __d(function(g,r,i,a,m,e,d){'use strict';Object.defineProperty(e,"__esModule",{v __d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var n=t(r(d[1]));var o={vibrate:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:400,o=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if('number'==typeof t)n.default.vibrate(t);else{if(!Array.isArray(t))throw new Error('Vibration pattern should be a number or array');n.default.vibrateByPattern(t,o?0:-1)}},cancel:function(){n.default.cancel()}};e.default=o},488,[5,489]); __d(function(g,_r,_i,a,m,_e,d){Object.defineProperty(_e,"__esModule",{value:!0});var e={};_e.default=void 0;var t=(function(e,t){if("function"==typeof WeakMap)var r=new WeakMap,n=new WeakMap;return(function(e,t){if(!t&&e&&e.__esModule)return e;var o,f,u={__proto__:null,default:e};if(null===e||"object"!=typeof e&&"function"!=typeof e)return u;if(o=t?n:r){if(o.has(e))return o.get(e);o.set(e,u)}for(var i in e)"default"!==i&&{}.hasOwnProperty.call(e,i)&&((f=(o=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,i))&&(f.get||f.set)?o(u,i,f):u[i]=e[i]);return u})(e,t)})(_r(d[0]));Object.keys(t).forEach(function(r){"default"!==r&&"__esModule"!==r&&(Object.prototype.hasOwnProperty.call(e,r)||r in _e&&_e[r]===t[r]||Object.defineProperty(_e,r,{enumerable:!0,get:function(){return t[r]}}))});_e.default=t.default},489,[490]); __d(function(g,_r,_i,a,m,_e,d){Object.defineProperty(_e,"__esModule",{value:!0}),_e.default=void 0;var e=(function(e,t){if("function"==typeof WeakMap)var r=new WeakMap,n=new WeakMap;return(function(e,t){if(!t&&e&&e.__esModule)return e;var o,f,u={__proto__:null,default:e};if(null===e||"object"!=typeof e&&"function"!=typeof e)return u;if(o=t?n:r){if(o.has(e))return o.get(e);o.set(e,u)}for(var i in e)"default"!==i&&{}.hasOwnProperty.call(e,i)&&((f=(o=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,i))&&(f.get||f.set)?o(u,i,f):u[i]=e[i]);return u})(e,t)})(_r(d[0]));_e.default=e.getEnforcing('Vibration')},490,[33]); -__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.pushByName=e.pop=void 0;var p=t(r(d[1]));e.pushByName=function(t,n){r(d[2]).storageApp.save({key:`MessageActivity-${t}`,data:n,expires:36e5}).finally(function(){p.default.navigate(t)})},e.pop=function(){p.default.pop()}},491,[5,492,493]); +__d(function(g,r,i,a,m,e,d){var p=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.pushByName=e.pop=e.Apps=void 0;var t=p(r(d[1]));e.Apps=(function(p){return p.App="app",p.Hospital="hospital",p.Ywq="ywq",p})({}),e.pushByName=function(p,n){r(d[2]).storageApp.save({key:`MessageActivity-${p}`,data:n,expires:36e5}).finally(function(){t.default.navigate(p)})},e.pop=function(){t.default.pop()}},491,[5,492,493]); __d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var o=r(d[0]);e.default=o.TurboModuleRegistry.getEnforcing('NavigationManager')},492,[3]); __d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.storageApp=void 0;var o=t(r(d[1])),l=t(r(d[2]));e.storageApp=new o.default({size:1e3,storageBackend:l.default,defaultExpires:864e5,enableCache:!0})},493,[5,494,496]); __d(function(g,r,i,a,_m,_e,d){var e=r(d[0]);Object.defineProperty(_e,"__esModule",{value:!0}),_e.default=void 0;var t=e(r(d[1])),n=e(r(d[2])),s=e(r(d[3]));_e.default=(function(){return(0,s.default)(function e(){var t=this,s=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if((0,n.default)(this,e),this._SIZE=s.size||1e3,this.sync=s.sync||{},this.defaultExpires=void 0!==s.defaultExpires?s.defaultExpires:864e5,this.enableCache=!1!==s.enableCache,this._s=s.storageBackend||null,this._innerVersion=11,this.cache={},this._s&&this._s.setItem)try{var o=this._s.setItem('__react_native_storage_test','test');this.isPromise=!(!o||!o.then)}catch(e){throw console.warn(e),delete this._s,e}else console.warn("Data would be lost after reload cause there is no storageBackend specified!\n \nEither use localStorage(for web) or AsyncStorage(for React Native) as a storageBackend.");this._mapPromise=this.getItem('map').then(function(e){t._m=t._checkMap(e&&JSON.parse(e)||{})})},[{key:"getItem",value:function(e){return this._s?this.isPromise?this._s.getItem(e):Promise.resolve(this._s.getItem(e)):Promise.resolve()}},{key:"setItem",value:function(e,t){return this._s?this.isPromise?this._s.setItem(e,t):Promise.resolve(this._s.setItem(e,t)):Promise.resolve()}},{key:"removeItem",value:function(e){return this._s?this.isPromise?this._s.removeItem(e):Promise.resolve(this._s.removeItem(e)):Promise.resolve()}},{key:"_initMap",value:function(){return{innerVersion:this._innerVersion,index:0,__keys__:{}}}},{key:"_checkMap",value:function(e){return e&&e.innerVersion&&e.innerVersion===this._innerVersion?e:this._initMap()}},{key:"_getId",value:function(e,t){return e+'_'+t}},{key:"_saveToMap",value:function(e){var t=e.key,n=e.id,s=e.data,o=this._getId(t,n),c=this._m;if(void 0!==c[o])return this.enableCache&&(this.cache[o]=JSON.parse(s)),this.setItem('map_'+c[o],s);if(void 0!==c[c.index]){var h=c[c.index],u=h.split('_');delete c[h],this._removeIdInKey(u[0],u[1]),this.enableCache&&delete this.cache[h]}if(c[o]=c.index,c[c.index]=o,c.__keys__[t]=c.__keys__[t]||[],c.__keys__[t].push(n),this.enableCache){var l=JSON.parse(s);this.cache[o]=l}var y=c.index;++c.index===this._SIZE&&(c.index=0),this.setItem('map_'+y,s),this.setItem('map',JSON.stringify(c))}},{key:"save",value:function(e){var t=this,n=e.key,s=e.id,o=e.data,c=e.rawData,h=e.expires,u=void 0===h?this.defaultExpires:h;-1!==n.toString().indexOf('_')&&console.error('Please do not use "_" in key!');var l={rawData:o};if(void 0===o){if(void 0===c)return void console.error('"data" is required in save()!');console.warn('"rawData" is deprecated, please use "data" instead!'),l.rawData=c}var y=Date.now();if(null!==u&&(l.expires=y+u),l=JSON.stringify(l),void 0===s){if(this.enableCache){var _=JSON.parse(l);this.cache[n]=_}return this.setItem(n,l)}return-1!==s.toString().indexOf('_')&&console.error('Please do not use "_" in id!'),this._mapPromise.then(function(){return t._saveToMap({key:n,id:s,data:l})})}},{key:"getBatchData",value:function(e){var t=this;return Promise.all(e.map(function(e){return t.load(e)}))}},{key:"getBatchDataWithIds",value:(e=(0,t.default)(function*(e){var t=this,n=e.key,s=e.ids,o=e.syncInBackground,c=e.syncParams,h=s.map(function(e){return t.load({key:n,id:e,syncInBackground:o,autoSync:!1,batched:!0})}),u=yield Promise.all(h),l=[];if(u.forEach(function(e){void 0!==e.syncId&&l.push(e.syncId)}),l.length){var y=yield this.sync[n]({id:l,syncParams:c});return u.map(function(e){return e.syncId?y.shift():e})}return u}),function(t){return e.apply(this,arguments)})},{key:"_lookupGlobalItem",value:function(e){var t=this,n=e.key;return this.enableCache&&void 0!==this.cache[n]?this._loadGlobalItem(Object.assign({ret:this.cache[n]},e)):this.getItem(n).then(function(n){return t._loadGlobalItem(Object.assign({ret:n},e))})}},{key:"_loadGlobalItem",value:function(e){var t=e.key,n=e.ret,s=e.autoSync,o=e.syncInBackground,c=e.syncParams;if(null==n){if(s&&this.sync[t])return this.sync[t]({syncParams:c});throw new(r(d[4]).NotFoundError)(JSON.stringify(e))}'string'==typeof n&&(n=JSON.parse(n),this.enableCache&&(this.cache[t]=n));var h=Date.now();if(n.expires= 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!! +} diff --git a/android/app/src/main/java/com/facebook/react/runtime/ReactHostHelper.kt b/android/app/src/main/java/com/facebook/react/runtime/ReactHostHelper.kt new file mode 100644 index 0000000..af54215 --- /dev/null +++ b/android/app/src/main/java/com/facebook/react/runtime/ReactHostHelper.kt @@ -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 + } +} \ No newline at end of file diff --git a/android/app/src/main/java/com/trust/ywx/BuzActivity.kt b/android/app/src/main/java/com/trust/ywx/BuzActivity.kt index 09fc5a8..647d1f4 100644 --- a/android/app/src/main/java/com/trust/ywx/BuzActivity.kt +++ b/android/app/src/main/java/com/trust/ywx/BuzActivity.kt @@ -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) diff --git a/android/app/src/main/java/com/trust/ywx/MainApplication.kt b/android/app/src/main/java/com/trust/ywx/MainApplication.kt index 0606264..1156eea 100644 --- a/android/app/src/main/java/com/trust/ywx/MainApplication.kt +++ b/android/app/src/main/java/com/trust/ywx/MainApplication.kt @@ -13,27 +13,31 @@ import com.trust.ywx.specs.navigation.NavigationPackage class MainApplication : Application(), ReactApplication { - override val reactNativeHost: ReactNativeHost = - object : DefaultReactNativeHost(this) { - override fun getPackages(): List = - PackageList(this).packages.apply { - // Packages that cannot be autolinked yet can be added manually here, for example: - add(NavigationPackage()) - } + override val reactNativeHost: ReactNativeHost = + object : DefaultReactNativeHost(this) { + override fun getPackages(): List = + PackageList(this).packages.apply { + // Packages that cannot be autolinked yet can be added manually here, for example: + add(NavigationPackage()) + } - override fun getJSMainModuleName(): String = "index" + override fun getJSMainModuleName(): String = + if (BuildConfig.BUILD_TYPE == "debug") "index" else "commom" - override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG + override fun getBundleAssetName(): String = + if (BuildConfig.BUILD_TYPE == "debug") "index.android.bundle" else "common.android.bundle" - override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED - override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED - } + override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG - override val reactHost: ReactHost - get() = getDefaultReactHost(applicationContext, reactNativeHost) + override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED + override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED + } - override fun onCreate() { - super.onCreate() - loadReactNative(this) - } + override val reactHost: ReactHost + get() = getDefaultReactHost(applicationContext, reactNativeHost) + + override fun onCreate() { + super.onCreate() + loadReactNative(this) + } } diff --git a/android/gradle.properties b/android/gradle.properties index 5e24e3a..efb28b3 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -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 \ No newline at end of file diff --git a/bundle/app.android.bundle b/bundle/app.android.bundle deleted file mode 100644 index 734b886..0000000 --- a/bundle/app.android.bundle +++ /dev/null @@ -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); \ No newline at end of file diff --git a/package.json b/package.json index b24c4a2..5b9d5a8 100644 --- a/package.json +++ b/package.json @@ -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", diff --git a/src/app/App.tsx b/src/app/App.tsx index 0f27aff..ff577d9 100644 --- a/src/app/App.tsx +++ b/src/app/App.tsx @@ -28,6 +28,7 @@ function App() { navigation.pushByName('hospital', {}); }} /> +