警告:Android P(禁用非官方API)

警告:Android P(禁用非官方API)

1

作者介绍

李俊涛

京东前台产品研发部-资深Android工程师

看雪论坛 Android安全小组成员

前言

1. 信息:

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

2. 验证:

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

https://developer.android.com/preview/download.html

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

目前官方文档已经明确对非官方API的限制:

总结如下

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

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

看点

02

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

官方声明:SDK接口是Android框架中记录的接口。 处理非SDK接口是API抽象化的实现细节; 它可随时更改,恕不另行通知。

(官方sdk接口:https://developer.android.com/reference/packages.html)

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

总结以下几点:

  • 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接口的各种方法都会产生错误或其他不良结果。下面列出了几种示例:

终上所述:使用非官方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预览版执行结果如图所示:

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

如图中所示,访问hide的方法以警告的形式出现在log日志中后方包含详细的信息,细心的朋友可能会看到,我们反射使用@hide的WIFI_SCAN_AVAILABLE的值灰名单的级别为(dark greylist, reflection),也就是说在属于无法访问的方法。以上便是Java层内容的测试

注意:来一波常用的隐藏api反射调用,显示结果如下:

虽然大多数还都在灰名单的light greylisted级别,暂时可以在Android P 预览版中运行,但不要忘记了上面所说的,Google无法保证在未来版本的平台上访问这些方法和字段

总结:

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

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

本文分享自微信公众号 - 京东技术(jingdongjishu)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-03-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏互联网杂技

【小教程】教你拿出app中的图片资源

有一种方法通过ipa或apk包来获得每个资源的切图,今天就来简单介绍下。因为有的同学还不知道这个方法,尤其是没有技术背景的同学(我司UI妹子得知这个方法如获至宝...

31450
来自专栏Android点滴积累

Android热修复技术原理详解(最新最全版本)

本文框架 什么是热修复? 热修复框架分类 技术原理及特点 Tinker框架解析 各框架对比图 总结   通过阅读本文,你会对热修复技术有更深的认知,本文会列出各...

89950
来自专栏IT大咖说

干货 | 沪江高级安卓工程师徐宜生:移动端APM性能监控

徐宜生,现任沪江高级Android开发工程师,著有《Android群英传》《Android群英传:神兵利器》两书,CSDN博客专家,慕课网Android讲师,活...

549110
来自专栏互联网杂技

小程序来了

2017年1月9日,小程序如约而至。 小程序究竟该如何获取?首先,你需要将微信更新至iOS6.5.3版本或Android6.5.3版本,其次,你得尝试使用一个小...

39480
来自专栏贾志刚-OpenCV学堂

OpenCV3.2集成Android Studio2.2开发配置

主要知识点 OpenCV4Android3.2 SDK介绍与下载 AS2.2与OpenCV3.2集成 程序演示与代码 AS集成OpenCV3.2配置常见错误 O...

47760
来自专栏EAWorld

移动开发的跨平台实践及在企业中的应用

目录: 一、移动跨平台已成为必然 二、驱动原生是移动跨平台的最佳选择 三、以工程化的形式解决移动跨平台问题 四、普元在企业移动跨平台上的优秀实践 五、总结与展望...

47460
来自专栏智能算法

实战:详解猫眼电影小程序开发过程

作者:辉仔,Android开发工程师,目前主要涉及移动端APP的开发,Github地址:https://github.com/hundredays。 责编:陈...

476150
来自专栏性能与架构

realtime 库和框架概览

Websocket 库 现在大部分新版浏览器、Android、IOS 都已经支持了 Websocket,直接使用 Websocket 问题不大,那么 Webso...

38870
来自专栏Android点滴积累

Android热修复框架之优逆势分析(Hotfix)

Android平台出现了一些优秀的热更新方案,主要可以分为4类: 基于Instant Run 热插拔方案:美团的Robust(实时修复)   Robust插件对...

670110
来自专栏EAWorld

DevOps平台实践落地之构建管理详解

? 企业做DevOps平台,本质上是做企业的IT生产线,最终是实现整个企业级的数字化生产线。构建作为落地DevOps平台必不可少的环节之一,是持续集成、交付和...

621100

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励