[mobilesafe] 05_清理系统应用缓存

Android 4.0

清理系统应用缓存

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