Android P+通过反射调用系统API实现高级功能

  • 1. 打开隐藏API
    • 1.1 导入FreeReflection包
    • 1.2 打开隐藏API
  • 2. 反射系统服务并调用相应方法

通过反射调用系统API已经不算是什么新鲜事了,不过在Android P之后,Google对隐藏API的限制更加严格,不能再直接通过反射去调用系统API了,必须通过特定手段先打开隐藏API的限制,具体原理可以移步另一种绕过 Android P以上非公开API限制的办法,这里我们只讲实战用法。

1. 打开隐藏API

1.1 导入FreeReflection包

新建AS项目后,打开项目的settings.gradle,在repositories闭包中添加

maven { url 'https://jitpack.io' }

然后在具体module的build.gradle中的dependencies中加入以下依赖

implementation 'com.github.tiann:FreeReflection:3.1.0'

1.2 打开隐藏API

在moudle中添加一个继承自Application的类(有关Application的相关信息请自行查阅相关文档)并在AndroidManifest.xml中注册。
例:
新建的类

public class ShellApplication extends Application {......
}

AndroidManifest.xml中注册

<applicationandroid:name=".ShellApplication"......

然后需要重写Application类的attachBaseContext方法,并在这个方法中调用FreeReflection库打开隐藏API

// ignore other import
import me.weishu.reflection.Reflection;
public class ShellApplication extends Application {@Overrideprotected void attachBaseContext(Context base) {super.attachBaseContext(base);Reflection.unseal(base);}
}

至此,隐藏API就打开了,我们就能够像之前一样使用反射了

2. 反射系统服务并调用相应方法

不同Android版本,系统服务的架构可能存在差别,需要根据具体版本进行处理,思路基本相同,这里以Android Q为例,反射ActivityTaskManager,注意ActivityTaskManager是在Android Q中加入的,低版本不适用。
在开始反射之前,我们需要先找到我们想反射的方法是属于哪一个系统服务里面的,思路比较简单,跟流程,这里我需要反射的是startActivityAndWait方法,这个方法是am命令带-W参数启动应用的实现,调用流程是Am->ActivityManagerService->ActivityTaskManagerService
但是我们知道,系统Service都是通过binder去调用的,这里ActivityTaskManagerSericeIActivityTaskManager进行调用的,并且由ActivityTaskManager进行代理,在ActivityTaskManager中使用单例模式保存了IActivityTaskManager的实例,并且提供了一个静态方法getService()用于获取该实例(其实Android其他的系统服务都在对应的xxxManager中提供了getService()方法去获取对应的实例),这就是我们着手的地方(反射不到实例就毫无用处)
代码如下:

        Class atmClazz = Class.forName("android.app.ActivityTaskManager");@SuppressLint("BlockedPrivateApi")Method methodGetService = atmClazz.getDeclaredMethod("getService");methodGetService.setAccessible(true);// atmObj即IActivityTaskManagerObject atmObj = methodGetService.invoke(null);

