NullAway:Android上的NullPointerExceptions的开源工具

简介: NullPointerExceptions (NPE)。空指针异常NullAway:https://github.com/uber/NullAway介绍 NullAwayNullAway 的核心是基于开源类型的 NPE 检查器,用于 Java 代码。

NullPointerExceptions (NPE)。空指针异常

NullAway:https://github.com/uber/NullAway

介绍 NullAway

NullAway 的核心是基于开源类型的 NPE 检查器,用于 Java 代码。要使用 NullAway,你必须先在代码(字段,方法参数或返回值为 null)中添加 @Nullable 注释。(由于我们以前使用 Eradicate ,我们已经在我们的代码库中有这些注释。)给定这些注释,NullAway 执行本地的一系列一致性检查,以确保在代码中取消引用的任何指针不能为空。

NullAway 是一个用于查找框架 Error Prone bug 的检查插件。Error Prone 的运行代码检查作为 Java 编译过程标准的一部分。此编译器的集成允许检查编译器已经完成的工作,如代码解析和类型检查。此外,NullAway 和 Error Prone 可直接集成到我们用于 Android 代码的构建工具 Buck 所支持的快速内存并行构建中。因此,NullAway 可以比在正常构建过程之外运行的工具快得多。

我们发现,NullAway 在正常构建时间中只用了很少的开销(约占 10%)。因此,我们配置了 NullAway,不仅仅是在提交队列中运行,而是运行在我们的 Android 代码的每一个版本上。

将 NullAway 整合到我们所有的 Java 构建中的价值表现在以下三个方面:

  • 立即反馈:集成到所有版本中,使开发人员能够在引入潜在的 NPE 时立即获得反馈,而不必等待提交队列。

  • 没有 NPE 检查器:构建集成意味着我们不再需要在提交队列上作为单独的作业运行无效检查器,从而节省了大量的机器资源。

  • 降低提交队列延迟:NullAway 能够显着降低提交队列延迟,因为由于 NPE 警告而导致提交队列失败变得非常罕见 ; 这个减少的延迟在我们转向monorepo之后变得更加显着。

使用 NullAway

img_2723ce96d53bbb5e23aa80976802a5ff.jpe
image

图 2:在三个简单的步骤中,NullAway 确定方法m中的表达式e是否为空.

要了解 NullAway 的工作原理,让我们考虑一下如何确定程序中的一些表达式是否为空,这是空值检查所需要的。请考虑以下示例:

class A {
 @Nullable Object f;
}
static void m(A x) {
 if (x.f != null) {
   System.out.println(x.f.toString());
 }
}

在上面的示例中,NullAway 尝试显示x不为空,以确保 x.f 不会导致 NPE,并且 x.f 在调用 xftoString() 时也不为null

对于不应该为null的表达式,NullAway 首先尝试快速证明表达式 是非空的,例如,通过检查其类型是否不是 @Nullable ,或者是否是不能为nullnew Object() 的表达式。

例如,由于x的声明没有注释为 @Nullable ,所以 NullAway 可以假设它不为空,从而显示 x.f 是安全的。NullAway 通过确定 @Nullable 表达式从不作为参数传递给方法m的方式执行这一假设。

如果快速检查失败,NullAway 试图使用数据流分析和充分利用检查框架现有的库显示非 null 的含量。数据流分析的一个主要目的是发现代码中的现有 null。

对于上面的例子中的 xftoString() 调用,快速检查不能显示 x.f 不能为 null,因为 A.f 字段是 @Nullable 。然而,我们的数据流分析使用封闭的条件检查, xf!= null 来表示 x.f.toString() 的调用是安全的。由于数据流分析可能很昂贵(它需要计算控制流图并运行定点计算),所以 NullAway 每个方法只运行一次分析,并缓存结果。

在 NullAway GitHub 页面上,有关于如何在 Android 应用程序或其他 Uber Engineering 和开源的 NullAway 上运行该工具的详细说明,NullAway 是消除 NPE 的快速实用工具,帮助其他人部署更可靠的 Android 应用程序。有关 NullAway 的详细检查,错误信息和限制的更多详细信息,请参阅我们的实施指南。

链接:

https://github.com/uber/NullAway/wiki

原文链接:

https://eng.uber.com/nullaway/

