[教程] Anbdroid缓存清理原理 [复制链接]

来源:互联网 发布:皮卡丘帐篷淘宝 编辑:程序博客网 时间:2024/06/06 03:34

http://bbs.hiapk.com/forum.php?mod=viewthread&tid=4375070


这里说的清除是在软件中清理其它程序的缓存,有两种:
均用到反射这方面的知识,
一种是:Android系统API把这些方法隐藏了。用到反射知识
一种带root权限的:
Class c1 = Class.forName("android.content.pm.IPackageDataObserver");
Method method = pm.getClass().getMethod("deleteApplicationCacheFiles", String.class,IPackageDataObserver.class);
method.invoke(pm, packageName,new IPackageDataObserver.Stub(){
     @Override
    public void onRemoveCompleted(String packageName,
              boolean succeeded) throws RemoteException {
}
});

<uses-permission android:name="android.permission.DELETE_CACHE_FILES" />
一种是不用权限;一键清理:
private static long getEnvironmentSize()
    {
      File localFile = Environment.getDataDirectory();
      long l1;
      if (localFile == null)
        l1 = 0L;
      while (true)
      {
        
        String str = localFile.getPath();
        StatFs localStatFs = new StatFs(str);
        long l2 = localStatFs.getBlockSize();
        l1 = localStatFs.getBlockCount() * l2;
        return l1;
      }
}
PackageManager pm = activity.getPackageManager();
Class[] arrayOfClass = new Class[2];
Class localClass2 = Long.TYPE;
arrayOfClass[0] = localClass2;
arrayOfClass[1] = IPackageDataObserver.class;
Method localMethod = pm.getClass().getMethod("freeStorageAndNotify", arrayOfClass);
Long localLong = Long.valueOf(getEnvironmentSize() - 1L);
Object[] arrayOfObject = new Object[2];
arrayOfObject[0] = localLong;
localMethod.invoke(pm,localLong,new IPackageDataObserver.Stub(){
  public void onRemoveCompleted(String packageName,boolean succeeded) throws RemoteException {
       // TODO Auto-generated method stub
  }
});

<uses-permission android:name="android.permission.CLEAR_APP_CACHE" />
下面的这个来自网上的清理软件就是用到了这个功能,不懂的下载的这个APP看一下就明白什么意思了~_~
device_cache.apk(168.41 KB, 下载次数: 57)