Android之界面Android

[P0][转载] Detected problems with

2019-03-19  本文已影响0人  灰灰手记

“The Android Road”

【京东自营】Android Studio开发实战:从零基础到App上线(第2版)
【京东自营】Android软件安全权威指南
【京东自营】Android进阶解密
Android安全架构深究 (美)埃伦科夫(Nikolay Elenkov)
Android开发艺术探索 任玉刚 著
疯狂Android讲义(第3版)赠光盘 李刚


原文地址:
【CSDN】Detected problems with API 弹窗 屏蔽解决方案 android


正文(稍作整理)

最近项目测试 MM 反馈每次进入 app,会提示一个弹窗。

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

原因分析

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

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

//在app初始化时调用即可
public class MyApplication extends Application {
 
    public JoyApplication() {
    }
 
    @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();
       }
   }
}

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


上一篇下一篇

猜你喜欢

热点阅读