Android开发之通过反射获取到Android隐藏的方法

在PackageManger中,有些方法被隐藏了,无法直接调用,需要使用反射来获取到该方法。

比如方法:getPackageSizeInfo(),通过这个方法可以获取到apk的CacheSize,CodeSize,DataSize等信息,但是该方法是隐藏的,@hide

遇到这种情况,需要使用反射:

1 try {
2     //通过反射,获取到PackageManager隐藏的方法getPackageSizeInfo()
3     Method getPackageSizeInfo = PackageManager.class.getMethod("getPackageSizeInfo", String.class, int.class, IPackageStatsObserver.class);
4 } catch ( NoSuchMethodException e ) {
5     e.printStackTrace();
6 }

getPackageSizeInfo()反射以后的使用:

1 getPackageSizeInfo.invoke(mPm, appInfo.packageName, myUserId.invoke(null, null), myStatsObserver);

反射参数说明:

PackageManager源码:

1     public abstract void getPackageSizeInfo(String packageName, int userHandle,
2             IPackageStatsObserver observer);

通过源码可以看出来,该方法需要三个参数,第一个参数为String类型的packageName,第二个参数是int类型的userHandle,第三个参数是IPackageStatsObserver类型的observer

所以getMethod()需要填写的参数:

第一个参数为该方法名:“getPackageSizeInfo”

第二个参数为getPackageSizeInfo()的第一个参数:String.class

第三个参数为getPackageSizeInfo()的第二个参数:int.class

第四个参数为getPackageSizeInfo()的第三个参数:IPackageStatsObserver.class

这样就可以通过反射获取到该方法,然后就是该方法的使用了,如下:

通过invoke()方法使用

第一个参数:执行该方法的类,mPm

第二个参数:包名,appInfo.packageName

第三个参数:UserHandle.myUserId(),因为该方法也是隐藏的,所以需要使用反射获取到该方法。

第四个参数:IPackageStatsObserver的对象,myStatsObserver

------------------------------------------------------------------------------------------------------------------------------

第二种反射方法:

1 Method method = null;
2 Method[] methods = PackageManager.class.getMethods();
3   for ( Method m : methods ) {
4       if ( "getPackageSizeInfo".equals(m.getName()) ) {
5            method = m;
6          }
7       }

通过getMethods获取到该类的所有方法,然后遍历方法,通过判断方法名来判断是否是getPackageSizeInfo()方法,然后赋值给method方法。然后就可以使用method了。

原文地址:https://www.cnblogs.com/liyiran/p/5296756.html