Androidコードによるキャッシュのクリーンアップ

2028 ワード

Android開発ではキャッシュをクリーンアップする機能が必要になる場合がありますが、ネットで探してみると、基本的な実現方法は2つあります.
1つ目はroot権限があり、アプリケーションのキャッシュフォルダを直接削除します.ブログを参考にしてみてください.
http://www.cnblogs.com/rayray/p/3413673.html
2つ目は、root権限を使わずにandroidシステムの脆弱性を利用し、すべてのキャッシュをクリーンアップすることです.実装の原理は、アプリケーションが大きなメモリを申請し、システムのメモリが申請のサイズ(申請のメモリスペースより小さい)を満たしていない場合、システムは携帯電話のすべてのキャッシュを整理してメモリスペースを解放しますが、スペースが申請のサイズに不足している場合は、エラーを報告します.たとえば、ユーザーは10 Gのメモリ容量を申請しますが、システムメモリは1 Gしかありません.システムはすべてのキャッシュをクリーンアップしてメモリを解放しますが、まだ足りません.この場合、エラーが発生します.私たちの目的はすでに達成されています.
 try {
                    Class[] arrayOfClass = new Class[2];
                    Class localClass2 = Long.TYPE;
                    arrayOfClass[0] = localClass2;
                    arrayOfClass[1] = IPackageDataObserver.class;
                    Method method = PackageManager.class.getMethod("freeStorageAndNotify", arrayOfClass);
                    method.invoke(packageManager,getEnvironmentSize() - 1L, new IPackageDataObserver.Stub(){

                        @Override
                        public void onRemoveCompleted(String packageName, boolean succeeded) throws RemoteException {
                            System.out.println("successed!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
                        }
                    });
                } catch (NoSuchMethodException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }

   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;
        }
    }