[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)