strip devsupport from prod builds
Reviewed By: zen Differential Revision: D2912192 fb-gh-sync-id: ff89fc16dcd86481657197055e31d2b67a94e7ea shipit-source-id: ff89fc16dcd86481657197055e31d2b67a94e7ea
This commit is contained in:
Родитель
8e9b70aa86
Коммит
8720d4bc76
|
@ -58,8 +58,7 @@ import com.facebook.react.common.ReactConstants;
|
||||||
import com.facebook.react.common.annotations.VisibleForTesting;
|
import com.facebook.react.common.annotations.VisibleForTesting;
|
||||||
import com.facebook.react.devsupport.DevServerHelper;
|
import com.facebook.react.devsupport.DevServerHelper;
|
||||||
import com.facebook.react.devsupport.DevSupportManager;
|
import com.facebook.react.devsupport.DevSupportManager;
|
||||||
import com.facebook.react.devsupport.DevSupportManagerImpl;
|
import com.facebook.react.devsupport.DevSupportManagerFactory;
|
||||||
import com.facebook.react.devsupport.DisabledDevSupportManager;
|
|
||||||
import com.facebook.react.devsupport.ReactInstanceDevCommandsHandler;
|
import com.facebook.react.devsupport.ReactInstanceDevCommandsHandler;
|
||||||
import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
|
import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
|
||||||
import com.facebook.react.modules.core.DeviceEventManagerModule;
|
import com.facebook.react.modules.core.DeviceEventManagerModule;
|
||||||
|
@ -275,15 +274,11 @@ import static com.facebook.react.bridge.ReactMarkerConstants.*;
|
||||||
mJSMainModuleName = jsMainModuleName;
|
mJSMainModuleName = jsMainModuleName;
|
||||||
mPackages = packages;
|
mPackages = packages;
|
||||||
mUseDeveloperSupport = useDeveloperSupport;
|
mUseDeveloperSupport = useDeveloperSupport;
|
||||||
if (mUseDeveloperSupport) {
|
mDevSupportManager = DevSupportManagerFactory.create(
|
||||||
mDevSupportManager = new DevSupportManagerImpl(
|
applicationContext,
|
||||||
applicationContext,
|
mDevInterface,
|
||||||
mDevInterface,
|
mJSMainModuleName,
|
||||||
mJSMainModuleName,
|
useDeveloperSupport);
|
||||||
useDeveloperSupport);
|
|
||||||
} else {
|
|
||||||
mDevSupportManager = new DisabledDevSupportManager();
|
|
||||||
}
|
|
||||||
mBridgeIdleDebugListener = bridgeIdleDebugListener;
|
mBridgeIdleDebugListener = bridgeIdleDebugListener;
|
||||||
mLifecycleState = initialLifecycleState;
|
mLifecycleState = initialLifecycleState;
|
||||||
mUIImplementationProvider = uiImplementationProvider;
|
mUIImplementationProvider = uiImplementationProvider;
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Загрузка…
Ссылка в новой задаче