通过adb列出Android应用程序的权限

87
使用adb,我该如何找出Android应用程序需要哪些权限?
因为我想在不同设备上显示多个应用程序的权限,查看它们在Google Play或设置>应用程序管理器中的权限需要太多手动操作。
4个回答

126
我只想把Jason和Juuso的答案结合起来,并注意到前者列出了已经授予的权限,而后者列出了请求的权限(包括已经授予的权限)。
要查看仅限已授予权限(但省略未授权的请求权限),请使用
adb shell dumpsys package packagename

请检查输出底部的grantedPermissions部分。

要列出所有权限(已请求但未授予+已请求和授予):

  1. 注意一个应用程序的APK。您可以运行相同的命令

adb shell dumpsys package packagename

从输出中的codePath元素获取APK路径。

  • (如果您的设备/模拟器上没有aapt)您需要像Juuso Ohtonen在他的回答中指出的那样从设备/模拟器中拉取APK。 因此,请从桌面执行类似于以下内容的操作:

  • adb pull /data/app/com.your.package.apk
    
  • 列出包的所有权限

    如果在设备/模拟器上缺少aapt,则可以在Android SDK中的build-tools/<version>/下找到它。

    然后执行:

  • aapt d permissions /path/to/com.your.package.apk
    

    我注意到“adb shell dumpsys package”命令可以显示有关应用程序的许多信息。它是否还可以显示应用程序正式使用的所有文件夹,例如外部存储(在我的设备上为“/storage/emulated/0/Android/data/PACKAGE_NAME”)? - android developer
    1
    在这里,Grep高亮显示是您的好帮手:adb shell dumpsys package com.example | grep --color -E "granted=true|$" - tir38
    dumpsys不会给你所有的权限。获取所有默认的Android权限的方法是使用dumpsysappops结合使用。有不同类型的权限;例如,一个接受allowdenyignoredefault,另一个只接受falsetrueaapt并不适用于所有系统,因此我建议大家使用跨平台的ADB - FifthAxiom

    28

    快速方法: adb shell dumpsys package 包名 | grep permission


    2
    这将仅列出已授予的权限,请参见我的下面的答案。 - Denys Kniazhev-Support Ukraine
    1
    它只包括那些名称中包含“permission”一词的权限吗? - android developer
    3
    在Windows机器上使用:adb shell“dumpsys package packagename | grep permission” - Devlpr

    22
    1. 列出所有应用程序及其安装路径(如果您只对第三方应用程序感兴趣,请使用-3标志)。例如,让我们尝试查找YouTube应用程序权限。
      adb shell pm list packages -f

      输出:

      ...
      package:/data/app/com.google.android.youtube-1.apk=com.google.android.youtube
      ...

    2. 从设备中提取所选的apk:
      adb pull /data/app/com.google.android.youtube-1.apk

    3. 列出权限:
      aapt d permissions com.google.android.youtube-1.apk

    输出:

        uses-permission: android.permission.BROADCAST_STICKY
        uses-permission: android.permission.CALL_PHONE
        uses-permission: android.permission.CALL_PRIVILEGED
        uses-permission: android.permission.WRITE_SETTINGS
        uses-permission: android.permission.WRITE_SECURE_SETTINGS
        uses-permission: android.permission.READ_CONTACTS
        uses-permission: android.permission.READ_CALL_LOG
        uses-permission: android.permission.WRITE_CONTACTS
        uses-permission: android.permission.WRITE_CALL_LOG
        uses-permission: android.permission.SYSTEM_ALERT_WINDOW
        uses-permission: android.permission.INTERNAL_SYSTEM_WINDOW
        uses-permission: android.permission.ADD_SYSTEM_SERVICE
        uses-permission: android.permission.VIBRATE
        uses-permission: android.permission.BLUETOOTH
        uses-permission: android.permission.BLUETOOTH_ADMIN
        uses-permission: android.permission.REORDER_TASKS
        uses-permission: android.permission.CHANGE_CONFIGURATION
        ...
    

    ...


    回答不错,但是为什么需要第二步呢?没有第二步也可以正常工作。 - Denys Kniazhev-Support Ukraine
    3
    @aapt 工具在 adb shell 中不可用。 - coco_
    @coco_ 你说得对,我一定是在使用预装了aapt的模拟器。 - Denys Kniazhev-Support Ukraine

    3

    dumpsys不能给你所有的权限。获取所有默认的Android权限的方法是使用dumpsysappops结合使用。有不同类型的权限;例如,一种接受allowdenyignoredefault,另一种只接受falsetrue。虽然我非常喜欢aapt,但它并不适用于所有系统,因此我建议大家使用跨平台的ADB

    获取所有权限的简短答案:

    • adb shell pm list permissions列出安装应用程序的权限(falsetrue)
    • adb shell cmd appops get <package>列出每个应用程序的用户级别权限(allowdenyignore)
    • adb shell dumpsys <package>列出每个应用程序在系统级别上的权限(grantrevoke)

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接