别让引入的 SDK 和第三方库导致您应用被下架!

2,832 阅读5分钟

或许您的应用正在使用一些第三方 SDK 或者代码库,毕竟 "站在巨人的肩膀上" 比从头开始最基础的应用开发更节省时间。作为应用开发者,您需要为应用的整体情况负责,包括用户体验和您的代码,当然,也包含第三方 SDK 和代码库。

当您在考虑使用 SDK 或代码库时,知晓它们对如何处理和使用数据处理尤为重要,这将使得您可以更好地保护用户隐私。

在本文中,我将和大家分享几个工具,可用于应用开发的不同阶段,包括开发阶段和应用发布后 (这是对 SDK 厂商文档的补充,推荐大家仔细阅读 SDK 文档)。

Merged Manifest 视图

为了能够增加灵活性,Gradle 支持多个以应用构建配置、应用模块或代码库依赖需求而定义的单独 Android Manifest 文件。这些清单文件根据工程需要包含不同的默认 XML 元素和属性。当构建应用时,Gradle 会将所有清单文件合并到一个清单文件中。您可以 指定 "合并规则" 来定义数值的合并方式。接下来,我们探讨如何使用这个工具洞悉您所依赖的 SDK。

Android Studio 提供了一种简单的方式来检查最终合并后的清单文件。方法是点击处于清单文件编辑窗口底部的 "Merged Manifest" 标签页。通过界面凸显的不同颜色,您可以清楚地分辨出不同的清单文件来源 (Manifest Sources)。这些源包括不同的代码库依赖,例如下图展示了名称为 "transport-backend" 的依赖在应用中所用到的权限。

Merged Manifest 视图示例

Merged Manifest 视图示例

这样的展示效果能够帮助您快速定位到由应用依赖所带来的异常权限请求。由于运行时的权限请求对话框可能会改变用户的交互,因此这些分析数据不仅非常有用,而且还能够使您更加全面地掌握应用的依赖对数据的使用目的。如果有必要的话,您需要向用户解释何时以及为何要访问某些数据。

如果您在合并后的清单文件中看到任何异常的权限使用,请仔细审阅相关依赖库文档 (或者联系开发者),并确保您了解该权限使用的实际目的。

该权限很有可能对于您所使用的服务来说是可选的。对于需要最小化数据使用的场景,您可以在应用模块的清单文件中添加一个 "remove" 节点标记 来防止该库的权限请求被合并到最终的应用中。

<uses-permission android:name="SOME_PERMISSION"
   tools:node="remove"/>

模块依赖视图

在开发工具链中另一个非常实用的工具是 Gradle 的模块依赖支持。依赖图表通常的用法是定位构建过程中遇到的问题。依赖图表还可以显示间接依赖的信息,有助于帮助开发者知晓由依赖库引入的额外依赖。如需了解更多信息,请参阅: 查看模块依赖项

接下来,我们将介绍另外一款工具,它可以帮助您更好地了解应用中的数据访问情况。

数据访问审计

随着应用复杂性的提高 (包括您团队规模的不断扩大),在应用的开发过程中很难直观地检查与 SDK 相关隐私数据的访问情况。

Android 11 引入了 数据访问审计 的特性,它可以帮助开发者确认在应用使用过程中哪段代码访问了数据。该特性可以让您将隐私数据与应用中的业务场景相关联,比如 "点咖啡" 或者 "与朋友分享"。进而定位任何异常的数据访问操作,并确定哪个模块或者应用场景执行了访问操作。

如需使用该特性,首先创建一个 context 对象,并且为其关联一个 "属性标签",该标签和某个业务场景相关,比如 "点咖啡"。您可以在 OrderCoffeeActivity.onCreate() 方法内实现这些。

attributionContext = createAttributionContext("orderCoffee")

您可以在之后开发框架的 API 调用中将上面创建的 attributionContext 作为 Context 类型的参数进行使用。

接下来,设置一个回调,当隐私数据被访问的时候会调用该回调。在回调内部,您可以获取 attributionTag (上面所设置的属性标签),并提取堆栈信息或者集成您自己的应用分析方法。

val appOpsCallback = object : AppOpsManager.OnOpNotedCallback() {
      // 当您的应用访问了隐私数据的时候,该回调会在应用访问隐私数据的时候被调用
      // 比如联系人数据
      override fun onNoted(syncNotedAppOp: SyncNotedAppOp) {
        logDataAccess(syncNotedAppOp.op,
                 // 这里会返回上面创建 attributionContext 的时候所传入的标签字符串,
                // 比如,这里就是 “orderCoffee”
                syncNotedAppOp.attributionTag, 
                Throwable().stackTrace.toString())
    }

数据访问审计同时支持同步和异步两种 API 调用,并且可以在 Android 11 及之后的设备上使用。如需了解更多信息,请参阅: 数据访问审计

小结

Android 11 中新增的 Merged Manifest 工具、Gradle 对于模块依赖的支持、数据访问审计 API,均是为了能够帮助开发者针对应用内和 SDK 依赖的数据访问和操作提供额外的监测。从而使您为终端用户展现更好的透明性。推荐大家将这些工具整合进现有的工作流程中。

此外,如果您通过 Google Play 商店发布应用,请确认已经阅读了相关的 用户数据策略,并且确保您使用的 SDK 是符合要求的。