刚刚有同学问我,不太了解 “非SDK接口” 是什么意思?android9.0有什么限制 ?apache的http也有限制 ?

而且现在的大部分系统都升级上来了,黑名单、灰名单和白名单 也是必须要了解一下的,这里参考Google开发者网站给大家整理一下。

首先,公共 SDK 接口是在 Android 框架软件包索引 中记录的那些接口,什么是框架软件包?

链接地址:https://developer.android.google.cn/reference/packages.html

非 SDK 接口 的处理是 API 抽象出来的实现细节,因此这些接口可能会在不另行通知的情况下随时发生更改。

黑名单 无论应用的目标 API 级别是什么,都无法使用此列表中的非 SDK 接口。如果您的应用尝试访问其中任何一个接口,系统就会抛出错误。
灰名单 从 Android 9(API 级别 28)开始,在每个 API 级别分别会限制某些非 SDK 接口。如果应用的目标 API 级别较低,您可以访问灰名单中的受限 API,但如果您的应用尝试访问在您的目标 API 级别受限的非 SDK 接口,系统就会假定此 API 已列入黑名单。说白了,就是只要在您应用的目标 API 级别不限制此列表中的非 SDK 接口,您就可以使用它们。
白名单 此列表中的接口已在 Android 框架软件包索引中正式记录,它们是受支持的接口,您可以自由使用。

有的同学听完还是比较郁闷……

那换个说法吧,比如应用在通过反射等机制与类互动时(WebView、HTTP等),android9.0之后就不应访问 SDK 中未列出的方法或字段,否则会提示报错,应用老老实实的用谷歌大佬提供的API就好了。

来看谷歌大佬的回应:

尽管您目前仍可以使用灰名单中的某些非 SDK 接口(取决于您应用的目标 API 级别),但是如果您使用任何非 SDK 方法或字段,终归存在很可能会损坏应用的风险。

如果您的应用依赖于非 SDK 接口,则应该开始计划迁移到 SDK 接口或其他替代方案。如果您无法为应用中的功能找到使用非 SDK 接口的替代方案,则应该请求新的公共 API。

尽管还是可以使用,但后果自负。

有frameworks的同学可以看这个路径,此文本包含已列入灰名单的非受限 API 的列表。

如果非常想使用此接口又找不到替代方案?

如果非常想使用此接口又找不到替代方案时怎么办?可以找Google提需求,如下图。



其它的说明都可以忽略,主要是确认自己的SDK接口到底是不是属于非SDK接口。

应用调试时进行测试

先建议开启lintOptions,检测一下其他问题。

另外在搭载 Android 9(API 级别 28)或更高版本的设备或模拟器上构建和运行可调试应用来测试该应用是否使用非 SDK 接口。

在您的应用上运行测试时,如果该应用访问了某些非 SDK 接口,系统就会输出一条日志消息。

您可以检查应用的日志消息,查找以下详细信息:

  • 声明的类、名称和类型(采用 Android 运行时所使用的格式)。
  • 访问方式:链接、反射或 JNI
  • 所访问的非 SDK 接口属于哪个列表。

我们可以使用 adb logcat 来查看这些日志消息,这些消息显示在所运行应用的 PID 下,不过日志消息看起来很痛苦……

举例而言,日志中可能包含如下条目:

Accessing hidden field Landroid/os/Message;->flags:I (light greylist, JNI)

我们也可以使用 StrictMode API 进行测试的

记得在主方法里面开启 StrictMode,用 StrictMode API 来测试应用是否使用 非 SDK 接口 ,怎么开启?打开 detectNonSdkApiUsage 方法 ,然后使用 penaltyListener 来接收每次使用 非 SDK 接口的行为所对应的回调,并且可以在其中实现自定义处理。

回调中提供的 Violation 对象派生自 Throwable,并且封闭式堆栈轨迹会提供相应使用行为的上下文。

当然,我们也可以使用 veridex 工具进行测试的

您还可以在 APK 上运行静态分析工具 veridexveridex 工具 会扫描 APK 的整个代码库(包括所有第三方库),并报告发现的所有使用非 SDK 接口的行为。

不过 veridex 工具存在以下局限性:

  • 它无法检测到通过 JNI 实现的调用。
  • 它只能检测到一部分通过反射实现的调用。
  • 它对非活动代码路径的分析仅限于 API 级别的检查。

有的人会好奇,它对原生代码中的非 NDK 接口是否有限制?Google大佬回应,Android SDK 包含 Java 接口。Android 平台从 Android 7(API 级别 26)开始就已经限制访问原生 C/C++ 代码中的非 NDK 的接口了。


作者:奥特曼超人Dujinyang

来源:CSDN

原文:dujinyang.blog.csdn.net/

版权声明:本文为博主杜锦阳原创文章,转载请附上博文链接!

