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

步骤:

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>


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值