Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >警告:Android P(禁用非官方API)

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

作者头像
京东技术
发布于 2018-04-10 07:45:49
发布于 2018-04-10 07:45:49
2.3K00
代码可运行
举报
文章被收录于专栏:京东技术京东技术
运行总次数:0
代码可运行
警告: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下。日志中的条目可能如下所示:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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有兴趣的同学可以进一步交流),一些变量或方法(这里随便找网上找了一个):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 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字段:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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造成了大量的崩溃哦,赶紧查看下自己的应用有没有使用到这些吧,提前做好准备哦。。。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-03-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 京东技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android P 应用兼容常见错误及建议
从 2018 年 3 月初我们发布 Android P 开发者预览版以来,很多开发者都对当前常见应用在 Android P 上做了一些兼容性测试,我们在这里总结了一些常见的问题,以及它们发生的原因和建议的修改措施。 问题 1: 假设 android.os.Build.VERSION.RELEASE 为数值类型 原因: 对于即将推出的 Android 新版本的预览版,这些值可能是字母数字 (如 “PPR” 或 “P”),因此在尝试将 “P” 解析为整数时会导致崩溃。 建议: 应用把 RELEASE 的值作为
Android 开发者
2018/05/31
8.6K0
Android P 适配指南
Google自 android L (5.0) 以来就持续对安装系统进行 安全 以及 性能上的升级,此次的 android P (9.0)也不例外, 更大程度上对之前一些版本一些警告的具体落实,无论你的 Target Api 是否是 28 都将受到影响。
用户1269200
2018/10/08
3.6K0
Android P 适配指南
Android N 第四个开发者预览版更新,即最终版 API 和 SDK 发布
今天Google官方推出了Android N的第四个预览版,相比前三个预览版,SDK和API最终定型。新的版本全名叫作Android N Dev Preview 4。 今天Android N 第四个开
非著名程序员
2018/02/02
5390
Android N 第四个开发者预览版更新,即最终版 API 和 SDK 发布
Tencent Shadow—零反射全动态Android插件框架正式开源
Android 9.0出现限制非公开SDK接口访问之后,可以说当时我们已知的所有插件框架实现都或多或少的出现了适配问题。大家的应对方式基本上都是一种对抗的思想,有的去破解限制,有的通过和Google沟通浅灰名单有效期暂时续命。
腾讯开源
2019/06/20
7.3K0
Tencent Shadow—零反射全动态Android插件框架正式开源
非SDK接口自动化检测工具--veridex
SDK接口指的是Android官方开发文档中声明的方法,即文档地址 中所能查询到的API,除了这些,其他的API都是非SDK接口
静默加载
2022/03/04
1.3K0
非SDK接口自动化检测工具--veridex
腾讯零反射全动态Android插件框架Shadow解析
最近几年,腾讯对于开源事业也是越来越支持,今天要说的就是在腾讯被广泛使用的Shadow框架,一个经过线上亿级用户量检验的反射全动态Android插件框架。 首先,让我们来看一下官方对于Shadow的简介:
xiangzhihong
2022/11/30
3.3K0
非 SDK 接口常见问题 | Android 开发者 FAQ Vol.13
常规问题 Q1: 什么是非 SDK 接口? A:非 SDK 接口指不在官方 Android SDK 涵盖范围内的 Java 字段和方法。此类接口是 SDK 的内部实现细节,可能随时会被修改,且不对开发者另行通知。 常规问题 Q2 : Android P 在非 SDK 接口使用限制方面采取了哪些举措? A:谷歌正在逐步限制非 SDK 接口的使用:针对不同接口采取不同形式的限制 (详情请参照条目 “应用运行时,我应该如何检测非 SDK 接口的使用?” )。若您正在使用非 SDK 接口进行开发,请特别注意限制对应
Android 开发者
2018/06/20
1.4K0
Android 9.0适配及部分新特性介绍
在最开始针对速贷进行Android9.0版本的适配时,我使用的是真机是vivo X21A,将targetSdkVersion升到28,运行发现网络请求全报400 Bad Request,查阅了网上针对android9.0网络请求问题的解决方案以及其他的一些迁移到Android9.0需注意的点(下文会讲到),做了些适配和调整,发现仍有问题,通过抓包也并没有发现问题的原因所在。随后试了下模拟器以及借来的google pixel(9.0)真机运行了下,能正常使用,并没有发现什么问题,于是猜想是机子本身系统的问题。
用户2802329
2018/12/10
3.4K0
Android 9.0适配及部分新特性介绍
API level targeting to 28,准备好了吗?
小编负责的地图手表项目,和Google合作,需要尽快完成targetsdk升级的适配测试工作。
用户5521279
2019/09/29
1.4K0
API level targeting to 28,准备好了吗?
自动化检测 Android APP 非 SDK 接口使用,防止非预期异常发生!
从 Android 9(API 级别 28)开始,Android 平台对应用能使用的非 SDK 接口实施了限制,只要应用引用非 SDK 接口或尝试使用反射或 JNI 来获取其句柄,这些限制就适用,这些限制旨在帮助提升用户体验和开发者体验,为用户降低应用发生崩溃的风险,同时为开发者降低紧急发布的风险。
岛哥的质量效能笔记
2021/09/14
1K0
自动化检测 Android APP 非 SDK 接口使用,防止非预期异常发生!
Android P 开发者预览版 · 操作指南
原文 / Fred Chung · Android 开发者平台技术推广 我们刚刚推出了 Android P 的开发者预览版,旨在让开发者提早体验下一个 Android 版本,从而为您的应用作出兼容性的
Android 开发者
2018/05/31
7570
Android hide api反射方案合集
最近工作需要,反射了一下 android.app.QueuedWork 这个类,但是这个类的一些 Field 在Android P之后是不允许APP反射的,所以需要通过一些绕过系统限制的方法。借此机会了解了一下各个绕过hide限制的反射方案。
烧麦程
2024/07/02
3530
Android hide api反射方案合集
Android 9 适配怎么做? “QQ音乐”优化实录
原文链接:https://wetest.qq.com/lab/view/406.html
WeTest质量开放平台团队
2018/09/23
2.4K0
Android 9 适配怎么做? “QQ音乐”优化实录
后续更新 | 减少使用非 SDK 接口以提升稳定性
作者: 软件工程师 David Brazdi 和 Nicolas Geoffray 在 Android 生态中,我们非常重视为用户和开发者提供最好的体验。每一次版本更新都会引入新的功能,助力开发
Android 开发者
2018/06/19
5410
QQ 音乐 Android 吃 Pie 之路
Android P 这次有很多行为变更,其中不乏一些需要亟需适配的变更。
QQ音乐技术团队
2018/08/31
3.6K5
QQ 音乐 Android 吃 Pie 之路
基于Google动态化方案的组件化演进
国内Android动态化方案已经蓬勃发展数年之久,在React Natvie、Flutter这些跨平台方案未出现之前,类似Atlas、Replugin、DLA等Android动态化方案在业界独领风骚。在国内动态化方案也分为两个流派:组件化与插件化。比如Atlas自称为组件化方案,另外诸如Replugin、DroidPlugin等称为插件化方案。本文不具体说明组件化与插件化区别相关介绍文章已多入牛毛,这里就不再赘述。
用户1907613
2018/07/25
2.4K0
基于Google动态化方案的组件化演进
Android P Beta 3 现已发布!
继上个月我们发布 Android P Beta 2 及终版 API 之后,今天我们发布 Android P 的 Beta 3 版本,这是我们今年在 Android P 开发者预览版本上的又一个里程碑。在之前的更新内容中,我们已经最终完善了面向开发者的 API,现在的 Beta 3 已经非常接近我们即将在今年夏天发布的 Android P 最终版本的形态。 Android P Beta 3 包括了最新的 bug 修正,稳定性优化和一些微调,以及 2018 年 7 月发布的安全更新。我们非常推荐您现在对自己的
Android 开发者
2018/07/04
7890
Android P专区免费开放 -- 同样的Android,不同的体验
2018年3月8日,Google推出了Android P Preview版本,并提供官方镜像下载。
WeTest质量开放平台团队
2018/10/29
1.2K0
Android P专区免费开放 -- 同样的Android,不同的体验
原文链接:http://wetest.qq.com/lab/view/376.html
WeTest质量开放平台团队
2018/04/09
4.4K4
Android P专区免费开放 -- 同样的Android,不同的体验
Android P Preview1 兼容要点[通俗易懂]
兼容Preview1 主要改下targetSdkVersion = 28 compileSdkVersion为前一个版本(比如27)
全栈程序员站长
2022/07/31
4520
推荐阅读
相关推荐
Android P 应用兼容常见错误及建议
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验