帮助您构建高质量的应用,是我们长期努力的一个方向。为此,我们经常寻找可以在工具和资源上投入精力的领域,这些工具和资源可以使您更加深刻地了解应用的性能。
重大更新
在 Android 11 上,我们引入了两个新工具——"数据访问审核 (Data Access Audit) API" 和 "进程退出原因 (Process Exit Reasons)",这可以使您更清晰地了解隐私数据的访问和进程退出的原因。
数据访问审核 API
Android 鼓励开发者审慎地访问敏感数据。在 Android 11 上,通过访问新的 API,可以给您带来更加透明的私有数据以及受保护数据的使用情况。这一 API 对于那些保留了旧代码或使用了第三方库或 SDK 的大型应用或许会十分有用。
在大型应用中,排查使用隐私数据的归因并非易事
第一个 API 是一个回调,当运行时权限所保护的数据被调用时,它允许应用回溯到代码调用处。如果希望得到通知,任何应用都可以在 AppOpsManager 中设置回调,每当有代码使用私有数据 (例如获取位置更新) 时都会执行该回调。您可以创建特定的逻辑来跟踪、提取和分析数据。
回溯到代码调用处
https://developer.android.google.cn/preview/privacy/data-access-auditing#log-access
AppOpsManager
https://developer.android.google.cn/reference/android/app/AppOpsManager.OnOpNotedCallback
Android 11 中的数据访问审核 API 有助于追溯您代码中私有数据的使用情况
第二个 API 针对多功能的复杂应用。一个社交类应用可能同时拥有 "查找好友" 以及 "照片标记" 功能,每个功能使用了各自的敏感数据子集。举例来说,"查找好友" 使用了位置、联系人数据,而 "照片标记" 使用位置、联系人以及相机。在 Android 11 中,您可以创建一个新的 Context 对象,该对象可以将应用中的部分代码归因于一个或者多个功能。此后,每种权限的使用都将追溯到与此上下文关联的功能。
归因
https://developer.android.google.cn/preview/privacy/data-access-auditing#audit-by-attribution-tag
关于这些 API 的实际使用情况,请查阅代码示例:
https://github.com/android/permissions-samples/tree/master/DataAccessAuditingKotlin
除了帮助您识别私有数据访问之外,Android 11 还包含了另一个新的 API,用来辅助排查无法捕捉现场的崩溃。
进程退出原因
造成应用被终止的原因,可能是 ANR、崩溃或是用户强行关闭应用等诸多情况,也因此难以进行跟踪,我们也收到了开发者们对此的相关反馈。为了诊断应用终止原因,一些开发者正在加入自定义代码,以构建自己的分析程序来改善应用的稳定性。
基于此想法,我们为您提供了一种简化诊断部分的方法。
Android 11 引入了一个新的 ActivityManager API 来上报应用进程终止相关的历史信息。
ActivityManager
https://developer.android.google.cn/reference/kotlin/android/app/ActivityManager#gethistoricalprocessexitreasons
您的应用可以使用该 API 来获取任何可用的进程退出的历史诊断信息,如进程终止是否源于ANR、内存问题、还是其他原因。
如果应用由于 ANR 导致终止,那么 ApplicationExitInfo.getTraceInputStream() 将在终止之前将一个 InputStream 返回给堆栈跟踪存储。这在高版本的系统上尤其有效,因为出于隐私和安全考虑,高版本系统提取 ANR traces 文件将更加复杂。为了避免资源泄漏,读取 InputStream 后将其关闭即可。
ApplicationExitInfo.getTraceInputStream()
https://developer.android.google.cn/reference/kotlin/android/app/ApplicationExitInfo?hl=en#gettraceinputstream
提取 ANR traces 文件
https://developer.android.google.cn/topic/performance/vitals/anr#pull_a_traces_file
此外,您还可以使用新的 ActivityManager.setProcessStateSummary() 方法存储自定义状态信息。您可以保存任意进程数据,这能非常有效地帮助您调试导致应用崩溃的代码段。对于一些开发者来讲,了解应用终止之前的状态必不可少,比如: 游戏开发者可能希望了解进程终止之前用户的游戏等级,一种常见的解决方案是将数据持久化保存,并在应用下次启动时读取。然而需要注意的是,输入数据的大小非常有限。任何保存过的进程状态信息都可以通过 ApplicationExitInfo.getProcessStateSummary() 方法获取。
ActivityManager.setProcessStateSummary()
https://developer.android.google.cn/reference/kotlin/android/app/ActivityManager#setprocessstatesummary
ApplicationExitInfo.getProcessStateSummary()
https://developer.android.google.cn/reference/kotlin/android/app/ApplicationExitInfo#getprocessstatesummary
相关资源
我们希望您通过这些额外的工具可以提升应用的隐私意识和稳定性。详细了解,请参阅以下开发文档:
数据访问审核 | Android 开发者
https://developer.android.google.cn/preview/privacy/data-access-auditing
进程退出原因 | Android 开发者
https://developer.android.google.cn/preview/features#app-process-exit-reasons
推荐阅读
点击屏末 | 阅读原文 | 前往 Android 11 Beta 版官方网站