现象
可以看到即使加了Api版本判断依然是报红的
具体分析
- 编译后有如下类似错误提示
Launching lib/main.dart on sdk gphone64 arm64 in debug mode...
/Users/dararii/Dev/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_inappwebview-5.4.3+7/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/in_app_webview/InAppWebView.java:280: error: cannot find symbol
settings.setAppCachePath(options.appCachePath);
^
symbol: method setAppCachePath(String)
location: variable settings of type WebSettings
/Users/dararii/Dev/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_inappwebview-5.4.3+7/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/in_app_webview/InAppWebView.java:494: error: cannot find symbol
settings.setAppCacheEnabled(false);
^
symbol: method setAppCacheEnabled(boolean)
location: variable settings of type WebSettings
/Users/dararii/Dev/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_inappwebview-5.4.3+7/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/in_app_webview/InAppWebView.java:504: error: cannot find symbol
settings.setAppCacheEnabled(true);
^
symbol: method setAppCacheEnabled(boolean)
- 首先在Android Studio 直接跳到系统源码里是可以看到这几个函数的
- 但是呢,当我们直接在本地找到对应android.jar包,然后用jadx反编译后,并没有这几个函数
解决方案
-
方案一
最简单,直接退回到32即可,即targetSdkVersion =32 和 compileSdkVersion =32 -
方案二
根据官方建议,迁移到替代方案: Service Workers & 具体迁移策略 -
方案三
setAppCacheEnabled(true);
换成setCacheMode(WebSettings.LOAD_DEFAULT)
setAppCacheEnabled(false);
换成setCacheMode(WebSettings.LOAD_NO_CACHE)
setAppCachePath("")
这个就没有代替方案了
这个官方并没有提及,不知道是否靠谱
- 方案四
替换android.jar为32的
这个方法最简单,但有个弊端,若是你使用了33的api,那可能就会报错了
-
方案五
制作一个修复版的android.jar包
具体就是将32的WebSettings.class文件替换到33的WebSettings.class即可
替换之后,在Android Studio就可以实现如下版本判断效果,还不会报红了
这里,我在Android33暂时采用的是方案三,并没有迁移到Service Workers,这个方案看起来挺复杂的,网上也没有相关文章,后续有时间再分析分析 -
修复包成品下载
资源在文章开头即可下载
使用方法:解压后,将 android33fix.jar 重命名为android.jar,然后复制替换到
/Sdk/platforms/android-33/android.jar
,替换前记得备份原始android.jar包哦
总结
-
目前我用的是方案五,基本上完美解决问题,既能使用33的api又不报错( 当然这只是临时解决方案,要想根本解决问题,还是按官方建议,迁移到 Service Workers ),不过记得要备份原始android.jar包哦,若是不会操作的,可以直接下载我下面修复后的成品
-
关于该问题的深入研究
根本原因是AppCache问题,该组件强制从Chrome 85 里移除了,具体参看:准备进行 AppCache 移除 ,之前这几个方法由于兼容问题暂时保留了,并被设置为弃用了,建议迁移到 Service Workers 方案。到了Android 13就直接被移除了。其实官方还是给了一个过渡期的