Android Studio targetApi=33 android 13 setAppCacheEnabled/setAppCachePath/setAppCacheMaxSize 报红问题探究

现象

在这里插入图片描述

可以看到即使加了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就直接被移除了。其实官方还是给了一个过渡期的

参考

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jitcor

觉得有用,不赏点?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值