前言

1 . 信息:

Android P(禁用非官方API)目前类似的消息此起彼伏,关于国外移动开发者社区 XDA 的活跃者们在 AOSP(Android 开放源代码项目)的代码提交记录中的发现。从 AOSP 最新的 commits 中可以看到,那些使用 Android SDK 里面没有被文档提及的非公开 APIs(也就是使用 @hide 注解标记的 APIs)的 apps 将受到系统限制。

image

2. 验证:

Android P预览版已经开发下载,大家可以下载刷机,测试下使用到的api是否被限制。Android官网提供的刷机包有以下四种,大家可以直接下载刷机包刷机进行验证。下载地址如下:https://developer.android.com/preview/download.html

image

刷完包之后迫不及待的测试了非官方禁用API,测试结果和大家猜测的一样,Android p会给大家弹出toast告知禁止使用非官方API,具体内容请参考:co/dev/appcompat,最终的链接地址为:https://developer.android.com/preview/restrictions-non-sdk-interfaces.html
目前官方文档已经明确对非官方API的限制:

image

总结如下

Android P引入了对非官方API的限制。无论是通过反射还是通过JNI等方法, 只要应用程序引用非SDK接口或尝试使用反射或JNI获取其句柄,就会使应用受到这些限制。

01

禁用非官方API原因

关于为何要减少非官方接口,提高应用稳定性,在2018年2月28日,Google官方有此类声明:原文地址:

https://android-developers.googleblog.com/2018/02/improving-stability-by-reducing-usage.html

image

通过以上内容可得知,Google早在Android N中已经在native层已经对ndk开发所使用的API进行了非官方API接口的限制,目前在Android P中开始实施对java层非官方API(官方SDK接口)的限制。目的是为了确保Android开发者和使用者的稳定性,为减少非官方API带来的崩溃,Google一直在努力着。

02

如何区分官方API和非官方API

image

