手机软件缓存的多少直接影响手机运行速度。代码在Google源码中获取缓存的方法被阉割掉了(隐藏)。现在,通过java反射机制获得getPackageSizeInfo方法
获得安装的程序
PackageManager packageManager = getPackageManager();
/**
* 接收2个参数
* 第一个参数接收一个包名
* 第二个参数接收aidl的对象
*/
//安装到手机上面所有的应用程序
List<PackageInfo> installedPackages = packageManager.getInstalledPackages(0);
for (PackageInfo packageInfo : installedPackages) {
getCacheSize(packageInfo);
}
通过反射获得隐藏函数getPackageSizeInfo
public void <span style="font-family: Arial, Helvetica, sans-serif;">getCacheSize </span>(String pkgName) throws Exception{
if ( pkgName != null){
//使用放射机制得到PackageManager类的隐藏函数getPackageSizeInfo
PackageManager pm = getPackageManager(); //得到pm对象
try {
//通过反射机制获得该隐藏函数
Method getPackageSizeInfo = pm.getClass().getDeclaredMethod("getPackageSizeInfo", String.class,IPackageStatsObserver.class);
//调用该函数,并且给其分配参数 ,待调用流程完成后会回调PkgSizeObserver类的函数
getPackageSizeInfo.invoke(pm, pkgName,new PkgSizeObserver());
}
catch(Exception ex){
Log.e(TAG, "NoSuchMethodException") ;
ex.printStackTrace() ;
throw ex ; // 抛出异常
}
}
}
//aidl文件形成的Bindler机制服务类
public class PkgSizeObserver extends IPackageStatsObserver.Stub{
/*** 回调函数,
* @param pStatus ,返回数据封装在PackageStats对象中
* @param succeeded 代表回调成功
*/
@Override
public void onGetStatsCompleted(PackageStats pStats, boolean succeeded)
throws RemoteException {
// TODO Auto-generated method stub
cachesize = pStats.cacheSize ; //缓存大小
datasize = pStats.dataSize ; //数据大小
codesize = pStats.codeSize ; //应用程序大小
totalsize = cachesize + datasize + codesize ;
Log.i(TAG, "cachesize--->"+cachesize+" datasize---->"+datasize+ " codeSize---->"+codesize) ;
}
}
需要导入的aidl文件
public void cleanAll(View view){
//清除全部 缓存 利用Android系统的一个漏洞。 freeStorageAndNotify
Method[] methods = PackageManager.class.getMethods();
for(Method method:methods){
if("freeStorageAndNotify".equals(method.getName())){
try {
method.invoke(pm, Integer.MAX_VALUE,new ClearCacheObserver());
} catch (Exception e) {
e.printStackTrace();
}
return ;
}
}
Toast.makeText(this, "清理完毕", 0).show();
}
class ClearCacheObserver extends IPackageDataObserver.Stub {
public void onRemoveCompleted(final String packageName, final boolean succeeded) {
<span style="white-space:pre"> </span>System.out.println(succeeded);
}
}
源码下载:http://download.csdn.net/detail/zhaokai621/9546468