Android9.0 如何区分SDK接口和非 SDK接口的更多相关文章

  1. 史上最严管控,Android P非SDK接口管控特性解读及适配

    导读 在 Android P 版本中,谷歌加入了非 SDK 接口使用限制,无论是通过调用.反射还是JNI等方式,开发者都无法对非 SDK 接口进行访问,此接口的滥用将会带来严重的系统兼容性问题. 针对 ...

  2. Android9.0特性

    这篇文章,是Android官方文档的中文版本. 注意事项(AndroidP 特性): (1),android.os.Build.VERSION.RELEASE ,需要当做字符串类型处理. (2),依赖 ...

  3. SpUtil多样加密存储,兼容android9.0

    代码地址如下:http://www.demodashi.com/demo/15058.html 前言 在android系统不断升级的过程中,Sharepreferences存储出现多中问题,其中有些是 ...

  4. android9.0适配HTTPS:not permitted by network security policy'

    app功能接口正常,其他手机运行OK,但是在Android9.0的手机上报错 CLEARTEXT communication to 192.168.1.xx not permitted by netw ...

  5. 很带劲,Android9.0可以在i.MX8开发板上这样跑

    米尔MYD-JX8MX开发板移植了Android9.0操作系统,现阶段最高版本的Android9.0操作系统将给您的产品在安全与稳定性方面带来更大的提升.可惜了,这里不能上传视频在i.MX8开发板跑A ...

  6. Solr4.8.0源码分析(6)之非排序查询

    Solr4.8.0源码分析(6)之非排序查询 上篇文章简单介绍了Solr的查询流程,本文开始将详细介绍下查询的细节.查询主要分为排序查询和非排序查询,由于两者走的是两个分支,所以本文先介绍下非排序的查 ...

  7. Android9.0新特性曝光,你准备好了吗

    Android9.0最早出现在2018年1月25日的谷歌官网上,初步代号已经确定为“Pistachio Ice Cream”(开心果冰淇淋),不过按照Google的惯例,如此长的三个单词代号,通常都只 ...

  8. 使用appium在android9.0真机上测试程序时报错command failed shell “ps ‘uiautomator’”的解决办法

    appium目前最新的windows版本是1.4.16,在android9.0真机上测试程序时会报错:command failed shell “ps ‘uiautomator’”. 网上大多数人的解 ...

  9. mysql 5.7中 count(0) count(*) count(主键) count(非空字段)效率比较

    mysql count(0) count(*) count(主键) count(非空字段) 效率比较 写代码的时候经理在背后说了一句count(0)的效率高于count(*) ,索性全部测试了一下 结 ...

随机推荐

  1. 讨厌的Permission denied:adb访问手机目录时,怎么处理Permission denied问题

    故事背景 手机某app出现了无响应,我想找到手机anr日志 但我只知道在data目录的某个目录里有个tra**的文件里有anr日志 具体的我真忘了,所以想要进入data中用ls查看一下 结果就出现了讨 ...

  2. Webpack配置区分开发环境和生产环境

    在项目开发的时候,我们通常会将程序分为开发环境和生产环境(或者叫线上环境),开发环境通常指的是我们正在开发的这个阶段所需要的一些环境配置,也就是方便我们开发人员调试开发的一种环境:生产环境通常指的是我 ...

  3. jenkins上下游工程以及空间占用处理

    1.最近项目架构调整,把十几个java项目整合为一个大的项目,这样构建上游工程成功后下游工程会自动构建 解决如下:取消这个勾选即可 2.构建单个项目时,会把所有子工程都打包一次 解决如下:指定构建时的 ...

  4. 基于API和SQL的基本操作【DataFrame】

    写在前面: 当得到一个DataFrame对象之后,可以使用对象提供的各种API方法进行直接调用,进行数据的处理. // =====基于dataframe的API=======之后的就都是DataFra ...

  5. Spring 梳理 - ContentNegotiatingViewResolver

    ContentNegotiatingViewResolver,这个视图解析器允许你用同样的内容数据来呈现不同的view.它支持如下面描述的三种方式: 1)使用扩展名http://localhost:8 ...

  6. js数组的增删改查

    array 数组的增删改: push 从数组后面推入一个元素或多个元素 var arr = [1,2,3]; ​ // 返回:修改后数组的长度 arr.push(4,5,6); pop 删除数组最后一 ...

  7. MongoDB的复制源oplog

    ​ 之前有说过MongoDB的复制是异步复制的,其实也就是通过oplog来实现的,他存放在local数据库中,我们来查询一下主节点的日志大小. ​ 除了主节点有oplog之外,其他节点也就有oplog ...

  8. element取表格对应id数据

    <el-button size="mini" type="danger" @click="editor(scope.row)"> ...

  9. poll(2) 源码分析

    poll(2) poll(2) 系统调用的功能和 select(2) 类似:等待一个文件集合中的文件描述符就绪进行I/O操作. 使用 实现 select(2) 的局限性: 关注的文件描述符集合大小最大 ...

  10. 手把手教你安装Eclipse最新版本的详细教程 - 大佬的鸡肋,菜鸟的盛宴(非常详细,非常实用)

    简介 首先声明此篇文章主要是针对测试菜鸟或者刚刚入门的小伙们或者童鞋们,大佬就没有必要往下看了. 写这篇文章的由来是因为后边要用这个工具,但是由于某些原因有部分小伙伴和童鞋们可能不会安装此工具,为了方 ...