您的位置:首页 > 编程语言

抄google工程师的代码:通过读setting的源代码,利用反射机制调用系统隐藏的API

2015-04-01 11:35 771 查看

步骤:

1.根据设置中的界面,搜索关键的字符串信息,通常我们首先跟踪到string.xml或者某个布局文件中。

2.找到该字符串相应的id获得点击事件的函数名,再次搜索,1到2次就能跟踪到一个src目录下的一个activity中。

3.在该activity中仔细查找,看这个功能是如何实现的。

4.有时我们会进入一个死胡同,系统的有些api是隐藏的我们可

5.将aidl文件加入到我们的程序中时要首先建立包名,在将相应的aidl文件拷贝到该包中,aidl文件可能还会使用其他aidl文件,

那么按照该做法,把其他aidl文件导入直到aidl文件不报错为止。

例如:获取系统中应用程序的缓存大小,代码大小,和数据大小。

首先:获取应用程序的包名,利用反射得到PackageManager的所有method,筛选出我们需要的api,调用,在传入参数时,需要用到aidl找到aidl文件拷贝到我们的程序中并定义一个接口的实现类:(需要用到的aidl文件有:IPackageStatsObserver.aidl,PackageStats.aidl,IPackageDataObserver.aidl)

<span style="font-size:18px;">public void click(View view){
EditText et = (EditText) findViewById(R.id.et_packname );
String packname = et.getText().toString().trim();
PackageManager pm = getPackageManager();

Method[]  methods  = PackageManager.class .getMethods();
for(Method method : methods){
//筛选出我们需要使用但被隐藏的 api
if("getPackageSizeInfo" .equals(method.getName())){
try {
method.invoke(pm, new Object[]{packname,new MyObserver()});
} catch (Exception e) {
e.printStackTrace();
}
}
}

}</span>


<span style="font-size:18px;">private class MyObserver extends IPackageStatsObserver.Stub{
@Override
public void onGetStatsCompleted(PackageStats pStats, boolean succeeded)
throws RemoteException {
long cache = pStats.cacheSize ;
long code = pStats.codeSize ;
long data = pStats.dataSize ;
System. out.println("缓存:" +Formatter.formatFileSize (MainActivity.this, cache));
System. out.println("代码:" +Formatter.formatFileSize (MainActivity.this, code));
System. out.println("数据:" +Formatter.formatFileSize (MainActivity.this, data));
}
}</span>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: