WebView:以编程方式清除服务工作线程缓存

drm*_*wer 4 android caching webview service-worker

为了为用户提供清除缓存的快速方法,我使用附加到“清除缓存”按钮的以下函数(基于thisthis):

static void clearAppCache(Context context) {
    try {
        File dir = context.getCacheDir();
        deleteDir(dir);
    } catch (Exception e) {
        // TODO: handle exception
    }
}

private static boolean deleteDir(File dir) {
    if (dir != null && dir.isDirectory()) {
        String[] children = dir.list();
        for (String aChildren : children) {
            boolean success = deleteDir(new File(dir, aChildren));
            if (!success) {
                return false;
            }
        }
        return dir.delete();
    } else if (dir!= null && dir.isFile()) {
        return dir.delete();
    } else {
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

我还使用相同的缓存路径设置我的 WebView,如下所示:

WebSettings webSettings = mWebView.getSettings();
webSettings.setAppCacheEnabled(true);
String cachePath = getApplicationContext().getCacheDir().getAbsolutePath();
webSettings.setAppCachePath(cachePath);
Run Code Online (Sandbox Code Playgroud)

我的理论是,调用clearAppCache()也会清除 WebView 的缓存,因为它所做的只是清除我为 WebView 设置的相同缓存文件夹。

但由于我的 WebView 现在正在加载一个使用Service Worker 的页面,我发现这似乎并没有清除Service Worker缓存。我收到一位用户的报告,为了真正清除服务工作人员的内容,他们必须手动清除以下文件夹的内容(在其 root 设备上):

/data/data/com.example.myapp/app_webview/Cache/
Run Code Online (Sandbox Code Playgroud)

根据这篇文章,我尝试将以下行添加到我的clearAppCache()函数中:

WebStorage.getInstance().deleteAllData();
Run Code Online (Sandbox Code Playgroud)

但这似乎仍然没有清除服务工作线程缓存的效果。

有任何想法吗?是的,我知道可以使用 javascript 清除服务工作线程缓存(请参阅上面链接的帖子),但我想要一种直接从 Android 执行此操作的方法。

drm*_*wer 5

我现在找到了删除服务工作线程缓存的方法。我的数据目录位于:

/data/user/0/com.app.package
Run Code Online (Sandbox Code Playgroud)

然后里面是:

/cache
    /http
    /org.chromium.android_webview
    /WebView
/code_cache
/files
/shared_prefs
/app_webview
    /webview_data.lock
    /Web Data
    /Web Data-journal
    /metrics_guid
    /Cookies
    /Cookies-journal
    /GPUCache
    /Service Worker
    /QuotaManager
    /QuotaManager-journal
    /databases
/app_textures
/app_download_internal
/databases
/shaders
Run Code Online (Sandbox Code Playgroud)

请注意其中存在Service Worker子目录app_webview,这有点泄露信息。

因此,要清除服务工作线程缓存,似乎您只需删除该子目录即可:

File dataDir = context.getDataDir(); // or see /sf/answers/1374129081/ for older Android versions
File serviceWorkerDir = new File(dataDir.getPath() + "/app_webview/Service Worker/");
deleteDir(serviceWorkerDir); // function defined in original post
Run Code Online (Sandbox Code Playgroud)

或者,更残酷的是,您似乎可以删除整个app_webview子文件夹及其中的所有内容:

File dataDir = context.getDataDir(); // or see /sf/answers/1374129081/ for older Android versions
File appWebViewDir = new File(dataDir.getPath() + "/app_webview/");
deleteDir(appWebViewDir); // function defined in original post
Run Code Online (Sandbox Code Playgroud)

仍然让我困惑的是,尽管将 WebView 的缓存路径设置webSettings.setAppCachePath(cachePath)在缓存目录中(请参阅我的原始帖子),但 WebView 已选择用于app_webview服务工作线程缓存。也许它使用缓存目录进行传统的 http 缓存,并选择自己的位置 ( app_webview) 进行 Service Worker 缓存?但看起来还是不太对劲。此外,如前所述,一位用户报告了 中存在Cache子目录app_webview,并且他们使用的是不支持服务工作人员的 KitKat (Android 4.4)...不知道为什么该app_webview/Cache目录正在使用而不是(或在除了)cacheapp_webview/Cache我身上根本就没有。