解决ReactNative崩溃:Can't find variable: __fbBatchedBri
这个坑我花了两天时间才爬出来!!首先关于这个问题,甭管google、百度还是看issue,大都给的解决方案是 通过以上途径,如果解决了这个问题,恭喜你!那么这种情况下通常会紧跟一个——但是!
意思是在debug的编译模式下bundleDebugJsAndAssets会默认被skipped,但为什么我执行项目的assembleDebug执行的却是bundleReleaseJsAndAssets而不是bundleDebugJsAndAssets,而且竟然被skipped了? OK!那么接下来的矛盾重点就集中在library/application上了。同样的代码在library和application中竟然两种执行结果,要解决这个问题只能深入到源码中查找答案。不过,这里我还不想讲RN解剖查看实现原理,只想了解ReactActivity的执行流程。好在RN提供了另一种页面实现方式,可以直接继承Activity,只需要实现DefaultHardwareBackBtnHandler接口即可。查看ReactActivity的代码,发现其实它就是这个套路。那么走起~ @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mRootView = new ReactRootView(this);
mManager = ReactInstanceManager.builder()
.setApplication(getApplication())
.setBundleAssetName("index.android.bundle")
.setJSMainModuleName("index.android")
.addPackage(new MainReactPackage())
.setUseDeveloperSupport(BuildConfig.DEBUG)
.setInitialLifecycleState(LifecycleState.RESUMED)
.build();
mRootView.startReactApplication(mManager,"WubaRNProV2",null);
setContentView(mRootView);
}
不出所料,启动这个Activity依然报java.lang.RuntimeException: ReferenceError: Can’t find variable: __fbBatchedBridge并crash,然后挪到application module下,启动,通过。这起码说明代码是没问题的。 public static final boolean DEBUG = Boolean.parseBoolean("true");
看上去也是true,没问题啊。算了!不管这么多了,直接把library module中的Activity中调用setUseDeveloperSupport的值改为true试试。结果,竟然执行通过了!看来找到了元凶。也就是说,虽然执行的是assembleDebug,但library module中BuildConfig.DEBUG其实是false。google后发现library在编译aar过程中其实执行的是release模式。这也印证了上面说的为什么执行的是bundleReleaseJsAndAssets而不是bundleDebugJsAndAssets。那么理论上修改gradle将libray module编译模式改成debug应该能解决这个问题。说干就干。 android {
publishNonDefault true
}
依赖WubaRNLib的module dependencies {
releaseCompile project(path: ':WubaRNLib',configuration: 'release')
debugCompile project(path: ':WubaRNLib',configuration: 'debug')
}
编译,运行,通过! 总结下,解决这个问题主要是用最传统也往往最能解决问题的二分大法,再加上一些直觉。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |