减少使用非 SDK 接口,提升系统稳定性
我们一直寻求改善 Android 用户以及开发者体验的方法,尽力提供稳定的体验。秉持这种精神,我们限制了 app 使用非 SDK 接口,因为此类作法往往存在用户遇上系统崩溃以及开发者需要紧急发布修复的风险。在 Android N 当中,我们限制了 C/C++ 代码所能使用的符号,从而确保使用 C++ 代码的 app 能够始终对接稳定的 NDK 接口,而不会因使用不稳定的非 NDK 接口而频频奔溃。自 Android P 起,我们将进一步提升系统稳定性,扩展此类限制至 Java 语言 SDK 接口。
将会有哪些行为?
从 Android P 版本开始,我们会限制使用非 SDK 方法与字段:您将无法对其进行访问 —— 无论通过直接调用、反射还是 JNI 等方式。如果加以尝试,您会收到 NoSuchFieldException 或者 NoSuchMethodException 等错误提示。
最初,此项限制主要针对使用频次较低或未使用的接口。在计划与设计工作当中,我们在解决用户及设备制造商反馈的 app 稳定性问题方面,会尊重广大开发者群体意见,同时尽可能降低变更幅度。如果您在迁移至 SDK 方法过程中,遇到技术方面的挑战,我们容许您在 app 更新至最新 API 之前继续使用原有方法。我们计划在今后的 Android 版本中进一步落实这些限制,同时提前通知各位开发人员,确保给予各位充分的时间迁移,并在此期间收集与所需 SDK 接口相关的反馈意见。我们一直强调使用非 SDK 接口带来的风险 —— 在任何版本的 Android 中重构代码以添加功能或修复 bug 时,非 SDK 接口都可能发生变化。因此,如果您的应用程序目前仍依赖于非 SDK 接口,则应尽快开始向 SDK 接口进行迁移。
由于 Java 语言与 C++ 的特性差异,因此该限制将与之前的符号限制略有区别。您不可访问不属于公开 SDK 的类别,同时请确保只使用各个类中被归入官方文档的部分。尤其需要注意的是,当您通过反射等语义与某个类进行交互时,不可访问未在 SDK 中明确列出的方法或字段。
如果缺少 SDK 接口,该如何应对?
我们了解到并不是所有 app 使用的非 SDK 接口都有可替代的 SDK 接口。我们重视您就公共 API 扩展及改进问题提出的反馈意见。如果您觉得在 SDK API 得到对应扩展之前无法停止使用非 SDK 接口,请尽快通过错误追踪器 (bug tracker) 向我们反馈。及时获取这些反馈意见对我们来说非常重要,我们需要利用这些信息调整限制黑名单,从而最大程度减少对开发人员产生的影响,同时着手为今后推出的 Android 平台开发必要的 SDK 接口。
下一步是什么?
在 Android P 开发者预览版当中,您将能够运行现有 app,并在使用非 SDK 接口时收到警告提示 —— 该接口会被列入最终版本的黑名单或灰名单。最好确保您的 app 在开发者预览版中能流畅运行;如果您担心自己的 app 可能受到影响,请特别留意接口兼容性警告信息。
在新开发者预览版发布以及错误追踪器分类条目更新之际,我们会继续监控非 SDK 接口的使用情况。如果官方 SDK 接口已经存在,我们将发布官方指南文档帮助您从常用的非 SDK 接口迁移至 SDK 接口。
相关内容延展请发送对应口令即可获得:
> API 程序包:API
> Android Developers 官方文档:官方文档
推荐阅读:
隆重推出 Android KTX,让 Kotlin 的开发更美妙!