原文地址:
正文(稍作整理)
最近项目测试 MM 反馈每次进入 app,会提示一个弹窗。![[转][P0] Detected problems with API 弹窗 屏蔽方案 - 图1](/uploads/projects/xshawn@aosp/d6c292386444664584b8810e6d7f21e6.png)
调查测试发现是 Android9.0 系统上产生的,综合网上各位前被采坑的资料分享。先把亲测可用的解决方案分享给大家,希望遇到此类问题的小伙伴可以快速解决。
原因分析
自 Android P 也就是 Android9.0 开始,谷歌限制开发者调用非官方公开 API(使用@hide注解的系统源码)以及废弃 API(@Deprecated)。当开发者用反射直接调用源码时就会出现上述提示框。因为这些 API 部分存在不稳定性,还有部分将来会被移除,谷歌此举旨在提示开发者尽量少使用反射,最好只用 SDK 开放的 API,以此减少这些不确定性对开发造成影响。
但是项目中,有些功能实现要用到怎么办?即使咱们不用,依赖的第三方类库,用到怎么办?这就坑了。所以,负负得正,哈哈,咱们在使用反射怼回去,屏蔽提示。
//在app初始化时调用即可public class MyApplication extends Application {public JoyApplication() {}@Overridepublic 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();}}}
相关链接:
【CSDN】Detected problems with API compatibility(visit g.co/dev/appcompat for more info)
