清理系统应用缓存
1、边扫描时,边列举正在扫描的包名 2、清理缓存,不能清理别的应用的缓存 DELETE_CACHE_FILES需要系统应用才能声明的权限, 所以清理不了别的应用的缓存,所以市面上的都是跳转到清理界面,让用户清理 但可以将自己的应用伪装成系统应用,就可以了 待写,setting源码,ctrl+h 清理缓存 找到系统隐藏清理缓存的api else if (v == mClearCacheButton) {
// Lazy initialization of observer
if (mClearCacheObserver == null) {
mClearCacheObserver = new ClearCacheObserver();
}
mPm.deleteApplicationCacheFiles(packageName, mClearCacheObserver);包管理者: private PackageManager mPm; 包名: String packageName = mAppEntry.info.packageName; 远程服务mClearCacheObserver 的初始化: if (mClearCacheObserver == null) {
mClearCacheObserver = new ClearCacheObserver();
}远程服务mClearCacheObserver 的实现类: class ClearCacheObserver extends IPackageDataObserver.Stub {
public void onRemoveCompleted(final String packageName, final boolean succeeded) {
final Message msg = mHandler.obtainMessage(CLEAR_CACHE);
msg.arg1 = succeeded ? OP_SUCCESSFUL:OP_FAILED;
mHandler.sendMessage(msg);
}
}
|
目标:查找Setting代码中,清除缓存,是如何实现的? 1、ctrl+h → File Search 清除缓存 ,找到定义的strings.xml 2、找到定义的strings.xml的文本 clear_cache_btn_text 3、继续ctrl+h clear_cache_btn_text 搜寻引用该文本的组件 4、可以发现该组件是一个按钮,id为clear_cache_button <Button
android:id="@+id/clear_cache_button"
android:layout_width="120dip"
android:layout_height="wrap_content"
android:layout_weight="0.4"
android:text="@string/clear_cache_btn_text" />5、继续ctrl+h clear_cache_button 找到该按钮的初始化 mClearCacheButton = (Button) view.findViewById(R.id.clear_cache_button); 6、然后ctrl+f mClearCacheButton 查找该按钮的点击事件,可以发现是当前类实现了onClick()方法 mClearCacheButton.setOnClickListener(this); 7、然后在该类的onClick()中,可以发现清除缓存按钮的实现 else if (v == mClearCacheButton) {
// Lazy initialization of observer
if (mClearCacheObserver == null) {
mClearCacheObserver = new ClearCacheObserver();
}
mPm.deleteApplicationCacheFiles(packageName, mClearCacheObserver);
} 8、mPm是什么?包管理者 private PackageManager mPm; mPm = getActivity().getPackageManager(); 8、packageName是什么呢?包名 找到定义:String packageName = mAppEntry.info.packageName; private ApplicationsState.AppEntry mAppEntry; ApplicationInfo info; PackageItemInfo public String packageName;//ApplicationInfo extends PackageItemInfo 9、mClearCacheObserver又是什么呢? 远程服务的实现类 class ClearCacheObserver extends IPackageDataObserver.Stub {
public void onRemoveCompleted(final String packageName, final boolean succeeded) {
final Message msg = mHandler.obtainMessage(CLEAR_CACHE);
msg.arg1 = succeeded ? OP_SUCCESSFUL:OP_FAILED;
mHandler.sendMessage(msg);
}
}可以发现mClearCacheObserver是一个远程服务 10、该方法是一个隐藏的api,所以只能使用反射来获取 * @hide
*/
public abstract void deleteApplicationCacheFiles(String packageName,IPackageDataObserver observer); |
权限: <uses-permission android:name="android.permission.DELETE_CACHE_FILES"/> Permission is only granted to system apps |
|