突破Android P(Preview 1)对调用隐藏API限制的方法

首先抛开Android P的具体实现过程,安卓系统要实现限制用户代码调用系统隐藏API,至少要做以下两个区分:

  1. 必须区分一个Method(或Field)对用户代码是隐藏的还是公开的。只有隐藏的才需要进行限制。
  2. 必须区分调用者的身份:是用户代码调用的还是系统代码(例如Activity类)调用的。只有用户代码调用时才需要进行限制。

具体到Android P的代码实现,它会在所有通过反射方式和JNI方式获取Method和Field的地方调用以下函数判断是否用户代码调用了系统的隐藏API(位于art/runtime/hidden_api.h),如果这个函数返回true,那么说明用户代码调用了系统的隐藏API,Android P(Preview1)会通过log发出警告,用户代码仍然能够获取到正确的Method或Field,在后续版本中获取到的Method或Field极有可能为空。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那么它是如何进行上述两个区分的呢?

  1. 每个Method(或Field)都有一个对应的access_flags_(uint32_t类型),原本这个值通过一些特定位(bit)表明其属性(public,private,static等),但是还有一些保留的未定义的位,Android P就利用未定义的几个位,表明这个Method(或Field)是对用户代码隐藏的还是公开的。
  2. 通过回溯调用栈找到调用者所在的Class,然后判断这个Class的ClassLoader是否为BootStrapClassLoader,如果是BoootStrapClassLoader那么就认为调用者是系统代码,否则就认为调用者是用户代码。fn_caller_in_boot就是一个函数指针,它用来判断调用者是
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值