目录
相关文章
|
7月前
|
Android开发 芯片 开发者
Android MediaTek bootloader 的序列号长度 & 移除非字母和数字限制 SN-Writer工具支持写入
Android MediaTek bootloader 的序列号长度 & 移除非字母和数字限制 SN-Writer工具支持写入
97 0
|
4月前
|
监控 Java API
Android经典实战之OkDownload:一个经典强大的文件下载开源库,支持断点续传
本文介绍的 OkDownload 是一个专为 Android 设计的开源下载框架,支持多线程下载、断点续传和任务队列管理等功能,具备可靠性、灵活性和高性能特点。它提供了多种配置选项和监听器,便于开发者集成和扩展。尽管已多年未更新,但依然适用于大多数文件下载需求。
382 1
|
4月前
|
编解码 Android开发
【Android Studio】使用UI工具绘制,ConstraintLayout 限制性布局,快速上手
本文介绍了Android Studio中使用ConstraintLayout布局的方法,通过创建布局文件、设置控件约束等步骤,快速上手UI设计,并提供了一个TV Launcher界面布局的绘制示例。
59 1
|
5月前
|
Java Android开发 iOS开发
探索安卓与iOS开发的差异性:平台、工具和用户体验的对比分析
【7月更文挑战第30天】在移动应用开发的广阔天地中,安卓和iOS两大平台各自占据着不可忽视的地位。本文将深入探讨这两大平台在开发环境、工具选择以及最终用户体验上的根本差异,并分析这些差异如何影响开发者的策略和用户的偏好。通过比较安卓的开放性与iOS的封闭性,我们将揭示不同平台下的开发哲学及其对生态系统的影响。
47 4
|
5月前
|
开发工具 Android开发 数据安全/隐私保护
探索iOS与安卓应用开发的异同:技术、工具和市场趋势
在移动操作系统的广阔舞台上,iOS和安卓两大主角各自演绎着怎样的精彩?本文将深入剖析这两大平台在应用开发过程中的技术差异、开发工具的选择以及面对的市场环境。通过数据支撑和案例分析,我们将一窥这两个系统如何影响开发者的决策,并探讨它们未来的发展方向。
|
4月前
|
API 调度 Android开发
Android经典实战之处理后台任务的2个工具
本文介绍Android后台任务管理,涵盖WorkManager与JobScheduler的使用方法及区别。WorkManager属Jetpack库,确保任务可靠执行,支持延迟与条件依赖。JobScheduler则针对特定条件下的任务调度,如网络类型。两者各有优势,WorkManager适用于多数场景。
51 0
|
5月前
|
监控 开发工具 Android开发
探索安卓与iOS开发的差异:平台特性、工具和市场趋势
在移动应用开发的广阔舞台上,安卓与iOS两大操作系统扮演着主角。它们各自拥有独特的平台特性、开发工具和市场定位,这些差异深刻影响着开发者的决策和产品的最终形态。本文将深入分析这两大平台的关键技术差异,探讨各自的开发环境和工具集,以及它们在市场上的表现和未来的趋势,为开发者提供一个全面的视角,帮助他们在这两个平台上做出更明智的开发选择。
|
6月前
|
监控 Android开发 iOS开发
探索Android与iOS开发的差异:平台、工具和用户体验的比较
【6月更文挑战第25天】在移动应用开发的广阔天地中,Android和iOS两大平台各领风骚,它们在开发环境、工具选择及用户体验设计上展现出独特的风貌。本文将深入探讨这两个操作系统在技术实现、市场定位和用户交互方面的关键差异,旨在为开发者提供一个全景式的视图,帮助他们在面对项目决策时能够更加明智地选择适合自己项目需求的平台。
|
6月前
|
开发工具 Android开发 iOS开发
探索安卓与iOS开发的差异:从工具到用户体验
【6月更文挑战第20天】在移动应用开发的广阔天地中,安卓和iOS两大平台各自占据半壁江山。本文将深入探讨这两个操作系统在开发环境、编程语言、用户界面设计以及性能优化等方面的关键差异。我们将通过比较分析,揭示各自平台的独特优势和面临的挑战,为开发者提供决策参考,并为最终用户提供更深层次的用户体验洞察。
|
6月前
|
存储 API 开发工具
kotlin安卓开发,如何获取设备的唯一id, 有哪些开源库
在Kotlin的Android开发中,获取设备唯一ID的方法包括不稳定的ANDROID_ID、需要权限的IMEI、使用UUID与SharedPreference结合,以及考虑隐私的Firebase Installations ID和Advertising ID。由于隐私问题和Google Play政策,IMEI和ANDROID_ID不推荐作为长期唯一标识。推荐使用UUID(首次安装时生成并存储),或在涉及广告时使用Advertising ID(需用户同意),而Firebase Installations ID则提供了一种合规的设备标识选项。在选择方法时,必须遵守隐私指南和政策。