由于反射调用了隐藏的API,在Android9.0运行APP的时候会出现弹框提醒:Detected problems with API compatibility(visit g.co/dev/appcompat for more info)
“自 Android P 也就是 Android9.0开始,谷歌限制开发者调用非官方公开API(使用@hide注解的系统源码)以及废弃API(@Deprecated)。当开发者用反射直接调用源码时就会出现上述提示框。因为这些API部分存在不稳定性,还有部分将来会被移除,谷歌此举旨在提示开发者尽量少使用反射,最好只用SDK开放的API,以此减少这些不确定性对开发造成影响。”
解决方法一:是在build.gradle改变编译目标版本,API 28也就是Android9.0,确定编译后没有再弹出提示。
"google":{
"targetSdkVersion":28,
}解决方法二:以毒攻毒,警告不能用反射,就用反射将其警告干掉。反射屏蔽系统弹框警告。自定义Application在onCreate()中用反射关闭弹框警告。
public class MyApplication extends Application {
public MyApplication() {
}
@Override
public void onCreate() {
super.onCreate();
disableAPIDialog();
}
private void disableAPIDialog() {
if (Build.VERSION.SDK_INT < 28) return;
try {
Class clazz = Class.forName("android.app.ActivityThread");
Method currentActivityThread = clazz.getDeclaredMethod("currentActivityThread");
currentActivityThread.setAccessible(true);
Object activityThread = currentActivityThread.invoke(null);
Field mHiddenApiWarningShown = clazz.getDeclaredField("mHiddenApiWarningShown");
mHiddenApiWarningShown.setAccessible(true);
mHiddenApiWarningShown.setBoolean(activityThread, true);
} catch (Exception e) {
e.printStackTrace();
}
}
}同时不要忘了在AndroidManifest.xml的application节点将android:name替换成自己的Application。
<application
android:name=".MyApplication"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

