Android,找到代码中所有请求权限的地方

Android, find all places in code to request permissions

我正在为 Marshmallow 之前的设备开发一个应用程序。源代码不是我写的,项目本身也很大。 我目前正在让应用程序在需要时请求权限。

问题是:如何找到代码中所有需要请求权限的地方? 我正在使用 Android Studio。

编辑
有些人建议将 api 更改为 23 并仅 运行 应用程序并查看它崩溃的地方。 问题是应用程序不会在每个地方都崩溃。

例如,运行未经许可使用此代码会使应用程序崩溃:

TelephonyManager manager = (TelephonyManager) context
            .getSystemService(Context.TELEPHONY_SERVICE);

虽然这只是 returns 一个空数组,而不是崩溃。

final String[] SELF_PROJECTION = new String[]{
    ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,};
Cursor cursor = context.getContentResolver()
    .query(ContactsContract.Profile.CONTENT_URI, SELF_PROJECTION, null, null, null);

此外,Android Lint 不会显示这些地方。我不确定是否应该这样。

当然,编译目标 api 23,不要添加权限代码,运行 应用程序并查看它崩溃的位置。

一旦你开始精确定位位置,然后打开权限(通过应用程序设置),这样你就可以通过那个屏幕,然后再关闭它们,这样你就可以看到它是否崩溃了。

Logcat 非常详细地让您知道权限被拒绝...

根据关于 security permissions 的开发者页面:

In almost all cases, however, a permission failure will be printed to the system log.

因此 运行 应用程序并在日志中搜索 "permissions" 或类似内容。

使用单元测试确保覆盖代码中可能需要权限的所有地方。

你可以这样做:从清单中删除危险权限。这样,您几乎可以在任何设备上进行测试,确保它会崩溃,并且您会找到需要这些权限的确切位置。无论如何我就是这样做的。

添加

lintOptions {
    enable 'MissingPermission'
}

在你的 build.gradle 中。这将在您构建应用程序后显示警告。

在您的应用首次启动时请求您想要的所有权限。

这不是最佳实践,但它是这个问题的答案