React Native适配AndroidX出现IllegalAccessError错误该如何解决?
Caused by: java.lang.IllegalAccessError: Method 'void androidx.core.net.ConnectivityManagerCompat.()' is inaccessible to class 'com.facebook.react.modules.netinfo.NetInfoModule' (declaration of 'com.facebook.react.modules.netinfo.NetInfoModule' appears in base.apk)
该错误是AndroidX核心库版本与React Native内置NetInfo模块不兼容导致的,具体触发逻辑如下:
- 适配AndroidX时引入了
1.1.0及以上版本的androidx.core:core依赖,该版本中ConnectivityManagerCompat的无参构造方法被调整为包私有,不允许外部类直接调用 - 当前使用的低于0.60版本的React Native核心库内置了
NetInfoModule模块,该模块的实现仍然尝试实例化ConnectivityManagerCompat,触发了访问权限异常 - 从React Native 0.60版本开始,官方已经将NetInfo从核心库中剥离,交由社区独立维护,旧版本内置的NetInfo实现不再适配新的AndroidX接口变更,是该问题的根因。
按兼容性和长期维护性优先级从高到低排列:
方案1:替换内置NetInfo为官方社区维护版本
首先安装独立的NetInfo社区包:npm install @react-native-community/netinfo --save # 或使用yarn yarn add @react-native-community/netinfo之后把项目中所有从
react-native导入NetInfo的代码,全部替换为从新包导入即可:
把import { NetInfo } from 'react-native'修改为import NetInfo from '@react-native-community/netinfo'
该方案是官方推荐的长期解决方案,后续不会出现同类兼容性问题。方案2:临时锁定AndroidX core库的兼容版本
如果暂时不想改动业务代码,可以在android/app/build.gradle中强制指定androidx.core:core的版本为兼容旧NetInfo实现的版本,在dependencies代码块外添加如下配置:configurations.all { resolutionStrategy.force 'androidx.core:core:1.0.0' }1.0.0版本的
ConnectivityManagerCompat构造方法仍为公开状态,不会触发访问错误。注意该方案为临时兼容方案,后续升级其他Android依赖可能会触发新的兼容性冲突。方案3:升级React Native到0.60+稳定版本
React Native 0.60及以上版本默认支持AndroidX,且已经移除了核心库中的NetInfo模块,升级后配合使用独立的社区NetInfo包即可彻底解决该问题,适合项目整体迭代升级的场景。
内容的提问来源于stack exchange,提问作者MULI_FREEDOM

