[mobilesafe] 08_一键清理缓存功能-freeStorageAndNotify

Android 4.0

一键清理缓存功能

一键清理缓存原理:利用PackageManager下隐藏的api,freeStorageAndNotify
/@hide
 */
public abstract void freeStorageAndNotify(long freeStorageSize, IPackageDataObserver observer);
long  freeStorageSize //要释放的缓存,如果系统缓存小于freeStorageSize,那么释放系统缓存,如果系统缓存大于freeStorageSize ,那么释放系统缓存-freeStorageSize 的大小。
The number of bytes of storage to befreed by the system.
权限:
<uses-permission android:name="android.permission.CLEAR_APP_CACHE" />  
小结:
这相当于利用系统的漏洞,
如果想申请的free空间大于系统rom空间,那么返回系统rom空间
如果freeStorageAndNotify小于系统rom空间,那么返回系统rom空间-freeStorageAndNotify
核心代码:
CleanCacheActivity.java
// 2、一键清理缓存点击事件
btn_clean_cache.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        // 一键清理缓存
        //public abstract void freeStorageAndNotify(long freeStorageSize, IPackageDataObserver observer);
        PackageManager packageManager = getPackageManager();
        Method[] methods = PackageManager.class.getMethods();
        for (Method method : methods) {
            if (method.getName().equals("freeStorageAndNotify")) {
                try {
                    method.invoke(packageManager, Long.MAX_VALUE,new MyIPackageDataObserver());
                } catch (Exception e) {
                    ToastUtils.showToastInThread(CleanCacheActivity.this"清理缓存失败");
                    e.printStackTrace();
                }
                break;
            }
        }
    }
});

/**
 * 5、一键清理-使用远程服务
 * @author hacket
 */
private class MyIPackageDataObserver extends IPackageDataObserver.Stub{
    @Override
    public void onRemoveCompleted(String packageName, boolean succeeded)
            throws RemoteException {
        ToastUtils.showToastInThread(CleanCacheActivity.this"清理缓存成功");
    }
结果:

问题:
低版本的手机,对于分配的Long.MAX_VALUE可能解析成-1,所以用Integer.MAX_VALUE就可以了
method.invoke(packageManager, Long.MAX_VALUE,new MyIPackageDataObserver());