expo-dev-launcher 4.0.0 → 4.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/android/build.gradle +1 -1
- package/android/src/debug/java/expo/modules/devlauncher/DevLauncherController.kt +43 -16
- package/android/src/debug/java/expo/modules/devlauncher/DevLauncherPackageDelegate.kt +1 -1
- package/android/src/debug/java/expo/modules/devlauncher/helpers/DevLauncherReactUtils.kt +158 -46
- package/android/src/debug/java/expo/modules/devlauncher/launcher/DevLauncherActivity.kt +10 -8
- package/android/src/debug/java/expo/modules/devlauncher/launcher/DevLauncherNetworkInterceptor.kt +12 -11
- package/android/src/debug/java/expo/modules/devlauncher/launcher/DevLauncherReactHost.kt +109 -0
- package/android/src/debug/java/expo/modules/devlauncher/launcher/{DevLauncherClientHost.kt → DevLauncherReactNativeHost.kt} +2 -2
- package/android/src/debug/java/expo/modules/devlauncher/launcher/errors/DevLauncherErrorActivity.kt +1 -1
- package/android/src/debug/java/expo/modules/devlauncher/launcher/errors/DevLauncherUncaughtExceptionHandler.kt +4 -3
- package/android/src/debug/java/expo/modules/devlauncher/launcher/loaders/DevLauncherAppLoader.kt +6 -6
- package/android/src/debug/java/expo/modules/devlauncher/launcher/loaders/DevLauncherAppLoaderFactory.kt +2 -3
- package/android/src/debug/java/expo/modules/devlauncher/launcher/loaders/DevLauncherExpoAppLoader.kt +2 -2
- package/android/src/debug/java/expo/modules/devlauncher/launcher/loaders/DevLauncherLocalAppLoader.kt +2 -2
- package/android/src/debug/java/expo/modules/devlauncher/launcher/loaders/DevLauncherPublishedAppLoader.kt +2 -2
- package/android/src/debug/java/expo/modules/devlauncher/launcher/loaders/DevLauncherReactNativeAppLoader.kt +2 -2
- package/android/src/debug/java/expo/modules/devlauncher/react/DevLauncherDevSupportManagerSwapper.kt +119 -57
- package/android/src/main/java/com/facebook/react/devsupport/NonFinalBridgeDevSupportManager.java +273 -0
- package/android/src/main/java/com/facebook/react/runtime/NonFinalBridgelessDevSupportManager.java +177 -0
- package/android/src/main/java/expo/modules/devlauncher/launcher/DevLauncherControllerInterface.kt +4 -4
- package/android/src/react-native-74/debug/expo/modules/devlauncher/rncompatibility/DevLauncherBridgeDevSupportManager.kt +75 -0
- package/android/src/react-native-74/debug/expo/modules/devlauncher/rncompatibility/DevLauncherBridgelessDevSupportManager.kt +55 -0
- package/android/src/react-native-74/debug/expo/modules/devlauncher/rncompatibility/DevLauncherDevSupportManagerFactory.kt +3 -3
- package/android/src/release/java/expo/modules/devlauncher/DevLauncherController.kt +13 -9
- package/android/src/release/java/expo/modules/devlauncher/launcher/DevLauncherReactHost.kt +11 -0
- package/android/src/release/java/expo/modules/devlauncher/launcher/{DevLauncherClientHost.kt → DevLauncherReactNativeHost.kt} +1 -1
- package/android/src/testDebug/java/expo/modules/devlauncher/DevLauncherControllerTest.kt +3 -3
- package/android/src/testDebug/java/expo/modules/devlauncher/launcher/loaders/DevLauncherAppLoaderFactoryTest.kt +3 -4
- package/package.json +3 -3
- package/android/src/react-native-74/debug/expo/modules/devlauncher/rncompatibility/DevLauncherDevSupportManager.kt +0 -286
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
package expo.modules.devlauncher.launcher
|
|
2
|
+
|
|
3
|
+
import android.app.Application
|
|
4
|
+
import com.facebook.react.ReactHost
|
|
5
|
+
import expo.modules.devlauncher.DEV_LAUNCHER_IS_NOT_AVAILABLE
|
|
6
|
+
|
|
7
|
+
object DevLauncherReactHost {
|
|
8
|
+
fun create(application: Application, launcherIp: String?): ReactHost {
|
|
9
|
+
throw IllegalStateException(DEV_LAUNCHER_IS_NOT_AVAILABLE)
|
|
10
|
+
}
|
|
11
|
+
}
|
|
@@ -5,7 +5,7 @@ import com.facebook.react.ReactNativeHost
|
|
|
5
5
|
import com.facebook.react.ReactPackage
|
|
6
6
|
import expo.modules.devlauncher.DEV_LAUNCHER_IS_NOT_AVAILABLE
|
|
7
7
|
|
|
8
|
-
class
|
|
8
|
+
class DevLauncherReactNativeHost(application: Application, launcherIp: String?) : ReactNativeHost(application) {
|
|
9
9
|
override fun getPackages(): MutableList<ReactPackage> {
|
|
10
10
|
throw IllegalStateException(DEV_LAUNCHER_IS_NOT_AVAILABLE)
|
|
11
11
|
}
|
|
@@ -3,7 +3,7 @@ package expo.modules.devlauncher
|
|
|
3
3
|
import android.content.Intent
|
|
4
4
|
import android.net.Uri
|
|
5
5
|
import androidx.test.core.app.ApplicationProvider
|
|
6
|
-
import
|
|
6
|
+
import expo.interfaces.devmenu.ReactHostWrapper
|
|
7
7
|
import expo.modules.devlauncher.koin.DevLauncherKoinContext
|
|
8
8
|
import expo.modules.devlauncher.tests.DevLauncherTestInterceptor
|
|
9
9
|
import expo.modules.devmenu.DevMenuManager
|
|
@@ -23,10 +23,10 @@ class DevLauncherControllerTest {
|
|
|
23
23
|
|
|
24
24
|
@Before
|
|
25
25
|
fun setup() {
|
|
26
|
-
val
|
|
26
|
+
val reactHost = mockk<ReactHostWrapper>(relaxed = true)
|
|
27
27
|
DevLauncherKoinContext.reinitialize()
|
|
28
28
|
DevLauncherKoinContext.app.koin.declare(DevLauncherTestInterceptorAllowReinitialization())
|
|
29
|
-
DevLauncherController.initialize(ApplicationProvider.getApplicationContext(),
|
|
29
|
+
DevLauncherController.initialize(ApplicationProvider.getApplicationContext(), reactHost)
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
@Test
|
|
@@ -3,9 +3,9 @@ package expo.modules.devlauncher.launcher.loaders
|
|
|
3
3
|
import android.content.Context
|
|
4
4
|
import android.net.Uri
|
|
5
5
|
import androidx.test.core.app.ApplicationProvider
|
|
6
|
-
import com.facebook.react.ReactNativeHost
|
|
7
6
|
import com.google.common.truth.Truth
|
|
8
7
|
import expo.modules.devlauncher.helpers.DevLauncherInstallationIDHelper
|
|
8
|
+
import expo.interfaces.devmenu.ReactHostWrapper
|
|
9
9
|
import expo.modules.devlauncher.helpers.loadUpdate
|
|
10
10
|
import expo.modules.devlauncher.koin.DevLauncherKoinContext
|
|
11
11
|
import expo.modules.devlauncher.launcher.DevLauncherControllerInterface
|
|
@@ -24,7 +24,6 @@ import org.junit.Test
|
|
|
24
24
|
import org.junit.runner.RunWith
|
|
25
25
|
import org.koin.dsl.module
|
|
26
26
|
import org.robolectric.RobolectricTestRunner
|
|
27
|
-
import java.lang.Exception
|
|
28
27
|
|
|
29
28
|
@RunWith(RobolectricTestRunner::class)
|
|
30
29
|
internal class DevLauncherAppLoaderFactoryTest {
|
|
@@ -36,13 +35,13 @@ internal class DevLauncherAppLoaderFactoryTest {
|
|
|
36
35
|
|
|
37
36
|
@Before
|
|
38
37
|
fun setup() {
|
|
39
|
-
val
|
|
38
|
+
val reactHost = mockk<ReactHostWrapper>(relaxed = true)
|
|
40
39
|
val devLauncherController = mockk<DevLauncherControllerInterface>(relaxed = true)
|
|
41
40
|
DevLauncherKoinContext.app.koin.loadModules(
|
|
42
41
|
listOf(
|
|
43
42
|
module {
|
|
44
43
|
single<Context> { ApplicationProvider.getApplicationContext() }
|
|
45
|
-
single {
|
|
44
|
+
single { reactHost }
|
|
46
45
|
single { devLauncherController }
|
|
47
46
|
single<UpdatesInterface?> { null }
|
|
48
47
|
single { mockk<DevLauncherInstallationIDHelper>(relaxed = true) }
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "expo-dev-launcher",
|
|
3
3
|
"title": "Expo Development Launcher",
|
|
4
|
-
"version": "4.0.
|
|
4
|
+
"version": "4.0.1",
|
|
5
5
|
"description": "Pre-release version of the Expo development launcher package for testing.",
|
|
6
6
|
"main": "build/DevLauncher.js",
|
|
7
7
|
"types": "build/DevLauncher.d.ts",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"homepage": "https://docs.expo.dev",
|
|
32
32
|
"dependencies": {
|
|
33
33
|
"ajv": "8.11.0",
|
|
34
|
-
"expo-dev-menu": "5.0.
|
|
34
|
+
"expo-dev-menu": "5.0.1",
|
|
35
35
|
"expo-manifests": "~0.14.0",
|
|
36
36
|
"resolve-from": "^5.0.0",
|
|
37
37
|
"semver": "^7.6.0"
|
|
@@ -66,5 +66,5 @@
|
|
|
66
66
|
"./setupTests.ts"
|
|
67
67
|
]
|
|
68
68
|
},
|
|
69
|
-
"gitHead": "
|
|
69
|
+
"gitHead": "75658dcbae535ec32cbb296de1c811eba059e03a"
|
|
70
70
|
}
|
|
@@ -1,286 +0,0 @@
|
|
|
1
|
-
package expo.modules.devlauncher.rncompatibility
|
|
2
|
-
|
|
3
|
-
import android.content.Context
|
|
4
|
-
import android.os.Handler
|
|
5
|
-
import android.os.Looper
|
|
6
|
-
import android.util.Log
|
|
7
|
-
import android.widget.Toast
|
|
8
|
-
import com.facebook.common.logging.FLog
|
|
9
|
-
import com.facebook.debug.holder.PrinterHolder
|
|
10
|
-
import com.facebook.debug.tags.ReactDebugOverlayTags
|
|
11
|
-
import com.facebook.infer.annotation.Assertions
|
|
12
|
-
import com.facebook.react.R
|
|
13
|
-
import com.facebook.react.bridge.JSBundleLoader
|
|
14
|
-
import com.facebook.react.bridge.JavaJSExecutor
|
|
15
|
-
import com.facebook.react.bridge.ReactMarker
|
|
16
|
-
import com.facebook.react.bridge.ReactMarkerConstants
|
|
17
|
-
import com.facebook.react.bridge.UiThreadUtil
|
|
18
|
-
import com.facebook.react.common.ReactConstants
|
|
19
|
-
import com.facebook.react.common.futures.SimpleSettableFuture
|
|
20
|
-
import com.facebook.react.devsupport.DevLauncherInternalSettingsWrapper
|
|
21
|
-
import com.facebook.react.devsupport.DevSupportManagerBase
|
|
22
|
-
import com.facebook.react.devsupport.HMRClient
|
|
23
|
-
import com.facebook.react.devsupport.ReactInstanceDevHelper
|
|
24
|
-
import com.facebook.react.devsupport.WebsocketJavaScriptExecutor
|
|
25
|
-
import com.facebook.react.devsupport.WebsocketJavaScriptExecutor.JSExecutorConnectCallback
|
|
26
|
-
import com.facebook.react.devsupport.interfaces.DevBundleDownloadListener
|
|
27
|
-
import com.facebook.react.devsupport.interfaces.DevSplitBundleCallback
|
|
28
|
-
import com.facebook.react.devsupport.interfaces.RedBoxHandler
|
|
29
|
-
import com.facebook.react.packagerconnection.RequestHandler
|
|
30
|
-
import expo.modules.devlauncher.DevLauncherController
|
|
31
|
-
import expo.modules.devlauncher.koin.DevLauncherKoinComponent
|
|
32
|
-
import expo.modules.devlauncher.koin.optInject
|
|
33
|
-
import expo.modules.devlauncher.launcher.DevLauncherControllerInterface
|
|
34
|
-
import expo.modules.devlauncher.launcher.errors.DevLauncherAppError
|
|
35
|
-
import expo.modules.devlauncher.launcher.errors.DevLauncherErrorActivity
|
|
36
|
-
|
|
37
|
-
import java.io.File
|
|
38
|
-
import java.io.IOException
|
|
39
|
-
import java.util.concurrent.ExecutionException
|
|
40
|
-
import java.util.concurrent.TimeUnit
|
|
41
|
-
import java.util.concurrent.TimeoutException
|
|
42
|
-
|
|
43
|
-
class DevLauncherDevSupportManager(
|
|
44
|
-
applicationContext: Context?,
|
|
45
|
-
val reactInstanceManagerHelper: ReactInstanceDevHelper?,
|
|
46
|
-
packagerPathForJSBundleName: String?,
|
|
47
|
-
enableOnCreate: Boolean,
|
|
48
|
-
redBoxHandler: RedBoxHandler?,
|
|
49
|
-
devBundleDownloadListener: DevBundleDownloadListener?,
|
|
50
|
-
minNumShakes: Int,
|
|
51
|
-
customPackagerCommandHandlers: MutableMap<String, RequestHandler>?
|
|
52
|
-
) : DevSupportManagerBase(
|
|
53
|
-
applicationContext,
|
|
54
|
-
reactInstanceManagerHelper,
|
|
55
|
-
packagerPathForJSBundleName,
|
|
56
|
-
enableOnCreate,
|
|
57
|
-
redBoxHandler,
|
|
58
|
-
devBundleDownloadListener,
|
|
59
|
-
minNumShakes,
|
|
60
|
-
customPackagerCommandHandlers,
|
|
61
|
-
null,
|
|
62
|
-
null
|
|
63
|
-
),
|
|
64
|
-
DevLauncherKoinComponent {
|
|
65
|
-
private val controller: DevLauncherControllerInterface? by optInject()
|
|
66
|
-
|
|
67
|
-
// copied from https://github.com/facebook/react-native/blob/aa4da248c12e3ba41ecc9f1c547b21c208d9a15f/ReactAndroid/src/main/java/com/facebook/react/devsupport/BridgeDevSupportManager.java#L65
|
|
68
|
-
private var mIsSamplingProfilerEnabled = false
|
|
69
|
-
private val devSettings: DevLauncherInternalSettingsWrapper = DevLauncherInternalSettingsWrapper(getDevSettings())
|
|
70
|
-
|
|
71
|
-
// copied from https://github.com/facebook/react-native/blob/aa4da248c12e3ba41ecc9f1c547b21c208d9a15f/ReactAndroid/src/main/java/com/facebook/react/devsupport/BridgeDevSupportManager.java#L88-L128
|
|
72
|
-
init {
|
|
73
|
-
if (devSettings.isStartSamplingProfilerOnInit) {
|
|
74
|
-
// Only start the profiler. If its already running, there is an error
|
|
75
|
-
if (!mIsSamplingProfilerEnabled) {
|
|
76
|
-
toggleJSSamplingProfiler()
|
|
77
|
-
} else {
|
|
78
|
-
Toast.makeText(
|
|
79
|
-
applicationContext,
|
|
80
|
-
"JS Sampling Profiler was already running, so did not start the sampling profiler",
|
|
81
|
-
Toast.LENGTH_LONG
|
|
82
|
-
)
|
|
83
|
-
.show()
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
addCustomDevOption(
|
|
88
|
-
applicationContext!!.getString(R.string.catalyst_sample_profiler_toggle)
|
|
89
|
-
) { toggleJSSamplingProfiler() }
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
override fun showNewJavaError(message: String?, e: Throwable) {
|
|
93
|
-
Log.e("DevLauncher", "$message", e)
|
|
94
|
-
if (!DevLauncherController.wasInitialized()) {
|
|
95
|
-
Log.e("DevLauncher", "DevLauncher wasn't initialized. Couldn't intercept native error handling.")
|
|
96
|
-
super.showNewJavaError(message, e)
|
|
97
|
-
return
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
val activity = reactInstanceManagerHelper?.currentActivity
|
|
101
|
-
if (activity == null || activity.isFinishing || activity.isDestroyed) {
|
|
102
|
-
return
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
controller?.onAppLoadedWithError()
|
|
106
|
-
DevLauncherErrorActivity.showError(activity, DevLauncherAppError(message, e))
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
// copied from https://github.com/facebook/react-native/blob/aa4da248c12e3ba41ecc9f1c547b21c208d9a15f/ReactAndroid/src/main/java/com/facebook/react/devsupport/BridgeDevSupportManager.java#L131-L134
|
|
110
|
-
override fun getUniqueTag() = "DevLauncherApp - Bridge"
|
|
111
|
-
|
|
112
|
-
// copied from https://github.com/facebook/react-native/blob/aa4da248c12e3ba41ecc9f1c547b21c208d9a15f/ReactAndroid/src/main/java/com/facebook/react/devsupport/BridgeDevSupportManager.java#L136-L156
|
|
113
|
-
override fun loadSplitBundleFromServer(
|
|
114
|
-
bundlePath: String?,
|
|
115
|
-
callback: DevSplitBundleCallback
|
|
116
|
-
) {
|
|
117
|
-
fetchSplitBundleAndCreateBundleLoader(
|
|
118
|
-
bundlePath,
|
|
119
|
-
object : CallbackWithBundleLoader {
|
|
120
|
-
override fun onSuccess(bundleLoader: JSBundleLoader) {
|
|
121
|
-
bundleLoader.loadScript(currentContext!!.catalystInstance)
|
|
122
|
-
var bundleURL = controller?.manifest?.getBundleURL() ?: devServerHelper.getDevServerSplitBundleURL(bundlePath)
|
|
123
|
-
currentContext!!
|
|
124
|
-
.getJSModule(HMRClient::class.java)
|
|
125
|
-
.registerBundle(bundleURL)
|
|
126
|
-
callback.onSuccess()
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
override fun onError(url: String, cause: Throwable) {
|
|
130
|
-
callback.onError(url, cause)
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
)
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
override fun startInspector() {
|
|
137
|
-
// no-op for the default `startInspector` which would be implicitly called
|
|
138
|
-
// right after `ReactInstanceManager` construction.
|
|
139
|
-
// For dev-launcher, we should inject the correct dev server address and
|
|
140
|
-
// call our customized `startInspectorWhenDevLauncherReady`.
|
|
141
|
-
// Check `DevLauncherReactUtils.injectReactInterceptor()` for details.
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
fun startInspectorWhenDevLauncherReady() {
|
|
145
|
-
super.startInspector()
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
// copied from https://github.com/facebook/react-native/blob/aa4da248c12e3ba41ecc9f1c547b21c208d9a15f/ReactAndroid/src/main/java/com/facebook/react/devsupport/BridgeDevSupportManager.java#L158-L165
|
|
149
|
-
private fun getExecutorConnectCallback(
|
|
150
|
-
future: SimpleSettableFuture<Boolean>
|
|
151
|
-
): JSExecutorConnectCallback {
|
|
152
|
-
return object : JSExecutorConnectCallback {
|
|
153
|
-
override fun onSuccess() {
|
|
154
|
-
future.set(true)
|
|
155
|
-
hideDevLoadingView()
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
override fun onFailure(cause: Throwable) {
|
|
159
|
-
hideDevLoadingView()
|
|
160
|
-
FLog.e(ReactConstants.TAG, "Failed to connect to debugger!", cause)
|
|
161
|
-
future.setException(
|
|
162
|
-
IOException(
|
|
163
|
-
applicationContext.getString(R.string.catalyst_debug_error),
|
|
164
|
-
cause
|
|
165
|
-
)
|
|
166
|
-
)
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
// copied from https://github.com/facebook/react-native/blob/aa4da248c12e3ba41ecc9f1c547b21c208d9a15f/ReactAndroid/src/main/java/com/facebook/react/devsupport/BridgeDevSupportManager.java#L179-L204
|
|
172
|
-
private fun reloadJSInProxyMode() {
|
|
173
|
-
// When using js proxy, there is no need to fetch JS bundle as proxy executor will do that
|
|
174
|
-
// anyway
|
|
175
|
-
devServerHelper.launchJSDevtools()
|
|
176
|
-
val factory = JavaJSExecutor.Factory {
|
|
177
|
-
val executor = WebsocketJavaScriptExecutor()
|
|
178
|
-
val future = SimpleSettableFuture<Boolean>()
|
|
179
|
-
executor.connect(
|
|
180
|
-
devServerHelper.websocketProxyURL,
|
|
181
|
-
getExecutorConnectCallback(future)
|
|
182
|
-
)
|
|
183
|
-
// TODO(t9349129) Don't use timeout
|
|
184
|
-
try {
|
|
185
|
-
future[90, TimeUnit.SECONDS]
|
|
186
|
-
return@Factory executor
|
|
187
|
-
} catch (e: ExecutionException) {
|
|
188
|
-
throw (e.cause as Exception)
|
|
189
|
-
} catch (e: InterruptedException) {
|
|
190
|
-
throw RuntimeException(e)
|
|
191
|
-
} catch (e: TimeoutException) {
|
|
192
|
-
throw RuntimeException(e)
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
reactInstanceDevHelper.onReloadWithJSDebugger(factory)
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
// copied from https://github.com/facebook/react-native/blob/aa4da248c12e3ba41ecc9f1c547b21c208d9a15f/ReactAndroid/src/main/java/com/facebook/react/devsupport/BridgeDevSupportManager.java#L206-L231
|
|
199
|
-
override fun handleReloadJS() {
|
|
200
|
-
UiThreadUtil.assertOnUiThread()
|
|
201
|
-
ReactMarker.logMarker(
|
|
202
|
-
ReactMarkerConstants.RELOAD,
|
|
203
|
-
devSettings.packagerConnectionSettings.debugServerHost
|
|
204
|
-
)
|
|
205
|
-
|
|
206
|
-
// dismiss redbox if exists
|
|
207
|
-
hideRedboxDialog()
|
|
208
|
-
if (devSettings.isRemoteJSDebugEnabled) {
|
|
209
|
-
PrinterHolder.getPrinter()
|
|
210
|
-
.logMessage(ReactDebugOverlayTags.RN_CORE, "RNCore: load from Proxy")
|
|
211
|
-
showDevLoadingViewForRemoteJSEnabled()
|
|
212
|
-
reloadJSInProxyMode()
|
|
213
|
-
} else {
|
|
214
|
-
PrinterHolder.getPrinter()
|
|
215
|
-
.logMessage(ReactDebugOverlayTags.RN_CORE, "RNCore: load from Server")
|
|
216
|
-
val bundleURL = controller?.manifest?.getBundleURL() ?: devServerHelper
|
|
217
|
-
.getDevServerBundleURL(Assertions.assertNotNull(jsAppBundleName))
|
|
218
|
-
reloadJSFromServer(bundleURL)
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
// copied from https://github.com/facebook/react-native/blob/aa4da248c12e3ba41ecc9f1c547b21c208d9a15f/ReactAndroid/src/main/java/com/facebook/react/devsupport/BridgeDevSupportManager.java#L233-L277
|
|
223
|
-
/** Starts of stops the sampling profiler */
|
|
224
|
-
private fun toggleJSSamplingProfiler() {
|
|
225
|
-
val handler = Handler(Looper.getMainLooper())
|
|
226
|
-
val javaScriptExecutorFactory = reactInstanceDevHelper.javaScriptExecutorFactory
|
|
227
|
-
if (!mIsSamplingProfilerEnabled) {
|
|
228
|
-
try {
|
|
229
|
-
javaScriptExecutorFactory.startSamplingProfiler()
|
|
230
|
-
handler.post {
|
|
231
|
-
Toast.makeText(applicationContext, "Starting Sampling Profiler", Toast.LENGTH_SHORT)
|
|
232
|
-
.show()
|
|
233
|
-
}
|
|
234
|
-
} catch (e: UnsupportedOperationException) {
|
|
235
|
-
handler.post {
|
|
236
|
-
Toast.makeText(
|
|
237
|
-
applicationContext,
|
|
238
|
-
javaScriptExecutorFactory.toString() + " does not support Sampling Profiler",
|
|
239
|
-
Toast.LENGTH_LONG
|
|
240
|
-
)
|
|
241
|
-
.show()
|
|
242
|
-
}
|
|
243
|
-
} finally {
|
|
244
|
-
mIsSamplingProfilerEnabled = true
|
|
245
|
-
}
|
|
246
|
-
} else {
|
|
247
|
-
try {
|
|
248
|
-
val outputPath: String = File.createTempFile(
|
|
249
|
-
"sampling-profiler-trace",
|
|
250
|
-
".cpuprofile",
|
|
251
|
-
applicationContext.cacheDir
|
|
252
|
-
).path
|
|
253
|
-
javaScriptExecutorFactory.stopSamplingProfiler(outputPath)
|
|
254
|
-
handler.post {
|
|
255
|
-
Toast.makeText(
|
|
256
|
-
applicationContext,
|
|
257
|
-
"Saved results from Profiler to $outputPath",
|
|
258
|
-
Toast.LENGTH_LONG
|
|
259
|
-
)
|
|
260
|
-
.show()
|
|
261
|
-
}
|
|
262
|
-
} catch (e: IOException) {
|
|
263
|
-
FLog.e(
|
|
264
|
-
ReactConstants.TAG,
|
|
265
|
-
"Could not create temporary file for saving results from Sampling Profiler",
|
|
266
|
-
e
|
|
267
|
-
)
|
|
268
|
-
} catch (e: UnsupportedOperationException) {
|
|
269
|
-
handler.post {
|
|
270
|
-
Toast.makeText(
|
|
271
|
-
applicationContext,
|
|
272
|
-
javaScriptExecutorFactory.toString() + " does not support Sampling Profiler",
|
|
273
|
-
Toast.LENGTH_LONG
|
|
274
|
-
)
|
|
275
|
-
.show()
|
|
276
|
-
}
|
|
277
|
-
} finally {
|
|
278
|
-
mIsSamplingProfilerEnabled = false
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
companion object {
|
|
284
|
-
fun getDevHelperInternalFieldName() = "mReactInstanceDevHelper"
|
|
285
|
-
}
|
|
286
|
-
}
|