Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b1249b82 authored by Adam Lesinski's avatar Adam Lesinski
Browse files

Add support for dumping new badging

APKs with AccessibilityServices, PrintServices, and or DeviceAdmin
will have those services dumped when running 'aapt dump badging'.

bug:10899864
Change-Id: I9c1f1f36c397b128dca802510368573a54977459
parent a9f97a0a
Loading
Loading
Loading
Loading
+68 −3
Original line number Diff line number Diff line
@@ -346,6 +346,7 @@ enum {
    LABEL_ATTR = 0x01010001,
    ICON_ATTR = 0x01010002,
    NAME_ATTR = 0x01010003,
    PERMISSION_ATTR = 0x01010006,
    DEBUGGABLE_ATTR = 0x0101000f,
    VERSION_CODE_ATTR = 0x0101021b,
    VERSION_NAME_ATTR = 0x0101021c,
@@ -631,12 +632,25 @@ int doDump(Bundle* bundle)
            bool hasOtherServices = false;
            bool hasWallpaperService = false;
            bool hasImeService = false;
            bool hasAccessibilityService = false;
            bool hasPrintService = false;
            bool hasWidgetReceivers = false;
            bool hasDeviceAdminReceiver = false;
            bool hasIntentFilter = false;
            bool actMainActivity = false;
            bool actWidgetReceivers = false;
            bool actDeviceAdminEnabled = false;
            bool actImeService = false;
            bool actWallpaperService = false;
            bool actAccessibilityService = false;
            bool actPrintService = false;

            // These permissions are required by services implementing services
            // the system binds to (IME, Accessibility, PrintServices, etc.)
            bool hasBindDeviceAdminPermission = false;
            bool hasBindInputMethodPermission = false;
            bool hasBindAccessibilityServicePermission = false;
            bool hasBindPrintServicePermission = false;

            // These two implement the implicit permissions that are granted
            // to pre-1.6 applications.
@@ -760,11 +774,17 @@ int doDump(Bundle* bundle)
                                hasOtherActivities |= !actMainActivity;
                            } else if (withinReceiver) {
                                hasWidgetReceivers |= actWidgetReceivers;
                                hasOtherReceivers |= !actWidgetReceivers;
                                hasDeviceAdminReceiver |= (actDeviceAdminEnabled &&
                                        hasBindDeviceAdminPermission);
                                hasOtherReceivers |= (!actWidgetReceivers && !actDeviceAdminEnabled);
                            } else if (withinService) {
                                hasImeService |= actImeService;
                                hasWallpaperService |= actWallpaperService;
                                hasOtherServices |= (!actImeService && !actWallpaperService);
                                hasAccessibilityService |= (actAccessibilityService &&
                                        hasBindAccessibilityServicePermission);
                                hasPrintService |= (actPrintService && hasBindPrintServicePermission);
                                hasOtherServices |= (!actImeService && !actWallpaperService &&
                                        !actAccessibilityService && !actPrintService);
                            }
                        }
                        withinIntentFilter = false;
@@ -1166,6 +1186,16 @@ int doDump(Bundle* bundle)
                                        " %s\n", error.string());
                                goto bail;
                            }

                            String8 permission = getAttribute(tree, PERMISSION_ATTR, &error);
                            if (error == "") {
                                if (permission == "android.permission.BIND_DEVICE_ADMIN") {
                                    hasBindDeviceAdminPermission = true;
                                }
                            } else {
                                fprintf(stderr, "ERROR getting 'android:permission' attribute for"
                                        " receiver '%s': %s\n", receiverName.string(), error.string());
                            }
                        } else if (tag == "service") {
                            withinService = true;
                            serviceName = getAttribute(tree, NAME_ATTR, &error);
@@ -1175,6 +1205,20 @@ int doDump(Bundle* bundle)
                                        " service: %s\n", error.string());
                                goto bail;
                            }

                            String8 permission = getAttribute(tree, PERMISSION_ATTR, &error);
                            if (error == "") {
                                if (permission == "android.permission.BIND_INPUT_METHOD") {
                                    hasBindInputMethodPermission = true;
                                } else if (permission == "android.permission.BIND_ACCESSIBILITY_SERVICE") {
                                    hasBindAccessibilityServicePermission = true;
                                } else if (permission == "android.permission.BIND_PRINT_SERVICE") {
                                    hasBindPrintServicePermission = true;
                                }
                            } else {
                                fprintf(stderr, "ERROR getting 'android:permission' attribute for"
                                        " service '%s': %s\n", serviceName.string(), error.string());
                            }
                        }
                    } else if (withinSupportsInput && tag == "input-type") {
                        String8 name = getAttribute(tree, NAME_ATTR, &error);
@@ -1189,7 +1233,13 @@ int doDump(Bundle* bundle)
                } else if ((depth == 4) && (tag == "intent-filter")) {
                    hasIntentFilter = true;
                    withinIntentFilter = true;
                    actMainActivity = actWidgetReceivers = actImeService = actWallpaperService = false;
                    actMainActivity = false;
                    actWidgetReceivers = false;
                    actImeService = false;
                    actWallpaperService = false;
                    actAccessibilityService = false;
                    actPrintService = false;
                    actDeviceAdminEnabled = false;
                } else if ((depth == 5) && withinIntentFilter){
                    String8 action;
                    if (tag == "action") {
@@ -1206,12 +1256,18 @@ int doDump(Bundle* bundle)
                        } else if (withinReceiver) {
                            if (action == "android.appwidget.action.APPWIDGET_UPDATE") {
                                actWidgetReceivers = true;
                            } else if (action == "android.app.action.DEVICE_ADMIN_ENABLED") {
                                actDeviceAdminEnabled = true;
                            }
                        } else if (withinService) {
                            if (action == "android.view.InputMethod") {
                                actImeService = true;
                            } else if (action == "android.service.wallpaper.WallpaperService") {
                                actWallpaperService = true;
                            } else if (action == "android.accessibilityservice.AccessibilityService") {
                                actAccessibilityService = true;
                            } else if (action == "android.printservice.PrintService") {
                                actPrintService = true;
                            }
                        }
                        if (action == "android.intent.action.SEARCH") {
@@ -1411,12 +1467,21 @@ int doDump(Bundle* bundle)
            if (hasWidgetReceivers) {
                printf("app-widget\n");
            }
            if (hasDeviceAdminReceiver) {
                printf("device-admin\n");
            }
            if (hasImeService) {
                printf("ime\n");
            }
            if (hasWallpaperService) {
                printf("wallpaper\n");
            }
            if (hasAccessibilityService) {
                printf("accessibility\n");
            }
            if (hasPrintService) {
                printf("print\n");
            }
            if (hasOtherActivities) {
                printf("other-activities\n");
            }