我们都知道google为了防止普通应用调用一些敏感方法会导致出现异常问题。 所以google把一些方法给hide掉了。被hide掉的方法普通应用的调用不了的, 否则会抛出java.lang.NoSuchMethodError异常。
but, 如果是系统应用就能正常调用被hide掉的方法。这是因为底层进行了判断。 有个疑问,google是怎么让方法hide掉的? 我以为是哪里会配置这些方法不能被调用呢。其实很简单,只要在方法或者类上面进行 注释然后在注释里加上@hide关键字即可。
/* * *@hide */
就类似上面这种。
被@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
解决方法二:
下面这个库也可以绕过反射拦截机制。
gradle文件中添加依赖。
dependencies {
implementation 'com.github.ChickenHook:RestrictionBypass:2.2'
}
github地址:github.com/ChickenHook…