mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
Delete Start/Stop Profiler from Dev Menu in Android
Reviewed By: mdvacca Differential Revision: D10473627 fbshipit-source-id: eec61903f0a7abd0757aed0750d4bd828e4887bc
This commit is contained in:
committed by
Facebook Github Bot
parent
7fb02bd908
commit
060a3ea3bf
@@ -10,9 +10,8 @@ package com.facebook.react;
|
||||
import com.facebook.react.bridge.ModuleSpec;
|
||||
import com.facebook.react.bridge.NativeModule;
|
||||
import com.facebook.react.bridge.ReactApplicationContext;
|
||||
import com.facebook.react.devsupport.JSCSamplingProfiler;
|
||||
import com.facebook.react.devsupport.JSDevSupport;
|
||||
import com.facebook.react.devsupport.JSCHeapCapture;
|
||||
import com.facebook.react.devsupport.JSDevSupport;
|
||||
import com.facebook.react.module.annotations.ReactModuleList;
|
||||
import com.facebook.react.module.model.ReactModuleInfoProvider;
|
||||
import java.util.ArrayList;
|
||||
@@ -27,7 +26,6 @@ import javax.inject.Provider;
|
||||
@ReactModuleList(
|
||||
nativeModules = {
|
||||
JSCHeapCapture.class,
|
||||
JSCSamplingProfiler.class,
|
||||
JSDevSupport.class,
|
||||
}
|
||||
)
|
||||
@@ -48,15 +46,6 @@ import javax.inject.Provider;
|
||||
return new JSCHeapCapture(reactContext);
|
||||
}
|
||||
}));
|
||||
moduleSpecList.add(
|
||||
ModuleSpec.nativeModuleSpec(
|
||||
JSCSamplingProfiler.class,
|
||||
new Provider<NativeModule>() {
|
||||
@Override
|
||||
public NativeModule get() {
|
||||
return new JSCSamplingProfiler(reactContext);
|
||||
}
|
||||
}));
|
||||
return moduleSpecList;
|
||||
}
|
||||
|
||||
|
||||
+1
-66
@@ -150,39 +150,6 @@ public class DevSupportManagerImpl implements
|
||||
|
||||
private @Nullable Map<String, RequestHandler> mCustomPackagerCommandHandlers;
|
||||
|
||||
private static class JscProfileTask extends AsyncTask<String, Void, Void> {
|
||||
private static final MediaType JSON =
|
||||
MediaType.parse("application/json; charset=utf-8");
|
||||
|
||||
private final String mSourceUrl;
|
||||
|
||||
private JscProfileTask(String sourceUrl) {
|
||||
mSourceUrl = sourceUrl;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Void doInBackground(String... jsonData) {
|
||||
try {
|
||||
String jscProfileUrl =
|
||||
Uri.parse(mSourceUrl).buildUpon()
|
||||
.path("/jsc-profile")
|
||||
.query(null)
|
||||
.build()
|
||||
.toString();
|
||||
OkHttpClient client = new OkHttpClient();
|
||||
for (String json: jsonData) {
|
||||
RequestBody body = RequestBody.create(JSON, json);
|
||||
Request request =
|
||||
new Request.Builder().url(jscProfileUrl).post(body).build();
|
||||
client.newCall(request).execute();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
FLog.e(ReactConstants.TAG, "Failed not talk to server", e);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public DevSupportManagerImpl(
|
||||
Context applicationContext,
|
||||
ReactInstanceManagerDevHelper reactInstanceManagerHelper,
|
||||
@@ -467,10 +434,8 @@ public class DevSupportManagerImpl implements
|
||||
}
|
||||
});
|
||||
if (mDevSettings.isNuclideJSDebugEnabled()) {
|
||||
// The concatenation is applied directly here because XML isn't emoji-friendly
|
||||
String nuclideJsDebugMenuItemTitle =
|
||||
mApplicationContext.getString(R.string.catalyst_debugjs_nuclide)
|
||||
+ EMOJI_HUNDRED_POINTS_SYMBOL;
|
||||
mApplicationContext.getString(R.string.catalyst_debugjs_nuclide);
|
||||
options.put(
|
||||
nuclideJsDebugMenuItemTitle,
|
||||
new DevOptionHandler() {
|
||||
@@ -484,9 +449,6 @@ public class DevSupportManagerImpl implements
|
||||
mDevSettings.isRemoteJSDebugEnabled()
|
||||
? mApplicationContext.getString(R.string.catalyst_debugjs_off)
|
||||
: mApplicationContext.getString(R.string.catalyst_debugjs);
|
||||
if (mDevSettings.isNuclideJSDebugEnabled()) {
|
||||
remoteJsDebugMenuItemTitle += EMOJI_FACE_WITH_NO_GOOD_GESTURE;
|
||||
}
|
||||
options.put(
|
||||
remoteJsDebugMenuItemTitle,
|
||||
new DevOptionHandler() {
|
||||
@@ -549,14 +511,6 @@ public class DevSupportManagerImpl implements
|
||||
mDevSettings.setFpsDebugEnabled(!mDevSettings.isFpsDebugEnabled());
|
||||
}
|
||||
});
|
||||
options.put(
|
||||
mApplicationContext.getString(R.string.catalyst_poke_sampling_profiler),
|
||||
new DevOptionHandler() {
|
||||
@Override
|
||||
public void onOptionSelected() {
|
||||
handlePokeSamplingProfiler();
|
||||
}
|
||||
});
|
||||
options.put(
|
||||
mApplicationContext.getString(R.string.catalyst_settings), new DevOptionHandler() {
|
||||
@Override
|
||||
@@ -878,25 +832,6 @@ public class DevSupportManagerImpl implements
|
||||
});
|
||||
}
|
||||
|
||||
private void handlePokeSamplingProfiler() {
|
||||
try {
|
||||
List<String> pokeResults = JSCSamplingProfiler.poke(60000);
|
||||
for (String result : pokeResults) {
|
||||
Toast.makeText(
|
||||
mCurrentContext,
|
||||
result == null
|
||||
? "Started JSC Sampling Profiler"
|
||||
: "Stopped JSC Sampling Profiler",
|
||||
Toast.LENGTH_LONG).show();
|
||||
new JscProfileTask(getSourceUrl()).executeOnExecutor(
|
||||
AsyncTask.THREAD_POOL_EXECUTOR,
|
||||
result);
|
||||
}
|
||||
} catch (JSCSamplingProfiler.ProfilerException e) {
|
||||
showNewJavaError(e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
|
||||
private void updateLastErrorInfo(
|
||||
@Nullable final String message,
|
||||
final StackFrame[] stack,
|
||||
|
||||
@@ -1,148 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
package com.facebook.react.devsupport;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
import com.facebook.react.bridge.JavaScriptModule;
|
||||
import com.facebook.react.bridge.ReactApplicationContext;
|
||||
import com.facebook.react.bridge.ReactContextBaseJavaModule;
|
||||
import com.facebook.react.bridge.ReactMethod;
|
||||
import com.facebook.react.module.annotations.ReactModule;
|
||||
|
||||
// This module is being called only by Java via the static method "poke" that
|
||||
// requires it to alreay be initialized, thus we eagerly initialize this module
|
||||
@ReactModule(name = "JSCSamplingProfiler", needsEagerInit = true)
|
||||
public class JSCSamplingProfiler extends ReactContextBaseJavaModule {
|
||||
public interface SamplingProfiler extends JavaScriptModule {
|
||||
void poke(int token);
|
||||
}
|
||||
|
||||
public static class ProfilerException extends Exception {
|
||||
ProfilerException(String message) {
|
||||
super(message);
|
||||
}
|
||||
}
|
||||
|
||||
private @Nullable SamplingProfiler mSamplingProfiler;
|
||||
private boolean mOperationInProgress;
|
||||
private int mOperationToken;
|
||||
private @Nullable String mOperationError;
|
||||
private @Nullable String mSamplingProfilerResult;
|
||||
|
||||
private static final HashSet<JSCSamplingProfiler> sRegisteredDumpers =
|
||||
new HashSet<>();
|
||||
|
||||
private static synchronized void registerSamplingProfiler(
|
||||
JSCSamplingProfiler dumper) {
|
||||
if (sRegisteredDumpers.contains(dumper)) {
|
||||
throw new RuntimeException(
|
||||
"a JSCSamplingProfiler registered more than once");
|
||||
}
|
||||
sRegisteredDumpers.add(dumper);
|
||||
}
|
||||
|
||||
private static synchronized void unregisterSamplingProfiler(
|
||||
JSCSamplingProfiler dumper) {
|
||||
sRegisteredDumpers.remove(dumper);
|
||||
}
|
||||
|
||||
public static synchronized List<String> poke(long timeout)
|
||||
throws ProfilerException {
|
||||
LinkedList<String> results = new LinkedList<>();
|
||||
if (sRegisteredDumpers.isEmpty()) {
|
||||
throw new ProfilerException("No JSC registered");
|
||||
}
|
||||
|
||||
for (JSCSamplingProfiler dumper : sRegisteredDumpers) {
|
||||
dumper.pokeHelper(timeout);
|
||||
results.add(dumper.mSamplingProfilerResult);
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
public JSCSamplingProfiler(ReactApplicationContext reactContext) {
|
||||
super(reactContext);
|
||||
mSamplingProfiler = null;
|
||||
mOperationInProgress = false;
|
||||
mOperationToken = 0;
|
||||
mOperationError = null;
|
||||
mSamplingProfilerResult = null;
|
||||
}
|
||||
|
||||
private synchronized void pokeHelper(long timeout) throws ProfilerException {
|
||||
if (mSamplingProfiler == null) {
|
||||
throw new ProfilerException("SamplingProfiler.js module not connected");
|
||||
}
|
||||
mSamplingProfiler.poke(getOperationToken());
|
||||
waitForOperation(timeout);
|
||||
}
|
||||
|
||||
private int getOperationToken() throws ProfilerException {
|
||||
if (mOperationInProgress) {
|
||||
throw new ProfilerException("Another operation already in progress.");
|
||||
}
|
||||
mOperationInProgress = true;
|
||||
return ++mOperationToken;
|
||||
}
|
||||
|
||||
private void waitForOperation(long timeout) throws ProfilerException {
|
||||
try {
|
||||
wait(timeout);
|
||||
} catch (InterruptedException e) {
|
||||
throw new ProfilerException(
|
||||
"Waiting for heap capture failed: " + e.getMessage());
|
||||
}
|
||||
|
||||
if (mOperationInProgress) {
|
||||
mOperationInProgress = false;
|
||||
throw new ProfilerException("heap capture timed out.");
|
||||
}
|
||||
|
||||
if (mOperationError != null) {
|
||||
throw new ProfilerException(mOperationError);
|
||||
}
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public synchronized void operationComplete(
|
||||
int token, String result, String error) {
|
||||
if (token == mOperationToken) {
|
||||
mOperationInProgress = false;
|
||||
mSamplingProfilerResult = result;
|
||||
mOperationError = error;
|
||||
this.notify();
|
||||
} else {
|
||||
throw new RuntimeException("Completed operation is not in progress.");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "JSCSamplingProfiler";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initialize() {
|
||||
super.initialize();
|
||||
mSamplingProfiler =
|
||||
getReactApplicationContext().getJSModule(SamplingProfiler.class);
|
||||
registerSamplingProfiler(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCatalystInstanceDestroy() {
|
||||
super.onCatalystInstanceDestroy();
|
||||
unregisterSamplingProfiler(this);
|
||||
mSamplingProfiler = null;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user