直接读其他应用的cache文件夹是不现实的。因为应用程序对其他应用程序设置了只能执行的权限:
但是发现系统的Setting中有缓存大小,
系统是怎么获取的呢?下面我们就来分析系统是怎么得到的:
1、首先导入系统上层应用程序Settings,发现系统的Settings布局中有“缓存”字样。我们可以直接在项目中搜索:
2、查询之后,就能看到整个项目含有“缓存”字样的文件。
3、双击进去,找到对应的strings文件,拿到对应的引用,继续在整个项目中搜索:
4、然后就能看见系统缓存信息界面的整个布局了。
5、我们知道缓存信息是在这一行的,双击进去再获取对应显示的控件id:
6、继续在整个项目中搜索:这次的目标是找到对应的.java文件,我们要知道它是在哪里被赋值的。
7、根据控件的id找到对应的变量。
8、选中对应的变量按ctrl+shift+G找到将其赋值的地方:
9、我们可以看到它是通过aidl的回调方法,将这个值给反出来了。
10、继续跟踪他的变量mStatsObserver,分别点击进去,可以看到他在两个地方被使用过,而且两个地方都是通过.getPackageSizeInfo方法。
11、在PackageManager类中他是一个隐藏方法,等会我们可以通过反射获取,再调用此方法:
12、IPackageStateObserver.aidl文件是我们需要的,接着去“androidxref.com”中搜索,下载它的源码复制到我们的工程中即可。
13、因为IPackageStateObserver.aidl文件中还需要有一个PackageStats.aidl,一起下载下来即可。
这里值得注意的是,在自己工程中要创建一个与aidl文件一致的包名。
14、参考系统代码获取到对应的值。
15、反射调用方法执行。
ps:
pm.getClass().getDeclareMethod("getPackageSizeInfo",String.class,IPackageStateObserver.class);
以上获取方式在4.1.2中是可以拿到的,但在以后的版本中,这种写法是有问题的。所以要用以下写法:
16、最后添加需要添加的权限,就可以获取到缓存信息了:
GET_PACKAGE_SIZE