[关闭]
@qinyun 2018-03-01T10:03:56.000000Z 字数 1602 阅读 715

谷歌将对非SDK的API的限制从NDK扩展到Java

未分类


译者|核子可乐

编辑|覃云

上个月,我们曾报道过Android 9.0将禁止使用非官方API,引起了开发者的热烈讨论,时隔一个多月,Android团队终于发声证实了这个说法,声称从Android 9.0开始,对非SDK的API的限制逐渐从NDK扩展到Java,并表明这样做的目的是为了提高系统的稳定性,下面,我们来看看他们是怎么说的。

谷歌声明全文

在Android系统当中,我们一直在寻找各种方法以尽可能保证理想的稳定性,从而改善用户与开发人员体验。本着这一思路,我们努力确保应用程序不使用非SDK接口,因为此类作法往往会导致用户遭遇崩溃,并给开发人员的紧急发布造成困扰。

在Android N当中,我们限制了C/C++代码所能使用的符号组合。此项变更确保使用C++代码的应用程序能够始终对接稳定的NDK接口,而不会因依赖于不稳定的非NDK接口而引发崩溃机率提升。从Android的下一个版本开始,我们将进一步扩展此类限制,从而涵盖SDK的Java语言接口以进一步巩固稳定性水平。
 

将带来哪些影响?

自Android的下一个版本开始,非SDK方法与字段的使用将受到限制,您将无法对其进行访问——无论通过直接、反射或者JNI等方式。如果加以尝试,您会看到NoSuchFieldException或者NoSuchMethodException等错误提示。
 
最初,此项限制主要涵盖使用率较低或并未得到实际使用的接口。我们在规划与设计工作当中,充分重新我们的开发者社区,并希望在解决用户及设备制造商所反馈的应用程序稳定性问题的同时,尽可能避免引入大幅度变更。如果您在实际开发当中存在一些能够迁移至SDK进行解决,但在技术层面存在挑战性的需求,我们将允许您继续使用原有方法,直到您逐步将应用程序更新至最新API。

我们计划在未来的Android版本当中进一步扩大这些限制,为开发人员提供充分的迁移时间,同时长期发布警报通告,并在此期间收集与所需SDK接口相关的反馈意见。我们一直在强调使用非SDK接口的风险性影响——当我们重构代码以添加功能或修复bug时,使用非SDK接口可能在各类Android版本当中引发不可知的变化。因此,如果您的应用程序目前仍依赖于非SDK接口,则应尽快着手向SDK备选方案进行迁移。

由于Java语言与C++在特性方面存在巨大差异,因此对Java语言的具体限制方式将与立足符号的C++限制略有区别。您不应访问不属于我们SDK的类,同时亦需要确保仅使用各个类当中被纳入官方文档的部分。具体来讲,这意味着当您通过反射等语义与某个类进行交互时,所访问的方法或字段皆在SDK当中得以明确列出。

如果缺少SDK替代选项,该如何处理?

我们知道,某些应用程序所使用的非SDK接口可能还找不到可行的SDK替代选项。我们非常重视您对于公共API扩展及改进方面提出的反馈意见。如果您确信在SDK API得到对应扩展之前无法停止使用非SDK接口,请通过我们的bug追踪器提供相关信息。及时获取这些反馈意见对我们来说非常重要,我们需要利用这部分资讯继续调整限制黑名单,从而最大限度降低此次迁移对开发人员的影响,同时着手为未来将陆续推出的各Android系统平台开发一切必要的替代方案。

接下来将发生哪些变化?

在下一个Android开发者预览版当中,您将能够运行现有应用程序,并在使用非SDK接口时收到警告提示——该接口将在最终版本中受到黑名单或灰名单机制的限制。请确保您的应用在开发者预览版中始终遵循最佳实践; 另外,如果您担心自己的应用可能受到影响,请特别关注接口兼容性警告信息。

利用即将推出的开发者预览版与新的bug追踪器目录,我们将专注于监控非SDK接口的使用情况。如果相关接口已经拥有官方支持的SDK替代选项,我们将发布官方指南以帮助您了解如何从非SDK接口迁移至官方支持方案。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注