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){
//使用反射射机制调用getPackageSizeInfo
PackageManager 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() {
@Override
public void onRemoveCompleted(String pkgName,
boolean succeeded) throws RemoteException {
}
});
}
catch(Exception ex){
Log.e(TAG, "NoSuchMethodException") ;
ex.printStackTrace() ;
throw ex ;
}
}
}