From a7c85179532818fffea698fddb87e9f1677c1406 Mon Sep 17 00:00:00 2001 From: meme <18178821+meme@users.noreply.github.com> Date: Thu, 8 Apr 2021 12:26:55 -0500 Subject: [PATCH] Android Binary XML support (#18545) ##print Signed-off-by: Riccardo Schirone --- librz/core/cmd/cmd_print.c | 13 +- librz/include/meson.build | 1 + librz/include/rz_util.h | 1 + librz/include/rz_util/rz_axml.h | 17 + librz/util/axml.c | 458 +++++++++ librz/util/axml_resources.h | 1598 +++++++++++++++++++++++++++++++ librz/util/meson.build | 1 + 7 files changed, 2088 insertions(+), 1 deletion(-) create mode 100644 librz/include/rz_util/rz_axml.h create mode 100644 librz/util/axml.c create mode 100644 librz/util/axml_resources.h diff --git a/librz/core/cmd/cmd_print.c b/librz/core/cmd/cmd_print.c index 58342ea61b..5889637cd4 100644 --- a/librz/core/cmd/cmd_print.c +++ b/librz/core/cmd/cmd_print.c @@ -78,7 +78,7 @@ static const char *help_msg_p6[] = { }; static const char *help_msg_pF[] = { - "Usage: pF[apdb]", "[len]", "parse ASN1, PKCS, X509, DER, protobuf", + "Usage: pF[apdbA]", "[len]", "parse ASN1, PKCS, X509, DER, protobuf, axml", "pFa", "[len]", "decode ASN1 from current block", "pFaq", "[len]", "decode ASN1 from current block (quiet output)", "pFb", "[len]", "decode raw proto buffers.", @@ -86,6 +86,7 @@ static const char *help_msg_pF[] = { "pFo", "[len]", "decode ASN1 OID", "pFp", "[len]", "decode PKCS7", "pFx", "[len]", "Same with X509", + "pFA", "[len]", "decode Android Binary XML from current block", NULL }; @@ -1275,6 +1276,16 @@ static void cmd_print_fromage(RzCore *core, const char *input, const ut8 *data, free(s); } } break; + case 'A': // "pFA" + { + char *s = rz_axml_decode(data, size); + if (s) { + rz_cons_printf("%s", s); + free(s); + } else { + eprintf("Malformed object: did you supply enough data?\ntry to change the block size (see b?)\n"); + } + } break; default: case '?': // "pF?" rz_core_cmd_help(core, help_msg_pF); diff --git a/librz/include/meson.build b/librz/include/meson.build index 4835d3b7f2..c9e28d8592 100644 --- a/librz/include/meson.build +++ b/librz/include/meson.build @@ -61,6 +61,7 @@ rz_util_files = [ 'rz_util/rz_ascii_table.h', 'rz_util/rz_asn1.h', 'rz_util/rz_assert.h', + 'rz_util/rz_axml.h', 'rz_util/rz_base64.h', 'rz_util/rz_base91.h', 'rz_util/rz_big.h', diff --git a/librz/include/rz_util.h b/librz/include/rz_util.h index e8ba5dec80..04b9ebba8c 100644 --- a/librz/include/rz_util.h +++ b/librz/include/rz_util.h @@ -25,6 +25,7 @@ struct timeval; int gettimeofday(struct timeval *p, void *tz); #endif +#include "rz_util/rz_axml.h" #include "rz_util/rz_event.h" #include "rz_util/rz_assert.h" #include "rz_util/rz_itv.h" diff --git a/librz/include/rz_util/rz_axml.h b/librz/include/rz_util/rz_axml.h new file mode 100644 index 0000000000..eabf6f20b8 --- /dev/null +++ b/librz/include/rz_util/rz_axml.h @@ -0,0 +1,17 @@ +// SPDX-FileCopyrightText: 2021 keegan +// SPDX-License-Identifier: LGPL-3.0-only + +#ifndef RZ_AXML_H +#define RZ_AXML_H + +#ifdef __cplusplus +extern "C" { +#endif + +RZ_API RZ_OWN char *rz_axml_decode(RZ_NONNULL const ut8 *buffer, const ut64 size); + +#ifdef __cplusplus +} +#endif + +#endif // RZ_AXML_H diff --git a/librz/util/axml.c b/librz/util/axml.c new file mode 100644 index 0000000000..0baea14f07 --- /dev/null +++ b/librz/util/axml.c @@ -0,0 +1,458 @@ +// SPDX-FileCopyrightText: 2021 keegan +// SPDX-License-Identifier: LGPL-3.0-only + +#include +#include +#include + +#include "axml_resources.h" + +enum { + TYPE_STRING_POOL = 0x0001, + TYPE_XML = 0x0003, + TYPE_START_NAMESPACE = 0x100, + TYPE_END_NAMESPACE = 0x101, + TYPE_START_ELEMENT = 0x0102, + TYPE_END_ELEMENT = 0x103, + TYPE_RESOURCE_MAP = 0x180, +}; + +enum { + RESOURCE_NULL = 0x00, + RESOURCE_REFERENCE = 0x01, + RESOURCE_STRING = 0x03, + RESOURCE_FLOAT = 0x04, + RESOURCE_INT_DEC = 0x10, + RESOURCE_INT_HEX = 0x11, + RESOURCE_BOOL = 0x12, +}; + +enum { + FLAG_UTF8 = 1 << 8, +}; + +// Beginning of every header +RZ_PACKED( + typedef struct { + ut16 type; + ut16 header_size; + ut32 size; + }) +chunk_header_t; + +// String pool referenced throughout the Binary XML, there must only be ONE +RZ_PACKED( + typedef struct { + ut32 string_count; + ut32 style_count; + ut32 flags; + ut32 strings_offset; + ut32 styles_offset; + ut32 offsets[]; + }) +string_pool_t; + +RZ_PACKED( + typedef struct { + ut16 size; + ut8 unused; + ut8 type; + union { + ut32 d; + float f; + } data; + }) +resource_value_t; + +RZ_PACKED( + typedef struct { + ut32 namespace; + ut32 name; + ut32 unused; + resource_value_t value; + }) +attribute_t; + +RZ_PACKED( + typedef struct { + ut32 line; + ut32 comment; + ut32 namespace; + ut32 name; + ut32 flags; + ut16 attribute_count; + ut16 unused0; + ut16 unused1; + ut16 unused2; + attribute_t attributes[]; + }) +start_element_t; + +RZ_PACKED( + typedef struct { + ut32 line; + ut32 comment; + ut32 namespace; + ut32 name; + }) +end_element_t; + +RZ_PACKED( + typedef struct { + ut32 line; + ut32 comment; + ut32 prefix; + ut32 uri; + }) +namespace_t; + +static char *string_lookup(string_pool_t *pool, const ut8 *data, ut64 data_size, ut32 i, size_t *length) { + if (i > rz_read_le32(&pool->string_count)) { + return NULL; + } + + ut32 offset = rz_read_le32(&pool->offsets[i]); + ut8 *start = (ut8 *)((uintptr_t)data + rz_read_le32(&pool->strings_offset) + 8 + offset); + + char *name = NULL; + if (pool->flags & FLAG_UTF8) { + if ((ut64)start > (ut64)data + data_size - sizeof(ut16)) { + return NULL; + } + + // Ignore UTF-16LE encoded length + ut32 n = *start++; + if (n & 0x80) { + n = ((n & 0x7f) << 8) | *start++; + } + + if ((ut64)start > (ut64)data + data_size - sizeof(ut16)) { + return NULL; + } + + // UTF-8 encoded length + n = *start++; + if (n & 0x80) { + n = ((n & 0x7f) << 8) | *start++; + } + + name = calloc(n + 1, 1); + + if (n == 0) { + if (length) { + *length = 0; + } + + return name; + } + + if ((ut64)start > (ut64)data + data_size - sizeof(ut32) - n - 1) { + free(name); + return NULL; + } + + memcpy(name, start, n); + + if (length) { + *length = n; + } + } else { + if ((ut64)start > (ut64)data + data_size - sizeof(ut32)) { + return NULL; + } + + ut16 *start16 = (ut16 *)start; + + // If >0x7fff, stored as a big-endian ut32 + ut32 n = rz_read_le16(start16++); + if (n & 0x8000) { + n |= ((n & 0x7fff) << 16) | rz_read_le16(start16++); + } + + // Size of UTF-16LE without NULL + n *= 2; + + name = calloc(n * 2 + 1, 1); + + if ((ut64)start16 > (ut64)data + data_size - sizeof(ut32) - n - 1) { + free(name); + return NULL; + } + + // If UTF-16LE, decode to UTF-8 so we can print it to the screen + if (rz_str_utf16_to_utf8((ut8 *)name, n * 2, (const ut8 *)start16, n, true) < 0) { + free(name); + RZ_LOG_ERROR("Failed to decode UTF16-LE\n"); + return NULL; + } + + if (length) { + *length = n; + } + } + + return name; +} + +static char *resource_value(string_pool_t *pool, const ut8 *data, ut64 data_size, + resource_value_t *value) { + switch (value->type) { + case RESOURCE_NULL: + return rz_str_new(""); + case RESOURCE_REFERENCE: + return rz_str_newf("@0x%x", value->data.d); + case RESOURCE_STRING: + return string_lookup(pool, data, data_size, rz_read_le32(&value->data.d), NULL); + case RESOURCE_FLOAT: + return rz_str_newf("%f", value->data.f); + case RESOURCE_INT_DEC: + return rz_str_newf("%d", value->data.d); + case RESOURCE_INT_HEX: + return rz_str_newf("0x%x", value->data.d); + case RESOURCE_BOOL: + return rz_str_newf(value->data.d ? "true" : "false"); + default: + RZ_LOG_WARN("Resource type is not recognized: %#x\n", value->type); + break; + } + return rz_str_new("null"); +} + +static bool dump_element(RzStrBuf *sb, string_pool_t *pool, namespace_t *namespace, + const ut8 *data, ut64 data_size, start_element_t *element, + const ut32 *resource_map, ut32 resource_map_length, st32 *depth, bool start) { + ut32 i; + + char *name = string_lookup(pool, data, data_size, rz_read_le32(&element->name), NULL); + for (i = 0; i < *depth; i++) { + rz_strbuf_appendf(sb, "\t"); + } + + if (start) { + rz_strbuf_appendf(sb, "<%s", name); + ut16 count = rz_read_le16(&element->attribute_count); + if (*depth == 0 && namespace) { + char *key = string_lookup(pool, data, data_size, namespace->prefix, NULL); + char *value = string_lookup(pool, data, data_size, namespace->uri, NULL); + rz_strbuf_appendf(sb, " xmlns:%s=\"%s\"", key, value); + free(key); + free(value); + } + + if (count != 0) { + rz_strbuf_appendf(sb, " "); + } + + for (i = 0; i < count; i++) { + attribute_t a = element->attributes[i]; + ut32 key_index = rz_read_le32(&a.name); + const char *key = (const char *)string_lookup(pool, data, data_size, key_index, NULL); + bool resource_key = false; + // If the key is empty, it is a cached resource name + if (key && *key == '\0') { + free((char *)key); + resource_key = true; + if (resource_map && key_index < resource_map_length) { + ut32 resource = rz_read_le32(&resource_map[key_index]); + if (resource >= 0x1010000) { + resource -= 0x1010000; + if (resource < ANDROID_ATTRIBUTE_NAMES_SIZE) { + key = ANDROID_ATTRIBUTE_NAMES[resource]; + } + } else { + key = "null"; + } + } else { + key = "null"; + } + } + char *value = resource_value(pool, data, data_size, &a.value); + // If there is a namespace on the value, and there is an active + // namespace, assume it is the same + if (rz_read_le32(&a.namespace) != -1 && namespace && namespace->prefix != -1) { + char *ns = string_lookup(pool, data, data_size, namespace->prefix, NULL); + rz_strbuf_appendf(sb, "%s:%s=\"%s\"", ns, key, value); + free(ns); + } else { + rz_strbuf_appendf(sb, "%s=\"%s\"", key, value); + } + if (i != count - 1) { + rz_strbuf_appendf(sb, " "); + } + if (!resource_key) { + free((char *)key); + } + free(value); + } + } else { + rz_strbuf_appendf(sb, "\n"); + free(name); + return true; +} + +/** + * \brief Decode a buffer with Android XML to regular XML string representation + * + * \param data Buffer containing the AXML data + * \param data_size Size of the buffer \p data + * \return String with the regular XML string + */ +RZ_API RZ_OWN char *rz_axml_decode(RZ_NONNULL const ut8 *data, const ut64 data_size) { + string_pool_t *pool = NULL; + namespace_t *namespace = NULL; + const ut32 *resource_map = NULL; + ut32 resource_map_length = 0; + RzStrBuf *sb = NULL; + st32 depth = 0; + + rz_return_val_if_fail(data, NULL); + if (data_size == 0) { + return strdup(""); + } + + RzBuffer *buffer = rz_buf_new_with_pointers(data, data_size, false); + if (!buffer) { + RZ_LOG_ERROR("Error allocating RzBuffer\n"); + goto error; + } + + ut64 offset = 0; + + chunk_header_t header = { 0 }; + if (rz_buf_fread_at(buffer, offset, (ut8 *)&header, "ssi", 1) != sizeof(header)) { + goto bad; + } + + if (header.type != TYPE_XML) { + goto bad; + } + + ut64 binary_size = header.size; + if (binary_size > data_size) { + goto bad; + } + + offset += sizeof(header); + + sb = rz_strbuf_new(""); + + while (offset < binary_size) { + if (rz_buf_fread_at(buffer, offset, (ut8 *)&header, "ssi", 1) != sizeof(header)) { + goto bad; + } + + ut16 type = header.type; + + // After reading the original chunk header, read the type-specific + // header + offset += sizeof(header); + + switch (type) { + case TYPE_STRING_POOL: { + ut16 header_size = header.size; + if (header_size == 0 || header_size > data_size) { + goto bad; + } + + pool = malloc(header_size); + if (!pool) { + goto bad; + } + + if (rz_buf_read_at(buffer, offset, (void *)pool, header_size) != header_size) { + goto bad; + } + break; + } + case TYPE_START_ELEMENT: { + // The string pool must be the first header + if (!pool) { + goto bad; + } + + ut16 header_size = header.size; + if (header_size == 0 || header_size > data_size) { + goto bad; + } + + start_element_t *element = malloc(header_size); + if (!element) { + goto bad; + } + + if (rz_buf_read_at(buffer, offset, (void *)element, header_size) != header_size) { + free(element); + goto bad; + } + + if (!dump_element(sb, pool, namespace, data, data_size, element, + resource_map, resource_map_length, &depth, true)) { + free(element); + goto bad; + } + + depth++; + + free(element); + break; + } + case TYPE_END_ELEMENT: { + depth--; + if (depth < 0) { + goto bad; + } + + end_element_t end; + if (rz_buf_read_at(buffer, offset, (void *)&end, sizeof(end)) != sizeof(end)) { + goto bad; + } + + // The beginning of the start and end element structs + // are the same, so we can use this interchangably + if (!dump_element(sb, pool, namespace, data, data_size, (start_element_t *)&end, + resource_map, resource_map_length, &depth, false)) { + goto bad; + } + break; + } + case TYPE_START_NAMESPACE: + // If there is already a start namespace, override it + free(namespace); + namespace = malloc(sizeof(*namespace)); + if (rz_buf_fread_at(buffer, offset, (ut8 *)namespace, "iiii", 1) != sizeof(*namespace)) { + goto bad; + } + break; + case TYPE_END_NAMESPACE: + break; + case TYPE_RESOURCE_MAP: + resource_map = (ut32 *)(data + offset); + resource_map_length = header.size; + if (resource_map_length > data_size - offset) { + goto bad; + } + resource_map_length /= sizeof(ut32); + break; + default: + RZ_LOG_WARN("Type is not recognized: %#x\n", type); + } + + offset += header.size - sizeof(header); + } + + rz_buf_free(buffer); + free(pool); + free(namespace); + return rz_strbuf_drain(sb); +bad: + RZ_LOG_ERROR("Invalid Android Binary XML\n"); +error: + if (buffer) + rz_buf_free(buffer); + free(pool); + rz_strbuf_free(sb); + return NULL; +} diff --git a/librz/util/axml_resources.h b/librz/util/axml_resources.h new file mode 100644 index 0000000000..0dfb62e0d9 --- /dev/null +++ b/librz/util/axml_resources.h @@ -0,0 +1,1598 @@ +// SPDX-FileCopyrightText: 2021 keegan +// SPDX-License-Identifier: LGPL-3.0-only + +#ifndef RZ_AXML_RESOURCES_H +#define RZ_AXML_RESOURCES_H + +#include + +/** + * A list of all public resources from frameworks/base/core/res/res/values/public.xml: + * + * const data = JSON.parse(require('xml2json').toJson(require('fs').readFileSync('public.xml').toString())) + * const resources = data.resources.public.filter(e => e.type === 'attr') + * + * ``` + * const resourceMap = {} + * for (const resource of resources) { + * resourceMap[parseInt(resource.id, 16)] = resource.name + * } + * + * const base = parseInt(resources[0].id, 16) + * const last = parseInt(resources[resources.length - 1].id, 16) + * + * for (let i = base; i <= last; i++) { + * if (resourceMap[i]) { + * console.log(`\t"${resourceMap[i]}",`) + * } else { + * console.log('\t"null",') + * } + * } + * ``` + * + */ +const char *ANDROID_ATTRIBUTE_NAMES[] = { + "theme", + "label", + "icon", + "name", + "manageSpaceActivity", + "allowClearUserData", + "permission", + "readPermission", + "writePermission", + "protectionLevel", + "permissionGroup", + "sharedUserId", + "hasCode", + "persistent", + "enabled", + "debuggable", + "exported", + "process", + "taskAffinity", + "multiprocess", + "finishOnTaskLaunch", + "clearTaskOnLaunch", + "stateNotNeeded", + "excludeFromRecents", + "authorities", + "syncable", + "initOrder", + "grantUriPermissions", + "priority", + "launchMode", + "screenOrientation", + "configChanges", + "description", + "targetPackage", + "handleProfiling", + "functionalTest", + "value", + "resource", + "mimeType", + "scheme", + "host", + "port", + "path", + "pathPrefix", + "pathPattern", + "action", + "data", + "targetClass", + "colorForeground", + "colorBackground", + "backgroundDimAmount", + "disabledAlpha", + "textAppearance", + "textAppearanceInverse", + "textColorPrimary", + "textColorPrimaryDisableOnly", + "textColorSecondary", + "textColorPrimaryInverse", + "textColorSecondaryInverse", + "textColorPrimaryNoDisable", + "textColorSecondaryNoDisable", + "textColorPrimaryInverseNoDisable", + "textColorSecondaryInverseNoDisable", + "textColorHintInverse", + "textAppearanceLarge", + "textAppearanceMedium", + "textAppearanceSmall", + "textAppearanceLargeInverse", + "textAppearanceMediumInverse", + "textAppearanceSmallInverse", + "textCheckMark", + "textCheckMarkInverse", + "buttonStyle", + "buttonStyleSmall", + "buttonStyleInset", + "buttonStyleToggle", + "galleryItemBackground", + "listPreferredItemHeight", + "expandableListPreferredItemPaddingLeft", + "expandableListPreferredChildPaddingLeft", + "expandableListPreferredItemIndicatorLeft", + "expandableListPreferredItemIndicatorRight", + "expandableListPreferredChildIndicatorLeft", + "expandableListPreferredChildIndicatorRight", + "windowBackground", + "windowFrame", + "windowNoTitle", + "windowIsFloating", + "windowIsTranslucent", + "windowContentOverlay", + "windowTitleSize", + "windowTitleStyle", + "windowTitleBackgroundStyle", + "alertDialogStyle", + "panelBackground", + "panelFullBackground", + "panelColorForeground", + "panelColorBackground", + "panelTextAppearance", + "scrollbarSize", + "scrollbarThumbHorizontal", + "scrollbarThumbVertical", + "scrollbarTrackHorizontal", + "scrollbarTrackVertical", + "scrollbarAlwaysDrawHorizontalTrack", + "scrollbarAlwaysDrawVerticalTrack", + "absListViewStyle", + "autoCompleteTextViewStyle", + "checkboxStyle", + "dropDownListViewStyle", + "editTextStyle", + "expandableListViewStyle", + "galleryStyle", + "gridViewStyle", + "imageButtonStyle", + "imageWellStyle", + "listViewStyle", + "listViewWhiteStyle", + "popupWindowStyle", + "progressBarStyle", + "progressBarStyleHorizontal", + "progressBarStyleSmall", + "progressBarStyleLarge", + "seekBarStyle", + "ratingBarStyle", + "ratingBarStyleSmall", + "radioButtonStyle", + "scrollbarStyle", + "scrollViewStyle", + "spinnerStyle", + "starStyle", + "tabWidgetStyle", + "textViewStyle", + "webViewStyle", + "dropDownItemStyle", + "spinnerDropDownItemStyle", + "dropDownHintAppearance", + "spinnerItemStyle", + "mapViewStyle", + "preferenceScreenStyle", + "preferenceCategoryStyle", + "preferenceInformationStyle", + "preferenceStyle", + "checkBoxPreferenceStyle", + "yesNoPreferenceStyle", + "dialogPreferenceStyle", + "editTextPreferenceStyle", + "ringtonePreferenceStyle", + "preferenceLayoutChild", + "textSize", + "typeface", + "textStyle", + "textColor", + "textColorHighlight", + "textColorHint", + "textColorLink", + "state_focused", + "state_window_focused", + "state_enabled", + "state_checkable", + "state_checked", + "state_selected", + "state_active", + "state_single", + "state_first", + "state_middle", + "state_last", + "state_pressed", + "state_expanded", + "state_empty", + "state_above_anchor", + "ellipsize", + "x", + "y", + "windowAnimationStyle", + "gravity", + "autoLink", + "linksClickable", + "entries", + "layout_gravity", + "windowEnterAnimation", + "windowExitAnimation", + "windowShowAnimation", + "windowHideAnimation", + "activityOpenEnterAnimation", + "activityOpenExitAnimation", + "activityCloseEnterAnimation", + "activityCloseExitAnimation", + "taskOpenEnterAnimation", + "taskOpenExitAnimation", + "taskCloseEnterAnimation", + "taskCloseExitAnimation", + "taskToFrontEnterAnimation", + "taskToFrontExitAnimation", + "taskToBackEnterAnimation", + "taskToBackExitAnimation", + "orientation", + "keycode", + "fullDark", + "topDark", + "centerDark", + "bottomDark", + "fullBright", + "topBright", + "centerBright", + "bottomBright", + "bottomMedium", + "centerMedium", + "id", + "tag", + "scrollX", + "scrollY", + "background", + "padding", + "paddingLeft", + "paddingTop", + "paddingRight", + "paddingBottom", + "focusable", + "focusableInTouchMode", + "visibility", + "fitsSystemWindows", + "scrollbars", + "fadingEdge", + "fadingEdgeLength", + "nextFocusLeft", + "nextFocusRight", + "nextFocusUp", + "nextFocusDown", + "clickable", + "longClickable", + "saveEnabled", + "drawingCacheQuality", + "duplicateParentState", + "clipChildren", + "clipToPadding", + "layoutAnimation", + "animationCache", + "persistentDrawingCache", + "alwaysDrawnWithCache", + "addStatesFromChildren", + "descendantFocusability", + "layout", + "inflatedId", + "layout_width", + "layout_height", + "layout_margin", + "layout_marginLeft", + "layout_marginTop", + "layout_marginRight", + "layout_marginBottom", + "listSelector", + "drawSelectorOnTop", + "stackFromBottom", + "scrollingCache", + "textFilterEnabled", + "transcriptMode", + "cacheColorHint", + "dial", + "hand_hour", + "hand_minute", + "format", + "checked", + "button", + "checkMark", + "foreground", + "measureAllChildren", + "groupIndicator", + "childIndicator", + "indicatorLeft", + "indicatorRight", + "childIndicatorLeft", + "childIndicatorRight", + "childDivider", + "animationDuration", + "spacing", + "horizontalSpacing", + "verticalSpacing", + "stretchMode", + "columnWidth", + "numColumns", + "src", + "antialias", + "filter", + "dither", + "scaleType", + "adjustViewBounds", + "maxWidth", + "maxHeight", + "tint", + "baselineAlignBottom", + "cropToPadding", + "textOn", + "textOff", + "baselineAligned", + "baselineAlignedChildIndex", + "weightSum", + "divider", + "dividerHeight", + "choiceMode", + "itemTextAppearance", + "horizontalDivider", + "verticalDivider", + "headerBackground", + "itemBackground", + "itemIconDisabledAlpha", + "rowHeight", + "maxRows", + "maxItemsPerRow", + "moreIcon", + "max", + "progress", + "secondaryProgress", + "indeterminate", + "indeterminateOnly", + "indeterminateDrawable", + "progressDrawable", + "indeterminateDuration", + "indeterminateBehavior", + "minWidth", + "minHeight", + "interpolator", + "thumb", + "thumbOffset", + "numStars", + "rating", + "stepSize", + "isIndicator", + "checkedButton", + "stretchColumns", + "shrinkColumns", + "collapseColumns", + "layout_column", + "layout_span", + "bufferType", + "text", + "hint", + "textScaleX", + "cursorVisible", + "maxLines", + "lines", + "height", + "minLines", + "maxEms", + "ems", + "width", + "minEms", + "scrollHorizontally", + "password", + "singleLine", + "selectAllOnFocus", + "includeFontPadding", + "maxLength", + "shadowColor", + "shadowDx", + "shadowDy", + "shadowRadius", + "numeric", + "digits", + "phoneNumber", + "inputMethod", + "capitalize", + "autoText", + "editable", + "freezesText", + "drawableTop", + "drawableBottom", + "drawableLeft", + "drawableRight", + "drawablePadding", + "completionHint", + "completionHintView", + "completionThreshold", + "dropDownSelector", + "popupBackground", + "inAnimation", + "outAnimation", + "flipInterval", + "fillViewport", + "prompt", + "startYear", + "endYear", + "mode", + "layout_x", + "layout_y", + "layout_weight", + "layout_toLeftOf", + "layout_toRightOf", + "layout_above", + "layout_below", + "layout_alignBaseline", + "layout_alignLeft", + "layout_alignTop", + "layout_alignRight", + "layout_alignBottom", + "layout_alignParentLeft", + "layout_alignParentTop", + "layout_alignParentRight", + "layout_alignParentBottom", + "layout_centerInParent", + "layout_centerHorizontal", + "layout_centerVertical", + "layout_alignWithParentIfMissing", + "layout_scale", + "visible", + "variablePadding", + "constantSize", + "oneshot", + "duration", + "drawable", + "shape", + "innerRadiusRatio", + "thicknessRatio", + "startColor", + "endColor", + "useLevel", + "angle", + "type", + "centerX", + "centerY", + "gradientRadius", + "color", + "dashWidth", + "dashGap", + "radius", + "topLeftRadius", + "topRightRadius", + "bottomLeftRadius", + "bottomRightRadius", + "left", + "top", + "right", + "bottom", + "minLevel", + "maxLevel", + "fromDegrees", + "toDegrees", + "pivotX", + "pivotY", + "insetLeft", + "insetRight", + "insetTop", + "insetBottom", + "shareInterpolator", + "fillBefore", + "fillAfter", + "startOffset", + "repeatCount", + "repeatMode", + "zAdjustment", + "fromXScale", + "toXScale", + "fromYScale", + "toYScale", + "fromXDelta", + "toXDelta", + "fromYDelta", + "toYDelta", + "fromAlpha", + "toAlpha", + "delay", + "animation", + "animationOrder", + "columnDelay", + "rowDelay", + "direction", + "directionPriority", + "factor", + "cycles", + "searchMode", + "searchSuggestAuthority", + "searchSuggestPath", + "searchSuggestSelection", + "searchSuggestIntentAction", + "searchSuggestIntentData", + "queryActionMsg", + "suggestActionMsg", + "suggestActionMsgColumn", + "menuCategory", + "orderInCategory", + "checkableBehavior", + "title", + "titleCondensed", + "alphabeticShortcut", + "numericShortcut", + "checkable", + "selectable", + "orderingFromXml", + "key", + "summary", + "order", + "widgetLayout", + "dependency", + "defaultValue", + "shouldDisableView", + "summaryOn", + "summaryOff", + "disableDependentsState", + "dialogTitle", + "dialogMessage", + "dialogIcon", + "positiveButtonText", + "negativeButtonText", + "dialogLayout", + "entryValues", + "ringtoneType", + "showDefault", + "showSilent", + "scaleWidth", + "scaleHeight", + "scaleGravity", + "ignoreGravity", + "foregroundGravity", + "tileMode", + "targetActivity", + "alwaysRetainTaskState", + "allowTaskReparenting", + "searchButtonText", + "colorForegroundInverse", + "textAppearanceButton", + "listSeparatorTextViewStyle", + "streamType", + "clipOrientation", + "centerColor", + "minSdkVersion", + "windowFullscreen", + "unselectedAlpha", + "progressBarStyleSmallTitle", + "ratingBarStyleIndicator", + "apiKey", + "textColorTertiary", + "textColorTertiaryInverse", + "listDivider", + "soundEffectsEnabled", + "keepScreenOn", + "lineSpacingExtra", + "lineSpacingMultiplier", + "listChoiceIndicatorSingle", + "listChoiceIndicatorMultiple", + "versionCode", + "versionName", + "marqueeRepeatLimit", + "windowNoDisplay", + "backgroundDimEnabled", + "inputType", + "isDefault", + "windowDisablePreview", + "privateImeOptions", + "editorExtras", + "settingsActivity", + "fastScrollEnabled", + "reqTouchScreen", + "reqKeyboardType", + "reqHardKeyboard", + "reqNavigation", + "windowSoftInputMode", + "imeFullscreenBackground", + "noHistory", + "headerDividersEnabled", + "footerDividersEnabled", + "candidatesTextStyleSpans", + "smoothScrollbar", + "reqFiveWayNav", + "keyBackground", + "keyTextSize", + "labelTextSize", + "keyTextColor", + "keyPreviewLayout", + "keyPreviewOffset", + "keyPreviewHeight", + "verticalCorrection", + "popupLayout", + "state_long_pressable", + "keyWidth", + "keyHeight", + "horizontalGap", + "verticalGap", + "rowEdgeFlags", + "codes", + "popupKeyboard", + "popupCharacters", + "keyEdgeFlags", + "isModifier", + "isSticky", + "isRepeatable", + "iconPreview", + "keyOutputText", + "keyLabel", + "keyIcon", + "keyboardMode", + "isScrollContainer", + "fillEnabled", + "updatePeriodMillis", + "initialLayout", + "voiceSearchMode", + "voiceLanguageModel", + "voicePromptText", + "voiceLanguage", + "voiceMaxResults", + "bottomOffset", + "topOffset", + "allowSingleTap", + "handle", + "content", + "animateOnClick", + "configure", + "hapticFeedbackEnabled", + "innerRadius", + "thickness", + "sharedUserLabel", + "dropDownWidth", + "dropDownAnchor", + "imeOptions", + "imeActionLabel", + "imeActionId", + "null", + "imeExtractEnterAnimation", + "imeExtractExitAnimation", + "tension", + "extraTension", + "anyDensity", + "searchSuggestThreshold", + "includeInGlobalSearch", + "onClick", + "targetSdkVersion", + "maxSdkVersion", + "testOnly", + "contentDescription", + "gestureStrokeWidth", + "gestureColor", + "uncertainGestureColor", + "fadeOffset", + "fadeDuration", + "gestureStrokeType", + "gestureStrokeLengthThreshold", + "gestureStrokeSquarenessThreshold", + "gestureStrokeAngleThreshold", + "eventsInterceptionEnabled", + "fadeEnabled", + "backupAgent", + "allowBackup", + "glEsVersion", + "queryAfterZeroResults", + "dropDownHeight", + "smallScreens", + "normalScreens", + "largeScreens", + "progressBarStyleInverse", + "progressBarStyleSmallInverse", + "progressBarStyleLargeInverse", + "searchSettingsDescription", + "textColorPrimaryInverseDisableOnly", + "autoUrlDetect", + "resizeable", + "required", + "accountType", + "contentAuthority", + "userVisible", + "windowShowWallpaper", + "wallpaperOpenEnterAnimation", + "wallpaperOpenExitAnimation", + "wallpaperCloseEnterAnimation", + "wallpaperCloseExitAnimation", + "wallpaperIntraOpenEnterAnimation", + "wallpaperIntraOpenExitAnimation", + "wallpaperIntraCloseEnterAnimation", + "wallpaperIntraCloseExitAnimation", + "supportsUploading", + "killAfterRestore", + "restoreNeedsApplication", + "smallIcon", + "accountPreferences", + "textAppearanceSearchResultSubtitle", + "textAppearanceSearchResultTitle", + "summaryColumn", + "detailColumn", + "detailSocialSummary", + "thumbnail", + "detachWallpaper", + "finishOnCloseSystemDialogs", + "scrollbarFadeDuration", + "scrollbarDefaultDelayBeforeFade", + "fadeScrollbars", + "colorBackgroundCacheHint", + "dropDownHorizontalOffset", + "dropDownVerticalOffset", + "quickContactBadgeStyleWindowSmall", + "quickContactBadgeStyleWindowMedium", + "quickContactBadgeStyleWindowLarge", + "quickContactBadgeStyleSmallWindowSmall", + "quickContactBadgeStyleSmallWindowMedium", + "quickContactBadgeStyleSmallWindowLarge", + "author", + "autoStart", + "expandableListViewWhiteStyle", + "installLocation", + "vmSafeMode", + "webTextViewStyle", + "restoreAnyVersion", + "tabStripLeft", + "tabStripRight", + "tabStripEnabled", + "logo", + "xlargeScreens", + "immersive", + "overScrollMode", + "overScrollHeader", + "overScrollFooter", + "filterTouchesWhenObscured", + "textSelectHandleLeft", + "textSelectHandleRight", + "textSelectHandle", + "textSelectHandleWindowStyle", + "popupAnimationStyle", + "screenSize", + "screenDensity", + "allContactsName", + "windowActionBar", + "actionBarStyle", + "navigationMode", + "displayOptions", + "subtitle", + "customNavigationLayout", + "hardwareAccelerated", + "measureWithLargestChild", + "animateFirstView", + "dropDownSpinnerStyle", + "actionDropDownStyle", + "actionButtonStyle", + "showAsAction", + "previewImage", + "actionModeBackground", + "actionModeCloseDrawable", + "windowActionModeOverlay", + "valueFrom", + "valueTo", + "valueType", + "propertyName", + "ordering", + "fragment", + "windowActionBarOverlay", + "fragmentOpenEnterAnimation", + "fragmentOpenExitAnimation", + "fragmentCloseEnterAnimation", + "fragmentCloseExitAnimation", + "fragmentFadeEnterAnimation", + "fragmentFadeExitAnimation", + "actionBarSize", + "imeSubtypeLocale", + "imeSubtypeMode", + "imeSubtypeExtraValue", + "splitMotionEvents", + "listChoiceBackgroundIndicator", + "spinnerMode", + "animateLayoutChanges", + "actionBarTabStyle", + "actionBarTabBarStyle", + "actionBarTabTextStyle", + "actionOverflowButtonStyle", + "actionModeCloseButtonStyle", + "titleTextStyle", + "subtitleTextStyle", + "iconifiedByDefault", + "actionLayout", + "actionViewClass", + "activatedBackgroundIndicator", + "state_activated", + "listPopupWindowStyle", + "popupMenuStyle", + "textAppearanceLargePopupMenu", + "textAppearanceSmallPopupMenu", + "breadCrumbTitle", + "breadCrumbShortTitle", + "listDividerAlertDialog", + "textColorAlertDialogListItem", + "loopViews", + "dialogTheme", + "alertDialogTheme", + "dividerVertical", + "homeAsUpIndicator", + "enterFadeDuration", + "exitFadeDuration", + "selectableItemBackground", + "autoAdvanceViewId", + "useIntrinsicSizeAsMinimum", + "actionModeCutDrawable", + "actionModeCopyDrawable", + "actionModePasteDrawable", + "textEditPasteWindowLayout", + "textEditNoPasteWindowLayout", + "textIsSelectable", + "windowEnableSplitTouch", + "indeterminateProgressStyle", + "progressBarPadding", + "animationResolution", + "state_accelerated", + "baseline", + "homeLayout", + "opacity", + "alpha", + "transformPivotX", + "transformPivotY", + "translationX", + "translationY", + "scaleX", + "scaleY", + "rotation", + "rotationX", + "rotationY", + "showDividers", + "dividerPadding", + "borderlessButtonStyle", + "dividerHorizontal", + "itemPadding", + "buttonBarStyle", + "buttonBarButtonStyle", + "segmentedButtonStyle", + "staticWallpaperPreview", + "allowParallelSyncs", + "isAlwaysSyncable", + "verticalScrollbarPosition", + "fastScrollAlwaysVisible", + "fastScrollThumbDrawable", + "fastScrollPreviewBackgroundLeft", + "fastScrollPreviewBackgroundRight", + "fastScrollTrackDrawable", + "fastScrollOverlayPosition", + "customTokens", + "nextFocusForward", + "firstDayOfWeek", + "showWeekNumber", + "minDate", + "maxDate", + "shownWeekCount", + "selectedWeekBackgroundColor", + "focusedMonthDateColor", + "unfocusedMonthDateColor", + "weekNumberColor", + "weekSeparatorLineColor", + "selectedDateVerticalBar", + "weekDayTextAppearance", + "dateTextAppearance", + "solidColor", + "spinnersShown", + "calendarViewShown", + "state_multiline", + "detailsElementBackground", + "textColorHighlightInverse", + "textColorLinkInverse", + "editTextColor", + "editTextBackground", + "horizontalScrollViewStyle", + "layerType", + "alertDialogIcon", + "windowMinWidthMajor", + "windowMinWidthMinor", + "queryHint", + "fastScrollTextColor", + "largeHeap", + "windowCloseOnTouchOutside", + "datePickerStyle", + "calendarViewStyle", + "textEditSidePasteWindowLayout", + "textEditSideNoPasteWindowLayout", + "actionMenuTextAppearance", + "actionMenuTextColor", + "textCursorDrawable", + "resizeMode", + "requiresSmallestWidthDp", + "compatibleWidthLimitDp", + "largestWidthLimitDp", + "state_hovered", + "state_drag_can_accept", + "state_drag_hovered", + "stopWithTask", + "switchTextOn", + "switchTextOff", + "switchPreferenceStyle", + "switchTextAppearance", + "track", + "switchMinWidth", + "switchPadding", + "thumbTextPadding", + "textSuggestionsWindowStyle", + "textEditSuggestionItemLayout", + "rowCount", + "rowOrderPreserved", + "columnCount", + "columnOrderPreserved", + "useDefaultMargins", + "alignmentMode", + "layout_row", + "layout_rowSpan", + "layout_columnSpan", + "actionModeSelectAllDrawable", + "isAuxiliary", + "accessibilityEventTypes", + "packageNames", + "accessibilityFeedbackType", + "notificationTimeout", + "accessibilityFlags", + "canRetrieveWindowContent", + "listPreferredItemHeightLarge", + "listPreferredItemHeightSmall", + "actionBarSplitStyle", + "actionProviderClass", + "backgroundStacked", + "backgroundSplit", + "textAllCaps", + "colorPressedHighlight", + "colorLongPressedHighlight", + "colorFocusedHighlight", + "colorActivatedHighlight", + "colorMultiSelectHighlight", + "drawableStart", + "drawableEnd", + "actionModeStyle", + "minResizeWidth", + "minResizeHeight", + "actionBarWidgetTheme", + "uiOptions", + "subtypeLocale", + "subtypeExtraValue", + "actionBarDivider", + "actionBarItemBackground", + "actionModeSplitBackground", + "textAppearanceListItem", + "textAppearanceListItemSmall", + "targetDescriptions", + "directionDescriptions", + "overridesImplicitlyEnabledSubtype", + "listPreferredItemPaddingLeft", + "listPreferredItemPaddingRight", + "requiresFadingEdge", + "publicKey", + "parentActivityName", + "null", + "isolatedProcess", + "importantForAccessibility", + "keyboardLayout", + "fontFamily", + "mediaRouteButtonStyle", + "mediaRouteTypes", + "supportsRtl", + "textDirection", + "textAlignment", + "layoutDirection", + "paddingStart", + "paddingEnd", + "layout_marginStart", + "layout_marginEnd", + "layout_toStartOf", + "layout_toEndOf", + "layout_alignStart", + "layout_alignEnd", + "layout_alignParentStart", + "layout_alignParentEnd", + "listPreferredItemPaddingStart", + "listPreferredItemPaddingEnd", + "singleUser", + "presentationTheme", + "subtypeId", + "initialKeyguardLayout", + "null", + "widgetCategory", + "permissionGroupFlags", + "labelFor", + "permissionFlags", + "checkedTextViewStyle", + "showOnLockScreen", + "format12Hour", + "format24Hour", + "timeZone", + "mipMap", + "mirrorForRtl", + "windowOverscan", + "requiredForAllUsers", + "indicatorStart", + "indicatorEnd", + "childIndicatorStart", + "childIndicatorEnd", + "restrictedAccountType", + "requiredAccountType", + "canRequestTouchExplorationMode", + "canRequestEnhancedWebAccessibility", + "canRequestFilterKeyEvents", + "layoutMode", + "keySet", + "targetId", + "fromScene", + "toScene", + "transition", + "transitionOrdering", + "fadingMode", + "startDelay", + "ssp", + "sspPrefix", + "sspPattern", + "addPrintersActivity", + "vendor", + "category", + "isAsciiCapable", + "autoMirrored", + "supportsSwitchingToNextInputMethod", + "requireDeviceUnlock", + "apduServiceBanner", + "accessibilityLiveRegion", + "windowTranslucentStatus", + "windowTranslucentNavigation", + "advancedPrintOptionsActivity", + "banner", + "windowSwipeToDismiss", + "isGame", + "allowEmbedded", + "setupActivity", + "fastScrollStyle", + "windowContentTransitions", + "windowContentTransitionManager", + "translationZ", + "tintMode", + "controlX1", + "controlY1", + "controlX2", + "controlY2", + "transitionName", + "transitionGroup", + "viewportWidth", + "viewportHeight", + "fillColor", + "pathData", + "strokeColor", + "strokeWidth", + "trimPathStart", + "trimPathEnd", + "trimPathOffset", + "strokeLineCap", + "strokeLineJoin", + "strokeMiterLimit", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "colorControlNormal", + "colorControlActivated", + "colorButtonNormal", + "colorControlHighlight", + "persistableMode", + "titleTextAppearance", + "subtitleTextAppearance", + "slideEdge", + "actionBarTheme", + "textAppearanceListItemSecondary", + "colorPrimary", + "colorPrimaryDark", + "colorAccent", + "nestedScrollingEnabled", + "windowEnterTransition", + "windowExitTransition", + "windowSharedElementEnterTransition", + "windowSharedElementExitTransition", + "windowAllowReturnTransitionOverlap", + "windowAllowEnterTransitionOverlap", + "sessionService", + "stackViewStyle", + "switchStyle", + "elevation", + "excludeId", + "excludeClass", + "hideOnContentScroll", + "actionOverflowMenuStyle", + "documentLaunchMode", + "maxRecents", + "autoRemoveFromRecents", + "stateListAnimator", + "toId", + "fromId", + "reversible", + "splitTrack", + "targetName", + "excludeName", + "matchOrder", + "windowDrawsSystemBarBackgrounds", + "statusBarColor", + "navigationBarColor", + "contentInsetStart", + "contentInsetEnd", + "contentInsetLeft", + "contentInsetRight", + "paddingMode", + "layout_rowWeight", + "layout_columnWeight", + "translateX", + "translateY", + "selectableItemBackgroundBorderless", + "elegantTextHeight", + "searchKeyphraseId", + "searchKeyphrase", + "searchKeyphraseSupportedLocales", + "windowTransitionBackgroundFadeDuration", + "overlapAnchor", + "progressTint", + "progressTintMode", + "progressBackgroundTint", + "progressBackgroundTintMode", + "secondaryProgressTint", + "secondaryProgressTintMode", + "indeterminateTint", + "indeterminateTintMode", + "backgroundTint", + "backgroundTintMode", + "foregroundTint", + "foregroundTintMode", + "buttonTint", + "buttonTintMode", + "thumbTint", + "thumbTintMode", + "fullBackupOnly", + "propertyXName", + "propertyYName", + "relinquishTaskIdentity", + "tileModeX", + "tileModeY", + "actionModeShareDrawable", + "actionModeFindDrawable", + "actionModeWebSearchDrawable", + "transitionVisibilityMode", + "minimumHorizontalAngle", + "minimumVerticalAngle", + "maximumAngle", + "searchViewStyle", + "closeIcon", + "goIcon", + "searchIcon", + "voiceIcon", + "commitIcon", + "suggestionRowLayout", + "queryBackground", + "submitBackground", + "buttonBarPositiveButtonStyle", + "buttonBarNeutralButtonStyle", + "buttonBarNegativeButtonStyle", + "popupElevation", + "actionBarPopupTheme", + "multiArch", + "touchscreenBlocksFocus", + "windowElevation", + "launchTaskBehindTargetAnimation", + "launchTaskBehindSourceAnimation", + "restrictionType", + "dayOfWeekBackground", + "dayOfWeekTextAppearance", + "headerMonthTextAppearance", + "headerDayOfMonthTextAppearance", + "headerYearTextAppearance", + "yearListItemTextAppearance", + "yearListSelectorColor", + "calendarTextColor", + "recognitionService", + "timePickerStyle", + "timePickerDialogTheme", + "headerTimeTextAppearance", + "headerAmPmTextAppearance", + "numbersTextColor", + "numbersBackgroundColor", + "numbersSelectorColor", + "amPmTextColor", + "amPmBackgroundColor", + "searchKeyphraseRecognitionFlags", + "checkMarkTint", + "checkMarkTintMode", + "popupTheme", + "toolbarStyle", + "windowClipToOutline", + "datePickerDialogTheme", + "showText", + "windowReturnTransition", + "windowReenterTransition", + "windowSharedElementReturnTransition", + "windowSharedElementReenterTransition", + "resumeWhilePausing", + "datePickerMode", + "timePickerMode", + "inset", + "letterSpacing", + "fontFeatureSettings", + "outlineProvider", + "contentAgeHint", + "country", + "windowSharedElementsUseOverlay", + "reparent", + "reparentWithOverlay", + "ambientShadowAlpha", + "spotShadowAlpha", + "navigationIcon", + "navigationContentDescription", + "fragmentExitTransition", + "fragmentEnterTransition", + "fragmentSharedElementEnterTransition", + "fragmentReturnTransition", + "fragmentSharedElementReturnTransition", + "fragmentReenterTransition", + "fragmentAllowEnterTransitionOverlap", + "fragmentAllowReturnTransitionOverlap", + "patternPathData", + "strokeAlpha", + "fillAlpha", + "windowActivityTransitions", + "colorEdgeEffect", + "resizeClip", + "collapseContentDescription", + "accessibilityTraversalBefore", + "accessibilityTraversalAfter", + "dialogPreferredPadding", + "searchHintIcon", + "revisionCode", + "drawableTint", + "drawableTintMode", + "fraction", + "trackTint", + "trackTintMode", + "start", + "end", + "breakStrategy", + "hyphenationFrequency", + "allowUndo", + "windowLightStatusBar", + "numbersInnerTextColor", + "colorBackgroundFloating", + "titleTextColor", + "subtitleTextColor", + "thumbPosition", + "scrollIndicators", + "contextClickable", + "fingerprintAuthDrawable", + "logoDescription", + "extractNativeLibs", + "fullBackupContent", + "usesCleartextTraffic", + "lockTaskMode", + "autoVerify", + "showForAllUsers", + "supportsAssist", + "supportsLaunchVoiceAssistFromKeyguard", + "listMenuViewStyle", + "subMenuArrow", + "defaultWidth", + "defaultHeight", + "resizeableActivity", + "supportsPictureInPicture", + "titleMargin", + "titleMarginStart", + "titleMarginEnd", + "titleMarginTop", + "titleMarginBottom", + "maxButtonHeight", + "buttonGravity", + "collapseIcon", + "level", + "contextPopupMenuStyle", + "textAppearancePopupMenuHeader", + "windowBackgroundFallback", + "defaultToDeviceProtectedStorage", + "directBootAware", + "preferenceFragmentStyle", + "canControlMagnification", + "languageTag", + "pointerIcon", + "tickMark", + "tickMarkTint", + "tickMarkTintMode", + "canPerformGestures", + "externalService", + "supportsLocalInteraction", + "startX", + "startY", + "endX", + "endY", + "offset", + "use32bitAbi", + "bitmap", + "hotSpotX", + "hotSpotY", + "version", + "backupInForeground", + "countDown", + "canRecord", + "tunerCount", + "fillType", + "popupEnterTransition", + "popupExitTransition", + "forceHasOverlappingRendering", + "contentInsetStartWithNavigation", + "contentInsetEndWithActions", + "numberPickerStyle", + "enableVrMode", + "hash", + "networkSecurityConfig", + "shortcutId", + "shortcutShortLabel", + "shortcutLongLabel", + "shortcutDisabledMessage", + "roundIcon", + "contextUri", + "contextDescription", + "showMetadataInPreview", + "colorSecondary", + "visibleToInstantApps", + "font", + "fontWeight", + "tooltipText", + "autoSizeTextType", + "autoSizeStepGranularity", + "autoSizePresetSizes", + "autoSizeMinTextSize", + "min", + "rotationAnimation", + "layout_marginHorizontal", + "layout_marginVertical", + "paddingHorizontal", + "paddingVertical", + "fontStyle", + "keyboardNavigationCluster", + "targetProcesses", + "nextClusterForward", + "colorError", + "focusedByDefault", + "appCategory", + "autoSizeMaxTextSize", + "recreateOnConfigChanges", + "certDigest", + "splitName", + "colorMode", + "isolatedSplits", + "targetSandboxVersion", + "canRequestFingerprintGestures", + "alphabeticModifiers", + "numericModifiers", + "fontProviderAuthority", + "fontProviderQuery", + "primaryContentAlpha", + "secondaryContentAlpha", + "requiredFeature", + "requiredNotFeature", + "autofillHints", + "fontProviderPackage", + "importantForAutofill", + "recycleEnabled", + "isStatic", + "isFeatureSplit", + "singleLineTitle", + "fontProviderCerts", + "iconTint", + "iconTintMode", + "maxAspectRatio", + "iconSpaceReserved", + "defaultFocusHighlightEnabled", + "persistentWhenFeatureAvailable", + "windowSplashscreenContent", + "requiredSystemPropertyName", + "requiredSystemPropertyValue", + "justificationMode", + "autofilledHighlight", + "showWhenLocked", + "turnScreenOn", + "classLoader", + "windowLightNavigationBar", + "navigationBarDividerColor", + "cantSaveState", + "ttcIndex", + "fontVariationSettings", + "dialogCornerRadius", + "compileSdkVersion", + "compileSdkVersionCodename", + "screenReaderFocusable", + "buttonCornerRadius", + "versionCodeMajor", + "versionMajor", + "isVrOnly", + "widgetFeatures", + "appComponentFactory", + "fallbackLineSpacing", + "accessibilityPaneTitle", + "firstBaselineToTopHeight", + "lastBaselineToBottomHeight", + "lineHeight", + "accessibilityHeading", + "outlineSpotShadowColor", + "outlineAmbientShadowColor", + "maxLongVersionCode", + "userRestriction", + "textFontWeight", + "windowLayoutInDisplayCutoutMode", + "packageType", + "opticalInsetLeft", + "opticalInsetTop", + "opticalInsetRight", + "opticalInsetBottom", + "forceDarkAllowed", + "supportsAmbientMode", + "usesNonSdkApi", + "nonInteractiveUiTimeout", + "isLightTheme", + "isSplitRequired", + "textLocale", + "settingsSliceUri", + "shell", + "interactiveUiTimeout", + "supportsMultipleDisplays", + "useAppZygote", + "selectionDividerHeight", + "foregroundServiceType", + "hasFragileUserData", + "minAspectRatio", + "inheritShowWhenLocked", + "zygotePreloadName", + "useEmbeddedDex", + "forceUriPermissions", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "null", + "allowClearUserDataOnFailedRestore", + "allowAudioPlaybackCapture", + "secureElementName", + "requestLegacyExternalStorage", + "enforceStatusBarContrast", + "enforceNavigationBarContrast", + "identifier", + "importantForContentCapture", + "forceQueryable", + "resourcesMap", + "animatedImageDrawable", + "htmlDescription", + "preferMinimalPostProcessing", + "supportsInlineSuggestions", + "crossProfile", + "canTakeScreenshot", + "sdkVersion", + "minExtensionVersion", + "allowNativeHeapPointerTagging", + "autoRevokePermissions", + "preserveLegacyExternalStorage", + "mimeGroup", + "gwpAsanMode", +}; + +size_t ANDROID_ATTRIBUTE_NAMES_SIZE = RZ_ARRAY_SIZE(ANDROID_ATTRIBUTE_NAMES); + +#endif // RZ_AXML_RESOURCES_H diff --git a/librz/util/meson.build b/librz/util/meson.build index 2343695749..f9e0b478b3 100644 --- a/librz/util/meson.build +++ b/librz/util/meson.build @@ -6,6 +6,7 @@ rz_util_sources = [ 'asn1.c', 'assert.c', 'astr.c', + 'axml.c', 'base85.c', 'base91.c', 'bitmap.c',