获取到IActivityTaskManager之后就是反射对应的方法了,例如我需要反射startActivityAndWait方法,那么对应代码如下:

        Class singletonClazz = Class.forName("android.app.IActivityTaskManager");Class clazzIApplicationThread = Class.forName("android.app.IApplicationThread");Class clazzProfileInfo = Class.forName("android.app.ProfilerInfo");Method startMethod = singletonClazz.getDeclaredMethod("startActivityAndWait",clazzIApplicationThread,String.class,Intent.class,String.class,IBinder.class,String.class,int.class,int.class,clazzProfileInfo,Bundle.class,int.class);startMethod.setAccessible(true);startMethod.invoke(atmObj,null, // callercontext.getPackageName(), // call package 这里context传入ApplicationContext即可intent, // intent -> ActivityManagerShellCommand -> MakeIntent// intent 可以通过context.getPackageManager().getLaunchIntentForPackage("com.xxx.xxx")获取null, // resolveTypenull, // resultInfonull, // resultWho0, // request code0, // flagsnull, // profile infonull,0 // userId);

Android P+通过反射调用系统API实现高级功能相关推荐

  1. Android 电话的反射调用机制实现自动接听电话

    最近在看一些有关反射和aidl远程服务控制的类,自己也小写了这么一个Android 电话的反射调用机制实现静默接听电话demo 自己总结出来,以供查阅,若是还有其他问题,希望大家指出. 首先要调用系统 ...

  2. Android开发中怎样调用系统Email发送邮件(多种调用方式)

    在Android中调用其他程序进行相关处理,几乎都是使用的Intent,所以,Email也不例外,所谓的调用Email,只是说Email可以接收Intent并做这些事情 我们都知道,在Android中 ...

  3. Android开发 调用系统相机相册图片功能,解决小米手机拍照或者图片横竖相反问题,及小米手机相册图片路径问题

    Android开发 调用系统相机相册图片功能,解决小米手机拍照或者图片横竖相反问题,及小米手机相册图片路径问题 1.调用相机,兼容7.0 AndroidManifest配置 <providera ...

  4. android调用系统相机实现拍照功能

    在实现拍照的功能时遇到了很多问题,搜索了很多资料,尝试了很多办法,终于解决了,下面简要的描述下在开发过程中遇到的问题. 虽然之前看过android开发的书,但是没有做过东西,这次也是临时决定让我做一个 ...

  5. Android 调用系统api录音的两种方式(MediaRecorder、AudioRecord)

    废话 权限.权限.权限,必须要先获取了录音权限,其他的事情晚点再说. 另外,新版本的Android 10系统会对录音有调整,引入了一个录音焦点的概念,也就是说以前的麦克风只能一个APP使用,必须要等它 ...

  6. 拦截电话--- 关于利用反射 调用系统 hiden的 方法

    首先 需要知道  关于电话的操作 都在 TelephonyManager这个 类中 //初始化 TelephonyManager TelephonyManager mTelephonyManager ...

  7. android调用相机与相册的方法,手把手教你:android调用系统相机、相册功能,适配6.0权限获取以及7.0之后获取URI(兼容多版本)...

    Android中调用系统相机来拍摄照片的代码,以下:html 一.首先设置Uri获取判断以及相机请求Codejava public final int TYPE_TAKE_PHOTO = 1;//Ur ...

  8. Android 通讯录学习笔记之——目标:调用系统通讯录的编辑功能

    资料来源:http://www.eoeandroid.com/thread-37271-1-1.html 代码功能:调用系统自带的编辑联系人功能 代码片段 // 如下用法在ANADOIR 2.3.6上 ...

  9. Android学习之调用系统相机实现拍照功能

    一.今天,来介绍如何调用系统自带的相机进行拍照,主要有以下2种实现的方式: 1.Camera应用程序包含了一个意图过滤器,即intent filter,它使得开发人员能够提供与Camera应用程序同等 ...

最新文章

  1. C语言数组栈怎么实现删除,C语言静态数组实现栈操作
  2. ajax中的让渡,jQuery必须掌握的API
  3. java部署web service的方式
  4. linux 软件安装 NOKEY问题
  5. 有关怎么在不创建新的按钮的前提下改变返回按钮的标题
  6. 为什么使用Deque而不使用Stack构造栈
  7. linux sem函数,linux下信号量及其SEM_UNDO标志
  8. Android笔记——Windows环境下Android Studio v1.0安装教程
  9. 有人培训设计模式,吾表示难以理解,因为根本没用
  10. 计算机d盘无法格式化,d盘无法格式化,教您解决D盘无法格式化的方法
  11. 利用Audacity软件分析ctf音频隐写
  12. 2021-2027全球与中国GPU服务器市场现状及未来发展趋势
  13. Iec61850 部署调试笔记一
  14. js+css 灵活层叠 绝对/相对 定位 2
  15. Oracle数据库账号被锁了怎么解锁
  16. 转自何海涛 编程面试的五个要点
  17. RPC框架的路由策略
  18. 后端返回数组对象(id重复)来去重并保留第一个
  19. pxe装机dhcp获取不到_通过PXE安装系统失败后的解决办法
  20. “寒冬”之下,二本学生是如何秋招上岸的?

热门文章

  1. 新能源汽车整车控制器(VCU\HCU)
  2. 黑马程序员就业班第二天的总结以及自己的看法
  3. java 根据年月获取周数、天数
  4. Telephone--短信发送/接收流程
  5. 将wav音频文件频谱分析后映射到钢琴琴键上(类似audio to midi功能)
  6. 考研高危人群!你是否还在危险的边缘试探?
  7. word2vec和bert的基本使用方法
  8. 【哈利波特·魔法觉醒】手记全攻略
  9. 程序员的数学(二)—— 逻辑,真与假的二元世界
  10. Office更新了那么多代,哪个版本好看呢?