隐藏Detected problems with API compatibility警告弹窗

2023-05-16

如果在Android9.0亦即API-28或以上的系统中运行debug app时,出现如下警告弹窗:

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

说明在代码中有通过反射调用含有@hide注解的方法或属性的逻辑,亦即调用系统隐藏API的逻辑。而从Android9.0开始,系统将限制这种调用方式,而弹出警告弹窗。

而要隐藏这个警告弹窗,有3种方案:

1.修改build.gradle文件,将targetSdkVersion修改为28或以上。

2.采用反射的方法关闭弹窗,在Application中执行一下如下方法即可。

/**
 * Android 9开始限制开发者调用非官方API方法和接口(即用反射直接调用源码)
 * 弹框提示 Detected problems with API compatibility(visit g.co/dev/appcompat for more info)
 * <p>
 * 隐藏警告弹框
 */
private void closeDetectedProblemApiDialog() {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) {
        return;
    }
    try {
        @SuppressLint("PrivateApi") Class clsPkgParser = Class.forName("android.content.pm.PackageParser$Package");
        Constructor constructor = clsPkgParser.getDeclaredConstructor(String.class);
        constructor.setAccessible(true);
 
        @SuppressLint("PrivateApi") Class clsActivityThread = Class.forName("android.app.ActivityThread");
        Method method = clsActivityThread.getDeclaredMethod("currentActivityThread");
        method.setAccessible(true);
        Object activityThread = method.invoke(null);
        Field hiddenApiWarning = clsActivityThread.getDeclaredField("mHiddenApiWarningShown");
        hiddenApiWarning.setAccessible(true);
        hiddenApiWarning.setBoolean(activityThread, true);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

3.查看代码中调用了哪些系统隐藏API,看可否将这些逻辑改成其他方式实现。

调用了系统隐藏API的时候,都会有类似Accessing hidden field或Accessing hidden method的打印。比如如下几个:

W/com.test.hm: Accessing hidden field Landroid/os/Message;->next:Landroid/os/Message; (light greylist, reflection)

W/com.test.hm: Accessing hidden method Ldalvik/system/CloseGuard;->get()Ldalvik/system/CloseGuard; (light greylist, reflection)

W/com.test.hm: Accessing hidden method Ldalvik/system/CloseGuard;->open(Ljava/lang/String;)V (light greylist, reflection)

W/com.test.hm: Accessing hidden method Ldalvik/system/CloseGuard;->warnIfOpen()V (light greylist, reflection)

W/com.test.hm: Accessing hidden method Lcom/android/org/conscrypt/OpenSSLSocketImpl;->setAlpnProtocols([B)V (light greylist, reflection)

W/com.test.hm: Accessing hidden field Landroid/content/ContentResolver;->mTargetSdkVersion:I (dark greylist, reflection)

当然以上方法调用,可能不太容易找到其他实现的方式,如果真的找不到,那也没办法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

隐藏Detected problems with API compatibility警告弹窗 的相关文章

  • 外部 API 的 CORS 问题 - 通过 PostMan 工作,但不能使用 Axios 进行 HTTP 请求 [重复]

    这个问题在这里已经有答案了 正在开发一个涉及汽车数据的新 Laravel 项目 并找到了一个免费的查找 API http www carqueryapi com documentation api usage 一个示例端点是 https w
  • 如何在AngularJS控制器中调用API?

    我需要在 AngularJS 控制器中执行这些 API 调用 任何例子都会有帮助 app post user auth users auth app get user logout helpers isAuthenticated users
  • 使用 oAuth 或其他方式实施访问

    我正在尝试想办法向其他第三方网站开放网站及其部分数据库 类似于 Twitter 让网络应用程序连接到其数据库以检索数据并可能存储数据的方式 我最初的研究让我想到了 oAuth 或者是 openID 我需要做的是让第三方网站登录网站上的用户帐
  • 如何获取Linux发行版名称和版本?

    在 Windows 中我读取注册表项SOFTWARE Microsoft Windows NT CurrentVersion ProductName获取操作系统的全名和版本 但在Linux中 代码 struct utsname ver un
  • 适用于任何支付网关的购物车 API? (至少需要支付宝)

    我正在尝试找到一个基于 java 的 API 它至少包含处理信用卡交易或通过 PayPal 购买的详细信息 以及其他网关以 IPN 方式作为附加功能 即不需要产品 只需发票金额 作为一点简化 我认为我应该能够执行类似以下伪代码的操作 sho
  • 通过 API 设置 Nest 目标湿度

    我在文档中找不到有关设置 Nest 恒温器目标湿度的任何内容 我绝对必须能够远程设置湿度 有人成功地做到了这一点吗 湿度不是一个可写字段
  • 需要帮助:google、yahoo、hotmail 联系人 api [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想从 Gmail Windows Live 和 Yahoo 导入地址簿联系人 就像 Facebook 一样 在 facebook 中 当
  • 在 youtube api 中检测播放事件

    我正在寻找一种通过 Javascript 检测嵌入 Youtube 视频中的播放事件的方法 现在我能够检测到状态更改 但我不知道如何在之后解除事件绑定并触发另一个事件来表明它已完成 我也不想使用 add removeEventListene
  • Android - API 级别 21 中的日期 [已关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 你好 我对 Android 还很陌生 目前我对本地日期 或我尝试过的任何其他日期格式 有一个大问题 L
  • 在 PHP 中 RESTful 上传文件

    因此 我正在编写一个脚本 该脚本将通过 RESTful 接口将视频上传到服务器 文档告诉我 我应该将数据 包括二进制视频文件 作为 POST 请求的一部分传递 我知道如何设置我的 POST 变量 但我不知道如何处理二进制数据 API 说我应
  • 如何将带有子查询的 JPQL 转换为 Criteria API 等效项?

    有一个由 5 个实体组成的简单对象模型 Company 组织 Address Club Group 公司与单个组织相关联 团体和俱乐部也与单个组织相关联 它们是单向的 这意味着组织不包含对其所有者的引用 一个组织可以有 0 个或多个地址 子
  • 如何使用 Whatsapp Cloud API 发送短信

    我在使用 Whatsapp Cloud API 已于 5 月 22 日向公众发布 时遇到问题 我做了一切在入门 https developers facebook com docs whatsapp cloud api get starte
  • 通过命令行创建私有 github 存储库

    我希望能够通过命令行创建一个私人 github 存储库 我认为使用其余 API 应该可以做到这一点 但是我无法从文档中弄清楚如何做到这一点 这可能吗 The GitHub CLI https github com cli cli tool
  • 使用 Python API 2.0.0.1 运行 Ansible Playbook

    安塞布尔版本 2 0 0 1 我现在已经四处寻找了很多 我发现的大多数文档要么不完整 要么已弃用 这篇文章适用于1 8 4版本 即 https stackoverflow com questions 27590039 running ans
  • Lua userdata:无法同时进行数组访问和方法

    我遇到了这个人的问题 Lua userdata数组访问及方法 https stackoverflow com questions 26970316 lua userdata array access and methods 其中 当我设置用
  • 在 ASP.net 中使用 NVP API 时 Paypal SetExpressCheckout 出现问题

    Hi 我正在实现 Facebook 游戏和 Paypal 快速结账支付服务之间的集成 我的网站是在 ASP net 中开发的 我使用 NVP API 进行集成 我的问题是我不断收到 10400 错误 订单总计丢失 我的代码是 Set the
  • 使用 Chrome TTS 的 SSML

    我试图通过强调等方式让 TTS 句子更加清晰 我正在使用Chrome TTS API http developer chrome com extensions tts html 这表明它接受SSML 格式的文档 http www w3 or
  • Postman如何发送请求? ajax,同源策略

    我发现了这个非常有用的 Chrome 扩展程序 名为 Postman 这是一个非常有用的扩展 特别是当您正在编写 RESTful 应用程序时 我感到困惑的一件事是这个插件 扩展如何能够在不同的域上成功发送 POST 请求 我尝试像这样使用
  • 同步和异步 API

    我正在开发一个库 它提供一些耗时的服务 我需要每个 API 有两个版本 一个用于同步函数调用 另一个用于异步 图书馆用户应决定使用哪个版本 服务结果可能对于系统继续运行 同步调用 至关重要 可能需要在不同的工作线程中完成相同的操作 因为结果
  • iOS 应用程序上的 Youtube API v3。我的 API 密钥不起作用,但其他人的密钥可以在同一应用程序上起作用。错误403

    这可能是 Google 的 Youtube 团队直接提出的问题 但我想先在这里问 以防将来也能帮助其他人 我在 iOS 应用程序上使用简单的 API 密钥 没有 OAuth 2 0 该应用程序只是从特定的播放列表 ID 返回视频 ID 列表

随机推荐

  • Engine::getDeviceForStrategyInt()解析

    audio devices t是int类型 audio devices t Engine getDeviceForStrategyInt routing strategy strategy DeviceVector availableOut
  • AudioService之音频输出通道切换

    前言 xff1a 音频输出的方式有很多种 xff0c 外放即扬声器 xff08 Speaker xff09 听筒 xff08 Telephone Receiver xff09 有线耳机 xff08 WiredHeadset xff09 蓝牙
  • UML 用例图以及UML的八种关系

    首先 xff0c 一张总体的知识脉络导图献上 xff1a 一 什么是用例图 xff1f 用例图描述了一组用例 参与者以及它们之间的关系 使用阶段 xff1a 软件需求分析 使用者 xff1a 软件分析人员 软件开发人员 用例模型 xff1a
  • 清除浏览器缓存后,发现页面样式不能加载了

    清除浏览器缓存后 xff0c 发现页面样式不能加载了 这里需要注意一个springboot版本问题 xff1a Spring Boot 1 x和2 x版本拦截器对于静态资源访问的区别 xff01 Spring Boot 1 x版本已经做好了
  • UML时序图(Sequence Diagram)

    什么是时序图 时序图 Sequence Diagram xff0c 又名序列图 循序图 xff0c 是一种UML交互图 它通过描述对象之间发送消息的时间顺序显示多个对象之间的动态协作 让我们来看一看visio2016对时序图的的解释 时序图
  • UML流程图

    流程图介绍 流程图 xff08 FlowChart xff09 是描述我们进行某一项活动所遵循顺序的一种图示方法 它能通过图形符号形象的表示解决问题的步骤和程序 好的流程图 xff0c 不仅能对我们的程序设计起到作用 xff1b 在帮助理解
  • Android: 如何切换 SCO 链路

    最近在做蓝牙音箱开发 xff0c 在 A2DP 和 HFP 来回切换的时候 xff0c 遇到了手机兼容性的问题 最终发现设备收声和手机收声 xff0c 是因为 soc 切换有问题 原先在网上找了一些资料发现其实还蛮简单的 就两句话 xff0
  • Java 枚举(enum) 详解6种常见的用法

    用法一 xff1a 常量 在JDK1 5 之前 xff0c 我们定义常量都是 xff1a public static final 现在好了 xff0c 有了枚举 xff0c 可以把相关的常量分组到一个枚举类型里 xff0c 而且枚举提供了比
  • Android注解快速入门和实用解析

    首先什么是注解 xff1f 64 Override就是注解 xff0c 它的作用是 xff1a 1 检查是否正确的重写了父类中的方法 2 标明代码 xff0c 这是一个重写的方法 1 体现在于 xff1a 检查子类重写的方法名与参数类型是否
  • Android高版本Service在后台一分钟被杀死

    最近公司出现了一个Bug xff0c Service在后台写log时候一分钟左右被杀死 xff0c 或者运行一会就被杀死了 xff0c 上网搜了一下原来是Android高版本为了保护电量 xff0c 流量什么的 xff0c 会在后台杀死这些
  • 解决Android8.0之后开启service

    背景 项目测试时发现的 xff0c 在双击返回键关闭应用后 xff08 并未杀死后台 xff09 重新打开APP xff0c 其他手机都OK xff0c 但是8 0的手机会出现较频繁的crash 检查代码 xff0c 问题锁定在重新开启应用
  • 在Android Studio中使用Lambda

    应用场景 在使用过程中 xff0c 不建议在自定义接口中使用 xff0c 原因是因为Lambda常应用在只有一个方法的接口中 而我们自定义的接口 xff0c 后期可能会增加接口中的方法 xff0c 这样修改的地方就比较多 xff0c 因为L
  • Android枚举实现Parcelable接口

    枚举类实现Parcelable的写法如下 xff1a public enum MyEnum implements Parcelable FIRST 1 SECOND 2 private int mValue MyEnum int value
  • Android Studio Build Output控制台输出乱码解决

    Android Studio版本升级到4 0之后 xff0c 出现Build Output控制台输出乱码的现象 该情况在Android Studio版本3 6及以上就会出现 解决方法 xff1a 点击Android Studio 菜单栏He
  • 1230---KVM Windows 虚拟机磁盘如何快速扩容

    KVM Windows 虚拟机磁盘如何快速扩容 前言 xff1a 由于KVM虚拟机直接构建于宿主机内核之上 xff0c 对于充分利用宿主机硬件性能有天然的优势 网上针对KVM Linux 虚拟机运维的文章很多 xff0c 但针对KVM Wi
  • Android中的IPv6

    什么是IPv6 IPv6 的全称是Internet Protocol version 6 Internet Protocol 译为 互联网协议 xff0c 所以 IPv6 就是互联网协议第6版 它对比于 IPv4 所带来的是地址池的扩容 x
  • 浅谈Android下的注解

    什么是注解 java lang annotation xff0c 接口 Annotation xff0c 在JDK5 0及以后版本引入 注解是代码里的特殊标记 xff0c 这些标记可以在编译 类加载 运行时被读取 xff0c 并执行相应的处
  • 浅析Java中的final关键字

    一 final关键字的基本用法 在Java中 xff0c final关键字可以用来修饰类 方法和变量 xff08 包括成员变量和局部变量 xff09 下面就从这三个方面来了解一下final关键字的基本用法 1 修饰类 当用final修饰一个
  • volatile与Java内存模型

    1 volatile特点 volatile的两大特点是可见性和有序性 xff1b volatile的内存语义 xff1a 当写一个volatile变量时 xff0c JMM会把该线程对应的本地内存中的共享变量值立即刷新回主内存中 当读一个v
  • 隐藏Detected problems with API compatibility警告弹窗

    如果在Android9 0亦即API 28或以上的系统中运行debug app时 xff0c 出现如下警告弹窗 xff1a Detected problems with API compatibility visit g co dev ap