Android开发之通过反射获取到Android隐藏的方法
在PackageManger中,有些方法被隐藏了,无法直接调用,需要使用反射来获取到该方法。
比如方法:getPackageSizeInfo(),通过这个方法可以获取到apk的CacheSize,CodeSize,DataSize等信息,但是该方法是隐藏的,@hide。
遇到这种情况,需要使用反射:
try {
//通过反射,获取到PackageManager隐藏的方法getPackageSizeInfo()
Method getPackageSizeInfo = PackageManager.class.getMethod("getPackageSizeInfo", String.class, int.class, IPackageStatsObserver.class);
} catch ( NoSuchMethodException e ) {
e.printStackTrace();
}
getPackageSizeInfo()反射以后的使用:
getPackageSizeInfo.invoke(mPm, appInfo.packageName, myUserId.invoke(null, null), myStatsObserver);
反射参数说明:
PackageManager源码:
public abstract void getPackageSizeInfo(String packageName, int userHandle,
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
------------------------------------------------------------------------------------------------------------------------------
第二种反射方法:
Method method = null;
Method[] methods = PackageManager.class.getMethods();
for ( Method m : methods ) {
if ( "getPackageSizeInfo".equals(m.getName()) ) {
method = m;
}
}
通过getMethods获取到该类的所有方法,然后遍历方法,通过判断方法名来判断是否是getPackageSizeInfo()方法,然后赋值给method方法。然后就可以使用method了。
Android开发之通过反射获取到Android隐藏的方法的更多相关文章
- Android开发之通过反射获取到挂断电话的API
Android开发黑名单工具类,需要用到挂断电话的API,但是该API处于隐藏状态,需要通过反射得到该方法.. 步骤: 1.通过当前类获取到ServiceManager的字节码 Class< ? ...
- Android开发中,那些让您觉得相见恨晚的方法、类或接口
Android开发中,那些让你觉得相见恨晚的方法.类或接口本篇文章内容提取自知乎Android开发中,有哪些让你觉得相见恨晚的方法.类或接口?,其实有一部是JAVA的,但是在android开发中也算常 ...
- android 开发对gif解码(适配android 4.2、4.3、4.4版本)
android 开发对gif解码(适配android 4.2.4.3.4.4版本) 使用方法: public class ImageInputActivity extends Activity imp ...
- Android开发调试无法连接到夜神模拟器的解决方法
Android开发调试无法连接到夜神模拟器的解决方法: 一般原因是adb的版本不一致造成的!!!!!换成一样的就可以了. 在网上看到的方法,特记录下来: 1.任务管理器里看下,adb.exe以及nox ...
- Android零基础入门第17节:Android开发第一个控件,TextView属性和方法大全
原文:Android零基础入门第17节:Android开发第一个控件,TextView属性和方法大全 前面简单学习了一些Android UI的一些基础知识,那么接下来我们一起来详细学习Android的 ...
- Java反射学习-1 - 反射获取类的属性,方法,构造器
新建一个Person类 package cn.tx.reflect; /** * 注解初步了解 * @author Administrator * */ public class Person { p ...
- android开发环境搭建日记和嵌入式Android开发环境初探
非常感谢博客园的各位,按照你们的博文,还有利用百度和谷歌逐渐建立了android的开发环境,只是给自己备份参考查看,看过的人可以忽略这篇文章. 本文章大部分参考了:http://www.cnblogs ...
- 五步搞定Android开发环境部署——非常详细的Android开发环境搭建教程
在windows安装Android的开发环境不简单也说不上算复杂,本文写给第一次想在自己Windows上建立Android开发环境投入Android浪潮的朋友们,为了确保大家能顺利完成开发环境的搭 ...
- Android开发学习之路--MAC下Android Studio开发环境搭建
自从毕业开始到现在还没有系统地学习android应用的开发,之前一直都是做些底层的驱动,以及linux上的c开发.虽然写过几个简单的app,也对android4.0.3的源代码做过部分的分析,也算入门 ...
随机推荐
- 从零开始学ios开发(五):IOS控件(2),Slider
下面继续学习ios的其他控件,这次会使用到的控件有Slider,当然还有一些之前已经使用过的控件Label. 这次我们不新建一个project了,当然如果你愿意重新创建一个新的项目也完全可以,我们还是 ...
- mysql查询差集
select A.* from A left join B using(name,addr,age) where B.name is NULL; select A.* from A left join ...
- C# Windows - 菜单栏和工具栏
除了MenuStrip控件之外,还有许多控件可用于填充菜单.3个常见的控件是ToolStripMenuItem,ToolStripDropDown,和ToolStripSeparator.这些控件表示 ...
- SQL Server 2008导出数据为SQL脚本的操作步骤
以前我们要将一个表中的数据导出为脚本,那么只有在网上找一个导出数据的Script,然后运行就可以导出数据脚本了.现在在SQL Server 2008的Management Studio中增加了一个新特 ...
- VBS基础篇 - 循环
经常地,当编写代码时,我们希望将一段代码执行若干次,我们可以在代码中使用循环语句来完成这项工作. 循环可分为三类:一类在条件变为 False 之前重复执行语句,一类在条件变为 True 之前重复执行语 ...
- C++(MFC)编程一些注意事项
一·书写问题 1.括号:左右大括号最好都放在左侧,这样可以很清楚大括号的看清配对情况以及作用域,便于检查也不易出错. 2.强制转换:强制转换表达式时一定要加括号,否则可能只转换了表达式中的单个量,可能 ...
- bnuoj 33656 J. C.S.I.: P15(图形搜索题)
http://www.bnuoj.com/bnuoj/problem_show.php?pid=33656 [题解]:暴力搜索题 [code]: #include <iostream> # ...
- Google history
传说,硅谷的公司在和微软的竞争中一直处于下风,不论在市场,人才,还是在打官司上,直到婴儿巨人Baby Giant谷歌的出现,历史才出现前所未有的改变.Google以一个强大的挑战者的身份出现在人们的视 ...
- Python标准库之os模块
1.删除和重命名文件 import os import string def replace(file, search_for, replace_with): # replace strings in ...
- vs2008中使用正则删除空行
起因 今天下了段代码复制到VS2008中想好好学习下,结果发现每隔一行都有一行空白行(如下图),如果只有几行么手动删下就好了,但是这边估计有几百行,我也不知道VS2008有没有什么支持快速删除空白行的 ...