Androi P以后Google可能会禁止使用反射来获取隐藏方法的调用,虽然在preview版本中只会以log的形式提示,但后续的版本可能会在使用反射时直接抛出错误。 这里提供其中一种破解反射禁止的方法,不过这种方法也有局限,就是只能用于原本已是public或者static的隐藏方法。 对于这种类型的隐藏方法,咱们以前的解决途径是经过反射来获取,由于虽然是public,可是方法被@hidden注解过,因此无法直接调用。 但虽然不能用反射,直接调用倒是能够的。这就是具体的思路。java
咱们知道在Android源码中有部分代码是不容许开发者使用的,这里要分两种状况。 · 没有打包进android.jar的类和方法,这部分不是隐藏的 · 打包进android.jar里的隐藏类和方法android
若是查看源码,会发现有不少代码其实没有打进android.jar,好比internal包下的类,其中就有WindowManagerService。 这部分类之因此不打进android.jar,目的是这些类是只给android内部使用的,不但愿开发者使用。程序员
今天只说明对于没有打包进 android.jar的类,在不用反射的状况下的使用方法。bash
在gradle项目里,能够用provided的方式引入 java library,这样引入的library不会被打包进最终的apk里。 在gradle中这么写,架构
dependencies {
provided project(':libhookandroid')
}
复制代码
举个例子,比方这时候要用 ActivityThread,这里面有个 public方法 currentActivityThread(),咱们要调用它,那么能够在lib项目下按报名建一个类ide
public class ActivityThread{
public static ActivityThread currentActivityThread(){
return null;
}
}
复制代码
为什么能够return null呢? 由于它不会最终编译进apk,运行时调用的仍然是Android里的ActivityThread,那里有真正的实现逻辑,咱们这里只是作了个壳用来保证编译时不会有问题。 写完lib后在主工程里就能够直接调用了,学习
ActivityThread thread = ActivityThread.currentActivityThread();
复制代码
由于是public方法,因此也不须要反射。gradle
对于Android里没有被打进 android.jar包中的类,能够经过 provided library的方式提供调用, 虽然P禁用了反射,可是直接调用是能够的。 然而缺点也是很明显,它不能用到 protected或者 private的方法。 对于其余的状况,咱们能够经过修改apk的class loader改为 BootStrapClassLoader来实现绕过这个限制。 看过以前文章的朋友应该知道 BootStrapClassLoader是终极 ClassLoader,之后咱们会介绍经过它来绕过限制的方法。ui
同时我通过多年的收藏目前也算收集到了一套完整的学习资料以及高清详细的Android架构进阶学习导图及笔记免费分享给你们,但愿对想成为架构师的朋友有必定的参考和帮助。 **下面是部分资料截图,诚意满满:特别适合有开发经验的Android程序员们学习。spa
资料免费领取方式:如今关注我而且加入群聊 群号:1018342383 或者是点击连接加入群聊【Android开发交流】:jq.qq.com/?_wv=1027&a…