> 文档中心 > Android开发-利用反射获取应用程序包的信息,以及清除应用程序缓存

Android开发-利用反射获取应用程序包的信息,以及清除应用程序缓存

Android系统中的PackageManager提供的package的管理相关的属性和方法,它通过与PackageManagerService(PMS)进行IPC通信,从而实现相关的功能。

然而,有些功能并没有直接以public方式对外提供,而是以hide的方式进行了隐藏。在实际应用程序开发过程中,可能需要用到相关的功能。可以通过反射来达到目的。例如,获取报的大小,清除App的缓存等。

利用反射获取PackageSize:

public void  queryPkgSize(String pkgName) throws Exception{    if ( pkgName != null){    //使用反射射机制调用getPackageSizeInfo    PackageManager pm = getPackageManager();  //获取pm实例    try {    //通过反射机制获得该隐藏函数Method getPackageSizeInfo = pm.getClass().getDeclaredMethod("getPackageSizeInfo", String.class,IPackageStatsObserver.class);    //调用该函数    getPackageSizeInfo.invoke(pm, pkgName,new PkgSizeObserver());}  catch(Exception ex){ Log.e(TAG, "NoSuchMethodException") ; ex.printStackTrace() ; throw ex ; }     }    }

利用反射清除package缓存:

public void  clearPackageCache(String pkgName) throws Exception {    if ( pkgName != null){ //使用反射射机制调用getPackageSizeInfoPackageManager pm = getPackageManager();  //获取pm实例try {//通过反射机制获得该隐藏函数Method localMethod = pm.getClass().getMethod("freeStorageAndNotify", Long.TYPE,IPackageDataObserver.class);Long localLong = Long.valueOf(getEnvironmentSize() - 1L);Object[] arrayOfObject = new Object[2];    arrayOfObject[0] = localLong;    //调用该函数    localMethod.invoke(pm,localLong,new IPackageDataObserver.Stub() {@Overridepublic void onRemoveCompleted(String pkgName,boolean succeeded) throws RemoteException {}});}     catch(Exception ex){    Log.e(TAG, "NoSuchMethodException") ;    ex.printStackTrace() ;    throw ex ;    }     }}