Skip to content

Commit

Permalink
strip devsupport from prod builds
Browse files Browse the repository at this point in the history
Reviewed By: zen

Differential Revision: D2912192

fb-gh-sync-id: ff89fc16dcd86481657197055e31d2b67a94e7ea
shipit-source-id: ff89fc16dcd86481657197055e31d2b67a94e7ea
  • Loading branch information
foghina authored and facebook-github-bot-7 committed Feb 11, 2016
1 parent 8e9b70a commit 8720d4b
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,7 @@
import com.facebook.react.common.annotations.VisibleForTesting;
import com.facebook.react.devsupport.DevServerHelper;
import com.facebook.react.devsupport.DevSupportManager;
import com.facebook.react.devsupport.DevSupportManagerImpl;
import com.facebook.react.devsupport.DisabledDevSupportManager;
import com.facebook.react.devsupport.DevSupportManagerFactory;
import com.facebook.react.devsupport.ReactInstanceDevCommandsHandler;
import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
import com.facebook.react.modules.core.DeviceEventManagerModule;
Expand Down Expand Up @@ -275,15 +274,11 @@ public T get() throws Exception {
mJSMainModuleName = jsMainModuleName;
mPackages = packages;
mUseDeveloperSupport = useDeveloperSupport;
if (mUseDeveloperSupport) {
mDevSupportManager = new DevSupportManagerImpl(
applicationContext,
mDevInterface,
mJSMainModuleName,
useDeveloperSupport);
} else {
mDevSupportManager = new DisabledDevSupportManager();
}
mDevSupportManager = DevSupportManagerFactory.create(
applicationContext,
mDevInterface,
mJSMainModuleName,
useDeveloperSupport);
mBridgeIdleDebugListener = bridgeIdleDebugListener;
mLifecycleState = initialLifecycleState;
mUIImplementationProvider = uiImplementationProvider;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package com.facebook.react.devsupport;

import javax.annotation.Nullable;

import java.lang.reflect.Constructor;

import android.content.Context;
import android.util.Log;

import com.facebook.react.common.ReactConstants;
import com.facebook.react.common.build.ReactBuildConfig;

/**
* A simple factory that creates instances of {@link DevSupportManager} implementations. Uses
* reflection to create DevSupportManagerImpl if it exists. This allows ProGuard to strip that class
* and its dependencies in release builds. If the class isn't found,
* {@link DisabledDevSupportManager} is returned instead.
*/
public class DevSupportManagerFactory {

private static final String DEVSUPPORT_IMPL_PACKAGE = "com.facebook.react.devsupport";
private static final String DEVSUPPORT_IMPL_CLASS = "DevSupportManagerImpl";

public static DevSupportManager create(
Context applicationContext,
ReactInstanceDevCommandsHandler reactInstanceCommandsHandler,
@Nullable String packagerPathForJSBundleName,
boolean enableOnCreate) {
if (!enableOnCreate) {
return new DisabledDevSupportManager();
}
try {
// ProGuard is surprisingly smart in this case and will keep a class if it detects a call to
// Class.forName() with a static string. So instead we generate a quasi-dynamic string to
// confuse it.
String className =
new StringBuilder(DEVSUPPORT_IMPL_PACKAGE)
.append(".")
.append(DEVSUPPORT_IMPL_CLASS)
.toString();
Class<?> devSupportManagerClass =
Class.forName(className);
Constructor constructor =
devSupportManagerClass.getConstructor(
Context.class,
ReactInstanceDevCommandsHandler.class,
String.class,
boolean.class);
return (DevSupportManager) constructor.newInstance(
applicationContext,
reactInstanceCommandsHandler,
packagerPathForJSBundleName,
true);
} catch (Exception e) {
throw new RuntimeException(
"Requested enabled DevSupportManager, but DevSupportManagerImpl class was not found" +
" or could not be created",
e);
}
}

}

0 comments on commit 8720d4b

Please sign in to comment.