绕过谷歌禁止反射的一种办法

Androi P之后Google可能会禁止使用反射来获取隐藏方法的调用,虽然在preview版本中只会以log的形式提示,但后续的版本可能会在使用反射时直接抛出错误。

这里提供其中一种破解反射禁止的方法,不过这种方法也有局限,就是只能用于本来已经是public或者static的隐藏方法。 对于这种类型的隐藏方法,我们之前的解决途径是通过反射来获取,因为虽然是public,但是方法被@hidden注解过,所以没法直接调用。 但虽然不能用反射,直接调用却是可以的。这就是具体的思路。

关于隐藏方法

我们知道在Android源码中有部分代码是不允许开发者使用的,这里要分两种情况。 · 没有打包进android.jar的类和方法,这部分不是隐藏的 · 打包进android.jar里的隐藏类和方法

如果查看源码,会发现有很多代码其实没有打进android.jar,比如internal包下的类,其中就有WindowManagerService。 这部分类之所以不打进android.jar,目的是这些类是只给android内部使用的,不希望开发者使用。

今天只说明对于没有打包进 android.jar的类,在不用反射的情况下的使用方法。

用provided的方式提供丢失的类

在gradle项目里,可以用provided的方式引入 java library,这样引入的library不会被打包进最终的apk里。 在gradle中这么写,

dependencies {
    provided project(':libhookandroid')
}

举个例子,比方这时候要用 ActivityThread,这里面有个 public方法 currentActivityThread(),我们要调用它,那么可以在lib项目下按报名建一个类

public class ActivityThread{
    public static ActivityThread currentActivityThread(){
        return null;
    }
}

为何可以return null呢? 因为它不会最终编译进apk,运行时调用的仍然是Android里的ActivityThread,那里有真正的实现逻辑,我们这里只是做了个壳用来保证编译时不会有问题。 写完lib后在主工程里就可以直接调用了,

....
    ActivityThread thread = ActivityThread.currentActivityThread();
....

因为是public方法,所以也不需要反射。

总结

对于Android里没有被打进 android.jar包中的类,可以通过 provided library的方式提供调用, 虽然P禁用了反射,但是直接调用是可以的。 然而缺点也是很明显,它不能用到 protected或者 private的方法。 对于其他的情况,我们可以通过修改apk的class loader改成 BootStrapClassLoader来实现绕过这个限制。 看过之前文章的朋友应该知道 BootStrapClassLoader是终极 ClassLoader,以后我们会介绍通过它来绕过限制的方法。

原文发布于微信公众号 - Android每日一讲(gh_f053f29083b9)

原文发表时间:2018-05-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android 研究

Retrofit解析2之使用简介

前面介绍完RESTful之后,我们先来初步认识下Retrofit的使用"姿势"。本文的主要内容如下:

7813
来自专栏奔跑的蛙牛技术博客

javaBean 简单理解JavaBean简单及使用

PO:persistant object持久对象,可以看成是与数据库中的表相映射的java对象。最简单的PO就是对应数据库中某个表中的一条记录,多个记录可以用P...

1594
来自专栏chenssy

【死磕Sharding-jdbc】---基于ssm

本篇文章讲解如何在ssm(spring、springmvc、mybatis)结构的程序上集成sharding-jdbc(版本为1.5.4.1)进行分库分表; 假...

1922
来自专栏Java开发者杂谈

线程间通信

  如果一个多线程程序中每个线程处理的资源没有交集,没有依赖关系那么这是一个完美的处理状态。你不用去考虑临界区域(critical section),不用担心存...

3819
来自专栏JackieZheng

Spring实战——缓存

缓存 提到缓存,你能想到什么?一级缓存,二级缓存,web缓存,redis…… 你所能想到的各种包罗万象存在的打着缓存旗号存在的各种技术或者实现,无非都是宣扬缓...

21010
来自专栏Linux驱动

41.Linux应用调试-修改内核来打印用户态的oops

1.在之前第36章里,我们学习了通过驱动的oops定位错误代码行 第36章的oops代码如下所示: Unable to handle kernel paging...

2995
来自专栏LeoXu的博客

Tapestry 教程(六)使用BeanEditForm来创建用户表单

在前面一章,我们看到了Tapestry如何处理简单地链接,甚至于处理能在URL中传递信息的链接。在本章,我们将会看到Tapestry如何以不同的方式做同样的事情...

1102
来自专栏java初学

关于mybatis的思考(2)——mybatis映射文件的深入理解

1194
来自专栏屈定‘s Blog

Java--死锁以及死锁的排查

清单一代码有点长,但是逻辑很简单,有两个临界区变量lockA,lockB,线程A先获取到lockA在获取lockB,线程B则与之相反顺序获取锁,那么就可能会有以...

5923
来自专栏LeoXu的博客

Tapestry 教程(五)实现Hi-Lo猜谜游戏

在这个游戏中,计算机会选择一个介于1到10之间的数字。你尝试猜出这个数字,点击一些链接。最后,计算器会告诉你确认目标数字你需要猜多少次。即使是像这样一个简单的示...

1742

扫码关注云+社区

领取腾讯云代金券