原文地址:

【CSDN】Detected problems with API 弹窗 屏蔽解决方案 android


正文(稍作整理)

最近项目测试 MM 反馈每次进入 app,会提示一个弹窗。
[转][P0] Detected problems with API 弹窗 屏蔽方案 - 图1

调查测试发现是 Android9.0 系统上产生的,综合网上各位前被采坑的资料分享。先把亲测可用的解决方案分享给大家,希望遇到此类问题的小伙伴可以快速解决。

原因分析
自 Android P 也就是 Android9.0 开始,谷歌限制开发者调用非官方公开 API(使用@hide注解的系统源码)以及废弃 API(@Deprecated)。当开发者用反射直接调用源码时就会出现上述提示框。因为这些 API 部分存在不稳定性,还有部分将来会被移除,谷歌此举旨在提示开发者尽量少使用反射,最好只用 SDK 开放的 API,以此减少这些不确定性对开发造成影响。

但是项目中,有些功能实现要用到怎么办?即使咱们不用,依赖的第三方类库,用到怎么办?这就坑了。所以,负负得正,哈哈,咱们在使用反射怼回去,屏蔽提示。

  1. //在app初始化时调用即可
  2. public class MyApplication extends Application {
  3. public JoyApplication() {
  4. }
  5. @Override
  6. public void onCreate() {
  7. super.onCreate();
  8. disableAPIDialog();
  9. }
  10. /**
  11. * 反射 禁止弹窗
  12. */
  13. private void disableAPIDialog(){
  14. if (Build.VERSION.SDK_INT < 28)return;
  15. try {
  16. Class clazz = Class.forName("android.app.ActivityThread");
  17. Method currentActivityThread = clazz.getDeclaredMethod("currentActivityThread");
  18. currentActivityThread.setAccessible(true);
  19. Object activityThread = currentActivityThread.invoke(null);
  20. Field mHiddenApiWarningShown = clazz.getDeclaredField("mHiddenApiWarningShown");
  21. mHiddenApiWarningShown.setAccessible(true);
  22. mHiddenApiWarningShown.setBoolean(activityThread, true);
  23. } catch (Exception e) {
  24. e.printStackTrace();
  25. }
  26. }
  27. }

相关链接:

【CSDN】Detected problems with API compatibility(visit g.co/dev/appcompat for more info)