因为实习的项目的需求,我需要清除项目中使用的WebView控件产生缓存
先连接上OTG线,开adb shell进行调试,进入data/data目录找到安装的程序的位置;
应用程序包的命名习惯的惯例是:域名.公司或组织名.程序
文件结构如下:
app_tbs:项目用到的腾讯TBS X5内核产生的文件
app_textures:似乎是和图形界面描绘有关的文件
app_webview:webview控件的文件夹
cacahe:缓存数据的文件夹
databases:保存数据的文件夹
files:长时间保存的数据的文件夹
lib:里面存放有后缀名为.so的文件,应该是依赖的库里面带有的;
shared_prefs:应该是存放SharedPreference的目录;
基于这样的文件结构,可以肯定需要删除的是cache文件夹的内容和databases文件夹里面的内容,而app_webview则不敢肯定;
以上就是app_webview内的内容,比较明显的第一反应看到比较熟悉的是Cookies文件夹和GPUCache
根据网上老哥们的说法,Cookies是sqlite,而Cookies-journal则是sqlite的缓存;
这两者应该是不需要清理的;
项目中用到WebView控件,在加载html页面时,会在应用目录下生成database和cache文件夹;
请求的url记录则保存在WebViewCache.db,而url的内容则保存在WebViewCache文件夹下
那么根据以上条件,先决定进行对cache文件夹和databases文件夹下的webview.db和webviewCache.db进行清理
首先使用了文件删除的办法清理缓存;
public class DataCleanManager {
private static DataOutputStream dos = null;
private static Process p = null;
/**
* 保留函数
* 运行root权限下的命令
* @param cmd 命令
*/
private static void runRootCmd(String cmd){
try {
p = Runtime.getRuntime().exec("su");
dos = new DataOutputStream(p.getOutputStream());
dos.writeBytes(cmd + "\n");
dos.flush();
dos.close();
p.destroy();
} catch (IOException e) {
e.printStackTrace();
}finally{
if(dos != null){
try{
dos.close();
}catch (IOException e) { e.printStackTrace(); }
}
}
}
/**
* 删除输入参数目录下的文件
* @param directory 文件目录
*/
private static void deleteFileByDirectory(File directory){
if(directory != null && directory.exists() && directory.isDirectory()){
for(File file : directory.listFiles() )
file.delete();
}
}
/**
* 删除目录下的指定文件名的文件
* @param directory 文件目录
* @param filename 文件名
*/
private static void deleteFileByDirectory(File directory, String filename){
if(directory != null && directory.exists() && directory.isDirectory()){
for(File file : directory.listFiles()){
if(file.toString().equals(filename))
file.delete();
}
}
}
/**
* 清除缓存文件
* @param context
*/
private void cleanInternalCache(Context context){
deleteFileByDirectory(context.getCacheDir());
}
/**
* 清除database文件夹下的webview.db和 webviewCache.db
* @param context
*/
private void cleanDatabases(Context context){
String dataBasesFilePath = "/data/data" + context.getPackageName() + "/databases";
deleteFileByDirectory(new File(dataBasesFilePath), "webview.db");
deleteFileByDirectory(new File(dataBasesFilePath), "webviewCache.db");
}
/**
* 清除webView相关的缓存
* @param context
*/
public void cleanCache(Context context){
cleanInternalCache(context);
cleanDatabases(context);
}
}
在项目的实际应用中好像有比较多的问题,删除了文件之后会导致项目不稳定;
然后参考了一篇比较好的博文:http://blog.csdn.net/liwei123liwei123/article/details/52624826;
引用了一下上面那篇博文,再记录一下要点:
1. WebView缓存分为两部分:
1.1页面缓存,加载一个网页时的html,css,JS的页面资源,这部分缓存是因为浏览器行为而产生的,开发者只能通过
配置HTTP响应头影响浏览器行为才能间接影响这些数据;
->>这部分缓存的索引存放在/data/data/package_name/databases文件夹下
->>这部分缓存的文件存放在/data/data/package_name/cache/XXXwebviewcacheXXX下
1.2数据缓存,数据缓存分为AppCache和DOM Storage两种,这些缓存资源是由开发者的直接行为产生的;
Android中的Webkit使用一个db文件来保存AppCache数据(my_path/ApplicationCache.db)
Android的Webkit会为DOM Storage产生两个文件(my_path/localstorage/网页 和 my_path/localstorage/Databases.db)