获取手机软件缓存的方法(反射)getPackageSizeInfo

手机软件缓存的多少直接影响手机运行速度。代码在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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值