利用反射获得程序的缓存大小、应用程序大小、数据大小,利用反射清除缓存,全部清理

来源:互联网 发布:java utc时间转换 在线 编辑:程序博客网 时间:2024/06/05 15:59

系统隐藏了获得缓存的getPackageSizeInfo方法,我们可以用反射来调用该方法。

读取缓存文件大小需要添加权限:GET_PACKAGE_SIZE

首先将IPackageStatsObserver.aidl和PackageStats.aidl文件拷贝到android.content.pm包下。

反射获得方法,后调用

Method getPackageSizeInfoMethod = null;Method[] methods = PackageManager.class.getMethods();for (Method method : methods) {if("getPackageSizeInfo".equals(method.getName())){getPackageSizeInfoMethod = method;}}List<PackageInfo> infos = pm.getInstalledPackages(0);for (PackageInfo info : infos) {try {getPackageSizeInfoMethod.invoke(pm, info.packageName,new myObserver());} catch (Exception e) {e.printStackTrace();}}

该方法后一个参数用到远程服务,写一个类继承远程服务:

private class myObserver extends IPackageStatsObserver.Stub{@Overridepublic void onGetStatsCompleted(PackageStats pStats, boolean succeeded)throws RemoteException {//缓存大小long cacheSize = pStats.cacheSize;//应用程序大小long codeSize = pStats.codeSize;//数据大小long dataSize = pStats.dataSize;其他处理}}


利用反射删除缓存

删除缓存文件需要添加权限:DELETE_CACHE_FILES

这个权限只能是系统程序才能用,所以,我们用不了。。。

iv_delete.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {try {Method method = PackageManager.class.getMethod("deleteApplicationCacheFiles", String.class,IPackageDataObserver.class);method.invoke(pm, pStats.packageName,new IPackageDataObserver.Stub(){@Overridepublic void onRemoveCompleted(String packageName, boolean succeeded)throws RemoteException {}});} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}});

普通软件是点击弹到系统设置界面,手动清理。


全部清理

利用反射得到freeStorageAndNotify方法,一键清理

Method[] methods = PackageManager.class.getMethods();for (Method method : methods) {if("freeStorageAndNotify".equals(method.getName())){try {//请求释放最大空间method.invoke(pm, Long.MAX_VALUE,new IPackageDataObserver.Stub(){@Overridepublic void onRemoveCompleted(String packageName, boolean succeeded)throws RemoteException {}});} catch (Exception e) {e.printStackTrace();}return;}}

0 0
原创粉丝点击