{"id":15621579,"url":"https://github.com/yale8848/cachewebview","last_synced_at":"2025-05-15T17:08:39.302Z","repository":{"id":39097169,"uuid":"104832739","full_name":"yale8848/CacheWebView","owner":"yale8848","description":"Custom implement Android WebView cache, offline website, let cahe config more simple and  flexible ","archived":false,"fork":false,"pushed_at":"2021-04-28T06:08:07.000Z","size":844,"stargazers_count":2016,"open_issues_count":53,"forks_count":298,"subscribers_count":29,"default_branch":"master","last_synced_at":"2025-04-07T22:10:02.597Z","etag":null,"topics":["android","cache","fast","offline","webview"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yale8848.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-09-26T03:42:51.000Z","updated_at":"2025-03-27T08:57:53.000Z","dependencies_parsed_at":"2022-07-14T03:30:44.164Z","dependency_job_id":null,"html_url":"https://github.com/yale8848/CacheWebView","commit_stats":null,"previous_names":[],"tags_count":18,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yale8848%2FCacheWebView","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yale8848%2FCacheWebView/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yale8848%2FCacheWebView/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yale8848%2FCacheWebView/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yale8848","download_url":"https://codeload.github.com/yale8848/CacheWebView/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254384989,"owners_count":22062422,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","cache","fast","offline","webview"],"created_at":"2024-10-03T09:51:08.496Z","updated_at":"2025-05-15T17:08:34.291Z","avatar_url":"https://github.com/yale8848.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# CacheWebView\n\n[![](https://img.shields.io/badge/jcenter-2.1.8-519dd9.svg)](https://bintray.com/yale8848/maven/CacheWebView/2.1.8)\n\n  [English](https://github.com/yale8848/CacheWebView/blob/master/README_EN.md)\n\n  CacheWebView通过拦截资源实现自定义缓存静态资源。突破WebView缓存空间限制，让缓存更简单。让网站离线也能正常访问。\n\n## 为什么要用CacheWebView\n\n- 让WebView缓存空间更大\n- 强制缓存静态资源，这样会更快\n- 想方便的拿到web缓存资源，比如说从缓存中拿页面已经加载过的图片\n\n\n## 使用方式\n\n### 引入库\n\n**注意2.x.x 不兼容 1.x.x**\n\n```groovy\nimplementation 'ren.yale.android:cachewebviewlib:2.2.1'\n```\n\n### 修改代码\n\nApplication 里初始化\n\n```\n\n    WebViewCacheInterceptorInst.getInstance().\n                init(new WebViewCacheInterceptor.Builder(this));\n\n```\n\n\n给WebView添加拦截\n\n- 如果你的项目minSdkVersion\u003e=21\n\n```\n    mWebView.setWebViewClient(new WebViewClient(){\n\n            @TargetApi(Build.VERSION_CODES.LOLLIPOP)\n            @Nullable\n            @Override\n            public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {\n                return  WebViewCacheInterceptorInst.getInstance().interceptRequest(request);\n            }\n\n            @Nullable\n            @Override\n            public WebResourceResponse shouldInterceptRequest(WebView view, String url) {\n                return  WebViewCacheInterceptorInst.getInstance().interceptRequest(url);\n            }\n     });\n\n```\n\n- 如果你的项目minSdkVersion\u003c21\n\n将调用 `mWebView.loadUrl(url)` 的地方替换为：`WebViewCacheInterceptorInst.getInstance().loadUrl(mWebView,url)`\n\n```\n\n    mWebView.setWebViewClient(new WebViewClient(){\n\n\n            @TargetApi(Build.VERSION_CODES.LOLLIPOP)\n            @Override\n            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {\n                WebViewCacheInterceptorInst.getInstance().loadUrl(mWebView,request.getUrl().toString());\n                return true;\n            }\n\n            @Override\n            public boolean shouldOverrideUrlLoading(WebView view, String url) {\n                WebViewCacheInterceptorInst.getInstance().loadUrl(mWebView,url);\n                return true;\n            }\n\n            @TargetApi(Build.VERSION_CODES.LOLLIPOP)\n            @Nullable\n            @Override\n            public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {\n                return  WebViewCacheInterceptorInst.getInstance().interceptRequest(request);\n            }\n\n            @Nullable\n            @Override\n            public WebResourceResponse shouldInterceptRequest(WebView view, String url) {\n                return  WebViewCacheInterceptorInst.getInstance().interceptRequest(url);\n            }\n    });\n\n```\n\n以上就配置完毕，其他代码不用改，这样拥有默认100M缓存空间；如果你需要更详细的配置，可以看看下面的进阶设置；\n\n---\n\n- 腾讯X5内核WebView兼容处理\n\n\n```\n     mWebView.setWebViewClient(new WebViewClient() {\n\n            @Override\n            public WebResourceResponse shouldInterceptRequest(WebView webView, String s) {\n                return WebResourceResponseAdapter.adapter(WebViewCacheInterceptorInst.getInstance().\n                        interceptRequest(s));\n            }\n\n            @Override\n            public WebResourceResponse shouldInterceptRequest(WebView webView, WebResourceRequest webResourceRequest) {\n\n                return WebResourceResponseAdapter.adapter(WebViewCacheInterceptorInst.getInstance().\n                        interceptRequest(WebResourceRequestAdapter.adapter(webResourceRequest)));\n            }\n        });\n\n```\n\n下面是兼容代码，可以参考：\n\n```\n@TargetApi(Build.VERSION_CODES.LOLLIPOP)\npublic class WebResourceRequestAdapter implements android.webkit.WebResourceRequest {\n\n    private com.tencent.smtt.export.external.interfaces.WebResourceRequest mWebResourceRequest;\n\n    private WebResourceRequestAdapter(com.tencent.smtt.export.external.interfaces.WebResourceRequest x5Request){\n        mWebResourceRequest = x5Request;\n    }\n\n    public static WebResourceRequestAdapter adapter(com.tencent.smtt.export.external.interfaces.WebResourceRequest x5Request){\n        return new WebResourceRequestAdapter(x5Request);\n    }\n\n    @Override\n    public Uri getUrl() {\n        return mWebResourceRequest.getUrl();\n    }\n\n    @Override\n    public boolean isForMainFrame() {\n        return mWebResourceRequest.isForMainFrame();\n    }\n\n    @Override\n    public boolean isRedirect() {\n        return mWebResourceRequest.isRedirect();\n    }\n\n    @Override\n    public boolean hasGesture() {\n        return mWebResourceRequest.hasGesture();\n    }\n\n    @Override\n    public String getMethod() {\n        return mWebResourceRequest.getMethod();\n    }\n\n    @Override\n    public Map\u003cString, String\u003e getRequestHeaders() {\n        return mWebResourceRequest.getRequestHeaders();\n    }\n}\n\n```\n\n\n```\npublic class WebResourceResponseAdapter extends com.tencent.smtt.export.external.interfaces.WebResourceResponse {\n\n    private android.webkit.WebResourceResponse mWebResourceResponse;\n\n    private WebResourceResponseAdapter(android.webkit.WebResourceResponse webResourceResponse){\n        mWebResourceResponse = webResourceResponse;\n    }\n\n    public static WebResourceResponseAdapter adapter(android.webkit.WebResourceResponse webResourceResponse){\n        if (webResourceResponse == null){\n            return null;\n        }\n        return new WebResourceResponseAdapter(webResourceResponse);\n\n    }\n\n    @Override\n    public String getMimeType() {\n        return mWebResourceResponse.getMimeType();\n    }\n\n    @Override\n    public InputStream getData() {\n        return mWebResourceResponse.getData();\n    }\n\n    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)\n    @Override\n    public int getStatusCode() {\n        return mWebResourceResponse.getStatusCode();\n    }\n\n    @RequiresApi(Build.VERSION_CODES.LOLLIPOP)\n    @Override\n    public Map\u003cString, String\u003e getResponseHeaders() {\n        return mWebResourceResponse.getResponseHeaders();\n    }\n\n    @Override\n    public String getEncoding() {\n        return mWebResourceResponse.getEncoding();\n    }\n\n    @RequiresApi(Build.VERSION_CODES.LOLLIPOP)\n    @Override\n    public String getReasonPhrase() {\n        return mWebResourceResponse.getReasonPhrase();\n    }\n}\n\n\n```\n\n如果你的项目minSdkVersion\u003c21, 在 `mWebView.loadUrl(url)` 之后调用  `WebViewCacheInterceptorInst.getInstance().loadUrl(url,mWebView.getSettings().getUserAgentString())`;\n\n\n---\n\n### 进阶设置\n\n - 基本设置\n\n ```Java\n    WebViewCacheInterceptor.Builder builder =  new WebViewCacheInterceptor.Builder(this);\n\n     builder.setCachePath(new File(this.getCacheDir(),\"cache_path_name\"))//设置缓存路径，默认getCacheDir，名称CacheWebViewCache\n                        .setDynamicCachePath(new File(this.getCacheDir(),\"dynamic_webview_cache\"))\n                        .setCacheSize(1024*1024*100)//设置缓存大小，默认100M\n                        .setConnectTimeoutSecond(20)//设置http请求链接超时，默认20秒\n                        .setReadTimeoutSecond(20)//设置http请求链接读取超时，默认20秒\n                        .setCacheType(CacheType.NORMAL);//设置缓存为正常模式，默认模式为强制缓存静态资源\n\n     WebViewCacheInterceptorInst.getInstance().init(builder);\n ```\n\n- 设置缓存后缀\n\nCacheWebview通过后缀判断来缓存静态文件，可以添加删除\n\n```Java\n    WebViewCacheInterceptor.Builder builder =  new WebViewCacheInterceptor.Builder(this);\n\n    CacheExtensionConfig extension = new CacheExtensionConfig();\n    extension.addExtension(\"json\").removeExtension(\"swf\");//添加删除缓存后缀\n\n    builder.setCacheExtensionConfig(extension);\n\n    WebViewCacheInterceptorInst.getInstance().init(builder);\n```\n\n默认有以下后缀缓存\n\n```\n    private static HashSet STATIC = new HashSet() {\n        {\n            add(\"html\");\n            add(\"htm\");\n            add(\"js\");\n            add(\"ico\");\n            add(\"css\");\n            add(\"png\");\n            add(\"jpg\");\n            add(\"jpeg\");\n            add(\"gif\");\n            add(\"bmp\");\n            add(\"ttf\");\n            add(\"woff\");\n            add(\"woff2\");\n            add(\"otf\");\n            add(\"eot\");\n            add(\"svg\");\n            add(\"xml\");\n            add(\"swf\");\n            add(\"txt\");\n            add(\"text\");\n            add(\"conf\");\n            add(\"webp\");\n        }\n    };\n\n```\n\n默认有以下后缀不缓存\n\n```\n    private static HashSet NO_CACH = new HashSet() {\n        {\n            add(\"mp4\");\n            add(\"mp3\");\n            add(\"ogg\");\n            add(\"avi\");\n            add(\"wmv\");\n            add(\"flv\");\n            add(\"rmvb\");\n            add(\"3gp\");\n        }\n    };\n```\n\n- 设置Assets路径\n\nCacheWebview可以从Assets路径加载静态资源，只要设置了Assets路径就是开启此功能，默认未开启；\n\n```\n\n  \n    WebViewCacheInterceptor.Builder builder =  new WebViewCacheInterceptor.Builder(this);\n    //默认精确匹配地址规则\n    builder.setAssetsDir(\"static\");\n    \n    //后缀匹配规则\n    //builder.isAssetsSuffixMod(true);\n    //WebViewCacheInterceptorInst.getInstance().initAssetsData(); //后台线程获取Assets文件资源\n    \n    WebViewCacheInterceptorInst.getInstance().init(builder);\n\n```\n\nbuilder.setAssetsDir(\"static\")后匹配规则：\n\nassets 结构如下：\n\n![](art/assets.png)\n\n（1）默认精确匹配规则：那么只有满足这种结构的url：http://xxx.com/scripts/jquery.min.js 都会从assets获取资源\n\n（2）后缀匹配规则：那么只要满足这种结构的url：http://xxx.com/x/xx/scripts/jquery.min.js 都会从assets获取资源\n\n- 自定义拦截规则\n\n```\n    builder.setResourceInterceptor(new ResourceInterceptor() {\n            @Override\n            public boolean interceptor(String url) {\n                return true;//按照默认规则，false 不拦截资源\n            }\n        });\n```\n\n\n- 获取缓存文件\n\n```\n\n    String url = \"http://m.mm131.com/css/at.js\";\n    InputStream inputStream =  WebViewCacheInterceptorInst.getInstance().getCacheFile(url);\n    if (inputStream!=null){\n\n    }\n\n```\n\n- 清除缓存文件\n\n```\n    WebViewCacheInterceptorInst.getInstance().clearCache();\n```\n\n- 强制缓存失效\n\n  强制缓存失效后，由WebView正常加载资源\n\n```\n    WebViewCacheInterceptorInst.getInstance().enableForce(false);\n```\n\n- HostnameVerifier设置\n\n builder.setTrustAllHostname();不安全\n\n```\n    WebViewCacheInterceptor.Builder builder =  new WebViewCacheInterceptor.Builder(this);\n    builder.setTrustAllHostname();//HostnameVerifier不验证，HostnameVerifier.verify()返回true，默认正常验证\n    WebViewCacheInterceptorInst.getInstance().init(builder);\n\n```\n\n- SSLSocketFactory 设置\n\n```\n    WebViewCacheInterceptor.Builder builder =  new WebViewCacheInterceptor.Builder(this);\n    builder.setSSLSocketFactory(SSLSocketFactory sslSocketFactory, X509TrustManager trustManager);//自定义SSLSocketFactory和X509TrustManager\n    WebViewCacheInterceptorInst.getInstance().init(builder);\n\n```\n\n- Debug log\n\n默认开启debug log , TAG=\"CacheWebView\",可以关闭log\n\n```\n    WebViewCacheInterceptor.Builder builder =  new WebViewCacheInterceptor.Builder(this);\n    builder.setDebug(false);\n    WebViewCacheInterceptorInst.getInstance().init(builder);\n\n```\n\n\n- 非单例模式\n\n**调用方法和单例一样**\n\n```\n    WebViewCacheInterceptor.Builder builder =  new WebViewCacheInterceptor.Builder(this);\n    WebViewRequestInterceptor webViewRequestInterceptor = builder.build();\n    webViewRequestInterceptor.getCacheFile(\"\");\n```\n\n## 混淆\n\n```\n#CacheWebview\n-dontwarn ren.yale.android.cachewebviewlib.**\n-keep class ren.yale.android.cachewebviewlib.**{*;}\n\n#okhttp\n-dontwarn okhttp3.**\n-keep class okhttp3.**{*;}\n\n#okio\n-dontwarn okio.**\n-keep class okio.**{*;}\n```\n\n\n## 贡献\n\n   [如何贡献代码](https://github.com/yale8848/CacheWebView/blob/master/CONTRIBUTING.md)\n\n### 博客\n\n  [如何让Android WebView访问更快](https://my.oschina.net/yale8848/blog/1544298)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyale8848%2Fcachewebview","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyale8848%2Fcachewebview","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyale8848%2Fcachewebview/lists"}