【问题标题】:Clean up unused Android permissions清理未使用的 Android 权限
【发布时间】:2013-08-24 02:42:43
【问题描述】:

如果我想研究 [在 Mainfest.xml 中请求的] 权限在 Android 应用程序中的使用方式和位置以删除它们,是否有一种简单的方法可以做到这一点? lint 或 findbugs 是否为跟踪项目中使用/滥用的权限提供某种支持?

【问题讨论】:

  • 我不认为这不是一个简单的直截了当的方法。有一个关于此主题的 discussion on Google Groups 和一个潜在的解决方案,但链接的网站似乎已关闭。
  • security stackexchange 上的当前答案说 apkinspector 可以检测权限使用。
  • 也可以查看这个 SO 问题 stackoverflow.com/questions/8257412/…
  • Google Groups 讨论中的潜在解决方案仍未解决。我也无法让 apkinspector 工作(太多的 Python 错误)。令人失望的是 Google 没有提供帮助开发者的工具。
  • 我从过去来接受正确答案...

标签: android permissions findbugs lint


【解决方案1】:

看看http://developer.android.com/reference/android/Manifest.permission.html 查找您在 Mainfest 中使用的权限

【讨论】:

  • 我可以从那里开始,但该列表并不能帮助我确定如何查找应用程序中所有不同权限的使用情况。例如,如果我声明“WRITE_SETTINGS”权限,那么它适用于哪个 API?如何搜索我的代码以使用此类权限?
  • 您会在每个右上角的标题中注意到“在 API 级别 1 中添加”developer.android.com/reference/android/…
  • 您很难确定每个班级需要什么权限,但例如在每个必需的班级中,您会发现一个注释,这需要例如权限:developer.android.com/reference/android/hardware/Camera.html
  • 这是我的麻烦。我想知道哪些类需要给定的权限,而不是相反。这样我就可以获得像“CAMERA”这样的权限,评估 android.hardware.Camera 并扫描我的源代码以查找“android.hardware.Camera”类的任何/所有用法,从而确定我是否真的需要声明“CAMERA”许可。
【解决方案2】:

对于我没有为其编写代码的应用程序,我会这样做的方式是逐个删除权限并每次都对应用程序进行端到端测试。当它失败时,缩小范围。如果没有,则可能无法使用该权限。

【讨论】:

  • 对于拥有 15 个以上权限的大型应用,这可能需要几天时间
  • 我知道,但我没有看到更好的解决方案。如果你有自动化测试,它可能需要更少的时间。如果您不这样做,如果您要继续开发该代码,那么无论如何编写测试都是值得的。
  • 如果是标准权限,你不妨在代码中搜索需要它的几个方法(根据 developer.android.com 搜索)
  • 毫无疑问。很容易找出代码的哪些部分正在使用互联网权限,但删除写入外部存储的每一段代码可能会比较棘手。
【解决方案3】:

您将不得不尝试将它们一一删除并检查该应用是否仍然可以正常工作。 lint 不会以任何方式检查这一点(应该是)。

当他们回来时(他们目前处于关闭状态),您可以将您的 apk 上传到该网站(如果您同意的话)并让他们静态分析您正在使用的权限:http://www.android-permissions.org/

【讨论】:

    【解决方案4】:

    最好的方法是了解可能实际做了什么。如果它要使用相机,那么您知道您需要相机许可。

    【讨论】:

      【解决方案5】:

      或者您可以只了解您的应用程序的功能,然后查看权限并查看哪些权限是额外的。您的应用程序做什么,它使用什么电话功能。应该有一些关于它应该做什么以及那里有什么方法的文档

      【讨论】:

      • 您假设 OP 是首先将权限放在那里的作者,而不是某些不良代码的继承者。
      【解决方案6】:

      我来自未来是为了拯救你的生命。

      在这里(将来),LINT 会检查缺少的权限,正如您在 LINT checks 上看到的那样。

      • 所以,去你的AndroidManifest.xml并删除所有标签<uses-permission>使用Android权限(意思是,不要删除属于你的应用程序的权限,例如UA_DATA和@987654326 @)。
      • 然后运行 ​​LINT 分析。点击Analyze,然后点击Inspect Code...
      • 查看下方Android -> Constant and Resource Type Mismatches
      • 您应该会看到所有缺失的权限。
      • 然后您只需右键单击它们并选择Apply fix "Add Permission"。如果您选择此选项,Android Studio 将为每个错误包含一个权限。因此,您最终会在清单文件上获得相同权限的多个副本,只需删除重复项即可。您也可以手动完成。

      这里是 LINT 规则的描述:

       ID 资源类型

       描述

      此检查会查看已使用各种支持注释(例如 RequiresPermission 或 UiThread)注释的 Android API 调用,并标记任何未按照注释指定的正确使用 API 的调用。此检查标记的错误示例:

      • 将错误类型的资源整数(例如 R.string)传递给需要不同类型(例如 R.dimen)的 API。
      • 忘记在需要它的方法中调用被覆盖的方法(通过 super)
      • 在未在清单中声明该权限的情况下调用需要权限的方法
      • 将资源颜色引用传递给需要 RGB 整数值的方法。

      ...还有更多。有关详细信息,请参阅http://developer.android.com/tools/debugging/annotations.html 上的文档


      我使用的是 Android Studio 2.1.2。

      【讨论】:

      • 确实,我确信 Lint 确实会检查权限。它不会在 Lint 的基本检查中执行,但是可以通过在 Lint 的设置中包含更多检查来轻松完成。
      • 哇,这确实很有趣!谢谢未来的开发者先生!
      【解决方案7】:

      在您的应用清单文件中,您应该有一个标签“Merged Manifest”,您可以在其中看到您的最终清单以及您请求的权限,您可以单击权限以查看它的来源。 (谁添加的 - ex': sdk 或它来自什么代码)

      还有一种简单的方法可以通过添加到清单来删除权限:

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

      还要记得在顶部添加工具:

      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:tools="http://schemas.android.com/tools"
          package="...">
      

      【讨论】:

      • 以下链接解释更多:link
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多