步骤:
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>