React Native系统App因WebView权限问题崩溃的解决方案咨询
React Native WebRTC应用转为系统应用后fetch调用崩溃问题解决
问题背景
使用React Native开发的WebRTC应用,在配置android:sharedUserId="android.uid.system"转为系统应用后出现崩溃,普通应用模式下可正常运行。
崩溃日志
03-28 15:39:13.467 7273 7613 E AndroidRuntime: FATAL EXCEPTION: OkHttp Dispatcher 03-28 15:39:13.467 7273 7613 E AndroidRuntime: Process: com.daxiaoipc, PID: 7273 03-28 15:39:13.467 7273 7613 E AndroidRuntime: java.lang.UnsupportedOperationException: For security reasons, WebView is not allowed in privileged processes 03-28 15:39:13.467 7273 7613 E AndroidRuntime: at android.webkit.WebViewFactory.getProvider(WebViewFactory.java:236) 03-28 15:39:13.467 7273 7613 E AndroidRuntime: at android.webkit.CookieManager.getInstance(CookieManager.java:47) 03-28 15:39:13.467 7273 7613 E AndroidRuntime: at com.facebook.react.modules.network.ForwardingCookieHandler.getCookieManager(ForwardingCookieHandler.java:136) 03-28 15:39:13.467 7273 7613 E AndroidRuntime: at com.facebook.react.modules.network.ForwardingCookieHandler.get(ForwardingCookieHandler.java:53) 03-28 15:39:13.467 7273 7613 E AndroidRuntime: at okhttp3.JavaNetCookieJar.loadForRequest(JavaNetCookieJar.kt:47) 03-28 15:39:13.467 7273 7613 E AndroidRuntime: at com.facebook.react.modules.network.ReactCookieJarContainer.loadForRequest(ReactCookieJarContainer.java:44) 03-28 15:39:13.467 7273 7613 E AndroidRuntime: at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.kt:74) 03-28 15:39:13.467 7273 7613 E AndroidRuntime: at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109) 03-28 15:39:13.467 7273 7613 E AndroidRuntime: at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.kt:76) 03-28 15:39:13.467 7273 7613 E AndroidRuntime: at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109) 03-28 15:39:13.467 7273 7613 E AndroidRuntime: at okhttp3.internal.connection.RealCall.getResponseWithInterceptorChain$okhttp(RealCall.kt:201) 03-28 15:39:13.467 7273 7613 E AndroidRuntime: at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:517) 03-28 15:39:13.467 7273 7613 E AndroidRuntime: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 03-28 15:39:13.467 7273 7613 E AndroidRuntime: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 03-28 15:39:13.467 7273 7613 E AndroidRuntime: at java.lang.Thread.run(Thread.java:919)
已知情况
- 崩溃由fetch调用触发,调用链:
fetch→okhttp3→webkit→WebView - 项目未直接使用WebView,基于Android 10,依赖react-native与react-native-webrtc
原因分析
Android系统出于安全考虑,禁止特权进程(如配置了android.uid.system的系统应用)使用WebView。而React Native默认网络模块通过ForwardingCookieHandler调用CookieManager.getInstance(),该方法内部会初始化WebView相关组件,从而触发系统的安全限制导致崩溃。
解决方法
方法一:替换默认CookieJar,避免依赖WebView的CookieManager
- 创建内存存储的自定义CookieJar实现:
import okhttp3.Cookie; import okhttp3.CookieJar; import okhttp3.HttpUrl; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class MemoryCookieJar implements CookieJar { private final Map<String, List<Cookie>> cookieStore = new HashMap<>(); @Override public void saveFromResponse(HttpUrl url, List<Cookie> cookies) { cookieStore.put(url.host(), cookies); } @Override public List<Cookie> loadForRequest(HttpUrl url) { List<Cookie> cookies = cookieStore.get(url.host()); return cookies != null ? cookies : new ArrayList<>(); } }
- 在
MainApplication.java中替换默认OkHttpClient:
import com.facebook.react.modules.network.OkHttpClientProvider; import okhttp3.OkHttpClient; @Override public void onCreate() { super.onCreate(); OkHttpClient customClient = OkHttpClientProvider.createClientBuilder() .cookieJar(new MemoryCookieJar()) .build(); OkHttpClientProvider.replaceOkHttpClient(customClient); }
方法二:禁用Cookie处理(业务无需Cookie时使用)
如果应用不需要处理Cookie,可直接设置空的CookieHandler:
import java.net.CookieHandler; @Override public void onCreate() { super.onCreate(); CookieHandler.setDefault(new CookieHandler() {}); }
方法三:修改React Native源码(不推荐)
修改ForwardingCookieHandler的getCookieManager方法,避免调用CookieManager.getInstance(),但这种方式会导致后续React Native版本升级困难,仅在其他方法不适用时考虑。
内容的提问来源于stack exchange,提问作者Jim Jin
相关产品推荐
相关产品推荐

