1.现象:
Android9.0后的系统有时会弹出
![](https://img.haomeiwen.com/i5451204/77436515b8b05924.png)
2.问题原因:
Android P 后谷歌限制了开发者调用非官方公开API 方法或接口,
也就是说,你用反射直接调用源码就会有这样的提示弹窗出现,
非 SDK 接口指的是 Android 系统内部使用、并未提供在 SDK 中的接口,
开发者可能通过 Java 反射、JNI 等技术来调用这些接口。
但是,这么做是很危险的:非 SDK 接口没有任何公开文档,必须查看源代码才能理解其行为逻辑。
但是源码是JAVA写的,万物皆可反射,所以还是可以用反射干掉这个 每次启动都会弹出的提醒窗口
系统源码
if (isAppDebuggable || isApiWarningEnabled) {
if (!mMainThread.mHiddenApiWarningShown && VMRuntime.getRuntime().hasUsedHiddenApi()) {
<!--可以看到,其实每次创建Activity都会弹的,为了避免每次都弹,Android自己加了一个标示-->
<!--而我们也就是利用反射修改这个标示,使得第一次都不会弹-->
// Only show the warning once per process.
mMainThread.mHiddenApiWarningShown = true;
String appName = getApplicationInfo().loadLabel(getPackageManager())
.toString();
String warning = "Detected problems with API compatibility\n"
+ "(visit g.co/dev/appcompat for more info)";
if (isAppDebuggable) {
new AlertDialog.Builder(this)
.setTitle(appName)
.setMessage(warning)
.setPositiveButton(android.R.string.ok, null)
.setCancelable(false)
.show();
} else {
Toast.makeText(this, appName + "\n" + warning, Toast.LENGTH_LONG).show();
}
}
}
3.解决办法:
在Application 的onCreate中反射关闭弹框
/**
* 隐藏9.0启屏弹窗
*/
private void hidePAPIDialog() {
try {
Class cls = Class.forName("android.app.ActivityThread");
Method declaredMethod = cls.getDeclaredMethod("currentActivityThread");
declaredMethod.setAccessible(true);
Object activityThread = declaredMethod.invoke(null);
Field mHiddenApiWarningShown = cls.getDeclaredField("mHiddenApiWarningShown");
mHiddenApiWarningShown.setAccessible(true);
<!--重点是这个值,设置为true之后就不会再弹窗了-->
mHiddenApiWarningShown.setBoolean(activityThread, true);
} catch (Exception e) {
e.printStackTrace();
}
}
参考文章:
1.https://www.jianshu.com/p/126157350c78
2.https://www.jianshu.com/p/f87fe39caf1d?tdsourcetag=s_pctim_aiomsg
网友评论