Android不能调用的@hide方法,只需要在方法或者类上注释@hide即可。

1,055 阅读2分钟

我们都知道google为了防止普通应用调用一些敏感方法会导致出现异常问题。 所以google把一些方法给hide掉了。被hide掉的方法普通应用的调用不了的, 否则会抛出java.lang.NoSuchMethodError异常。

image.png

but, 如果是系统应用就能正常调用被hide掉的方法。这是因为底层进行了判断。 有个疑问,google是怎么让方法hide掉的? 我以为是哪里会配置这些方法不能被调用呢。其实很简单,只要在方法或者类上面进行 注释然后在注释里加上@hide关键字即可。

/* * *@hide */

image.png 就类似上面这种。 被@hide标记即可,那普通应用就不能调用找到这些方法了。就是这么简单。应该是编译时会做一些特殊的 处理。 如果普通用户想要调用这些方法,那么只需要把@hide标记去掉即可。 也可以在frameworks/base/data/etc/hiddenapi-package-whitelist.xml中给特定的应用配置白名单。

解决调用不到hide方法的办法: 解决方法一:

解决hide方法反射限制的问题

android9.0后对hide方法反射限制需要系统签名或者加入白名单才可以反射hide方法

android Q开始,禁止所有反射方法调用,需要系统签名或者加入白名单才可以反射名单文件地址:

frameworks/base/data/etc/hiddenapi-package-whitelist.xml

/system/etc/sysconfig # ls hiddenapi-package-whitelist.xml

开启反射调用

Android 10 (API 29)

adb shell settings put global hidden_api_policy 1

Android 9 (API 28)

adb shell settings put global hidden_api_policy_pre_p_apps 1

adb shell settings put global hidden_api_policy_p_apps 1

如果重置回原来的策略(即,限制调用),可以执行下面的命令

adb shell settings delete global hidden_api_policy_pre_p_apps

adb shell settings delete global hidden_api_policy_p_apps

解决方法二:

Android 11 反射屏蔽机制绕过方法

下面这个库也可以绕过反射拦截机制。

gradle文件中添加依赖。

dependencies {

implementation 'com.github.ChickenHook:RestrictionBypass:2.2'

}

github地址:github.com/ChickenHook…