普通APP通过反射,访问系统内部方法时,出现NoSuchMethodError错误,定位到
/frameworks/base/core/java/android/content/pm/ApplicationInfo.java
isAllowedToUseHiddenApis()方法:
java
private boolean isAllowedToUseHiddenApis() {
if (isSignedWithPlatformKey()) {
return true;
} else if (isSystemApp() || isUpdatedSystemApp()) {
return usesNonSdkApi() || isPackageWhitelistedForHiddenApis();
} else {
return false;
}
}
允许访问内部方法的APP有两种:
1、系统签名APP
2、SYSTEM APP或PRIVATE APP
修改isAllowedToUseHiddenApis方法:
java
private boolean isAllowedToUseHiddenApis() {
if (isSignedWithPlatformKey()) {
return true;
} else if (isSystemApp() || isUpdatedSystemApp()) {
return usesNonSdkApi() || isPackageWhitelistedForHiddenApis();
} else {
//return false;
return isPackageWhitelistedForHiddenApis();
}
}
isPackageWhitelistedForHiddenApis为自带方法,读取系统配置文件中白名单配置。
系统启动时,/frameworks/base/core/java/com/android/server/SystemConfig.java的readPermissionsFromXml方法读取配置文件:
/frameworks/base/data/etc/hiddenapi-package-whitelist.xml
java
<?xml version="1.0" encoding="utf-8"?>
<config>
....................
<hidden-api-whitelisted-app package="your package name" />
</config>
在配置文件末尾增加APP的包名,允许此包名的APP调用内部方法。