官方声明:SDK接口是Android框架中记录的接口。 处理非SDK接口是API抽象化的实现细节; 它可随时更改,恕不另行通知。(官方sdk接口:https://developer.android.com/reference/packages.html)

关于限制到何种程度,Goole官方有以下说明:

image

总结以下几点:

  • Android P预览版暂时对非官方API不做限制,目的是为了提供给开发者用于测试应用中是否使用非官方API。

  • Android P预览版暂时会打印使用的非官方API的日志以及弹出相应的toast提供给开发者测试使用(注:Toast是为了增加关注度,logcat中有使用非官方API的详细信息)

  • 日志(logcat)信息中包括Android运行时使用的格式的声明类,名称和类型。日志消息还指示访问方式:直接,通过反射或通过JNI。以及适用的灰名单。

有两种灰名单:

  • light greylisted :包含方法和字段,它们继续在Android P预览版中运行,但Google无法保证在未来版本的平台上访问这些方法和字段。

  • dark greylist:开发人员预览版本中无法访问的方法。
    这些日志消息可以使用adb logcat访问,并且会显示在正在运行的应用程序的PID下。日志中的条目可能如下所示:

Accessing hidden field Landroid/os/Message;->flags:I (light greylist, JNI)
Accessing hidden method Landroid/app/ActivityThread;->currentActivityThread()Landroid/app/ActivityThread; (dark greylist, reflection)

03

使用非官方API的后果

在Developer Preview的后续版本中,访问非SDK接口的各种方法都会产生错误或其他不良结果。下面列出了几种示例:

image

终上所述:使用非官方API的小伙伴么,赶紧检查下自己的APP是否使用了非官方API吧,Android P呼之欲出,别到时间措手不及。

04

实际测试

有了以上大google的威逼利诱,以及各种模式下对非官方API的限制,我们来实际的测试下:
举个例子,拿 android.net.wifi 包里面的 WifiManager 类来说,该 Class 里面就包含很多 @hide 标记的代码(其实源码中类都包含有很多的@hide标记,有兴趣的可以参考下http://androidxref.com/查看源码,或者下载源码https://source.android.com/setup/downloading有兴趣的同学可以进一步交流),一些变量或方法(这里随便找网上找了一个):

/*** Broadcast intent action indicating whether Wi-Fi scanning is allowed currently* @hide*/public static final String WIFI_SCAN_AVAILABLE = "wifi_scan_available";
    这里我们通过java reflection功能来实现该功能,即调用隐藏API WIFI_SCAN_AVAILABLE字段:
WifiManager wifiManager = (WifiManager) getApplication().getSystemService(Context.WIFI_SERVICE);
field = wifiManager.getClass().getDeclaredField("WIFI_SCAN_AVAILABLE");
Log.d(Tag, (String) field.get(wifiManager));

上述实现上很简单,通过反射Filed WIFI_SCAN_AVAILABLE 来打印隐藏Field的值,在pixel Android P预览版执行结果如图所示:

image

图中执行结果让访问g.co/dev/appcompat正如我们上文中前言的内容,我们再来看下打印的日志:

image

如图中所示,访问hide的方法以警告的形式出现在log日志中后方包含详细的信息,细心的朋友可能会看到,我们反射使用@hide的WIFI_SCAN_AVAILABLE的值灰名单的级别为(dark greylist, reflection),也就是说在属于无法访问的方法。以上便是Java层内容的测试
虽然大多数还都在灰名单的light greylisted级别,暂时可以在Android P 预览版中运行,但不要忘记了上面所说的,Google无法保证在未来版本的平台上访问这些方法和字段

总结:

以上,无论是java层使用了非官方API还是在NDK层反射使用,都会在log日志中打印详细信息。

亲爱的开发者们,Android官方禁用非官方API已经从Android N到Android P有了比较实质的进展,为构建稳定和谐的Android使用环境,大Google也一直努力着。对于使用非官方API的内容请大家及时留意,不要因为一个不留神触碰到了源码Bug造成了大量的崩溃哦,赶紧查看下自己的应用有没有使用到这些吧,提前做好准备哦。。。

作者:SYfarming
链接:https://www.jianshu.com/p/a86d42fbc843
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

androidP 对反射的限制之黑名单机制相关推荐

  1. java 委托机制_通过反射实现Java下的委托机制代码详解

    简述 一直对Java没有现成的委托机制耿耿于怀,所幸最近有点时间,用反射写了一个简单的委托模块,以供参考. 模块API public Class Delegater()//空参构造,该类管理委托实例并 ...

  2. java委托机制教程_通过反射实现Java下的委托机制代码详解

    简述 一直对java没有现成的委托机制耿耿于怀,所幸最近有点时间,用反射写了一个简单的委托模块,以供参考. 模块api public class delegater()//空参构造,该类管理委托实例并 ...

  3. spark2.2以后版本任务调度将增加黑名单机制

    问题导读 1.spark如何开启黑名单机制? 2.哪些条件将将executors列入黑名单? 3.整个节点被列入黑名单,executors如何处理? spark2.2中在任务调度中,增加了黑名单机制, ...

  4. hadoop黑名单机制

    转自:http://blog.csdn.net/liangliyin/article/details/7606275 Note:这里描述的黑名单是指jobtracker网页summary表格中显示的& ...

  5. Hadoop的TaskTracker黑名单机制

    Note:这里描述的黑名单是指jobtracker网页summary表格中显示的"Blacklisted Nodes",称之为集群黑名单. 在HADOOP-4305之前,Hadoo ...

  6. java的反射和它的类加载机制

    2019独角兽企业重金招聘Python工程师标准>>> 1. java 的类装载系统: 在java虚拟机中有两种类装载器: 启动类装载器 和 自定义类装载器. 前者是jvm的一部分, ...

  7. 从共享单车看城市云反射弧的工作运行机制

    作者:刘锋,黄子铜 概要:智能时代,我们的城市从架构上也越来越类脑化,从运转上变得越来越智慧,共享单车基于物联网技术,很便捷地解决了最后一公里的需求,是城市云脑中云反射弧在交通领域一个显著的案例. 1 ...

  8. 电商平台分析平台----需求六:实时统计之黑名单机制

    做什么? 从Kafka获取实时数据,对每个用户的点击次数进行累加并写入MySQL,当一天之内一个用户对一个广告的点击次数超过100次时,将用户加入黑名单中. 需求解析 1.先从kafka得到数据,数据 ...

  9. HDFS白名单和黑名单机制

    白名单 允许哪些机器可以加入到当前的HDFS集群中. 通过在hdfs-site.xml中配置dfs.hosts参数来指定白名单,dfs.hosts默认值为空,表示所有机器都可以加入集群中. 白名单配置 ...

最新文章

  1. 什么是Java反射机制?
  2. 软件工程质量管理体系要求_软件质量管理| 软件工程
  3. 【flink】Flink 中的木桶效应:单个 subtask 卡死导致整个任务卡死
  4. mysql5.1 主主同步_mysql主主同步指定库的指定表(version 5.1~5.7)
  5. Unity cg vertex and fragment shaders(二)
  6. ssh 无法连接 z/OS 主机
  7. eclipse中svn插件的工程不能与svn资源库同步的解决方法
  8. Mybatis递归自查询查(无限极分类)
  9. JavaWeb项目生成PDF文件添加水印图片并导出
  10. 软件测试--计算机基础
  11. DevExpress WinForms v20.2版本亮点放送——PDF Viewer功能加强
  12. 秀米编辑器详细使用教程
  13. 芭蕉树上第十九根芭蕉-- Qt生成随机数的方法
  14. 二项分布与负二项分布卡片
  15. 自建 CA 中心并签发 CA 证书
  16. 使用bable打包js
  17. 计算机知识与技能竞赛配图,“高教杯”全国大学生先进制图技术与技能大赛
  18. Sunny带你半小时掌握Mybati关联映射
  19. html名人名言页面,HTML5 纪念卡 | 名人名言卡
  20. RTC时钟学习总结附带其他小总结

热门文章

  1. 嵌入式基础学习-U-Boot使用
  2. 计算机清内存,电脑内存清理命令是什么
  3. INO(Initial NFT Offering )
  4. 一文读懂 | 数据中台如何为企业赋能?
  5. 社保管理系统连接不上服务器,社保费客户端登录服务器异常
  6. 手机/平板上如何进行网页过滤
  7. Flutter面试总结(2022)
  8. 微服务团队_为什么团队文化对于成功的微服务至关重要
  9. 网站使用手机相机_使用“互通相机”把你的iPhone手机变成Mac的心灵之窗!
  10. 会计科目 分类 说明