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 ; } }}