# 使用内存安全工具提升应用质量和安全性

**URL:** <https://meta.101.dev/t/topic/584>\
**Category:** Android 开发\
**Tags:** android\
**Created:** [2022 年3 月 15 日 05:46 UTC](https://meta.101.dev/t/topic/584 "2022-03-15T05:46:04Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![101](https://meta.101.dev/user_avatar/meta.101.dev/101/32/575_2.png) [@101](https://meta.101.dev/u/101)\
**Post date:** [2022 年3 月 15 日 05:46 UTC](https://meta.101.dev/t/topic/584/1 "2022-03-15T05:46:04Z")

</div>

![](https://devrel.andfun.cn/devrel/posts/2022/03/sVTA4E.png)

Android 内存安全工具是一个可帮助您提升应用质量和安全性的综合工具包。通过本文您可以了解到我们推出的各种内存安全工具及其使用场景，以及了解如何通过这些工具来找到并修复问题。

如果您更喜欢通过视频了解此内容，请在此处查看:

△ 使用内存安全工具提升应用质量和安全性

**什么是内存安全错误**

内存错误是指在使用 C 或 C++ 等原生语言处理内存时发生的错误。

```Kotlin
void BufferOverflow() {
    char *p = new char[10];
    p[20] = 'x'; // 💣💥 在分配的数组之外写入
}

void UseAfterFree() {
    char *p = new char[10];
    delete[] p;
    p[0] = 'x'; // 💣💥 在数组已经被释放之后写入
}

```

△ 两种常见的内存安全错误

在这个例子中，我们可以看到最常见的两种错误形式，分别是 Buffer Overflow (缓冲区溢出) 和 Use After Free (释放后使用)。

终端用户设备每秒会报告超过 3,000 次与内存相关的崩溃，也就是说每个月会发生 77 亿次崩溃，并且这些崩溃很容易被用户感知，导致用户对这些应用产生糟糕的印象。使用内存安全工具可帮助您减少此类错误，从而改进用户体验。

每年有超过 60% 的 Android 漏洞是由内存错误造成的，除了 Android 之外的其他大型原生代码库也报告了类似的问题，修复应用中的内存错误与修复系统中的内存错误一样重要。用户不必关心操作系统如何保护其数据，而您的应用则不应忽视这个问题，使用内存安全工具有助于为用户提供更高的安全保障。

Play 商店中超过 50% 的应用包含有原生代码，即便您没有直接使用原生代码来实现应用中的功能，也可能会因为使用第三方 SDK 或库而间接包含原生代码。

## **使用内存安全工具**

我们的任务是帮助开发者确保内存安全，帮助您避免在使用原生代码处理内存时造成错误和漏洞。因此，我们开发了一套工具以便检测并帮助开发者提高工作效率，这使得检测和修复此类错误变得比以往更轻松。

多年来，我们致力于引入新工具并增强现有工具，现在正式向您介绍这三款工具:

- HWASan: 基于编译器的内存错误检测工具
- GWP-ASan: 基于分配器的概率性内存错误检测工具
- Arm MTE: 基于硬件的内存错误检测工具

**HWASan**

HWASan 从 Android 10 开始提供，它可以检测各类内存错误包括堆栈、全局和堆问题。使用该工具需要重新编译，因为它需要在所有内存操作中引入额外的代码来运行，所以该工具可能不适合在生产环境中部署。引入 HWASan 大约会使应用的性能降低两倍，我们建议您在开发和测试阶段中使用 HWASan。

使用 HWASan 总共有 3 个步骤:

- 将 HWASan 刷写到您的测试设备上
- 使用 -fsanitize=hwaddress 参数重新构建您的应用
- 运行

我们为大多数 Pixel 设备维护 HWASan 构建，虽然该工具的性能不适合在生产环境中部署，但用于测试是足够的。在内部我们使用 HWASan 构建来对新的 Pixel 设备进行 dogfood 测试。如果您想了解更多关于 HWASan 的详细信息，请查阅文档指南 [HWAddress Sanitizer](https://developer.android.google.cn/ndk/guides/hwasan)。

**GWP-ASan**

GWP-ASan 是我们在 Android 11 中引入的一款概率性内存错误检测工具，概率性是指随机保护某些堆分配，这样能在性能和捕获错误的几率之间取得平衡。这有点像彩票系统，随着运行代码库的设备数量增加，检测到错误的几率也会增加。GWP-ASan 不需要重新编译，其性能非常适合用于生产环境，强烈建议您从开发初期一直到测试和部署到生产环境的各个阶段都使用 GWP-ASan。

GWP-ASan 的使用非常简单:

- 将 gwpAsanMode 添加到 Android 清单文件
- 运行

如果您想了解更多关于 GWP-ASan 的详细信息，请查阅文档指南 [GWP-ASan](https://developer.android.google.cn/ndk/guides/gwp-asan)。

**Arm MTE**

Arm MTE 是我们与 Arm 合作开发的基于硬件的内存错误检测工具，我们将随着新硬件的推出在未来逐步为开发者提供这款工具。虽然这类硬件技术在一些 Android 设备上可用，但我们强烈建议应用开发者们去熟悉 HWASan 与 GWP-ASan 以便在各类兼容的设备间更为顺畅的过渡。

## **运行代码并查找问题**

启用内存安全工具后应尽可能多地执行代码路径，内存错误会生成可用于本地调试的 Logcat 和 Tombstone 跟踪记录，在生产环境中，报告将从设备导出到 Play 开发者控制台。我们在 [Android 12 中引入了新的 Tombostone API](https://developer.android.google.cn/about/versions/12/features#provide_apps_direct_access_to_tombstone_traces) 使开发者能在应用下次启动时提取到更多的崩溃信息。我们一直在与 Firebase 合作，致力于在 Crashlytics 中提供对内存安全工具的支持。

## **修复问题**

![△ 内存安全工具提供了包含分配和取消分配回溯的错误报告](https://devrel.andfun.cn/devrel/posts/2022/03/fKuiB4.png)

△ 内存安全工具提供了包含分配和取消分配回溯的错误报告

使用内存安全工具时，错误报告会包含有助于调试的更多信息，除了令人不愉快的回溯之外，还包含了分配和取消分配的回溯，这对找到错误的根本原因很有帮助。我们在内部开发 Android 操作系统时一直在使用这些工具，这帮助我们检测到了在代码库中隐藏了多年的大量错误，这些工具极大地提高了我们检测错误的能力，而且增强的错误报告帮助我们缩短了修复时间。

## **总结**

Android 内存安全工具可以检测代码库中的内存错误，修复此类错误可帮助提高质量和安全性。确保内存安全的诀窍是使用内存安全工具运行代码找到错误，然后修复这些错误。

感谢您阅读本文章，期待您使用我们所提供的工具提升 Android 生态系统的质量和安全性，如果您遇到任何问题或有任何反馈，请通过 [Github Issues](https://github.com/android/ndk/issues) 与我们取得联系。

欢迎您 [点击这里](https://go2.gdsub.com/androiddevfb) 向我们提交反馈，或分享您喜欢的内容、发现的问题。您的反馈对我们非常重要，感谢您的支持！
