对于app是系统级别的APP,如下设置的
android:sharedUserId=“android.uid.system”
遇到使用WebView出现下面的错误时
Process: com.alps.gamecenter, PID: 25495
android.view.InflateException: Binary XML file line #34: Binary XML file line #34: Error inflating class android.webkit.WebView
Caused by: android.view.InflateException: Binary XML file line #34: Error inflating class android.webkit.WebView
Caused by: java.lang.reflect.InvocationTargetException
34行我这里只有一个WebView,没有其他组件
查了很多资料,有说升级androidx.appcompat:appcompat:1.0.0到1.0.2版本,但我已经是1.5.0版本了,降级回去也不行的
解决办法
public static void hookWebView() {int sdkInt = Build.VERSION.SDK_INT;try {Class<?> factoryClass = Class.forName("android.webkit.WebViewFactory");Field field = factoryClass.getDeclaredField("sProviderInstance");field.setAccessible(true);Object sProviderInstance = field.get(null);if (sProviderInstance != null) {Log.i(TAG, "sProviderInstance isn't null");return;}Method getProviderClassMethod;if (sdkInt > 22) {getProviderClassMethod = factoryClass.getDeclaredMethod("getProviderClass");} else if (sdkInt == 22) {getProviderClassMethod = factoryClass.getDeclaredMethod("getFactoryClass");} else {Log.i(TAG, "Don't need to Hook WebView");return;}getProviderClassMethod.setAccessible(true);Class<?> factoryProviderClass = (Class<?>) getProviderClassMethod.invoke(factoryClass);Class<?> delegateClass = Class.forName("android.webkit.WebViewDelegate");Constructor<?> delegateConstructor = delegateClass.getDeclaredConstructor();delegateConstructor.setAccessible(true);if (sdkInt < 26) {//低于Android O版本Constructor<?> providerConstructor = factoryProviderClass.getConstructor(delegateClass);if (providerConstructor != null) {providerConstructor.setAccessible(true);sProviderInstance = providerConstructor.newInstance(delegateConstructor.newInstance());}} else {@SuppressLint("SoonBlockedPrivateApi") Field chromiumMethodName = factoryClass.getDeclaredField("CHROMIUM_WEBVIEW_FACTORY_METHOD");chromiumMethodName.setAccessible(true);String chromiumMethodNameStr = (String) chromiumMethodName.get(null);if (chromiumMethodNameStr == null) {chromiumMethodNameStr = "create";}Method staticFactory = factoryProviderClass.getMethod(chromiumMethodNameStr, delegateClass);if (staticFactory != null) {sProviderInstance = staticFactory.invoke(null, delegateConstructor.newInstance());}}if (sProviderInstance != null) {field.set("sProviderInstance", sProviderInstance);Log.i(TAG, "Hook success!");} else {Log.i(TAG, "Hook failed!");}} catch (Throwable e) {Log.w(TAG, e);}}
并且在Application 的OnCreate 初始化中调用此方法,先hook出来
再使用时就不会报错了