Android P+通过反射调用系统API实现高级功能
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去调用的,这里ActivityTaskManagerSerice
是IActivityTaskManager
进行调用的,并且由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实现高级功能相关推荐
- Android 电话的反射调用机制实现自动接听电话
最近在看一些有关反射和aidl远程服务控制的类,自己也小写了这么一个Android 电话的反射调用机制实现静默接听电话demo 自己总结出来,以供查阅,若是还有其他问题,希望大家指出. 首先要调用系统 ...
- Android开发中怎样调用系统Email发送邮件(多种调用方式)
在Android中调用其他程序进行相关处理,几乎都是使用的Intent,所以,Email也不例外,所谓的调用Email,只是说Email可以接收Intent并做这些事情 我们都知道,在Android中 ...
- Android开发 调用系统相机相册图片功能,解决小米手机拍照或者图片横竖相反问题,及小米手机相册图片路径问题
Android开发 调用系统相机相册图片功能,解决小米手机拍照或者图片横竖相反问题,及小米手机相册图片路径问题 1.调用相机,兼容7.0 AndroidManifest配置 <providera ...
- android调用系统相机实现拍照功能
在实现拍照的功能时遇到了很多问题,搜索了很多资料,尝试了很多办法,终于解决了,下面简要的描述下在开发过程中遇到的问题. 虽然之前看过android开发的书,但是没有做过东西,这次也是临时决定让我做一个 ...
- Android 调用系统api录音的两种方式(MediaRecorder、AudioRecord)
废话 权限.权限.权限,必须要先获取了录音权限,其他的事情晚点再说. 另外,新版本的Android 10系统会对录音有调整,引入了一个录音焦点的概念,也就是说以前的麦克风只能一个APP使用,必须要等它 ...
- 拦截电话--- 关于利用反射 调用系统 hiden的 方法
首先 需要知道 关于电话的操作 都在 TelephonyManager这个 类中 //初始化 TelephonyManager TelephonyManager mTelephonyManager ...
- android调用相机与相册的方法,手把手教你:android调用系统相机、相册功能,适配6.0权限获取以及7.0之后获取URI(兼容多版本)...
Android中调用系统相机来拍摄照片的代码,以下:html 一.首先设置Uri获取判断以及相机请求Codejava public final int TYPE_TAKE_PHOTO = 1;//Ur ...
- Android 通讯录学习笔记之——目标:调用系统通讯录的编辑功能
资料来源:http://www.eoeandroid.com/thread-37271-1-1.html 代码功能:调用系统自带的编辑联系人功能 代码片段 // 如下用法在ANADOIR 2.3.6上 ...
- Android学习之调用系统相机实现拍照功能
一.今天,来介绍如何调用系统自带的相机进行拍照,主要有以下2种实现的方式: 1.Camera应用程序包含了一个意图过滤器,即intent filter,它使得开发人员能够提供与Camera应用程序同等 ...
最新文章
- C语言数组栈怎么实现删除,C语言静态数组实现栈操作
- ajax中的让渡,jQuery必须掌握的API
- java部署web service的方式
- linux 软件安装 NOKEY问题
- 有关怎么在不创建新的按钮的前提下改变返回按钮的标题
- 为什么使用Deque而不使用Stack构造栈
- linux sem函数,linux下信号量及其SEM_UNDO标志
- Android笔记——Windows环境下Android Studio v1.0安装教程
- 有人培训设计模式,吾表示难以理解,因为根本没用
- 计算机d盘无法格式化,d盘无法格式化,教您解决D盘无法格式化的方法
- 利用Audacity软件分析ctf音频隐写
- 2021-2027全球与中国GPU服务器市场现状及未来发展趋势
- Iec61850 部署调试笔记一
- js+css 灵活层叠 绝对/相对 定位 2
- Oracle数据库账号被锁了怎么解锁
- 转自何海涛 编程面试的五个要点
- RPC框架的路由策略
- 后端返回数组对象(id重复)来去重并保留第一个
- pxe装机dhcp获取不到_通过PXE安装系统失败后的解决办法
- “寒冬”之下,二本学生是如何秋招上岸的?