前言
最近公司有对安装好的应用的数据要求进行清理数据缓存需求,也就查找相关资料实现了,清除自身的缓存简单,但是要是想清除其他第三方应用这个就要消耗点精力了,因为android将clearApplicationUserData该接口给隐藏掉了,这只能通过反射来获取相关方法来实现。不多说,直接上代码。
代码
ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
try {
Class<?> amClass = Class.forName(am.getClass().getName());
Method clearApp = amClass.getMethod("clearApplicationUserData", String.class, IPackageDataObserver.class);
Log.d("MainActivity", "clearApp: " + clearApp.getName());
clearApp.invoke(am, packageName, new IPackageDataObserver() {
@Override
public IBinder asBinder() {
return null;
}
@Override
public void onRemoveCompleted(String packageName, boolean succeeded) throws RemoteException {
}
});
} catch (Exception e) {
Log.d("MainActivity", "Exception: " + e.toString());
e.printStackTrace();
return false;
}
return true;
注意项
1. 清除权限:<uses-permission android:name="android.permission.CLEAR_APP_USER_DATA" />
2. 系统应用:在清单文件下设置
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:sharedUserId="android.uid.system">
3. 对于混淆应用需要避免混淆IPackageDataObserver文件
-keep class android.content.pm.** { *; }
总结
代码简洁,也就不做解释,不懂反射机制就回看本人前几遍文章。上面的代码你们直接使用会爆IPackageDataObserver接口文件无法找到,毕竟它是aidl文件,下面项目链接地址将提供。其实也简单,也可以在main下创建aidl文件目录下创建包名android.content.pm的IPackageDataObserver.aidl文件,里面实现很简单。
项目链接地址:
点击打开链接
转载请注明原文地址: https://ju.6miu.com/read-1200925.html