在android里面第三方应用一般是没有对系统文件的读写权限,那如何进行/data/data目录下缓存的清理工作呢?
主要有两种思路:
一种通过ActivityManager的方法clearApplicationUserData()来完成,系统setting程序就是这么做的:
setting 源码中:ManageApplications类-->InstalledAppDetails类-->initiateClearUserData方法-->clearApplicationUserData()来实现。
顺便简单的说下ManageApplications类的一个跳转逻辑,ManageApplications类是一个Tabactivity,有4个tab:已下载、全部、sd卡、正在运行。
前三个逻辑都是一样的,就是上面这个逻辑,“正在运行”有点不同,ManageApplications类-->RunningProcessesView类-->RunningServiceDetails
类-->目标方法。
回到原来的话题,事实上clearApplicationUserData对开发者不可见,需要通过反射获得,同时这个方法还需要android.permission.CLEAR_APP_USER_DATA权限。想要这个权限,那么你的程序只能用mm命令来编译了。这种方法的操作的具体参考:http://bbs.51cto.com/thread-1034446-1.html
另一种方法可以通过linux的rm命令来完成,但需要root权限,而且想要删除某个文件,总得先读取删除的目录,但是/data/data/目录一般是不可读的,所以listFiles()的返回值一定是空的,想要读取/data/data目录,有两种方式:
第一,使用android自带的内部储存函数:getCacheDir,getDir,getFilesDir等,这种方法读取的目录有限,具体可参考:http://blog.youkuaiyun.com/hudashi/article/details/8037076
一般使用方法如下:
Context otherAppContext = mContext.createPackageContext(packageName, Context.CONTEXT_IGNORE_SECURITY);
File path = otherAppContext.getFilesDir();
第二种,先使用chmod 改变/data/data/packageName的读写权限,然后再使用listFiles来读取(这样就可以得到完全的目录内容,想删啥删啥):
//改变权重
String cmd="chmod 755 /data/data/"+packageName;
Process p = Runtime.getRuntime().exec("su");
DataOutputStream os =new DataOutputStream(p.getOutputStream());
os.writeBytes(cmd.toString() +"\n");
os.writeBytes("exit\n");
os.flush();
//读取目录
File app_path = new File("/data/data/"+packageName);
File [] files = app_path.listFiles();
String delete= null;
for(File f:files){
//这里可以进行一些选择,删掉相应的文件
if(deleted==null){
delete = " rm -r " + f.toString() +"\n";
}else{
delete += " rm -r " + f.toString() +"\n";
}
}
//最后执行命令delete
os.writeBytes(delete.toString() +"\n");
os.writeBytes("exit\n");
os.flush();
好的,至此我们自己写的程序已经可以删除其他应用程序在 /data/data/packgeName下面的缓存数据了!!!