Android版本限制反射,突破Android p Api限制

本文介绍了Android P及以上版本对部分系统API的限制,特别是对于反射调用的限制。详细解析了反射调用系统API的流程,包括shouldDenyAccessToMember函数的检查逻辑。同时,提出了在Android P以上版本访问hidden API的解决方案,即利用系统类VMRuntime的setHiddenApiExemptions方法来绕过限制。
摘要由CSDN通过智能技术生成

1.Androi P中Api限制

在Android P上,google对部分系统Api进行了分类,对部分api标记为 灰色,深灰和黑色,

这些被标记的api原则上是不能使用的,尤其是针对反射调用的,会根据api被标记的颜色发出警告或者抛出异常

2.反射调用系统api的流程

Class getDeclaredMethod的时序图如下:

7c46c9d4d8fa

image.png

shouldDenyAccessToMember这个函数是处理hiddenapi的主要逻辑,如果hiddenapi可以使用,会返回false,如果不能使用,会返回true重点看一下ShouldDenyAccessToMember这个函数

template

inline bool ShouldDenyAccessToMember(T* member,

const std::function& fn_get_access_context,

AccessMethod access_method)

REQUIRES_SHARED(Locks::mutator_lock_) {

DCHECK(member != nullptr);

// Get the runtime flags encoded in member's access flags.

// Note: this works for proxy methods because they inherit access flags from their

// respective interface methods.

const uint32_t runtime_flags = GetRuntimeFlags(member);

// Exit early if member is public API. This flag is also set for non-boot class

// path fields/methods.

if ((runtime_flags & kAccPublicApi) != 0) {

return false;

}

// Determine which domain the caller and callee belong to.

// This can be *very* expensive. This is why ShouldDenyAccessToMember

// should not be called on every individual access.

const AccessContext caller_context = fn_get_access_context();

const AccessContext callee_context(member->GetDeclaringClass());

// Non-boot classpath callers should have exited early.

DCHECK(!callee_context.IsApplicationDomain());

// Check if the caller is always allowed to access members in the callee context.

if (caller_context.CanAlwaysAccess(callee_context)) {

return false;<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值