前言
最近上线的App,开始有个别用户反映每次启动App时会弹出一个英文弹窗,听到这有点奇怪的问题,我立马怀疑是不是跟安卓派(android pie 安卓P 即 android 9.0系统代号)的新特性有关系?

找到原因
果不其然,查阅大量文档文章后大概了解了这个情况发生的原因:
自从手机系统升级到Android 9.0以后,打开APP开始出现以上提示,出现这种情况的原因是:
Android P 后Google限制了开发者调用非官方公开API 方法或接口,也就是说,你用反射直接调用源码就会有这样的提示弹窗出现,非 SDK 接口指的是 Android 系统内部使用、并未提供在 SDK 中的接口,开发者可能通过 Java 反射、JNI 等技术来调用这些接口。但是,这么做是很危险的:非 SDK 接口没有任何公开文档,必须查看源代码才能理解其行为逻辑。
我开发的Hybrid App是使用Apche Cordova构建底层的框架,我猜或许这类框架在底层构建上存在反射调用源码的地方,也或许是因为我调用了个别插件导致的,那没办法咯,只能想想如何消灭这个弹框的弹出了。
解决方案
查阅了部分安卓大佬的文章后,终于找到一篇有讲到针对Cordova出现该情况的解决方案(简直美滋滋):
1、找到Cordova Android工程下的驱动源文件:

2、导入所需代码

import java.lang.reflect.Method;
import java.lang.reflect.Field;
3、添加禁止弹窗方法并调用

public void onCreate(Bundle savedInstanceState){
... //忽略代码块
disableAPIDialog();
}
private void disableAPIDialog(){
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();
}
}
ok,至此重新构建安装包就可以解决这个问题啦!非常感谢这位大佬给予的解决方法!~
参考文章: