Link between Android Permissions and Permission Groups

后端 未结 4 1810
渐次进展
渐次进展 2020-12-31 13:15

I an new to Android Development. I was looking at the android manifest permissions. There are two things. Permissions and Permission Groups. I know that the list at

相关标签:
4条回答
  • 2020-12-31 13:35

    It's possible to use PackageManager getAllPermissionGroups() and queryPermissionsByGroup() to enumerate the entire Android permission hierarchy. The code below produced the output shown at the end on a 5.1.1 (SDK 22) device. The groups marked "personal" have groupInfo.flags == 1, and appear to correspond to the permission groups that are called "dangerous" in Marshmallow.

    You will get different permission hierarchies on different devices due to differences in SDK levels and the fact that apps can define custom permissions.

    /**
     * Uses PackageManager getAllPermissionGroups() and queryPermissionsByGroup()
     * to enumerate the Android permission hierarchy.
     */
    private void showPermissionTree()
    {
        final PackageManager pm = m_context.getPackageManager();
        if (pm == null)
            return;
    
        /*
         * Get a list of all permission groups and sort them alphabetically.
         * Then add to the end of the list the special case of a null group name. There can be
         * numerous permissions that are not listed under a group name.
         */
        List<PermissionGroupInfo> groupInfoList = pm.getAllPermissionGroups(0);
        if (groupInfoList == null)
            return;
    
        ArrayList<String> groupNameList = new ArrayList<>();
        for (PermissionGroupInfo groupInfo : groupInfoList) {
            String groupName = groupInfo.name;
            if (groupName != null) {
                if (Build.VERSION.SDK_INT >= 17) {
                    /*
                     * SDK 17 added the flags field. If non-zero, the permission group contains
                     * permissions that control access to user personal data.
                     * N.B. These are the permissions groups that are called "dangerous" in
                     * Marshmallow.
                     */
                    if (groupInfo.flags != 0) {
                        groupName += " (personal)";
                    }
                }
                groupNameList.add(groupName);
            }
        }
    
        Collections.sort(groupNameList);
        groupNameList.add(null);
    
        /*
         * Loop though each permission group, adding to the StringBuilder the group name and
         * the list of all permissions under that group.
         */
        StringBuilder sb = new StringBuilder(10000);
        final String INDENT = "   ";
    
        for (String groupName : groupNameList) {
            if (groupName == null)
                groupName = "null";
    
            sb.append("* ").append(groupName).append("\n");
    
            ArrayList<String> permissionNameList = getPermissionsForGroup(groupName);
            if (permissionNameList.size() > 0) {
                for (String permission : permissionNameList) {
                    sb.append(INDENT).append(permission).append("\n");
                }
            } else {
                sb.append(INDENT).append("no permissions under group\n");
            }
    
            sb.append("\n");
        }
    
        m_textView.setText(sb.toString());
    }
    
    
    /*
     * Gets and returns a list of all permission under the specified group, sorted alphabetically.
     *
     * N.B. groupName can be null. The docs for PackageManager.queryPermissionsByGroup() say
     * "Use null to find all of the permissions not associated with a group."
     */
    private ArrayList<String> getPermissionsForGroup(String groupName)
    {
        final PackageManager pm = m_context.getPackageManager();
        final ArrayList<String> permissionNameList = new ArrayList<>();
    
        try {
            List<PermissionInfo> permissionInfoList =
                    pm.queryPermissionsByGroup(groupName, PackageManager.GET_META_DATA);
            if (permissionInfoList != null) {
                for (PermissionInfo permInfo : permissionInfoList) {
                    String permName = permInfo.name;
                    if (permName == null) {
                        permName = "null";
                    } else if (permName.isEmpty()) {
                        permName = "empty";
                    }
                    permissionNameList.add(permName);
                }
            }
        }
        catch (PackageManager.NameNotFoundException e) {
            // e.printStackTrace();
            Log.d(TAG, "permissions not found for group = " + groupName);
        }
    
        Collections.sort(permissionNameList);
    
        return permissionNameList;
    }
    

    * android.permission-group.ACCESSIBILITY_FEATURES
       no permissions under group
    
    * android.permission-group.ACCOUNTS (personal)
       no permissions under group
    
    * android.permission-group.AFFECTS_BATTERY
       android.permission.CHANGE_WIFI_MULTICAST_STATE
       android.permission.FLASHLIGHT
       android.permission.TRANSMIT_IR
       android.permission.VIBRATE
       android.permission.WAKE_LOCK
    
    * android.permission-group.APP_INFO
       android.permission.GET_TASKS
       android.permission.KILL_BACKGROUND_PROCESSES
       android.permission.MANAGE_ACTIVITY_STACKS
       android.permission.PERSISTENT_ACTIVITY
       android.permission.REAL_GET_TASKS
       android.permission.RECEIVE_BOOT_COMPLETED
       android.permission.REMOVE_TASKS
       android.permission.REORDER_TASKS
       android.permission.RESTART_PACKAGES
    
    * android.permission-group.AUDIO_SETTINGS
       android.permission.MODIFY_AUDIO_SETTINGS
    
    * android.permission-group.BLUETOOTH_NETWORK
       android.permission.BLUETOOTH
       android.permission.BLUETOOTH_ADMIN
       android.permission.BLUETOOTH_MAP
       android.permission.BLUETOOTH_PRIVILEGED
    
    * android.permission-group.BOOKMARKS (personal)
       no permissions under group
    
    * android.permission-group.CALENDAR (personal)
       no permissions under group
    
    * android.permission-group.CAMERA (personal)
       no permissions under group
    
    * android.permission-group.COST_MONEY
       no permissions under group
    
    * android.permission-group.DEVELOPMENT_TOOLS
       android.permission.ACCESS_ALL_EXTERNAL_STORAGE
       android.permission.CHANGE_CONFIGURATION
       android.permission.DUMP
       android.permission.READ_LOGS
       android.permission.SET_ALWAYS_FINISH
       android.permission.SET_DEBUG_APP
       android.permission.SET_PROCESS_LIMIT
       android.permission.SIGNAL_PERSISTENT_PROCESSES
       android.permission.WRITE_SECURE_SETTINGS
       com.android.chrome.permission.DEBUG
    
    * android.permission-group.DEVICE_ALARMS (personal)
       no permissions under group
    
    * android.permission-group.DISPLAY
       android.permission.SYSTEM_ALERT_WINDOW
    
    * android.permission-group.HARDWARE_CONTROLS
       android.permission.ACCESS_FM_RADIO
       android.permission.ACCESS_MTP
       android.permission.HARDWARE_TEST
       android.permission.MANAGE_USB
    
    * android.permission-group.LOCATION (personal)
       no permissions under group
    
    * android.permission-group.MESSAGES (personal)
       no permissions under group
    
    * android.permission-group.MICROPHONE (personal)
       no permissions under group
    
    * android.permission-group.NETWORK
       android.permission.ACCESS_NETWORK_STATE
       android.permission.ACCESS_WIFI_STATE
       android.permission.ACCESS_WIMAX_STATE
       android.permission.BROADCAST_NETWORK_PRIVILEGED
       android.permission.CHANGE_NETWORK_STATE
       android.permission.CHANGE_WIFI_STATE
       android.permission.CHANGE_WIMAX_STATE
       android.permission.CONNECTIVITY_INTERNAL
       android.permission.DOWNLOAD_WITHOUT_NOTIFICATION
       android.permission.INTERNET
       android.permission.LOOP_RADIO
       android.permission.NFC
       android.permission.READ_WIFI_CREDENTIAL
       android.permission.RECEIVE_DATA_ACTIVITY_CHANGE
       android.permission.SCORE_NETWORKS
       com.android.vending.BILLING
       com.android.vending.CHECK_LICENSE
       com.google.android.c2dm.permission.RECEIVE
       com.google.android.c2dm.permission.SEND
       com.google.android.gtalkservice.permission.SEND_HEARTBEAT
       com.google.android.permission.BROADCAST_DATA_MESSAGE
       com.google.android.xmpp.permission.BROADCAST
       com.google.android.xmpp.permission.SEND_RECEIVE
       com.google.android.xmpp.permission.USE_XMPP_ENDPOINT
       com.google.android.xmpp.permission.XMPP_ENDPOINT_BROADCAST
       com.gsma.services.nfc.permission.TRANSACTION_EVENT
    
    * android.permission-group.PERSONAL_INFO (personal)
       no permissions under group
    
    * android.permission-group.PHONE_CALLS (personal)
       no permissions under group
    
    * android.permission-group.SCREENLOCK (personal)
       no permissions under group
    
    * android.permission-group.SOCIAL_INFO (personal)
       no permissions under group
    
    * android.permission-group.STATUS_BAR
       android.permission.EXPAND_STATUS_BAR
    
    * android.permission-group.STORAGE (personal)
       no permissions under group
    
    * android.permission-group.SYNC_SETTINGS
       android.permission.READ_SYNC_SETTINGS
       android.permission.READ_SYNC_STATS
       android.permission.WRITE_SYNC_SETTINGS
    
    * android.permission-group.SYSTEM_CLOCK
       android.permission.SET_TIME_ZONE
    
    * android.permission-group.SYSTEM_TOOLS
       android.permission.ACCESS_LOCATION_EXTRA_COMMANDS
       android.permission.ACCESS_MOCK_LOCATION
       android.permission.ACCESS_PDB_STATE
       android.permission.ASEC_ACCESS
       android.permission.ASEC_CREATE
       android.permission.ASEC_DESTROY
       android.permission.ASEC_MOUNT_UNMOUNT
       android.permission.ASEC_RENAME
       android.permission.BATTERY_STATS
       android.permission.BLUETOOTH_STACK
       android.permission.BROADCAST_PACKAGE_REMOVED
       android.permission.BROADCAST_STICKY
       android.permission.CHANGE_BACKGROUND_DATA_SETTING
       android.permission.CLEAR_APP_CACHE
       android.permission.DIAGNOSTIC
       android.permission.FORCE_STOP_PACKAGES
       android.permission.GET_APP_OPS_STATS
       android.permission.GET_DETAILED_TASKS
       android.permission.GET_PACKAGE_SIZE
       android.permission.GLOBAL_SEARCH
       android.permission.GLOBAL_SEARCH_CONTROL
       android.permission.INTERACT_ACROSS_USERS
       android.permission.INTERACT_ACROSS_USERS_FULL
       android.permission.MANAGE_USERS
       android.permission.MODIFY_APPWIDGET_BIND_PERMISSIONS
       android.permission.MOUNT_FORMAT_FILESYSTEMS
       android.permission.MOUNT_UNMOUNT_FILESYSTEMS
       android.permission.NET_ADMIN
       android.permission.NET_TUNNELING
       android.permission.OEM_UNLOCK_STATE
       android.permission.READ_DREAM_STATE
       android.permission.READ_SEARCH_INDEXABLES
       android.permission.RECOVERY
       android.permission.REMOTE_AUDIO_PLAYBACK
       android.permission.SET_ANIMATION_SCALE
       android.permission.SET_PREFERRED_APPLICATIONS
       android.permission.SET_SCREEN_COMPATIBILITY
       android.permission.SET_WALLPAPER_COMPONENT
       android.permission.START_ANY_ACTIVITY
       android.permission.START_TASKS_FROM_RECENTS
       android.permission.SUBSCRIBED_FEEDS_READ
       android.permission.SUBSCRIBED_FEEDS_WRITE
       android.permission.WRITE_APN_SETTINGS
       android.permission.WRITE_DREAM_STATE
       android.permission.WRITE_SETTINGS
       com.android.launcher.permission.INSTALL_SHORTCUT
       com.android.launcher.permission.UNINSTALL_SHORTCUT
       com.android.launcher3.permission.READ_SETTINGS
       com.android.launcher3.permission.WRITE_SETTINGS
       com.google.android.launcher.permission.READ_SETTINGS
       com.google.android.launcher.permission.WRITE_SETTINGS
       com.motorola.permission.ACCESS_COGRADIO
    
    * android.permission-group.USER_DICTIONARY (personal)
       no permissions under group
    
    * android.permission-group.VOICEMAIL (personal)
       no permissions under group
    
    * android.permission-group.WALLPAPER
       android.permission.SET_WALLPAPER
       android.permission.SET_WALLPAPER_HINTS
    
    * android.permission-group.WRITE_USER_DICTIONARY
       android.permission.WRITE_USER_DICTIONARY
    
    * com.google.android.gms.permission.CAR_INFORMATION
       com.google.android.gms.permission.CAR_FUEL
       com.google.android.gms.permission.CAR_MILEAGE
       com.google.android.gms.permission.CAR_VENDOR_EXTENSION
    
    * null
       no permissions under group
    
    0 讨论(0)
  • 2020-12-31 13:37

    The Android source contains the actual mappings between the default permission groups and permissions.

    https://github.com/android/platform_frameworks_base/blob/master/core/res/AndroidManifest.xml

    If you wanted a mapping from permission group to permission you could take AndroidMainifest.xml file for the version of Android you are working with and parse the XML to create the mapping. So to answer your question yes it is possible, but it sounds like this may be overkill for your task.


    UPDATE: Because I actually needed this mapping myself for another project I decided to share my code to create this mapping. You can view the results in the github repository.

    Link: https://github.com/benjholla/AndroidPermissionAttributeMapper


    UPDATE 2:

    My group open sourced our solution that generates this mapping and some other object wrappers around Android documentation for permissions. There are some tutorials on the project page and the github repo.

    Project Page: https://ensoftcorp.github.io/android-essentials-toolbox/

    Source: https://github.com/EnSoftCorp/android-essentials-toolbox

    0 讨论(0)
  • 2020-12-31 13:37

    As far as I Know: Manifest.permission_group*AB* = Manifest.permission*A* + Manifest.permission*B* take a look at this instance:

    android.permission-group.MESSAGES = SEND_SMS + WRITE_SMS + RECEIVE_SMS + READ_SMS + BROADCAST_SMS

    I hope you get the idea.

    0 讨论(0)
  • 2020-12-31 13:58

    There is a table in the API Guides, but only for dangerous permissions:

    https://developer.android.com/guide/topics/security/permissions.html#perm-groups

    0 讨论(0)
提交回复
热议问题