Androidコードによるキャッシュのクリーンアップ
2028 ワード
Android開発ではキャッシュをクリーンアップする機能が必要になる場合がありますが、ネットで探してみると、基本的な実現方法は2つあります.
1つ目はroot権限があり、アプリケーションのキャッシュフォルダを直接削除します.ブログを参考にしてみてください.
http://www.cnblogs.com/rayray/p/3413673.html
2つ目は、root権限を使わずにandroidシステムの脆弱性を利用し、すべてのキャッシュをクリーンアップすることです.実装の原理は、アプリケーションが大きなメモリを申請し、システムのメモリが申請のサイズ(申請のメモリスペースより小さい)を満たしていない場合、システムは携帯電話のすべてのキャッシュを整理してメモリスペースを解放しますが、スペースが申請のサイズに不足している場合は、エラーを報告します.たとえば、ユーザーは10 Gのメモリ容量を申請しますが、システムメモリは1 Gしかありません.システムはすべてのキャッシュをクリーンアップしてメモリを解放しますが、まだ足りません.この場合、エラーが発生します.私たちの目的はすでに達成されています.
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;
}
}