diff options
author | Andres Salomon <dilinger@debian.org> | 2021-10-03 23:33:14 +0200 |
---|---|---|
committer | Andres Salomon <dilinger@debian.org> | 2021-10-03 23:33:14 +0200 |
commit | f9a74f80e3f6d4bcaa88e6a9db9e790e7e608dd7 (patch) | |
tree | 40cbd877832c6a438debbb0a99ba10979e6532f1 |
Import pyaxmlparser_0.3.26.orig.tar.gz
[dgit import orig pyaxmlparser_0.3.26.orig.tar.gz]
30 files changed, 11429 insertions, 0 deletions
diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..513ce9f --- /dev/null +++ b/.editorconfig @@ -0,0 +1,19 @@ +root = true + +[*] +indent_style = space +indent_size = 4 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.{json}] +indent_style = space +indent_size = 2 + +[*.md] +trim_trailing_whitespace = false + +[Makefile] +indent_style = tab
\ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6564ff4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,90 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +env/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +*.egg-info/ +.installed.cfg +*.egg + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*,cover +.hypothesis/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# IPython Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# dotenv +.env + +# virtualenv +venv/ +ENV/ + +# Spyder project settings +.spyderproject + +# Rope project settings +.ropeproject +.vscode @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..cc9cae0 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,4 @@ +include *.txt +include *.json +include *.xml +include pyaxmlparser/resources/* diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..48c598d --- /dev/null +++ b/README.rst @@ -0,0 +1,44 @@ +axmlparser +=========== + + +A simple parser to parse Android XML file. + + +Usage +====== + + +CLI : +==== + +.. code-block:: shell + + $ apkinfo ~/Downloads/com.hardcodedjoy.roboremo.15.apk + APK: /home/chillaranand/Downloads/com.hardcodedjoy.roboremo.15.apk + App name: RoboRemo + Package: com.hardcodedjoy.roboremo + Version name: 2.0.0 + Version code: 15 + Is it Signed: True + Is it Signed with v1 Signatures: True + Is it Signed with v2 Signatures: True + Is it Signed with v3 Signatures: False + + + +Python package : +================ + +.. code-block:: python + + from pyaxmlparser import APK + + + apk = APK('/foo/bar.apk') + print(apk.package) + print(apk.version_name) + print(apk.version_code) + print(apk.icon_info) + print(apk.icon_data) + print(apk.application) diff --git a/apkinfo.1 b/apkinfo.1 new file mode 100644 index 0000000..b7f418e --- /dev/null +++ b/apkinfo.1 @@ -0,0 +1,23 @@ +.\" +.\" apkinfo(1) +.\" +.\" Copyright (C) 2018 Andres Salomon +.TH apkinfo 1 "June 2018" +.SH NAME +apkinfo \- display information about an Android APK file +.SH SYNOPSIS +.B apkinfo +[\fI\,OPTIONS\/\fR] \fI\,FILENAME\/\fR +.SH OPTIONS +.TP +\fB\-\-help\fR +Show a list of possible options and exit. +.SH DESCRIPTION +.B apkinfo +is a tool to display information about a downloaded Android APK file. +.B apkinfo +displays APK metadata such as package, version, and naming information. + +This man page was contributed by Andres Salomon <dilinger@debian.org> +for the Debian GNU/Linux system (but may be used by others). + diff --git a/circle.yml b/circle.yml new file mode 100644 index 0000000..5fd2daf --- /dev/null +++ b/circle.yml @@ -0,0 +1,16 @@ +machine: + python: + version: 3.6.0 + +dependencies: + override: + - pip install -r requirements.txt + - pip install codecov + +test: + override: + - flake8 + - coverage run --source=pyaxmlparser -m pytest -vx --ff + - coverage report -m + post: + - codecov -t $CODECOV_TOKEN diff --git a/examples/get_app_name.py b/examples/get_app_name.py new file mode 100644 index 0000000..129d990 --- /dev/null +++ b/examples/get_app_name.py @@ -0,0 +1,22 @@ +""" +Usage: +python get_app_name.py /path/to/extracted/apk/dir +""" +import sys + +from pyaxmlparser.arscparser import ARSCParser +from pyaxmlparser.axmlprinter import AXMLPrinter + + +app_root = sys.argv[1] + +xml = AXMLPrinter(open("{}/AndroidManifest.xml".format(app_root), 'rb').read()).get_xml_obj() +rsc = ARSCParser(open("{}/resources.arsc".format(app_root), "rb").read()) + +app_name_hex = xml.getElementsByTagName("application")[0].getAttribute("android:label") +app_name = '0x' + app_name_hex[1:] +app_name = rsc.get_string( + rsc.get_packages_names()[0], + rsc.get_id(rsc.get_packages_names()[0], int(app_name, 0))[1] +) +print('App name is "{}"'.format(app_name[1])) diff --git a/pyaxmlparser/__init__.py b/pyaxmlparser/__init__.py new file mode 100644 index 0000000..7e22b06 --- /dev/null +++ b/pyaxmlparser/__init__.py @@ -0,0 +1,3 @@ +# flake8: noqa + +from pyaxmlparser.core import APK diff --git a/pyaxmlparser/arscparser.py b/pyaxmlparser/arscparser.py new file mode 100644 index 0000000..5ef5772 --- /dev/null +++ b/pyaxmlparser/arscparser.py @@ -0,0 +1,784 @@ +# This file is part of Androguard. +# +# Copyright (C) 2012/2013, Anthony Desnos <desnos at t0t0.fr> +# All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS-IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging +from pyaxmlparser import bytecode +import collections +from struct import unpack +from pyaxmlparser.arscutil import ARSCHeader, ARSCResTablePackage, \ + ARSCResTypeSpec, ARSCResType, ARSCResTableEntry, ARSCResTableConfig +from pyaxmlparser.stringblock import StringBlock +import pyaxmlparser.constants as const +from pyaxmlparser.utils import complexToFloat +from xml.sax.saxutils import escape + +log = logging.getLogger("pyaxmlparser.arscparser") + + +class ARSCParser(object): + """ + Parser for resource.arsc files + """ + def __init__(self, raw_buff): + self.analyzed = False + self._resolved_strings = None + self.buff = bytecode.BuffHandle(raw_buff) + + self.header = ARSCHeader(self.buff) + # TODO: assert header type + self.packageCount = unpack('<I', self.buff.read(4))[0] + + self.packages = {} + self.values = {} + self.resource_values = collections.defaultdict(collections.defaultdict) + self.resource_configs = collections.defaultdict(lambda: collections.defaultdict(set)) + self.resource_keys = collections.defaultdict( + lambda: collections.defaultdict(collections.defaultdict)) + self.stringpool_main = None + + # skip to the start of the first chunk data, skipping trailing header bytes + self.buff.set_idx(self.header.start + self.header.header_size) + + # Gives the offset inside the file of the end of this chunk + data_end = self.header.start + self.header.size + + while self.buff.get_idx() <= data_end - ARSCHeader.SIZE: + res_header = ARSCHeader(self.buff) + + if res_header.start + res_header.size > data_end: + # this inner chunk crosses the boundary of the table chunk + break + + if res_header.type == const.RES_STRING_POOL_TYPE and not self.stringpool_main: + self.stringpool_main = StringBlock(self.buff, res_header) + + elif res_header.type == const.RES_TABLE_PACKAGE_TYPE: + assert len(self.packages) < self.packageCount, "Got more packages than expected" + + current_package = ARSCResTablePackage(self.buff, res_header) + package_name = current_package.get_name() + package_data_end = res_header.start + res_header.size + + self.packages[package_name] = [] + + # After the Header, we have the resource type symbol table + self.buff.set_idx(current_package.header.start + current_package.typeStrings) + type_sp_header = ARSCHeader(self.buff) + assert type_sp_header.type == const.RES_STRING_POOL_TYPE, \ + "Expected String Pool header, got %x" % type_sp_header.type + mTableStrings = StringBlock(self.buff, type_sp_header) + + # Next, we should have the resource key symbol table + self.buff.set_idx(current_package.header.start + current_package.keyStrings) + key_sp_header = ARSCHeader(self.buff) + assert key_sp_header.type == const.RES_STRING_POOL_TYPE, \ + "Expected String Pool header, got %x" % key_sp_header.type + mKeyStrings = StringBlock(self.buff, key_sp_header) + + # Add them to the dict of read packages + self.packages[package_name].append(current_package) + self.packages[package_name].append(mTableStrings) + self.packages[package_name].append(mKeyStrings) + + pc = PackageContext(current_package, self.stringpool_main, + mTableStrings, mKeyStrings) + + # skip to the first header in this table package chunk + # FIXME is this correct? We have already read the first two sections! + # self.buff.set_idx(res_header.start + res_header.header_size) + # this looks more like we want: (???) + self.buff.set_idx(res_header.start + res_header.header_size + type_sp_header.size + key_sp_header.size) + + # Read all other headers + while self.buff.get_idx() <= package_data_end - ARSCHeader.SIZE: + pkg_chunk_header = ARSCHeader(self.buff) + log.debug("Found a header: {}".format(pkg_chunk_header)) + if pkg_chunk_header.start + pkg_chunk_header.size > package_data_end: + # we are way off the package chunk; bail out + break + + self.packages[package_name].append(pkg_chunk_header) + + if pkg_chunk_header.type == const.RES_TABLE_TYPE_SPEC_TYPE: + self.packages[package_name].append(ARSCResTypeSpec(self.buff, pc)) + + elif pkg_chunk_header.type == const.RES_TABLE_TYPE_TYPE: + a_res_type = ARSCResType(self.buff, pc) + self.packages[package_name].append(a_res_type) + self.resource_configs[package_name][a_res_type].add(a_res_type.config) + + log.debug("Config: {}".format(a_res_type.config)) + + entries = [] + for i in range(0, a_res_type.entryCount): + current_package.mResId = current_package.mResId & 0xffff0000 | i + entries.append((unpack('<i', self.buff.read(4))[0], current_package.mResId)) + + self.packages[package_name].append(entries) + + for entry, res_id in entries: + if self.buff.end(): + break + + if entry != -1: + ate = ARSCResTableEntry(self.buff, res_id, pc) + self.packages[package_name].append(ate) + if ate.is_weak(): + # FIXME we are not sure how to implement the FLAG_WEAk! + # We saw the following: There is just a single Res_value after the ARSCResTableEntry + # and then comes the next ARSCHeader. + # Therefore we think this means all entries are somehow replicated? + # So we do some kind of hack here. We set the idx to the entry again... + # Now we will read all entries! + # Not sure if this is a good solution though + self.buff.set_idx(ate.start) + elif pkg_chunk_header.type == const.RES_TABLE_LIBRARY_TYPE: + log.warning("RES_TABLE_LIBRARY_TYPE chunk is not supported") + else: + # FIXME: silently skip other chunk types + pass + + # skip to the next chunk + self.buff.set_idx(pkg_chunk_header.start + pkg_chunk_header.size) + + # move to the next resource chunk + self.buff.set_idx(res_header.start + res_header.size) + + def _analyse(self): + if self.analyzed: + return + + self.analyzed = True + + for package_name in self.packages: + self.values[package_name] = {} + + nb = 3 + while nb < len(self.packages[package_name]): + header = self.packages[package_name][nb] + if isinstance(header, ARSCHeader): + if header.type == const.RES_TABLE_TYPE_TYPE: + a_res_type = self.packages[package_name][nb + 1] + + locale = a_res_type.config.get_language_and_region() + + c_value = self.values[package_name].setdefault(locale, {"public": []}) + + entries = self.packages[package_name][nb + 2] + nb_i = 0 + for entry, res_id in entries: + if entry != -1: + ate = self.packages[package_name][nb + 3 + nb_i] + + self.resource_values[ate.mResId][a_res_type.config] = ate + self.resource_keys[package_name][a_res_type.get_type()][ate.get_value()] = ate.mResId + + if ate.get_index() != -1: + c_value["public"].append( + (a_res_type.get_type(), ate.get_value(), + ate.mResId)) + + if a_res_type.get_type() not in c_value: + c_value[a_res_type.get_type()] = [] + + if a_res_type.get_type() == "string": + c_value["string"].append( + self.get_resource_string(ate)) + + elif a_res_type.get_type() == "id": + if not ate.is_complex(): + c_value["id"].append( + self.get_resource_id(ate)) + + elif a_res_type.get_type() == "bool": + if not ate.is_complex(): + c_value["bool"].append( + self.get_resource_bool(ate)) + + elif a_res_type.get_type() == "integer": + c_value["integer"].append( + self.get_resource_integer(ate)) + + elif a_res_type.get_type() == "color": + c_value["color"].append( + self.get_resource_color(ate)) + + elif a_res_type.get_type() == "dimen": + c_value["dimen"].append( + self.get_resource_dimen(ate)) + + nb_i += 1 + nb += 3 + nb_i - 1 # -1 to account for the nb+=1 on the next line + nb += 1 + + def get_resource_string(self, ate): + return [ate.get_value(), ate.get_key_data()] + + def get_resource_id(self, ate): + x = [ate.get_value()] + if ate.key.get_data() == 0: + x.append("false") + elif ate.key.get_data() == 1: + x.append("true") + return x + + def get_resource_bool(self, ate): + x = [ate.get_value()] + if ate.key.get_data() == 0: + x.append("false") + elif ate.key.get_data() == -1: + x.append("true") + return x + + def get_resource_integer(self, ate): + return [ate.get_value(), ate.key.get_data()] + + def get_resource_color(self, ate): + entry_data = ate.key.get_data() + return [ + ate.get_value(), + "#%02x%02x%02x%02x" % ( + ((entry_data >> 24) & 0xFF), + ((entry_data >> 16) & 0xFF), + ((entry_data >> 8) & 0xFF), + (entry_data & 0xFF)) + ] + + def get_resource_dimen(self, ate): + try: + return [ + ate.get_value(), "%s%s" % ( + complexToFloat(ate.key.get_data()), + const.DIMENSION_UNITS[ate.key.get_data() & const.COMPLEX_UNIT_MASK]) + ] + except IndexError: + log.debug("Out of range dimension unit index for %s: %s" % ( + complexToFloat(ate.key.get_data()), + ate.key.get_data() & const.COMPLEX_UNIT_MASK)) + return [ate.get_value(), ate.key.get_data()] + + # FIXME + def get_resource_style(self, ate): + return ["", ""] + + def get_packages_names(self): + """ + Retrieve a list of all package names, which are available + in the given resources.arsc. + """ + return list(self.packages.keys()) + + def get_locales(self, package_name): + """ + Retrieve a list of all available locales in a given packagename. + + :param package_name: the package name to get locales of + """ + self._analyse() + return list(self.values[package_name].keys()) + + def get_types(self, package_name, locale='\x00\x00'): + """ + Retrieve a list of all types which are available in the given + package and locale. + + :param package_name: the package name to get types of + :param locale: the locale to get types of (default: '\x00\x00') + """ + self._analyse() + return list(self.values[package_name][locale].keys()) + + def get_public_resources(self, package_name, locale='\x00\x00'): + """ + Get the XML (as string) of all resources of type 'public'. + + The public resources table contains the IDs for each item. + + :param package_name: the package name to get the resources for + :param locale: the locale to get the resources for (default: '\x00\x00') + """ + + self._analyse() + + buff = '<?xml version="1.0" encoding="utf-8"?>\n' + buff += '<resources>\n' + + try: + for i in self.values[package_name][locale]["public"]: + buff += '<public type="%s" name="%s" id="0x%08x" />\n' % ( + i[0], i[1], i[2]) + except KeyError: + pass + + buff += '</resources>\n' + + return buff.encode('utf-8') + + def get_string_resources(self, package_name, locale='\x00\x00'): + """ + Get the XML (as string) of all resources of type 'string'. + + Read more about string resources: + https://developer.android.com/guide/topics/resources/string-resource.html + + :param package_name: the package name to get the resources for + :param locale: the locale to get the resources for (default: '\x00\x00') + """ + self._analyse() + + buff = '<?xml version="1.0" encoding="utf-8"?>\n' + buff += '<resources>\n' + + try: + for i in self.values[package_name][locale]["string"]: + if any(map(i[1].__contains__, '<&>')): + value = '<![CDATA[%s]]>' % i[1] + else: + value = i[1] + buff += '<string name="%s">%s</string>\n' % (i[0], value) + except KeyError: + pass + + buff += '</resources>\n' + + return buff.encode('utf-8') + + def get_strings_resources(self): + """ + Get the XML (as string) of all resources of type 'string'. + This is a combined variant, which has all locales and all package names + stored. + """ + self._analyse() + + buff = '<?xml version="1.0" encoding="utf-8"?>\n' + + buff += "<packages>\n" + for package_name in self.get_packages_names(): + buff += "<package name=\"%s\">\n" % package_name + + for locale in self.get_locales(package_name): + buff += "<locale value=%s>\n" % repr(locale) + + buff += '<resources>\n' + try: + for i in self.values[package_name][locale]["string"]: + buff += '<string name="%s">%s</string>\n' % (i[0], escape(i[1])) + except KeyError: + pass + + buff += '</resources>\n' + buff += '</locale>\n' + + buff += "</package>\n" + + buff += "</packages>\n" + + return buff.encode('utf-8') + + def get_id_resources(self, package_name, locale='\x00\x00'): + """ + Get the XML (as string) of all resources of type 'id'. + + Read more about ID resources: + https://developer.android.com/guide/topics/resources/more-resources.html#Id + + :param package_name: the package name to get the resources for + :param locale: the locale to get the resources for (default: '\x00\x00') + """ + self._analyse() + + buff = '<?xml version="1.0" encoding="utf-8"?>\n' + buff += '<resources>\n' + + try: + for i in self.values[package_name][locale]["id"]: + if len(i) == 1: + buff += '<item type="id" name="%s"/>\n' % (i[0]) + else: + buff += '<item type="id" name="%s">%s</item>\n' % (i[0], + escape(i[1])) + except KeyError: + pass + + buff += '</resources>\n' + + return buff.encode('utf-8') + + def get_bool_resources(self, package_name, locale='\x00\x00'): + """ + Get the XML (as string) of all resources of type 'bool'. + + Read more about bool resources: + https://developer.android.com/guide/topics/resources/more-resources.html#Bool + + :param package_name: the package name to get the resources for + :param locale: the locale to get the resources for (default: '\x00\x00') + """ + self._analyse() + + buff = '<?xml version="1.0" encoding="utf-8"?>\n' + buff += '<resources>\n' + + try: + for i in self.values[package_name][locale]["bool"]: + buff += '<bool name="%s">%s</bool>\n' % (i[0], i[1]) + except KeyError: + pass + + buff += '</resources>\n' + + return buff.encode('utf-8') + + def get_integer_resources(self, package_name, locale='\x00\x00'): + """ + Get the XML (as string) of all resources of type 'integer'. + + Read more about integer resources: + https://developer.android.com/guide/topics/resources/more-resources.html#Integer + + :param package_name: the package name to get the resources for + :param locale: the locale to get the resources for (default: '\x00\x00') + """ + self._analyse() + + buff = '<?xml version="1.0" encoding="utf-8"?>\n' + buff += '<resources>\n' + + try: + for i in self.values[package_name][locale]["integer"]: + buff += '<integer name="%s">%s</integer>\n' % (i[0], i[1]) + except KeyError: + pass + + buff += '</resources>\n' + + return buff.encode('utf-8') + + def get_color_resources(self, package_name, locale='\x00\x00'): + """ + Get the XML (as string) of all resources of type 'color'. + + Read more about color resources: + https://developer.android.com/guide/topics/resources/more-resources.html#Color + + :param package_name: the package name to get the resources for + :param locale: the locale to get the resources for (default: '\x00\x00') + """ + self._analyse() + + buff = '<?xml version="1.0" encoding="utf-8"?>\n' + buff += '<resources>\n' + + try: + for i in self.values[package_name][locale]["color"]: + buff += '<color name="%s">%s</color>\n' % (i[0], i[1]) + except KeyError: + pass + + buff += '</resources>\n' + + return buff.encode('utf-8') + + def get_dimen_resources(self, package_name, locale='\x00\x00'): + """ + Get the XML (as string) of all resources of type 'dimen'. + + Read more about Dimension resources: + https://developer.android.com/guide/topics/resources/more-resources.html#Dimension + + :param package_name: the package name to get the resources for + :param locale: the locale to get the resources for (default: '\x00\x00') + """ + self._analyse() + + buff = '<?xml version="1.0" encoding="utf-8"?>\n' + buff += '<resources>\n' + + try: + for i in self.values[package_name][locale]["dimen"]: + buff += '<dimen name="%s">%s</dimen>\n' % (i[0], i[1]) + except KeyError: + pass + + buff += '</resources>\n' + + return buff.encode('utf-8') + + def get_id(self, package_name, rid, locale='\x00\x00'): + """ + Returns the tuple (resource_type, resource_name, resource_id) + for the given resource_id. + + :param package_name: package name to query + :param rid: the resource_id + :param locale: specific locale + :return: tuple of (resource_type, resource_name, resource_id) + """ + self._analyse() + + try: + for i in self.values[package_name][locale]["public"]: + if i[2] == rid: + return i + except KeyError: + pass + return None, None, None + + class ResourceResolver(object): + """ + Resolves resources by ID + """ + def __init__(self, android_resources, config=None): + self.resources = android_resources + self.wanted_config = config + + def resolve(self, res_id): + result = [] + self._resolve_into_result(result, res_id, self.wanted_config) + return result + + def _resolve_into_result(self, result, res_id, config): + configs = self.resources.get_res_configs(res_id, config) + if configs: + for config, ate in configs: + self.put_ate_value(result, ate, config) + + def put_ate_value(self, result, ate, config): + if ate.is_complex(): + complex_array = [] + result.append((config, complex_array)) + for _, item in ate.item.items: + self.put_item_value(complex_array, item, config, complex_=True) + else: + self.put_item_value(result, ate.key, config, complex_=False) + + def put_item_value(self, result, item, config, complex_): + if item.is_reference(): + res_id = item.get_data() + if res_id: + self._resolve_into_result( + result, + item.get_data(), + self.wanted_config) + else: + if complex_: + result.append(item.format_value()) + else: + result.append((config, item.format_value())) + + def get_resolved_res_configs(self, rid, config=None): + resolver = ARSCParser.ResourceResolver(self, config) + return resolver.resolve(rid) + + def get_resolved_strings(self): + self._analyse() + if self._resolved_strings: + return self._resolved_strings + + r = {} + for package_name in self.get_packages_names(): + r[package_name] = {} + k = {} + + for locale in self.values[package_name]: + v_locale = locale + if v_locale == '\x00\x00': + v_locale = 'DEFAULT' + + r[package_name][v_locale] = {} + + try: + for i in self.values[package_name][locale]["public"]: + if i[0] == 'string': + r[package_name][v_locale][i[2]] = None + k[i[1]] = i[2] + except KeyError: + pass + + try: + for i in self.values[package_name][locale]["string"]: + if i[0] in k: + r[package_name][v_locale][k[i[0]]] = i[1] + except KeyError: + pass + + self._resolved_strings = r + return r + + def get_res_configs(self, rid, config=None, fallback=True): + """ + Return the resources found with the ID `rid` and select + the right one based on the configuration, or return all if no configuration was set. + + But we try to be generous here and at least try to resolve something: + This method uses a fallback to return at least one resource (the first one in the list) + if more than one items are found and the default config is used and no default entry could be found. + + This is usually a bad sign (i.e. the developer did not follow the android documentation: + https://developer.android.com/guide/topics/resources/localization.html#failing2) + In practise an app might just be designed to run on a single locale and thus only has those locales set. + + You can disable this fallback behaviour, to just return exactly the given result. + + :param rid: resource id as int + :param config: a config to resolve from, or None to get all results + :param fallback: Enable the fallback for resolving default configuration (default: True) + :return: a list of ARSCResTableConfig: ARSCResTableEntry + """ + self._analyse() + + if not rid: + raise ValueError("'rid' should be set") + if not isinstance(rid, int): + raise ValueError("'rid' must be an int") + + if rid not in self.resource_values: + log.info("The requested rid could not be found in the resources.") + return [] + + res_options = self.resource_values[rid] + if len(res_options) > 1 and config: + if config in res_options: + return [(config, res_options[config])] + elif fallback and config == ARSCResTableConfig.default_config(): + log.warning("No default resource config could be found for the given rid, using fallback!") + return [list(self.resource_values[rid].items())[0]] + else: + return [] + else: + return list(res_options.items()) + + def get_string(self, package_name, name, locale='\x00\x00'): + self._analyse() + + try: + for i in self.values[package_name][locale]["string"]: + if i[0] == name: + return i + except KeyError: + return None + + def get_res_id_by_key(self, package_name, resource_type, key): + try: + return self.resource_keys[package_name][resource_type][key] + except KeyError: + return None + + def get_items(self, package_name): + self._analyse() + return self.packages[package_name] + + def get_type_configs(self, package_name, type_name=None): + if package_name is None: + package_name = self.get_packages_names()[0] + result = collections.defaultdict(list) + + for res_type, configs in list(self.resource_configs[package_name].items()): + if res_type.get_package_name() == package_name and ( + type_name is None or res_type.get_type() == type_name): + result[res_type.get_type()].extend(configs) + + return result + + @staticmethod + def parse_id(name): + """ + Resolves an id from a binary XML file in the form "@[package:]DEADBEEF" + and returns a tuple of package name and resource id. + If no package name was given, i.e. the ID has the form "@DEADBEEF", + the package name is set to None. + + Raises a ValueError if the id is malformed. + + :param name: the string of the resource, as in the binary XML file + :return: a tuple of (resource_id, package_name). + """ + + if not name.startswith('@'): + raise ValueError("Not a valid resource ID, must start with @: '{}'".format(name)) + + # remove @ + name = name[1:] + + package = None + if ':' in name: + package, res_id = name.split(':', 1) + else: + res_id = name + + if len(res_id) != 8: + raise ValueError("Numerical ID is not 8 characters long: '{}'".format(res_id)) + + try: + return int(res_id, 16), package + except ValueError: + raise ValueError("ID is not a hex ID: '{}'".format(res_id)) + + def get_resource_xml_name(self, r_id, package=None): + """ + Returns the XML name for a resource, including the package name if package is None. + A full name might look like `@com.example:string/foobar` + Otherwise the name is only looked up in the specified package and is returned without + the package name. + The same example from about without the package name will read as `@string/foobar`. + + If the ID could not be found, `None` is returned. + + A description of the XML name can be found here: + https://developer.android.com/guide/topics/resources/providing-resources#ResourcesFromXml + + :param r_id: numerical ID if the resource + :param package: package name + :return: XML name identifier + """ + if package: + resource, name, i_id = self.get_id(package, r_id) + if not i_id: + return None + return "@{}/{}".format(resource, name) + else: + for p in self.get_packages_names(): + r, n, i_id = self.get_id(p, r_id) + if i_id: + # found the resource in this package + package = p + resource = r + name = n + break + if not package: + return None + else: + return "@{}:{}/{}".format(package, resource, name) + + +class PackageContext(object): + def __init__(self, current_package, stringpool_main, mTableStrings, + mKeyStrings): + self.stringpool_main = stringpool_main + self.mTableStrings = mTableStrings + self.mKeyStrings = mKeyStrings + self.current_package = current_package + + def get_mResId(self): + return self.current_package.mResId + + def set_mResId(self, mResId): + self.current_package.mResId = mResId + + def get_package_name(self): + return self.current_package.get_name() diff --git a/pyaxmlparser/arscutil.py b/pyaxmlparser/arscutil.py new file mode 100644 index 0000000..fe76d0c --- /dev/null +++ b/pyaxmlparser/arscutil.py @@ -0,0 +1,642 @@ +# This file is part of Androguard. +# +# Copyright (C) 2012/2013, Anthony Desnos <desnos at t0t0.fr> +# All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS-IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging +from struct import unpack +import pyaxmlparser.constants as const +from pyaxmlparser.utils import format_value + +log = logging.getLogger("pyaxmlparser.arscutil") + + +class ARSCResTablePackage(object): + """ + See http://androidxref.com/9.0.0_r3/xref/frameworks/base/libs/androidfw/include/androidfw/ResourceTypes.h#861 + """ + def __init__(self, buff, header): + self.header = header + self.start = buff.get_idx() + self.id = unpack('<I', buff.read(4))[0] + self.name = buff.readNullString(256) + self.typeStrings = unpack('<I', buff.read(4))[0] + self.lastPublicType = unpack('<I', buff.read(4))[0] + self.keyStrings = unpack('<I', buff.read(4))[0] + self.lastPublicKey = unpack('<I', buff.read(4))[0] + self.mResId = self.id << 24 + + def get_name(self): + name = self.name.decode("utf-16", 'replace') + name = name[:name.find("\x00")] + return name + + +class ARSCHeader(object): + """ + Object which contains a Resource Chunk. + This is an implementation of the `ResChunk_header`. + + It will throw an AssertionError if the header could not be read successfully. + + It is not checked if the data is outside the buffer size nor if the current + chunk fits into the parent chunk (if any)! + + See http://androidxref.com/9.0.0_r3/xref/frameworks/base/libs/androidfw/include/androidfw/ResourceTypes.h#196 + """ + SIZE = 2 + 2 + 4 + + def __init__(self, buff): + self.start = buff.get_idx() + # Make sure we do not read over the buffer: + assert buff.size() >= self.start + self.SIZE, "Can not read over the buffer size! Offset={}".format(self.start) + self._type, self._header_size, self._size = unpack('<HHL', buff.read(self.SIZE)) + + # Assert that the read data will fit into the chunk. + # The total size must be equal or larger than the header size + assert self._header_size >= self.SIZE, \ + "declared header size is smaller than required size of {}! Offset={}".format(self.SIZE, self.start) + assert self._size >= self.SIZE, \ + "declared chunk size is smaller than required size of {}! Offset={}".format(self.SIZE, self.start) + assert self._size >= self._header_size, \ + "declared chunk size ({}) is smaller than header size ({})! Offset={}".format(self._size, + self._header_size, + self.start) + + @property + def type(self): + """ + Type identifier for this chunk + """ + return self._type + + @property + def header_size(self): + """ + Size of the chunk header (in bytes). Adding this value to + the address of the chunk allows you to find its associated data + (if any). + """ + return self._header_size + + @property + def size(self): + """ + Total size of this chunk (in bytes). This is the chunkSize plus + the size of any data associated with the chunk. Adding this value + to the chunk allows you to completely skip its contents (including + any child chunks). If this value is the same as chunkSize, there is + no data associated with the chunk. + """ + return self._size + + @property + def end(self): + """ + Get the absolute offset inside the file, where the chunk ends. + This is equal to `ARSCHeader.start + ARSCHeader.size`. + """ + return self.start + self.size + + def __repr__(self): + return ( + "<ARSCHeader idx='0x{:08x}' type='{}' header_size='{}' size='{}'>" + ).format(self.start, self.type, self.header_size, self.size) + + +class ARSCResTypeSpec(object): + """ + See http://androidxref.com/9.0.0_r3/xref/frameworks/base/libs/androidfw/include/androidfw/ResourceTypes.h#1327 + """ + def __init__(self, buff, parent=None): + self.start = buff.get_idx() + self.parent = parent + self.id = unpack('<B', buff.read(1))[0] + self.res0 = unpack('<B', buff.read(1))[0] + self.res1 = unpack('<H', buff.read(2))[0] + assert self.res0 == 0, "res0 must be zero!" + assert self.res1 == 0, "res1 must be zero!" + self.entryCount = unpack('<I', buff.read(4))[0] + + self.typespec_entries = [] + for i in range(0, self.entryCount): + self.typespec_entries.append(unpack('<I', buff.read(4))[0]) + + +class ARSCResType(object): + """ + See http://androidxref.com/9.0.0_r3/xref/frameworks/base/libs/androidfw/include/androidfw/ResourceTypes.h#1364 + """ + def __init__(self, buff, parent=None): + self.start = buff.get_idx() + self.parent = parent + + self.id = unpack('<B', buff.read(1))[0] + self.flags, = unpack('<B', buff.read(1)) + self.reserved = unpack('<H', buff.read(2))[0] + assert self.reserved == 0, "reserved must be zero!" + self.entryCount = unpack('<I', buff.read(4))[0] + self.entriesStart = unpack('<I', buff.read(4))[0] + + self.mResId = (0xff000000 & self.parent.get_mResId()) | self.id << 16 + self.parent.set_mResId(self.mResId) + + self.config = ARSCResTableConfig(buff) + + def get_type(self): + return self.parent.mTableStrings.getString(self.id - 1) + + def get_package_name(self): + return self.parent.get_package_name() + + def __repr__(self): + return "ARSCResType(%x, %x, %x, %x, %x, %x, %x, %s)" % ( + self.start, + self.id, + self.flags, + self.reserved, + self.entryCount, + self.entriesStart, + self.mResId, + "table:" + self.parent.mTableStrings.getString(self.id - 1) + ) + + +class ARSCResTableConfig(object): + """ + ARSCResTableConfig contains the configuration for specific resource selection. + This is used on the device to determine which resources should be loaded + based on different properties of the device like locale or displaysize. + + See the definition of ResTable_config in + http://androidxref.com/9.0.0_r3/xref/frameworks/base/libs/androidfw/include/androidfw/ResourceTypes.h#911 + """ + @classmethod + def default_config(cls): + if not hasattr(cls, 'DEFAULT'): + cls.DEFAULT = ARSCResTableConfig(None) + return cls.DEFAULT + + def __init__(self, buff=None, **kwargs): + if buff is not None: + self.start = buff.get_idx() + + # uint32_t + self.size = unpack('<I', buff.read(4))[0] + + # union: uint16_t mcc, uint16_t mnc + # 0 means any + self.imsi = unpack('<I', buff.read(4))[0] + + # uint32_t as chars \0\0 means any + # either two 7bit ASCII representing the ISO-639-1 language code + # or a single 16bit LE value representing ISO-639-2 3 letter code + self.locale = unpack('<I', buff.read(4))[0] + + # struct of: + # uint8_t orientation + # uint8_t touchscreen + # uint8_t density + self.screenType = unpack('<I', buff.read(4))[0] + + # struct of + # uint8_t keyboard + # uint8_t navigation + # uint8_t inputFlags + # uint8_t inputPad0 + self.input = unpack('<I', buff.read(4))[0] + + # struct of + # uint16_t screenWidth + # uint16_t screenHeight + self.screenSize = unpack('<I', buff.read(4))[0] + + # struct of + # uint16_t sdkVersion + # uint16_t minorVersion which should be always 0, as the meaning is not defined + self.version = unpack('<I', buff.read(4))[0] + + # The next three fields seems to be optional + if self.size >= 32: + # struct of + # uint8_t screenLayout + # uint8_t uiMode + # uint16_t smallestScreenWidthDp + self.screenConfig, = unpack('<I', buff.read(4)) + else: + log.debug("This file does not have a screenConfig! size={}".format(self.size)) + self.screenConfig = 0 + + if self.size >= 36: + # struct of + # uint16_t screenWidthDp + # uint16_t screenHeightDp + self.screenSizeDp, = unpack('<I', buff.read(4)) + else: + log.debug("This file does not have a screenSizeDp! size={}".format(self.size)) + self.screenSizeDp = 0 + + if self.size >= 40: + # struct of + # uint8_t screenLayout2 + # uint8_t colorMode + # uint16_t screenConfigPad2 + self.screenConfig2, = unpack("<I", buff.read(4)) + else: + log.debug("This file does not have a screenConfig2! size={}".format(self.size)) + self.screenConfig2 = 0 + + self.exceedingSize = self.size - (buff.tell() - self.start) + if self.exceedingSize > 0: + log.debug("Skipping padding bytes!") + self.padding = buff.read(self.exceedingSize) + + else: + self.start = 0 + self.size = 0 + self.imsi = \ + ((kwargs.pop('mcc', 0) & 0xffff) << 0) + \ + ((kwargs.pop('mnc', 0) & 0xffff) << 16) + + self.locale = 0 + for char_ix, char in kwargs.pop('locale', "")[0:4]: + self.locale += (ord(char) << (char_ix * 8)) + + self.screenType = \ + ((kwargs.pop('orientation', 0) & 0xff) << 0) + \ + ((kwargs.pop('touchscreen', 0) & 0xff) << 8) + \ + ((kwargs.pop('density', 0) & 0xffff) << 16) + + self.input = \ + ((kwargs.pop('keyboard', 0) & 0xff) << 0) + \ + ((kwargs.pop('navigation', 0) & 0xff) << 8) + \ + ((kwargs.pop('inputFlags', 0) & 0xff) << 16) + \ + ((kwargs.pop('inputPad0', 0) & 0xff) << 24) + + self.screenSize = \ + ((kwargs.pop('screenWidth', 0) & 0xffff) << 0) + \ + ((kwargs.pop('screenHeight', 0) & 0xffff) << 16) + + self.version = \ + ((kwargs.pop('sdkVersion', 0) & 0xffff) << 0) + \ + ((kwargs.pop('minorVersion', 0) & 0xffff) << 16) + + self.screenConfig = \ + ((kwargs.pop('screenLayout', 0) & 0xff) << 0) + \ + ((kwargs.pop('uiMode', 0) & 0xff) << 8) + \ + ((kwargs.pop('smallestScreenWidthDp', 0) & 0xffff) << 16) + + self.screenSizeDp = \ + ((kwargs.pop('screenWidthDp', 0) & 0xffff) << 0) + \ + ((kwargs.pop('screenHeightDp', 0) & 0xffff) << 16) + + # TODO add this some day... + self.screenConfig2 = 0 + + self.exceedingSize = 0 + + def _unpack_language_or_region(self, char_in, char_base): + char_out = "" + if char_in[0] & 0x80: + first = char_in[1] & 0x1f + second = ((char_in[1] & 0xe0) >> 5) + ((char_in[0] & 0x03) << 3) + third = (char_in[0] & 0x7c) >> 2 + char_out += chr(first + char_base) + char_out += chr(second + char_base) + char_out += chr(third + char_base) + else: + if char_in[0]: + char_out += chr(char_in[0]) + if char_in[1]: + char_out += chr(char_in[1]) + return char_out + + def get_language_and_region(self): + """ + Returns the combined language+region string or \x00\x00 for the default locale + :return: + """ + if self.locale != 0: + _language = self._unpack_language_or_region( + [self.locale & 0xff, (self.locale & 0xff00) >> 8, ], ord('a')) + _region = self._unpack_language_or_region( + [ + (self.locale & 0xff0000) >> 16, + (self.locale & 0xff000000) >> 24, + ], ord('0') + ) + return (_language + "-r" + _region) if _region else _language + return "\x00\x00" + + def get_config_name_friendly(self): + """ + Here for legacy reasons. + + use :meth:`~get_qualifier` instead. + """ + return self.get_qualifier() + + def get_qualifier(self): + """ + Return resource name qualifier for the current configuration. + for example + * `ldpi-v4` + * `hdpi-v4` + + All possible qualifiers are listed in table 2 of https://developer.android.com/guide + /topics/resources/providing-resources + + FIXME: This name might not have all properties set! + :return: str + """ + res = [] + + mcc = self.imsi & 0xFFFF + mnc = (self.imsi & 0xFFFF0000) >> 16 + if mcc != 0: + res.append("mcc%d" % mcc) + if mnc != 0: + res.append("mnc%d" % mnc) + + if self.locale != 0: + res.append(self.get_language_and_region()) + + screenLayout = self.screenConfig & 0xff + if (screenLayout & const.MASK_LAYOUTDIR) != 0: + if screenLayout & const.MASK_LAYOUTDIR == const.LAYOUTDIR_LTR: + res.append("ldltr") + elif screenLayout & const.MASK_LAYOUTDIR == const.LAYOUTDIR_RTL: + res.append("ldrtl") + else: + res.append("layoutDir_%d" % (screenLayout & const.MASK_LAYOUTDIR)) + + smallestScreenWidthDp = (self.screenConfig & 0xFFFF0000) >> 16 + if smallestScreenWidthDp != 0: + res.append("sw%ddp" % smallestScreenWidthDp) + + screenWidthDp = self.screenSizeDp & 0xFFFF + screenHeightDp = (self.screenSizeDp & 0xFFFF0000) >> 16 + if screenWidthDp != 0: + res.append("w%ddp" % screenWidthDp) + if screenHeightDp != 0: + res.append("h%ddp" % screenHeightDp) + + if (screenLayout & const.MASK_SCREENSIZE) != const.SCREENSIZE_ANY: + if screenLayout & const.MASK_SCREENSIZE == const.SCREENSIZE_SMALL: + res.append("small") + elif screenLayout & const.MASK_SCREENSIZE == const.SCREENSIZE_NORMAL: + res.append("normal") + elif screenLayout & const.MASK_SCREENSIZE == const.SCREENSIZE_LARGE: + res.append("large") + elif screenLayout & const.MASK_SCREENSIZE == const.SCREENSIZE_XLARGE: + res.append("xlarge") + else: + res.append("screenLayoutSize_%d" % (screenLayout & const.MASK_SCREENSIZE)) + if (screenLayout & const.MASK_SCREENLONG) != 0: + if screenLayout & const.MASK_SCREENLONG == const.SCREENLONG_NO: + res.append("notlong") + elif screenLayout & const.MASK_SCREENLONG == const.SCREENLONG_YES: + res.append("long") + else: + res.append("screenLayoutLong_%d" % (screenLayout & const.MASK_SCREENLONG)) + + density = (self.screenType & 0xffff0000) >> 16 + if density != const.DENSITY_DEFAULT: + if density == const.DENSITY_LOW: + res.append("ldpi") + elif density == const.DENSITY_MEDIUM: + res.append("mdpi") + elif density == const.DENSITY_TV: + res.append("tvdpi") + elif density == const.DENSITY_HIGH: + res.append("hdpi") + elif density == const.DENSITY_XHIGH: + res.append("xhdpi") + elif density == const.DENSITY_XXHIGH: + res.append("xxhdpi") + elif density == const.DENSITY_XXXHIGH: + res.append("xxxhdpi") + elif density == const.DENSITY_NONE: + res.append("nodpi") + elif density == const.DENSITY_ANY: + res.append("anydpi") + else: + res.append("%ddpi" % (density)) + + touchscreen = (self.screenType & 0xff00) >> 8 + if touchscreen != const.TOUCHSCREEN_ANY: + if touchscreen == const.TOUCHSCREEN_NOTOUCH: + res.append("notouch") + elif touchscreen == const.TOUCHSCREEN_FINGER: + res.append("finger") + elif touchscreen == const.TOUCHSCREEN_STYLUS: + res.append("stylus") + else: + res.append("touchscreen_%d" % touchscreen) + + screenSize = self.screenSize + if screenSize != 0: + screenWidth = self.screenSize & 0xffff + screenHeight = (self.screenSize & 0xffff0000) >> 16 + res.append("%dx%d" % (screenWidth, screenHeight)) + + version = self.version + if version != 0: + sdkVersion = self.version & 0xffff + minorVersion = (self.version & 0xffff0000) >> 16 + res.append("v%d" % sdkVersion) + if minorVersion != 0: + res.append(".%d" % minorVersion) + + return "-".join(res) + + def get_language(self): + x = self.locale & 0x0000ffff + return chr(x & 0x00ff) + chr((x & 0xff00) >> 8) + + def get_country(self): + x = (self.locale & 0xffff0000) >> 16 + return chr(x & 0x00ff) + chr((x & 0xff00) >> 8) + + def get_density(self): + x = ((self.screenType >> 16) & 0xffff) + return x + + def is_default(self): + """ + Test if this is a default resource, which matches all + + This is indicated that all fields are zero. + :return: True if default, False otherwise + """ + return all(map(lambda x: x == 0, self._get_tuple())) + + def _get_tuple(self): + return ( + self.imsi, + self.locale, + self.screenType, + self.input, + self.screenSize, + self.version, + self.screenConfig, + self.screenSizeDp, + self.screenConfig2, + ) + + def __hash__(self): + return hash(self._get_tuple()) + + def __eq__(self, other): + return self._get_tuple() == other._get_tuple() + + def __repr__(self): + return "<ARSCResTableConfig '{}'='{}'>".format(self.get_qualifier(), repr(self._get_tuple())) + + +class ARSCResTableEntry(object): + """ + See https://github.com/LineageOS/android_frameworks_base/blob/ + df2898d9ce306bb2fe922d3beaa34a9cf6873d27/include/androidfw/ResourceTypes.h#L1370 + """ + FLAG_COMPLEX = 1 + FLAG_PUBLIC = 2 + FLAG_WEAK = 4 + + def __init__(self, buff, mResId, parent=None): + self.start = buff.get_idx() + self.mResId = mResId + self.parent = parent + self.size = unpack('<H', buff.read(2))[0] + self.flags = unpack('<H', buff.read(2))[0] + self.index = unpack('<I', buff.read(4))[0] + + if self.is_complex(): + self.item = ARSCComplex(buff, parent) + else: + # If FLAG_COMPLEX is not set, a Res_value structure will follow + self.key = ARSCResStringPoolRef(buff, self.parent) + + def get_index(self): + return self.index + + def get_value(self): + return self.parent.mKeyStrings.getString(self.index) + + def get_key_data(self): + return self.key.get_data_value() + + def is_public(self): + return (self.flags & self.FLAG_PUBLIC) != 0 + + def is_complex(self): + return (self.flags & self.FLAG_COMPLEX) != 0 + + def is_weak(self): + return (self.flags & self.FLAG_WEAK) != 0 + + def __repr__(self): + return ( + "<ARSCResTableEntry idx='0x{:08x}' mResId='0x{:08x}' size='{}' " + "flags='0x{:02x}' index='0x{:x}' holding={}>" + ).format( + self.start, + self.mResId, + self.size, + self.flags, + self.index, + self.item if self.is_complex() else self.key) + + +class ARSCComplex(object): + def __init__(self, buff, parent=None): + self.start = buff.get_idx() + self.parent = parent + + self.id_parent = unpack('<I', buff.read(4))[0] + self.count = unpack('<I', buff.read(4))[0] + + self.items = [] + for i in range(0, self.count): + self.items.append((unpack('<I', buff.read(4))[0], + ARSCResStringPoolRef(buff, self.parent))) + + def __repr__(self): + return "<ARSCComplex idx='0x{:08x}' parent='{}' count='{}'>".format(self.start, self.id_parent, self.count) + + +class ARSCResStringPoolRef(object): + def __init__(self, buff, parent=None): + self.start = buff.get_idx() + self.parent = parent + + self.size, = unpack("<H", buff.read(2)) + self.res0, = unpack("<B", buff.read(1)) + assert self.res0 == 0, "res0 must be always zero!" + self.data_type = unpack('<B', buff.read(1))[0] + self.data = unpack('<I', buff.read(4))[0] + + def get_data_value(self): + return self.parent.stringpool_main.getString(self.data) + + def get_data(self): + return self.data + + def get_data_type(self): + return self.data_type + + def get_data_type_string(self): + return const.TYPE_TABLE[self.data_type] + + def format_value(self): + return format_value( + self.data_type, + self.data, + self.parent.stringpool_main.getString + ) + + def is_reference(self): + return self.data_type == const.TYPE_REFERENCE + + def __repr__(self): + return "<ARSCResStringPoolRef idx='0x{:08x}' size='{}' type='{}' data='0x{:08x}'>".format( + self.start, + self.size, + const.TYPE_TABLE.get(self.data_type, "0x%x" % self.data_type), + self.data) + + +def get_arsc_info(arscobj): + """ + Return a string containing all resources packages ordered by packagename, locale and type. + + :param arscobj: :class:`~ARSCParser` + :return: a string + """ + buff = "" + for package in arscobj.get_packages_names(): + buff += package + ":\n" + for locale in arscobj.get_locales(package): + buff += "\t" + repr(locale) + ":\n" + for ttype in arscobj.get_types(package, locale): + buff += "\t\t" + ttype + ":\n" + try: + tmp_buff = getattr(arscobj, "get_" + ttype + "_resources")( + package, locale).decode("utf-8", 'replace').split("\n") + for i in tmp_buff: + buff += "\t\t\t" + i + "\n" + except AttributeError: + pass + return buff diff --git a/pyaxmlparser/axmlparser.py b/pyaxmlparser/axmlparser.py new file mode 100644 index 0000000..53678fa --- /dev/null +++ b/pyaxmlparser/axmlparser.py @@ -0,0 +1,576 @@ +# This file is part of Androguard. +# +# Copyright (C) 2012, Anthony Desnos <desnos at t0t0.fr> +# All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS-IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging +from struct import unpack + +import pyaxmlparser.constants as const +from pyaxmlparser import bytecode +from pyaxmlparser.stringblock import StringBlock +from pyaxmlparser.resources import public +from .arscutil import ARSCHeader + +log = logging.getLogger("pyaxmlparser.axmlparser") + + +class AXMLParser(object): + """ + AXMLParser reads through all chunks in the AXML file + and implements a state machine to return information about + the current chunk, which can then be read by :class:`~AXMLPrinter`. + + An AXML file is a file which contains multiple chunks of data, defined + by the `ResChunk_header`. + There is no real file magic but as the size of the first header is fixed + and the `type` of the `ResChunk_header` is set to `RES_XML_TYPE`, a file + will usually start with `0x03000800`. + But there are several examples where the `type` is set to something + else, probably in order to fool parsers. + + Typically the AXMLParser is used in a loop which terminates if `m_event` is set to `END_DOCUMENT`. + You can use the `next()` function to get the next chunk. + Note that not all chunk types are yielded from the iterator! Some chunks are processed in + the AXMLParser only. + The parser will set `is_valid()` to False if it parses something not valid. + Messages what is wrong are logged. + + See http://androidxref.com/9.0.0_r3/xref/frameworks/base/libs/androidfw/include/androidfw/ResourceTypes.h#563 + """ + def __init__(self, raw_buff): + self._reset() + + self._valid = True + self.axml_tampered = False + self.buff = bytecode.BuffHandle(raw_buff) + + # Minimum is a single ARSCHeader, which would be a strange edge case... + if self.buff.size() < 8: + log.error("Filesize is too small to be a valid AXML file! Filesize: {}".format(self.buff.size())) + self._valid = False + return + + # This would be even stranger, if an AXML file is larger than 4GB... + # But this is not possible as the maximum chunk size is a unsigned 4 byte int. + if self.buff.size() > 0xFFFFFFFF: + log.error("Filesize is too large to be a valid AXML file! Filesize: {}".format(self.buff.size())) + self._valid = False + return + + try: + axml_header = ARSCHeader(self.buff) + except AssertionError as e: + log.error("Error parsing first resource header: %s", e) + self._valid = False + return + + self.filesize = axml_header.size + + if axml_header.header_size == 28024: + # Can be a common error: the file is not an AXML but a plain XML + # The file will then usually start with '<?xm' / '3C 3F 78 6D' + log.warning("Header size is 28024! Are you trying to parse a plain XML file?") + + if axml_header.header_size != 8: + log.error( + "This does not look like an AXML file. " + "header size does not equal 8! header size = {}".format( + axml_header.header_size + ) + ) + self._valid = False + return + + if self.filesize > self.buff.size(): + log.error( + "This does not look like an AXML file. " + "Declared filesize does not match real size: {} vs {}".format( + self.filesize, self.buff.size() + ) + ) + self._valid = False + return + + if self.filesize < self.buff.size(): + # The file can still be parsed up to the point where the chunk should end. + self.axml_tampered = True + log.warning( + "Declared filesize ({}) is smaller than total file size ({}). " + "Was something appended to the file? Trying to parse it anyways.".format( + self.filesize, self.buff.size() + ) + ) + + # Not that severe of an error, we have plenty files where this is not + # set correctly + if axml_header.type != const.RES_XML_TYPE: + self.axml_tampered = True + log.warning( + "AXML file has an unusual resource type! " + "Malware likes to to such stuff to anti androguard! " + "But we try to parse it anyways. " + "Resource Type: 0x{:04x}".format(axml_header.type) + ) + + # Now we parse the STRING POOL + try: + header = ARSCHeader(self.buff) + except AssertionError as e: + log.error("Error parsing resource header of string pool: %s", e) + self._valid = False + return + + if header.header_size != 0x1C: + log.error( + "This does not look like an AXML file. String chunk header " + "size does not equal 28! header size = {}".format( + header.header_size + ) + ) + self._valid = False + return + + if header.type != const.RES_STRING_POOL_TYPE: + log.error( + "Expected String Pool header, got resource type 0x{:04x} " + "instead".format(header.type) + ) + self._valid = False + return + + self.sb = StringBlock(self.buff, header) + + # Stores resource ID mappings, if any + self.m_resourceIDs = [] + + # Store a list of prefix/uri mappings encountered + self.namespaces = [] + + def is_valid(self): + """ + Get the state of the AXMLPrinter. + if an error happend somewhere in the process of parsing the file, + this flag is set to False. + """ + return self._valid + + def _reset(self): + self.m_event = -1 + self.m_lineNumber = -1 + self.m_name = -1 + self.m_namespaceUri = -1 + self.m_attributes = [] + self.m_idAttribute = -1 + self.m_classAttribute = -1 + self.m_styleAttribute = -1 + + def __next__(self): + self._do_next() + return self.m_event + + next = __next__ # For Python 2 compatibility + + def _do_next(self): + if self.m_event == const.END_DOCUMENT: + return + + self._reset() + while self._valid: + # Stop at the declared filesize or at the end of the file + if self.buff.end() or self.buff.get_idx() == self.filesize: + self.m_event = const.END_DOCUMENT + break + + # Again, we read an ARSCHeader + try: + h = ARSCHeader(self.buff) + except AssertionError as e: + log.error("Error parsing resource header: %s", e) + self._valid = False + return + + # Special chunk: Resource Map. This chunk might be contained inside + # the file, after the string pool. + if h.type == const.RES_XML_RESOURCE_MAP_TYPE: + log.debug("AXML contains a RESOURCE MAP") + # Check size: < 8 bytes mean that the chunk is not complete + # Should be aligned to 4 bytes. + if h.size < 8 or (h.size % 4) != 0: + log.error("Invalid chunk size in chunk XML_RESOURCE_MAP") + self._valid = False + return + + for i in range((h.size - h.header_size) // 4): + self.m_resourceIDs.append(unpack('<L', self.buff.read(4))[0]) + + continue + + # Parse now the XML chunks. + # unknown chunk types might cause problems, but we can skip them! + if h.type < const.RES_XML_FIRST_CHUNK_TYPE or h.type > const.RES_XML_LAST_CHUNK_TYPE: + # h.size is the size of the whole chunk including the header. + # We read already 8 bytes of the header, thus we need to + # subtract them. + log.error("Not a XML resource chunk type: 0x{:04x}. Skipping {} bytes".format(h.type, h.size)) + self.buff.set_idx(h.end) + continue + + # Check that we read a correct header + if h.header_size != 0x10: + log.error( + "XML Resource Type Chunk header size does not match 16! " + "At chunk type 0x{:04x}, declared header size={}, " + "chunk size={}".format(h.type, h.header_size, h.size) + ) + self._valid = False + return + + # Line Number of the source file, only used as meta information + self.m_lineNumber, = unpack('<L', self.buff.read(4)) + + # Comment_Index (usually 0xFFFFFFFF) + self.m_comment_index, = unpack('<L', self.buff.read(4)) + + if self.m_comment_index != 0xFFFFFFFF and h.type in [ + const.RES_XML_START_NAMESPACE_TYPE, + const.RES_XML_END_NAMESPACE_TYPE]: + log.warning("Unhandled Comment at namespace chunk: '{}'".format( + self.sb[self.m_comment_index]) + ) + + if h.type == const.RES_XML_START_NAMESPACE_TYPE: + prefix, = unpack('<L', self.buff.read(4)) + uri, = unpack('<L', self.buff.read(4)) + + s_prefix = self.sb[prefix] + s_uri = self.sb[uri] + + log.debug( + "Start of Namespace mapping: prefix " + "{}: '{}' --> uri {}: '{}'".format( + prefix, s_prefix, uri, s_uri + ) + ) + + if s_uri == '': + log.warning("Namespace prefix '{}' resolves to empty URI. " + "This might be a packer.".format(s_prefix)) + + if (prefix, uri) in self.namespaces: + log.info( + "Namespace mapping ({}, {}) already seen! " + "This is usually not a problem but could indicate " + "packers or broken AXML compilers.".format(prefix, uri)) + self.namespaces.append((prefix, uri)) + + # We can continue with the next chunk, as we store the namespace + # mappings for each tag + continue + + if h.type == const.RES_XML_END_NAMESPACE_TYPE: + # END_PREFIX contains again prefix and uri field + prefix, = unpack('<L', self.buff.read(4)) + uri, = unpack('<L', self.buff.read(4)) + + # We remove the last namespace mapping matching + if (prefix, uri) in self.namespaces: + self.namespaces.remove((prefix, uri)) + else: + log.warning( + "Reached a NAMESPACE_END without having the namespace stored before? " + "Prefix ID: {}, URI ID: {}".format(prefix, uri) + ) + + # We can continue with the next chunk, as we store the namespace + # mappings for each tag + continue + + # START_TAG is the start of a new tag. + if h.type == const.RES_XML_START_ELEMENT_TYPE: + # The TAG consists of some fields: + # * (chunk_size, line_number, comment_index - we read before) + # * namespace_uri + # * name + # * flags + # * attribute_count + # * class_attribute + # After that, there are two lists of attributes, 20 bytes each + + # Namespace URI (String ID) + self.m_namespaceUri, = unpack('<L', self.buff.read(4)) + # Name of the Tag (String ID) + self.m_name, = unpack('<L', self.buff.read(4)) + # FIXME: Flags + _ = self.buff.read(4) # noqa + # Attribute Count + attributeCount, = unpack('<L', self.buff.read(4)) + # Class Attribute + self.m_classAttribute, = unpack('<L', self.buff.read(4)) + + self.m_idAttribute = (attributeCount >> 16) - 1 + self.m_attribute_count = attributeCount & 0xFFFF + self.m_styleAttribute = (self.m_classAttribute >> 16) - 1 + self.m_classAttribute = (self.m_classAttribute & 0xFFFF) - 1 + + # Now, we parse the attributes. + # Each attribute has 5 fields of 4 byte + for i in range(0, self.m_attribute_count * const.ATTRIBUTE_LENGHT): + # Each field is linearly parsed into the array + # Each Attribute contains: + # * Namespace URI (String ID) + # * Name (String ID) + # * Value + # * Type + # * Data + self.m_attributes.append(unpack('<L', self.buff.read(4))[0]) + + # Then there are class_attributes + for i in range(const.ATTRIBUTE_IX_VALUE_TYPE, len(self.m_attributes), const.ATTRIBUTE_LENGHT): + self.m_attributes[i] = self.m_attributes[i] >> 24 + + self.m_event = const.START_TAG + break + + if h.type == const.RES_XML_END_ELEMENT_TYPE: + self.m_namespaceUri, = unpack('<L', self.buff.read(4)) + self.m_name, = unpack('<L', self.buff.read(4)) + + self.m_event = const.END_TAG + break + + if h.type == const.RES_XML_CDATA_TYPE: + # The CDATA field is like an attribute. + # It contains an index into the String pool + # as well as a typed value. + # usually, this typed value is set to UNDEFINED + + # ResStringPool_ref data --> uint32_t index + self.m_name, = unpack('<L', self.buff.read(4)) + + # Res_value typedData: + # uint16_t size + # uint8_t res0 -> always zero + # uint8_t dataType + # uint32_t data + # For now, we ingore these values + size, res0, dataType, data = unpack("<HBBL", self.buff.read(8)) + + log.debug( + "found a CDATA Chunk: " + "index={: 6d}, size={: 4d}, res0={: 4d}, " + "dataType={: 4d}, data={: 4d}".format( + self.m_name, size, res0, dataType, data + ) + ) + + self.m_event = const.TEXT + break + + # Still here? Looks like we read an unknown XML header, try to skip it... + log.warning("Unknown XML Chunk: 0x{:04x}, skipping {} bytes.".format(h.type, h.size)) + self.buff.set_idx(h.end) + + @property + def name(self): + """ + Return the String assosciated with the tag name + """ + if self.m_name == -1 or (self.m_event != const.START_TAG and self.m_event != const.END_TAG): + return u'' + + return self.sb[self.m_name] + + @property + def comment(self): + """ + Return the comment at the current position or None if no comment is given + + This works only for Tags, as the comments of Namespaces are silently dropped. + Currently, there is no way of retrieving comments of namespaces. + """ + if self.m_comment_index == 0xFFFFFFFF: + return None + + return self.sb[self.m_comment_index] + + @property + def namespace(self): + """ + Return the Namespace URI (if any) as a String for the current tag + """ + if self.m_name == -1 or (self.m_event != const.START_TAG and self.m_event != const.END_TAG): + return u'' + + # No Namespace + if self.m_namespaceUri == 0xFFFFFFFF: + return u'' + + return self.sb[self.m_namespaceUri] + + @property + def nsmap(self): + """ + Returns the current namespace mapping as a dictionary + + there are several problems with the map and we try to guess a few + things here: + + 1) a URI can be mapped by many prefixes, so it is to decide which one to take + 2) a prefix might map to an empty string (some packers) + 3) uri+prefix mappings might be included several times + 4) prefix might be empty + """ + + NSMAP = dict() + # solve 3) by using a set + for k, v in set(self.namespaces): + s_prefix = self.sb[k] + s_uri = self.sb[v] + # Solve 2) & 4) by not including + if s_uri != "" and s_prefix != "": + # solve 1) by using the last one in the list + NSMAP[s_prefix] = s_uri + + return NSMAP + + @property + def text(self): + """ + Return the String assosicated with the current text + """ + if self.m_name == -1 or self.m_event != const.TEXT: + return u'' + + return self.sb[self.m_name] + + def getName(self): + """ + Legacy only! + use :py:attr:`~androguard.core.bytecodes.AXMLParser.name` instead + """ + return self.name + + def getText(self): + """ + Legacy only! + use :py:attr:`~androguard.core.bytecodes.AXMLParser.text` instead + """ + return self.text + + def getPrefix(self): + """ + Legacy only! + use :py:attr:`~androguard.core.bytecodes.AXMLParser.namespace` instead + """ + return self.namespace + + def _get_attribute_offset(self, index): + """ + Return the start inside the m_attributes array for a given attribute + """ + if self.m_event != const.START_TAG: + log.warning("Current event is not START_TAG.") + + offset = index * const.ATTRIBUTE_LENGHT + if offset >= len(self.m_attributes): + log.warning("Invalid attribute index") + + return offset + + def getAttributeCount(self): + """ + Return the number of Attributes for a Tag + or -1 if not in a tag + """ + if self.m_event != const.START_TAG: + return -1 + + return self.m_attribute_count + + def getAttributeUri(self, index): + """ + Returns the numeric ID for the namespace URI of an attribute + """ + offset = self._get_attribute_offset(index) + uri = self.m_attributes[offset + const.ATTRIBUTE_IX_NAMESPACE_URI] + + return uri + + def getAttributeNamespace(self, index): + """ + Return the Namespace URI (if any) for the attribute + """ + uri = self.getAttributeUri(index) + + # No Namespace + if uri == 0xFFFFFFFF: + return u'' + + return self.sb[uri] + + def getAttributeName(self, index): + """ + Returns the String which represents the attribute name + """ + offset = self._get_attribute_offset(index) + name = self.m_attributes[offset + const.ATTRIBUTE_IX_NAME] + + res = self.sb[name] + # If the result is a (null) string, we need to look it up. + if not res: + attr = self.m_resourceIDs[name] + if attr in public.SYSTEM_RESOURCES['attributes']['inverse']: + res = 'android:' + public.SYSTEM_RESOURCES['attributes']['inverse'][attr] + else: + # Attach the HEX Number, so for multiple missing attributes we do not run + # into problems. + res = 'android:UNKNOWN_SYSTEM_ATTRIBUTE_{:08x}'.format(attr) + + return res + + def getAttributeValueType(self, index): + """ + Return the type of the attribute at the given index + + :param index: index of the attribute + """ + offset = self._get_attribute_offset(index) + return self.m_attributes[offset + const.ATTRIBUTE_IX_VALUE_TYPE] + + def getAttributeValueData(self, index): + """ + Return the data of the attribute at the given index + + :param index: index of the attribute + """ + offset = self._get_attribute_offset(index) + return self.m_attributes[offset + const.ATTRIBUTE_IX_VALUE_DATA] + + def getAttributeValue(self, index): + """ + This function is only used to look up strings + All other work is done by + :func:`~androguard.core.bytecodes.axml.format_value` + # FIXME should unite those functions + :param index: index of the attribute + :return: + """ + offset = self._get_attribute_offset(index) + valueType = self.m_attributes[offset + const.ATTRIBUTE_IX_VALUE_TYPE] + if valueType == const.TYPE_STRING: + valueString = self.m_attributes[offset + const.ATTRIBUTE_IX_VALUE_STRING] + return self.sb[valueString] + return u'' diff --git a/pyaxmlparser/axmlprinter.py b/pyaxmlparser/axmlprinter.py new file mode 100644 index 0000000..e9e838c --- /dev/null +++ b/pyaxmlparser/axmlprinter.py @@ -0,0 +1,249 @@ +# This file is part of Androguard. +# +# Copyright (C) 2012, Anthony Desnos <desnos at t0t0.fr> +# All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS-IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import re +import sys +import binascii +import logging + +from pyaxmlparser.axmlparser import AXMLParser +from pyaxmlparser.utils import format_value +import pyaxmlparser.constants as const +from lxml import etree + +log = logging.getLogger("pyaxmlparser.axmlprinter") + + +class AXMLPrinter: + """ + Converter for AXML Files into a lxml ElementTree, which can easily be + converted into XML. + + A Reference Implementation can be found at http://androidxref.com/9.0.0_r3/ + xref/frameworks/base/tools/aapt/XMLNode.cpp + """ + __charrange = None + __replacement = None + + def __init__(self, raw_buff): + self.axml = AXMLParser(raw_buff) + + self.root = None + self.packerwarning = False + cur = [] + + while self.axml.is_valid(): + _type = next(self.axml) + + if _type == const.START_TAG: + name = self._fix_name(self.axml.name) + uri = self._print_namespace(self.axml.namespace) + tag = "{}{}".format(uri, name) + + comment = self.axml.comment + if comment: + if self.root is None: + log.warning("Can not attach comment with content '{}' without root!".format(comment)) + else: + cur[-1].append(etree.Comment(comment)) + + log.debug("START_TAG: {} (line={})".format(tag, self.axml.m_lineNumber)) + elem = etree.Element(tag, nsmap=self.axml.nsmap) + + for i in range(self.axml.getAttributeCount()): + uri = self._print_namespace(self.axml.getAttributeNamespace(i)) + name = self._fix_name(self.axml.getAttributeName(i)) + value = self._fix_value(self._get_attribute_value(i)) + + log.debug("found an attribute: {}{}='{}'".format(uri, name, value.encode("utf-8"))) + if "{}{}".format(uri, name) in elem.attrib: + log.warning("Duplicate attribute '{}{}'! Will overwrite!".format(uri, name)) + elem.set("{}{}".format(uri, name), value) + + if self.root is None: + self.root = elem + else: + if not cur: + # looks like we lost the root? + log.error("No more elements available to attach to! Is the XML malformed?") + break + cur[-1].append(elem) + cur.append(elem) + + if _type == const.END_TAG: + if not cur: + log.warning("Too many END_TAG! No more elements available to attach to!") + + name = self.axml.name + uri = self._print_namespace(self.axml.namespace) + tag = "{}{}".format(uri, name) + if cur[-1].tag != tag: + log.warning( + "Closing tag '{}' does not match current stack! " + "At line number: {}. Is the XML malformed?".format( + self.axml.name, self.axml.m_lineNumber + ) + ) + cur.pop() + if _type == const.TEXT: + log.debug("TEXT for {}".format(cur[-1])) + cur[-1].text = self.axml.text + if _type == const.END_DOCUMENT: + # Check if all namespace mappings are closed + if len(self.axml.namespaces) > 0: + log.warning( + "Not all namespace mappings were closed! Malformed AXML?") + break + + def get_buff(self): + """ + Returns the raw XML file without prettification applied. + + :returns: bytes, encoded as UTF-8 + """ + return self.get_xml(pretty=False) + + def get_xml(self, pretty=True): + """ + Get the XML as an UTF-8 string + + :returns: bytes encoded as UTF-8 + """ + return etree.tostring(self.root, encoding="utf-8", pretty_print=pretty) + + def get_xml_obj(self): + """ + Get the XML as an ElementTree object + + :returns: :class:`lxml.etree.Element` + """ + return self.root + + def is_valid(self): + """ + Return the state of the AXMLParser. + If this flag is set to False, the parsing has failed, thus + the resulting XML will not work or will even be empty. + """ + return self.axml.is_valid() + + def is_packed(self): + """ + Returns True if the AXML is likely to be packed + + Packers do some weird stuff and we try to detect it. + Sometimes the files are not packed but simply broken or compiled with + some broken version of a tool. + Some file corruption might also be appear to be a packed file. + + :returns: True if packer detected, False otherwise + """ + return self.packerwarning + + def _get_attribute_value(self, index): + """ + Wrapper function for format_value + to resolve the actual value of an attribute in a tag + :param index: index of the current attribute + :return: formatted value + """ + _type = self.axml.getAttributeValueType(index) + _data = self.axml.getAttributeValueData(index) + + return format_value(_type, _data, lambda _: self.axml.getAttributeValue(index)) + + def _fix_name(self, name): + """ + Apply some fixes to element named and attribute names. + Try to get conform to: + > Like element names, attribute names are case-sensitive and must start with a letter or underscore. + > The rest of the name can contain letters, digits, hyphens, underscores, and periods. + See: https://msdn.microsoft.com/en-us/library/ms256152(v=vs.110).aspx + + :param name: Name of the attribute + :return: a fixed version of the name + """ + if not name[0].isalpha() and name[0] != "_": + log.warning("Invalid start for name '{}'".format(name)) + self.packerwarning = True + name = "_{}".format(name) + if name.startswith("android:"): + # Seems be a common thing... + # Actually this means that the Manifest is likely to be broken, as + # usually no namespace URI is set in this case. + log.warning( + "Name '{}' starts with 'android:' prefix! " + "The Manifest seems to be broken? Removing prefix.".format( + name + ) + ) + self.packerwarning = True + name = name[len("android:"):] + if ":" in name: + # Print out an extra warning + log.warning("Name seems to contain a namespace prefix: '{}'".format(name)) + if not re.match(r"^[a-zA-Z0-9._-]*$", name): + log.warning("Name '{}' contains invalid characters!".format(name)) + self.packerwarning = True + name = re.sub(r"[^a-zA-Z0-9._-]", "_", name) + + return name + + def _fix_value(self, value): + """ + Return a cleaned version of a value + according to the specification: + > Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] + + See https://www.w3.org/TR/xml/#charsets + + :param value: a value to clean + :return: the cleaned value + """ + if not self.__charrange or not self.__replacement: + if sys.maxunicode == 0xFFFF: + # Fix for python 2.x, surrogate pairs does not match in regex + self.__charrange = re.compile( + u'^([\u0020-\uD7FF\u0009\u000A\u000D\uE000-\uFFFD]|[\uD800-\uDBFF][\uDC00-\uDFFF])*$') + # TODO: this regex is slightly wrong... surrogates are not matched as pairs. + self.__replacement = re.compile(u'[^\u0020-\uDBFF\u0009\u000A\u000D\uE000-\uFFFD\uDC00-\uDFFF]') + else: + self.__charrange = re.compile(u'^[\u0020-\uD7FF\u0009\u000A\u000D\uE000-\uFFFD\U00010000-\U0010FFFF]*$') + self.__replacement = re.compile(u'[^\u0020-\uD7FF\u0009\u000A\u000D\uE000-\uFFFD\U00010000-\U0010FFFF]') + + # Reading string until \x00. This is the same as aapt does. + if "\x00" in value: + self.packerwarning = True + log.warning( + "Null byte found in attribute value at position {}: " + "Value(hex): '{}'".format( + value.find("\x00"), + binascii.hexlify(value.encode("utf-8")) + ) + ) + value = value[:value.find("\x00")] + + if not self.__charrange.match(value): + log.warning("Invalid character in value found. Replacing with '_'.") + self.packerwarning = True + value = self.__replacement.sub('_', value) + return value + + def _print_namespace(self, uri): + if uri != "": + uri = "{{{}}}".format(uri) + return uri diff --git a/pyaxmlparser/bytecode.py b/pyaxmlparser/bytecode.py new file mode 100644 index 0000000..65360f2 --- /dev/null +++ b/pyaxmlparser/bytecode.py @@ -0,0 +1,363 @@ +from __future__ import print_function +from __future__ import absolute_import + +from builtins import str +from builtins import object +from struct import unpack, pack + +import logging + +log = logging.getLogger("pyaxmlparser.bytecode") + + +# Handle exit message +def Exit(msg): + log.warning("Error : " + msg) + raise Exception("oops") + + +class SV(object): + + def __init__(self, size, buff): + self.__size = size + self.__value = unpack(self.__size, buff)[0] + + def _get(self): + return pack(self.__size, self.__value) + + def __str__(self): + return "0x%x" % self.__value + + def __int__(self): + return self.__value + + def get_value_buff(self): + return self._get() + + def get_value(self): + return self.__value + + def set_value(self, attr): + self.__value = attr + + +class SVs(object): + + def __init__(self, size, ntuple, buff): + self.__size = size + + self.__value = ntuple._make(unpack(self.__size, buff)) + + def _get(self): + l = [] + for i in self.__value._fields: + l.append(getattr(self.__value, i)) + return pack(self.__size, *l) + + def _export(self): + return [x for x in self.__value._fields] + + def get_value_buff(self): + return self._get() + + def get_value(self): + return self.__value + + def set_value(self, attr): + self.__value = self.__value._replace(**attr) + + def __str__(self): + return self.__value.__str__() + + +def object_to_bytes(obj): + """ + Convert a object to a bytearray or call get_raw() of the object + if no useful type was found. + """ + if isinstance(obj, str): + return bytearray(obj, "UTF-8") + elif isinstance(obj, bool): + return bytearray() + elif isinstance(obj, int): + return pack("<L", obj) + elif obj is None: + return bytearray() + elif isinstance(obj, bytearray): + return obj + else: + return obj.get_raw() + + +class MethodBC(object): + + def show(self, value): + getattr(self, "show_" + value)() + + +class BuffHandle(object): + """ + BuffHandle is a wrapper around bytes. + It gives the ability to jump in the byte stream, just like with BytesIO. + """ + + def __init__(self, buff): + self.__buff = bytearray(buff) + self.__idx = 0 + + def __getitem__(self, item): + """ + Get the byte at the position `item` + + :param int item: offset in the buffer + :returns: byte at the position + :rtype: int + """ + return self.__buff[item] + + def __len__(self): + return self.size() + + def size(self): + """ + Get the total size of the buffer + + :rtype: int + """ + return len(self.__buff) + + def length_buff(self): + """ + Alias for :meth:`size` + """ + return self.size() + + def set_idx(self, idx): + """ + Set the current offset in the buffer + + :param int idx: offset to set + """ + self.__idx = idx + + def get_idx(self): + """ + Get the current offset in the buffer + + :rtype: int + """ + return self.__idx + + def add_idx(self, idx): + """ + Advance the current offset by `idx` + + :param int idx: number of bytes to advance + """ + self.__idx += idx + + def tell(self): + """ + Alias for :meth:`get_idx`. + + :rtype: int + """ + return self.__idx + + def readNullString(self, size): + """ + Read a String with length `size` at the current offset + + :param int size: length of the string + :rtype: bytearray + """ + data = self.read(size) + return data + + def read_b(self, size): + """ + Read bytes with length `size` without incrementing the current offset + + :param int size: length to read in bytes + :rtype: bytearray + """ + return self.__buff[self.__idx:self.__idx + size] + + def peek(self, size): + """ + Alias for :meth:`read_b` + """ + return self.read_b(size) + + def read_at(self, offset, size): + """ + Read bytes from the given offset with length `size` without incrementing + the current offset + + :param int offset: offset to start reading + :param int size: length of bytes to read + :rtype: bytearray + """ + return self.__buff[offset:offset + size] + + def readat(self, off): + """ + Read all bytes from the start of `off` until the end of the buffer + + :param int off: starting offset + :rtype: bytearray + """ + if isinstance(off, SV): + off = off.value + + return self.__buff[off:] + + def read(self, size): + """ + Read from the current offset a total number of `size` bytes + and increment the offset by `size` + + :param int size: length of bytes to read + :rtype: bytearray + """ + if isinstance(size, SV): + size = size.value + + buff = self.__buff[self.__idx:self.__idx + size] + self.__idx += size + + return buff + + def end(self): + """ + Test if the current offset is at the end or over the buffer boundary + + :rtype: bool + """ + return self.__idx >= len(self.__buff) + + def get_buff(self): + """ + Return the whole buffer + + :rtype: bytearray + """ + return self.__buff + + def set_buff(self, buff): + """ + Overwrite the current buffer with the content of `buff` + + :param bytearray buff: the new buffer + """ + self.__buff = buff + + def save(self, filename): + """ + Save the current buffer to `filename` + + Exisiting files with the same name will be overwritten. + + :param str filename: the name of the file to save to + """ + with open(filename, "wb") as fd: + fd.write(self.__buff) + + +class Buff(object): + def __init__(self, offset, buff): + self.offset = offset + self.buff = buff + + self.size = len(buff) + + +# Here for legacy reasons. Might get removed some day... +_Bytecode = BuffHandle + + +def FormatClassToJava(i): + """ + Transform a java class name into the typed variant found in DEX files. + + example:: + + >>> FormatClassToJava('java.lang.Object') + 'Ljava/lang/Object;' + + :param i: the input class name + :rtype: str + """ + return "L" + i.replace(".", "/") + ";" + + +def FormatClassToPython(i): + """ + Transform a typed class name into a form which can be used as a python + attribute + + example:: + + >>> FormatClassToPython('Lfoo/bar/foo/Barfoo$InnerClass;') + 'Lfoo_bar_foo_Barfoo_InnerClass' + + :param i: classname to transform + :rtype: str + """ + i = i[:-1] + i = i.replace("/", "_") + i = i.replace("$", "_") + + return i + + +def FormatNameToPython(i): + """ + Transform a (method) name into a form which can be used as a python + attribute + + example:: + + >>> FormatNameToPython('<clinit>') + 'clinit' + + :param i: name to transform + :rtype: str + """ + + i = i.replace("<", "") + i = i.replace(">", "") + i = i.replace("$", "_") + + return i + + +def FormatDescriptorToPython(i): + """ + Format a descriptor into a form which can be used as a python attribute + + example:: + + >>> FormatDescriptorToPython('(Ljava/lang/Long; Ljava/lang/Long; Z Z)V') + 'Ljava_lang_LongLjava_lang_LongZZV + + :param i: name to transform + :rtype: str + """ + + i = i.replace("/", "_") + i = i.replace(";", "") + i = i.replace("[", "") + i = i.replace("(", "") + i = i.replace(")", "") + i = i.replace(" ", "") + i = i.replace("$", "") + + return i + + +class Node(object): + def __init__(self, n, s): + self.id = n + self.title = s + self.children = [] diff --git a/pyaxmlparser/cli.py b/pyaxmlparser/cli.py new file mode 100644 index 0000000..65aaa16 --- /dev/null +++ b/pyaxmlparser/cli.py @@ -0,0 +1,22 @@ +import os + +import click + +from pyaxmlparser import APK + + +@click.command() +@click.argument('filename') +def main(filename): + filename = os.path.expanduser(filename) + apk = APK(filename) + + click.echo('APK: {}'.format(filename)) + click.echo('App name: {}'.format(apk.application)) + click.echo('Package: {}'.format(apk.packagename)) + click.echo('Version name: {}'.format(apk.version_name)) + click.echo('Version code: {}'.format(apk.version_code)) + click.echo('Is it Signed: {}'.format(apk.signed)) + click.echo('Is it Signed with v1 Signatures: {}'.format(apk.signed_v1)) + click.echo('Is it Signed with v2 Signatures: {}'.format(apk.signed_v2)) + click.echo('Is it Signed with v3 Signatures: {}'.format(apk.signed_v3)) diff --git a/pyaxmlparser/constants.py b/pyaxmlparser/constants.py new file mode 100644 index 0000000..55d8323 --- /dev/null +++ b/pyaxmlparser/constants.py @@ -0,0 +1,184 @@ +# Type definiton for (type, data) tuples representing a value +# See http://androidxref.com/9.0.0_r3/xref/frameworks/base/libs/androidfw/include/androidfw/ResourceTypes.h#262 + +# The 'data' is either 0 or 1, specifying this resource is either +# undefined or empty, respectively. +TYPE_NULL = 0x00 +# The 'data' holds a ResTable_ref, a reference to another resource +# table entry. +TYPE_REFERENCE = 0x01 +# The 'data' holds an attribute resource identifier. +TYPE_ATTRIBUTE = 0x02 +# The 'data' holds an index into the containing resource table's +# global value string pool. +TYPE_STRING = 0x03 +# The 'data' holds a single-precision floating point number. +TYPE_FLOAT = 0x04 +# The 'data' holds a complex number encoding a dimension value +# such as "100in". +TYPE_DIMENSION = 0x05 +# The 'data' holds a complex number encoding a fraction of a +# container. +TYPE_FRACTION = 0x06 +# The 'data' holds a dynamic ResTable_ref, which needs to be +# resolved before it can be used like a TYPE_REFERENCE. +TYPE_DYNAMIC_REFERENCE = 0x07 +# The 'data' holds an attribute resource identifier, which needs to be resolved +# before it can be used like a TYPE_ATTRIBUTE. +TYPE_DYNAMIC_ATTRIBUTE = 0x08 +# Beginning of integer flavors... +TYPE_FIRST_INT = 0x10 +# The 'data' is a raw integer value of the form n..n. +TYPE_INT_DEC = 0x10 +# The 'data' is a raw integer value of the form 0xn..n. +TYPE_INT_HEX = 0x11 +# The 'data' is either 0 or 1, for input "false" or "true" respectively. +TYPE_INT_BOOLEAN = 0x12 +# Beginning of color integer flavors... +TYPE_FIRST_COLOR_INT = 0x1c +# The 'data' is a raw integer value of the form #aarrggbb. +TYPE_INT_COLOR_ARGB8 = 0x1c +# The 'data' is a raw integer value of the form #rrggbb. +TYPE_INT_COLOR_RGB8 = 0x1d +# The 'data' is a raw integer value of the form #argb. +TYPE_INT_COLOR_ARGB4 = 0x1e +# The 'data' is a raw integer value of the form #rgb. +TYPE_INT_COLOR_RGB4 = 0x1f +# ...end of integer flavors. +TYPE_LAST_COLOR_INT = 0x1f +# ...end of integer flavors. +TYPE_LAST_INT = 0x1f + +# Constants for ARSC Files +# see http://androidxref.com/9.0.0_r3/xref/frameworks/base/libs/androidfw/include/androidfw/ResourceTypes.h#215 +RES_NULL_TYPE = 0x0000 +RES_STRING_POOL_TYPE = 0x0001 +RES_TABLE_TYPE = 0x0002 +RES_XML_TYPE = 0x0003 + +RES_XML_FIRST_CHUNK_TYPE = 0x0100 +RES_XML_START_NAMESPACE_TYPE = 0x0100 +RES_XML_END_NAMESPACE_TYPE = 0x0101 +RES_XML_START_ELEMENT_TYPE = 0x0102 +RES_XML_END_ELEMENT_TYPE = 0x0103 +RES_XML_CDATA_TYPE = 0x0104 +RES_XML_LAST_CHUNK_TYPE = 0x017f + +RES_XML_RESOURCE_MAP_TYPE = 0x0180 + +RES_TABLE_PACKAGE_TYPE = 0x0200 +RES_TABLE_TYPE_TYPE = 0x0201 +RES_TABLE_TYPE_SPEC_TYPE = 0x0202 +RES_TABLE_LIBRARY_TYPE = 0x0203 + +# Flags in the STRING Section +SORTED_FLAG = 1 << 0 +UTF8_FLAG = 1 << 8 + +# Position of the fields inside an attribute +ATTRIBUTE_IX_NAMESPACE_URI = 0 +ATTRIBUTE_IX_NAME = 1 +ATTRIBUTE_IX_VALUE_STRING = 2 +ATTRIBUTE_IX_VALUE_TYPE = 3 +ATTRIBUTE_IX_VALUE_DATA = 4 +ATTRIBUTE_LENGHT = 5 + +# Internally used state variables for AXMLParser +START_DOCUMENT = 0 +END_DOCUMENT = 1 +START_TAG = 2 +END_TAG = 3 +TEXT = 4 + +# Table used to lookup functions to determine the value representation in ARSCParser +TYPE_TABLE = { + TYPE_ATTRIBUTE: "attribute", + TYPE_DIMENSION: "dimension", + TYPE_FLOAT: "float", + TYPE_FRACTION: "fraction", + TYPE_INT_BOOLEAN: "int_boolean", + TYPE_INT_COLOR_ARGB4: "int_color_argb4", + TYPE_INT_COLOR_ARGB8: "int_color_argb8", + TYPE_INT_COLOR_RGB4: "int_color_rgb4", + TYPE_INT_COLOR_RGB8: "int_color_rgb8", + TYPE_INT_DEC: "int_dec", + TYPE_INT_HEX: "int_hex", + TYPE_NULL: "null", + TYPE_REFERENCE: "reference", + TYPE_STRING: "string", +} + +RADIX_MULTS = [0.00390625, 3.051758E-005, 1.192093E-007, 4.656613E-010] +DIMENSION_UNITS = ["px", "dip", "sp", "pt", "in", "mm"] +FRACTION_UNITS = ["%", "%p"] + +COMPLEX_UNIT_MASK = 0x0F + +ACONFIGURATION_MCC = 0x0001 +ACONFIGURATION_MNC = 0x0002 +ACONFIGURATION_LOCALE = 0x0004 +ACONFIGURATION_TOUCHSCREEN = 0x0008 +ACONFIGURATION_KEYBOARD = 0x0010 +ACONFIGURATION_KEYBOARD_HIDDEN = 0x0020 +ACONFIGURATION_NAVIGATION = 0x0040 +ACONFIGURATION_ORIENTATION = 0x0080 +ACONFIGURATION_DENSITY = 0x0100 +ACONFIGURATION_SCREEN_SIZE = 0x0200 +ACONFIGURATION_VERSION = 0x0400 +ACONFIGURATION_SCREEN_LAYOUT = 0x0800 +ACONFIGURATION_UI_MODE = 0x1000 +ACONFIGURATION_LAYOUTDIR_ANY = 0x00 +ACONFIGURATION_LAYOUTDIR_LTR = 0x01 +ACONFIGURATION_LAYOUTDIR_RTL = 0x02 +ACONFIGURATION_SCREENSIZE_ANY = 0x00 +ACONFIGURATION_SCREENSIZE_SMALL = 0x01 +ACONFIGURATION_SCREENSIZE_NORMAL = 0x02 +ACONFIGURATION_SCREENSIZE_LARGE = 0x03 +ACONFIGURATION_SCREENSIZE_XLARGE = 0x04 +ACONFIGURATION_SCREENLONG_ANY = 0x00 +ACONFIGURATION_SCREENLONG_NO = 0x1 +ACONFIGURATION_SCREENLONG_YES = 0x2 +ACONFIGURATION_TOUCHSCREEN_ANY = 0x0000 +ACONFIGURATION_TOUCHSCREEN_NOTOUCH = 0x0001 +ACONFIGURATION_TOUCHSCREEN_STYLUS = 0x0002 +ACONFIGURATION_TOUCHSCREEN_FINGER = 0x0003 +ACONFIGURATION_DENSITY_DEFAULT = 0 +ACONFIGURATION_DENSITY_LOW = 120 +ACONFIGURATION_DENSITY_MEDIUM = 160 +ACONFIGURATION_DENSITY_TV = 213 +ACONFIGURATION_DENSITY_HIGH = 240 +ACONFIGURATION_DENSITY_XHIGH = 320 +ACONFIGURATION_DENSITY_XXHIGH = 480 +ACONFIGURATION_DENSITY_XXXHIGH = 640 +ACONFIGURATION_DENSITY_ANY = 0xfffe +ACONFIGURATION_DENSITY_NONE = 0xffff +MASK_LAYOUTDIR = 0xC0 +MASK_SCREENSIZE = 0x0f +MASK_SCREENLONG = 0x30 +SHIFT_LAYOUTDIR = 6 +SHIFT_SCREENLONG = 4 +LAYOUTDIR_ANY = ACONFIGURATION_LAYOUTDIR_ANY << SHIFT_LAYOUTDIR +LAYOUTDIR_LTR = ACONFIGURATION_LAYOUTDIR_LTR << SHIFT_LAYOUTDIR +LAYOUTDIR_RTL = ACONFIGURATION_LAYOUTDIR_RTL << SHIFT_LAYOUTDIR +SCREENSIZE_ANY = ACONFIGURATION_SCREENSIZE_ANY +SCREENSIZE_SMALL = ACONFIGURATION_SCREENSIZE_SMALL +SCREENSIZE_NORMAL = ACONFIGURATION_SCREENSIZE_NORMAL +SCREENSIZE_LARGE = ACONFIGURATION_SCREENSIZE_LARGE +SCREENSIZE_XLARGE = ACONFIGURATION_SCREENSIZE_XLARGE +SCREENLONG_ANY = ACONFIGURATION_SCREENLONG_ANY << SHIFT_SCREENLONG +SCREENLONG_NO = ACONFIGURATION_SCREENLONG_NO << SHIFT_SCREENLONG +SCREENLONG_YES = ACONFIGURATION_SCREENLONG_YES << SHIFT_SCREENLONG +DENSITY_DEFAULT = ACONFIGURATION_DENSITY_DEFAULT +DENSITY_LOW = ACONFIGURATION_DENSITY_LOW +DENSITY_MEDIUM = ACONFIGURATION_DENSITY_MEDIUM +DENSITY_TV = ACONFIGURATION_DENSITY_TV +DENSITY_HIGH = ACONFIGURATION_DENSITY_HIGH +DENSITY_XHIGH = ACONFIGURATION_DENSITY_XHIGH +DENSITY_XXHIGH = ACONFIGURATION_DENSITY_XXHIGH +DENSITY_XXXHIGH = ACONFIGURATION_DENSITY_XXXHIGH +DENSITY_ANY = ACONFIGURATION_DENSITY_ANY +DENSITY_NONE = ACONFIGURATION_DENSITY_NONE +TOUCHSCREEN_ANY = ACONFIGURATION_TOUCHSCREEN_ANY +TOUCHSCREEN_NOTOUCH = ACONFIGURATION_TOUCHSCREEN_NOTOUCH +TOUCHSCREEN_STYLUS = ACONFIGURATION_TOUCHSCREEN_STYLUS +TOUCHSCREEN_FINGER = ACONFIGURATION_TOUCHSCREEN_FINGER diff --git a/pyaxmlparser/core.py b/pyaxmlparser/core.py new file mode 100644 index 0000000..2fe69c8 --- /dev/null +++ b/pyaxmlparser/core.py @@ -0,0 +1,2208 @@ +from __future__ import division +from __future__ import print_function + +from builtins import str +from struct import unpack +from pyaxmlparser.utils import read, format_value, get_certificate_name_string + +from pyaxmlparser.arscparser import ARSCParser +from pyaxmlparser.axmlprinter import AXMLPrinter +from pyaxmlparser.axmlparser import AXMLParser +from pyaxmlparser.arscutil import ARSCResTableConfig +from pyaxmlparser.resources import public +import pyaxmlparser.constants as const + + +import io +from zlib import crc32 +import os +import re +import zipfile +import logging +import hashlib +import binascii + +import lxml.sax +from xml.dom.pulldom import SAX2DOM + +# Used for reading Certificates +from asn1crypto import cms, x509, keys + + +NS_ANDROID_URI = 'http://schemas.android.com/apk/res/android' +NS_ANDROID = '{{{}}}'.format(NS_ANDROID_URI) # Namespace as used by etree + +log = logging.getLogger("pyaxmlparser.core") + + +def parse_lxml_dom(tree): + handler = SAX2DOM() + lxml.sax.saxify(tree, handler) + return handler.document + + +class Error(Exception): + """Base class for exceptions in this module.""" + pass + + +class FileNotPresent(Error): + pass + + +class BrokenAPKError(Error): + pass + +def _dump_additional_attributes(additional_attributes): + """ try to parse additional attributes, but ends up to hexdump if the scheme is unknown """ + + attributes_raw = io.BytesIO(additional_attributes) + attributes_hex = binascii.hexlify(additional_attributes) + + if not len(additional_attributes): + return attributes_hex + + len_attribute, = unpack('<I', attributes_raw.read(4)) + if len_attribute != 8: + return attributes_hex + + attr_id, = unpack('<I', attributes_raw.read(4)) + if attr_id != APK._APK_SIG_ATTR_V2_STRIPPING_PROTECTION: + return attributes_hex + + scheme_id, = unpack('<I', attributes_raw.read(4)) + + return "stripping protection set, scheme %d" % scheme_id + + +def _dump_digests_or_signatures(digests_or_sigs): + + infos = "" + for i,dos in enumerate(digests_or_sigs): + + infos += "\n" + infos += " [%d]\n" % i + infos += " - Signature Id : %s\n" % APK._APK_SIG_ALGO_IDS.get(dos[0], hex(dos[0])) + infos += " - Digest: %s" % binascii.hexlify(dos[1]) + + return infos + + +class APKV2SignedData: + """ + This class holds all data associated with an APK V3 SigningBlock signed data. + source : https://source.android.com/security/apksigning/v2.html + """ + + def __init__(self): + self._bytes = None + self.digests = None + self.certificates = None + self.additional_attributes = None + + def __str__(self): + + certs_infos = "" + + for i,cert in enumerate(self.certificates): + x509_cert = x509.Certificate.load(cert) + + certs_infos += "\n" + certs_infos += " [%d]\n" % i + certs_infos += " - Issuer: %s\n" % get_certificate_name_string(x509_cert.issuer, short=True) + certs_infos += " - Subject: %s\n" % get_certificate_name_string(x509_cert.subject, short=True) + certs_infos += " - Serial Number: %s\n" % hex(x509_cert.serial_number) + certs_infos += " - Hash Algorithm: %s\n" % x509_cert.hash_algo + certs_infos += " - Signature Algorithm: %s\n" % x509_cert.signature_algo + certs_infos += " - Valid not before: %s\n" % x509_cert['tbs_certificate']['validity']['not_before'].native + certs_infos += " - Valid not after: %s" % x509_cert['tbs_certificate']['validity']['not_after'].native + + return "\n".join([ + 'additional_attributes : {}'.format(_dump_additional_attributes(self.additional_attributes)), + 'digests : {}'.format(_dump_digests_or_signatures(self.digests)), + 'certificates : {}'.format(certs_infos), + ]) + + +class APKV3SignedData(APKV2SignedData): + """ + This class holds all data associated with an APK V3 SigningBlock signed data. + source : https://source.android.com/security/apksigning/v3.html + """ + + def __init__(self): + super().__init__() + self.minSDK = None + self.maxSDK = None + + def __str__(self): + + base_str = super().__str__() + + # maxSDK is set to a negative value if there is no upper bound on the sdk targeted + max_sdk_str = "%d" % self.maxSDK + if self.maxSDK >= 0x7fffffff: + max_sdk_str = "0x%x" % self.maxSDK + + return "\n".join([ + 'signer minSDK : {:d}'.format(self.minSDK), + 'signer maxSDK : {:s}'.format(max_sdk_str), + base_str + ]) + + +class APKV2Signer: + """ + This class holds all data associated with an APK V2 SigningBlock signer. + source : https://source.android.com/security/apksigning/v2.html + """ + + def __init__(self): + self._bytes = None + self.signed_data = None + self.signatures = None + self.public_key = None + + def __str__(self): + return "\n".join([ + '{:s}'.format(str(self.signed_data)), + 'signatures : {}'.format(_dump_digests_or_signatures(self.signatures)), + 'public key : {}'.format(binascii.hexlify(self.public_key)), + ]) + + +class APKV3Signer(APKV2Signer): + """ + This class holds all data associated with an APK V3 SigningBlock signer. + source : https://source.android.com/security/apksigning/v3.html + """ + + def __init__(self): + super().__init__() + self.minSDK = None + self.maxSDK = None + + def __str__(self): + + base_str = super().__str__() + + # maxSDK is set to a negative value if there is no upper bound on the sdk targeted + max_sdk_str = "%d" % self.maxSDK + if self.maxSDK >= 0x7fffffff: + max_sdk_str = "0x%x" % self.maxSDK + + return "\n".join([ + 'signer minSDK : {:d}'.format(self.minSDK), + 'signer maxSDK : {:s}'.format(max_sdk_str), + base_str + ]) + + +class APK: + # Constants in ZipFile + _PK_END_OF_CENTRAL_DIR = b"\x50\x4b\x05\x06" + _PK_CENTRAL_DIR = b"\x50\x4b\x01\x02" + + # Constants in the APK Signature Block + _APK_SIG_MAGIC = b"APK Sig Block 42" + _APK_SIG_KEY_V2_SIGNATURE = 0x7109871a + _APK_SIG_KEY_V3_SIGNATURE = 0xf05368c0 + _APK_SIG_ATTR_V2_STRIPPING_PROTECTION = 0xbeeff00d + + _APK_SIG_ALGO_IDS = { + 0x0101 : "RSASSA-PSS with SHA2-256 digest, SHA2-256 MGF1, 32 bytes of salt, trailer: 0xbc", + 0x0102 : "RSASSA-PSS with SHA2-512 digest, SHA2-512 MGF1, 64 bytes of salt, trailer: 0xbc", + 0x0103 : "RSASSA-PKCS1-v1_5 with SHA2-256 digest.", # This is for build systems which require deterministic signatures. + 0x0104 : "RSASSA-PKCS1-v1_5 with SHA2-512 digest.", # This is for build systems which require deterministic signatures. + 0x0201 : "ECDSA with SHA2-256 digest", + 0x0202 : "ECDSA with SHA2-512 digest", + 0x0301 : "DSA with SHA2-256 digest", + } + + __no_magic = False + + def __init__(self, filename, raw=False, skip_analysis=False, testzip=False): + """ + This class can access to all elements in an APK file + + example:: + + APK("myfile.apk") + APK(read("myfile.apk"), raw=True) + + :param filename: specify the path of the file, or raw data + :param raw: specify if the filename is a path or raw data (optional) + :param magic_file: specify the magic file (not used anymore - legacy only) + :param skip_analysis: Skip the analysis, e.g. no manifest files are read. (default: False) + :param testzip: Test the APK for integrity, e.g. if the ZIP file is broken. Throw an exception on failure (default False) + + :type filename: string + :type raw: boolean + :type skip_analysis: boolean + :type testzip: boolean + + """ + self.filename = filename + + self.xml = {} + self.axml = {} + self.arsc = {} + + self.package = "" + self.androidversion = {} + self.permissions = [] + self.uses_permissions = [] + self.declared_permissions = {} + self.valid_apk = False + + self._is_signed_v2 = None + self._is_signed_v3 = None + self._v2_blocks = {} + self._v2_signing_data = None + self._v3_signing_data = None + + self._files = {} + self.files_crc32 = {} + + if raw is True: + self.__raw = bytearray(filename) + self._sha256 = hashlib.sha256(self.__raw).hexdigest() + # Set the filename to something sane + self.filename = "raw_apk_sha256:{}".format(self._sha256) + + self.zip = zipfile.ZipFile(io.BytesIO(self.__raw), mode="r") + else: + self.__raw = None + self.zip = zipfile.ZipFile(filename, mode="r") + + if testzip: + log.info("Testing zip file integrity, this might take a while...") + # Test the zipfile for integrity before continuing. + # This process might be slow, as the whole file is read. + # Therefore it is possible to enable it as a separate feature. + # + # A short benchmark showed, that testing the zip takes about 10 times longer! + # e.g. normal zip loading (skip_analysis=True) takes about 0.01s, where + # testzip takes 0.1s! + ret = self.zip.testzip() + if ret is not None: + # we could print the filename here, but there are zip which are so broken + # That the filename is either very very long or does not make any sense. + # Thus we do not do it, the user might find out by using other tools. + raise BrokenAPKError("The APK is probably broken: testzip returned an error.") + + if not skip_analysis: + self._apk_analysis() + + def _ns(self, name): + """ + return the name including the Android namespace + """ + return NS_ANDROID + name + + def _apk_analysis(self): + """ + Run analysis on the APK file. + + This method is usually called by __init__ except if skip_analysis is False. + It will then parse the AndroidManifest.xml and set all fields in the APK class which can be + extracted from the Manifest. + """ + i = "AndroidManifest.xml" + try: + manifest_data = self.zip.read(i) + except KeyError: + log.warning("Missing AndroidManifest.xml. Is this an APK file?") + else: + ap = AXMLPrinter(manifest_data) + + if not ap.is_valid(): + log.error("Error while parsing AndroidManifest.xml - is the file valid?") + return + + self.axml[i] = ap + self.xml[i] = self.axml[i].get_xml_obj() + + if self.axml[i].is_packed(): + log.warning("XML Seems to be packed, operations on the AndroidManifest.xml might fail.") + + if self.xml[i] is not None: + if self.xml[i].tag != "manifest": + log.error("AndroidManifest.xml does not start with a <manifest> tag! Is this a valid APK?") + return + + self.package = self.get_attribute_value("manifest", "package") + self.androidversion["Code"] = self.get_attribute_value("manifest", "versionCode") + self.androidversion["Name"] = self.get_attribute_value("manifest", "versionName") + permission = list(self.get_all_attribute_value("uses-permission", "name")) + self.permissions = list(set(self.permissions + permission)) + + for uses_permission in self.find_tags("uses-permission"): + self.uses_permissions.append([ + self.get_value_from_tag(uses_permission, "name"), + self._get_permission_maxsdk(uses_permission) + ]) + + # getting details of the declared permissions + for d_perm_item in self.find_tags('permission'): + d_perm_name = self._get_res_string_value( + str(self.get_value_from_tag(d_perm_item, "name"))) + d_perm_label = self._get_res_string_value( + str(self.get_value_from_tag(d_perm_item, "label"))) + d_perm_description = self._get_res_string_value( + str(self.get_value_from_tag(d_perm_item, "description"))) + d_perm_permissionGroup = self._get_res_string_value( + str(self.get_value_from_tag(d_perm_item, "permissionGroup"))) + d_perm_protectionLevel = self._get_res_string_value( + str(self.get_value_from_tag(d_perm_item, "protectionLevel"))) + + d_perm_details = { + "label": d_perm_label, + "description": d_perm_description, + "permissionGroup": d_perm_permissionGroup, + "protectionLevel": d_perm_protectionLevel, + } + self.declared_permissions[d_perm_name] = d_perm_details + + self.valid_apk = True + + def __getstate__(self): + """ + Function for pickling APK Objects. + + We remove the zip from the Object, as it is not pickable + And it does not make any sense to pickle it anyways. + + :return: the picklable APK Object without zip. + """ + # Upon pickling, we need to remove the ZipFile + x = self.__dict__ + x['axml'] = str(x['axml']) + x['xml'] = str(x['xml']) + del x['zip'] + + return x + + def __setstate__(self, state): + """ + Load a pickled APK Object and restore the state + + We load the zip file back by reading __raw from the Object. + + :param state: pickled state + """ + self.__dict__ = state + + self.zip = zipfile.ZipFile(io.BytesIO(self.__raw), mode="r") + + def _get_res_string_value(self, string): + if not string.startswith('@string/'): + return string + string_key = string[8:] + + res_parser = self.get_android_resources() + if not res_parser: + return '' + string_value = '' + for package_name in res_parser.get_packages_names(): + extracted_values = res_parser.get_string(package_name, string_key) + if extracted_values: + string_value = extracted_values[1] + break + return string_value + + def _get_permission_maxsdk(self, item): + maxSdkVersion = None + try: + maxSdkVersion = int(self.get_value_from_tag(item, "maxSdkVersion")) + except ValueError: + log.warning(self.get_max_sdk_version() + 'is not a valid value for <uses-permission> maxSdkVersion') + except TypeError: + pass + return maxSdkVersion + + def is_valid_APK(self): + """ + Return true if the APK is valid, false otherwise. + An APK is seen as valid, if the AndroidManifest.xml could be successful parsed. + This does not mean that the APK has a valid signature nor that the APK + can be installed on an Android system. + + :rtype: boolean + """ + return self.valid_apk + + def get_filename(self): + """ + Return the filename of the APK + + :rtype: :class:`str` + """ + return self.filename + + def get_app_name(self): + """ + Return the appname of the APK + + This name is read from the AndroidManifest.xml + using the application android:label. + If no label exists, the android:label of the main activity is used. + + If there is also no main activity label, an empty string is returned. + + :rtype: :class:`str` + """ + + app_name = self.get_attribute_value('application', 'label') + if app_name is None: + activities = self.get_main_activities() + main_activity_name = None + if len(activities) > 0: + main_activity_name = activities.pop() + app_name = self.get_attribute_value( + 'activity', 'label', name=main_activity_name + ) + + if app_name is None: + # No App name set + # TODO return packagename instead? + log.warning("It looks like that no app name is set for the main activity!") + return "" + + if app_name.startswith("@"): + res_parser = self.get_android_resources() + if not res_parser: + # TODO: What should be the correct return value here? + return app_name + + res_id, package = res_parser.parse_id(app_name) + + # If the package name is the same as the APK package, + # we should be able to resolve the ID. + if package and package != self.get_package(): + if package == 'android': + # TODO: we can not resolve this, as we lack framework-res.apk + # one exception would be when parsing framework-res.apk directly. + log.warning("Resource ID with android package name encountered! " + "Will not resolve, framework-res.apk would be required.") + return app_name + else: + # TODO should look this up, might be in the resources + log.warning("Resource ID with Package name '{}' encountered! Will not resolve".format(package)) + return app_name + + try: + app_name = res_parser.get_resolved_res_configs( + res_id, + ARSCResTableConfig.default_config())[0][1] + except Exception as e: + log.warning("Exception selecting app name: %s" % e) + return app_name + + def get_app_icon(self, max_dpi=65536): + """ + Return the first icon file name, which density is not greater than max_dpi, + unless exact icon resolution is set in the manifest, in which case + return the exact file. + + This information is read from the AndroidManifest.xml + + From https://developer.android.com/guide/practices/screens_support.html + and https://developer.android.com/ndk/reference/group___configuration.html + + * DEFAULT 0dpi + * ldpi (low) 120dpi + * mdpi (medium) 160dpi + * TV 213dpi + * hdpi (high) 240dpi + * xhdpi (extra-high) 320dpi + * xxhdpi (extra-extra-high) 480dpi + * xxxhdpi (extra-extra-extra-high) 640dpi + * anydpi 65534dpi (0xFFFE) + * nodpi 65535dpi (0xFFFF) + + There is a difference between nodpi and anydpi: + nodpi will be used if no other density is specified. Or the density does not match. + nodpi is the fallback for everything else. If there is a resource that matches the DPI, + this is used. + anydpi is also valid for all densities but in this case, anydpi will overrule all other files! + Therefore anydpi is usually used with vector graphics and with constraints on the API level. + For example adaptive icons are usually marked as anydpi. + + When it comes now to selecting an icon, there is the following flow: + 1) is there an anydpi icon? + 2) is there an icon for the dpi of the device? + 3) is there a nodpi icon? + 4) (only on very old devices) is there a icon with dpi 0 (the default) + + For more information read here: https://stackoverflow.com/a/34370735/446140 + + :rtype: :class:`str` + """ + main_activity_name = self.get_main_activity() + + app_icon = self.get_attribute_value( + 'activity', 'icon', name=main_activity_name) + + if not app_icon: + app_icon = self.get_attribute_value('application', 'icon') + + res_parser = self.get_android_resources() + if not res_parser: + # Can not do anything below this point to resolve... + return None + + if app_icon and app_icon.startswith("@android:"): + android_res_id = app_icon[9:] + # default icon: + # https://developer.android.com/reference/android/R.mipmap#sym_def_app_icon or + # https://developer.android.com/reference/android/R.drawable#sym_def_app_icon + if ( + public.SYSTEM_RESOURCES['mipmaps']['inverse'].get(int(android_res_id, 16)) == 'sym_def_app_icon' or + public.SYSTEM_RESOURCES['drawables']['inverse'].get(int(android_res_id, 16)) == 'sym_def_app_icon' + ): + app_icon = None + + if not app_icon: + res_id = res_parser.get_res_id_by_key(self.package, 'mipmap', 'ic_launcher') + if res_id: + app_icon = "@%x" % res_id + + if not app_icon: + res_id = res_parser.get_res_id_by_key(self.package, 'drawable', 'ic_launcher') + if res_id: + app_icon = "@%x" % res_id + + if not app_icon: + # If the icon can not be found, return now + return None + + if app_icon.startswith("@"): + res_id = int(app_icon[1:], 16) + candidates = res_parser.get_resolved_res_configs(res_id) + + app_icon = None + current_dpi = -1 + + try: + for config, file_name in candidates: + dpi = config.get_density() + if current_dpi < dpi <= max_dpi: + app_icon = file_name + current_dpi = dpi + except Exception as e: + log.warning("Exception selecting app icon: %s" % e) + + return app_icon + + def get_package(self): + """ + Return the name of the package + + This information is read from the AndroidManifest.xml + + :rtype: :class:`str` + """ + return self.package + + def get_androidversion_code(self): + """ + Return the android version code + + This information is read from the AndroidManifest.xml + + :rtype: :class:`str` + """ + return self.androidversion["Code"] + + def get_androidversion_name(self): + """ + Return the android version name + + This information is read from the AndroidManifest.xml + + :rtype: :class:`str` + """ + return self.androidversion["Name"] + + def get_files(self): + """ + Return the file names inside the APK. + + :rtype: a list of :class:`str` + """ + return self.zip.namelist() + + def _get_file_magic_name(self, buffer): + """ + Return the filetype guessed for a buffer + :param buffer: bytes + :return: str of filetype + """ + default = "Unknown" + ftype = None + + try: + # Magic is optional + import magic + except ImportError: + self.__no_magic = True + log.warning("No Magic library was found on your system.") + return default + except TypeError as e: + self.__no_magic = True + log.warning("It looks like you have the magic python package installed but not the magic library itself!") + log.warning("Error from magic library: %s", e) + log.warning("Please follow the installation instructions at https://github.com/ahupp/python-magic/#installation") + log.warning("You can also install the 'python-magic-bin' package on Windows and MacOS") + return default + + try: + # There are several implementations of magic, + # unfortunately all called magic + # We use this one: https://github.com/ahupp/python-magic/ + getattr(magic, "MagicException") + except AttributeError: + # Looks like no magic was installed + return default + + try: + ftype = magic.from_buffer(buffer[:1024]) + except magic.MagicError as e: + log.exception("Error getting the magic type!") + return default + + if not ftype: + return default + else: + return self._patch_magic(buffer, ftype) + + @property + def files(self): + """ + Returns a dictionary of filenames and detected magic type + + :return: dictionary of files and their mime type + """ + return self.get_files_types() + + def get_files_types(self): + """ + Return the files inside the APK with their associated types (by using python-magic) + + :rtype: a dictionnary + """ + if self._files == {}: + # Generate File Types / CRC List + for i in self.get_files(): + buffer = self.zip.read(i) + self.files_crc32[i] = crc32(buffer) + # FIXME why not use the crc from the zipfile? + # should be validated as well. + # crc = self.zip.getinfo(i).CRC + self._files[i] = self._get_file_magic_name(buffer) + + return self._files + + def _patch_magic(self, buffer, orig): + """ + Overwrite some probably wrong detections by mime libraries + + :param buffer: bytes of the file to detect + :param orig: guess by mime libary + :return: corrected guess + """ + if ("Zip" in orig) or ('(JAR)' in orig): + val = is_android_raw(buffer) + if val == "APK": + return "Android application package file" + + return orig + + def get_files_crc32(self): + """ + Calculates and returns a dictionary of filenames and CRC32 + + :return: dict of filename: CRC32 + """ + if self.files_crc32 == {}: + for i in self.get_files(): + buffer = self.zip.read(i) + self.files_crc32[i] = crc32(buffer) + + return self.files_crc32 + + def get_files_information(self): + """ + Return the files inside the APK with their associated types and crc32 + + :rtype: str, str, int + """ + for k in self.get_files(): + yield k, self.get_files_types()[k], self.get_files_crc32()[k] + + def get_raw(self): + """ + Return raw bytes of the APK + + :rtype: bytes + """ + if self.__raw: + return self.__raw + else: + self.__raw = bytearray(read(self.filename)) + return self.__raw + + def get_file(self, filename): + """ + Return the raw data of the specified filename + inside the APK + + :rtype: bytes + """ + try: + return self.zip.read(filename) + except KeyError: + raise FileNotPresent(filename) + + def get_dex(self): + """ + Return the raw data of the classes dex file + + This will give you the data of the file called `classes.dex` + inside the APK. If the APK has multiple DEX files, you need to use :func:`~APK.get_all_dex`. + + :rtype: bytes + """ + try: + return self.get_file("classes.dex") + except FileNotPresent: + return "" + + def get_dex_names(self): + """ + Return the names of all DEX files found in the APK. + This method only accounts for "offical" dex files, i.e. all files + in the root directory of the APK named classes.dex or classes[0-9]+.dex + + :rtype: a list of str + """ + dexre = re.compile("classes(\d*).dex") + return filter(lambda x: dexre.match(x), self.get_files()) + + def get_all_dex(self): + """ + Return the raw data of all classes dex files + + :rtype: a generator of bytes + """ + for dex_name in self.get_dex_names(): + yield self.get_file(dex_name) + + def is_multidex(self): + """ + Test if the APK has multiple DEX files + + :return: True if multiple dex found, otherwise False + """ + dexre = re.compile("^classes(\d+)?.dex$") + return len([instance for instance in self.get_files() if dexre.search(instance)]) > 1 + + @DeprecationWarning + def get_elements(self, tag_name, attribute, with_namespace=True): + """ + Deprecated: use `get_all_attribute_value()` instead + Return elements in xml files which match with the tag name and the specific attribute + :param tag_name: a string which specify the tag name + :param attribute: a string which specify the attribute + """ + for i in self.xml: + if self.xml[i] is None: + continue + for item in self.xml[i].findall('.//' + tag_name): + if with_namespace: + value = item.get(self._ns(attribute)) + else: + value = item.get(attribute) + # There might be an attribute without the namespace + if value: + yield self._format_value(value) + + def _format_value(self, value): + """ + Format a value with packagename, if not already set + + :param value: + :return: + """ + if len(value) > 0: + if value[0] == ".": + value = self.package + value + else: + v_dot = value.find(".") + if v_dot == 0: + value = self.package + "." + value + elif v_dot == -1: + value = self.package + "." + value + return value + + @DeprecationWarning + def get_element(self, tag_name, attribute, **attribute_filter): + """ + :Deprecated: use `get_attribute_value()` instead + Return element in xml files which match with the tag name and the specific attribute + :param tag_name: specify the tag name + :type tag_name: string + :param attribute: specify the attribute + :type attribute: string + :rtype: string + """ + for i in self.xml: + if self.xml[i] is None: + continue + tag = self.xml[i].findall('.//' + tag_name) + if len(tag) == 0: + return None + for item in tag: + skip_this_item = False + for attr, val in list(attribute_filter.items()): + attr_val = item.get(self._ns(attr)) + if attr_val != val: + skip_this_item = True + break + + if skip_this_item: + continue + + value = item.get(self._ns(attribute)) + + if value is not None: + return value + return None + + def get_all_attribute_value( + self, tag_name, attribute, format_value=True, **attribute_filter + ): + """ + Return all the attribute values in xml files which match with the tag name and the specific attribute + :param tag_name: specify the tag name + :type tag_name: string + :param attribute: specify the attribute + :type attribute: string + :param format_value: specify if the value needs to be formatted with packagename + :type format_value: boolean + """ + tags = self.find_tags(tag_name, **attribute_filter) + for tag in tags: + value = tag.get(attribute) or tag.get(self._ns(attribute)) + if value is not None: + if format_value: + yield self._format_value(value) + else: + yield value + + def get_attribute_value( + self, tag_name, attribute, format_value=False, **attribute_filter + ): + """ + Return the attribute value in xml files which matches the tag name and the specific attribute + :param tag_name: specify the tag name + :type tag_name: string + :param attribute: specify the attribute + :type attribute: string + :param format_value: specify if the value needs to be formatted with packagename + :type format_value: boolean + """ + + for value in self.get_all_attribute_value( + tag_name, attribute, format_value, **attribute_filter): + if value is not None: + return value + + def get_value_from_tag(self, tag, attribute): + """ + Return the value of the android prefixed attribute in a specific tag. + + This function will always try to get the attribute with a android: prefix first, + and will try to return the attribute without the prefix, if the attribute could not be found. + This is useful for some broken AndroidManifest.xml, where no android namespace is set, + but could also indicate malicious activity (i.e. wrongly repackaged files). + A warning is printed if the attribute is found without a namespace prefix. + + If you require to get the exact result you need to query the tag directly: + + example:: + >>> from lxml.etree import Element + >>> tag = Element('bar', nsmap={'android': 'http://schemas.android.com/apk/res/android'}) + >>> tag.set('{http://schemas.android.com/apk/res/android}foobar', 'barfoo') + >>> tag.set('name', 'baz') + # Assume that `a` is some APK object + >>> a.get_value_from_tag(tag, 'name') + 'baz' + >>> tag.get('name') + 'baz' + >>> tag.get('foobar') + None + >>> a.get_value_from_tag(tag, 'foobar') + 'barfoo' + + :param lxml.etree.Element tag: specify the tag element + :param str attribute: specify the attribute name + :returns: the attribute's value, or None if the attribute is not present + """ + + # TODO: figure out if both android:name and name tag exist which one to give preference: + # currently we give preference for the namespace one and fallback to the un-namespaced + value = tag.get(self._ns(attribute)) + if value is None: + value = tag.get(attribute) + + if value: + # If value is still None, the attribute could not be found, thus is not present + log.warning("Failed to get the attribute '{}' on tag '{}' with namespace. " + "But found the same attribute without namespace!".format(attribute, tag.tag)) + return value + + def find_tags(self, tag_name, **attribute_filter): + """ + Return a list of all the matched tags in all available xml + :param tag: specify the tag name + :type tag: string + """ + all_tags = [ + self.find_tags_from_xml( + i, tag_name, **attribute_filter + ) + for i in self.xml + ] + return [tag for tag_list in all_tags for tag in tag_list] + + def find_tags_from_xml( + self, xml_name, tag_name, **attribute_filter + ): + """ + Return a list of all the matched tags in a specific xml + :param xml_name: specify from which xml to pick the tag from + :type xml_name: string + :param tag_name: specify the tag name + :type tag_name: string + """ + xml = self.xml[xml_name] + if xml is None: + return [] + if xml.tag == tag_name: + if self.is_tag_matched( + xml.tag, **attribute_filter + ): + return [xml] + return [] + tags = xml.findall(".//" + tag_name) + return [ + tag for tag in tags if self.is_tag_matched( + tag, **attribute_filter + ) + ] + + def is_tag_matched(self, tag, **attribute_filter): + """ + Return true if the attributes matches in attribute filter. + + An attribute filter is a dictionary containing: {attribute_name: value}. + This function will return True if and only if all attributes have the same value. + This function allows to set the dictionary via kwargs, thus you can filter like this: + + example:: + a.is_tag_matched(tag, name="foobar", other="barfoo") + + This function uses a fallback for attribute searching. It will by default use + the namespace variant but fall back to the non-namespace variant. + Thus specifiying :code:`{"name": "foobar"}` will match on :code:`<bla name="foobar" \>` + as well as on :code:`<bla android:name="foobar" \>`. + + :param lxml.etree.Element tag: specify the tag element + :param attribute_filter: specify the attribute filter as dictionary + """ + if len(attribute_filter) <= 0: + return True + for attr, value in attribute_filter.items(): + _value = self.get_value_from_tag(tag, attr) + if _value != value: + return False + return True + + def get_main_activities(self): + """ + Return names of the main activities + + These values are read from the AndroidManifest.xml + + :rtype: a set of str + """ + x = set() + y = set() + + for i in self.xml: + if self.xml[i] is None: + continue + activities_and_aliases = self.xml[i].findall(".//activity") + \ + self.xml[i].findall(".//activity-alias") + + for item in activities_and_aliases: + # Some applications have more than one MAIN activity. + # For example: paid and free content + activityEnabled = item.get(self._ns("enabled")) + if activityEnabled == "false": + continue + + for sitem in item.findall(".//action"): + val = sitem.get(self._ns("name")) + if val == "android.intent.action.MAIN": + activity = item.get(self._ns("name")) + if activity is not None: + x.add(item.get(self._ns("name"))) + else: + log.warning('Main activity without name') + + for sitem in item.findall(".//category"): + val = sitem.get(self._ns("name")) + if val == "android.intent.category.LAUNCHER": + activity = item.get(self._ns("name")) + if activity is not None: + y.add(item.get(self._ns("name"))) + else: + log.warning('Launcher activity without name') + + return x.intersection(y) + + def get_main_activity(self): + """ + Return the name of the main activity + + This value is read from the AndroidManifest.xml + + :rtype: str + """ + activities = self.get_main_activities() + if len(activities) > 0: + return self._format_value(activities.pop()) + return None + + def get_activities(self): + """ + Return the android:name attribute of all activities + + :rtype: a list of str + """ + return list(self.get_all_attribute_value("activity", "name")) + + def get_services(self): + """ + Return the android:name attribute of all services + + :rtype: a list of str + """ + return list(self.get_all_attribute_value("service", "name")) + + def get_receivers(self): + """ + Return the android:name attribute of all receivers + + :rtype: a list of string + """ + return list(self.get_all_attribute_value("receiver", "name")) + + def get_providers(self): + """ + Return the android:name attribute of all providers + + :rtype: a list of string + """ + return list(self.get_all_attribute_value("provider", "name")) + + def get_intent_filters(self, itemtype, name): + """ + Find intent filters for a given item and name. + + Intent filter are attached to activities, services or receivers. + You can search for the intent filters of such items and get a dictionary of all + attached actions and intent categories. + + :param itemtype: the type of parent item to look for, e.g. `activity`, `service` or `receiver` + :param name: the `android:name` of the parent item, e.g. activity name + :return: a dictionary with the keys `action` and `category` containing the `android:name` of those items + """ + d = {"action": [], "category": []} + + for i in self.xml: + # TODO: this can probably be solved using a single xpath + for item in self.xml[i].findall(".//" + itemtype): + if self._format_value(item.get(self._ns("name"))) == name: + for sitem in item.findall(".//intent-filter"): + for ssitem in sitem.findall("action"): + if ssitem.get(self._ns("name")) not in d["action"]: + d["action"].append(ssitem.get(self._ns("name"))) + for ssitem in sitem.findall("category"): + if ssitem.get(self._ns("name")) not in d["category"]: + d["category"].append(ssitem.get(self._ns("name"))) + + if not d["action"]: + del d["action"] + + if not d["category"]: + del d["category"] + + return d + + def get_permissions(self): + """ + Return permissions names declared in the AndroidManifest.xml. + + It is possible that permissions are returned multiple times, + as this function does not filter the permissions, i.e. it shows you + exactly what was defined in the AndroidManifest.xml. + + Implied permissions, which are granted automatically, are not returned + here. Use :meth:`get_uses_implied_permission_list` if you need a list + of implied permissions. + + :returns: A list of permissions + :rtype: list + """ + return self.permissions + + def get_uses_implied_permission_list(self): + """ + Return all permissions implied by the target SDK or other permissions. + + :rtype: list of string + """ + target_sdk_version = self.get_effective_target_sdk_version() + + READ_CALL_LOG = 'android.permission.READ_CALL_LOG' + READ_CONTACTS = 'android.permission.READ_CONTACTS' + READ_EXTERNAL_STORAGE = 'android.permission.READ_EXTERNAL_STORAGE' + READ_PHONE_STATE = 'android.permission.READ_PHONE_STATE' + WRITE_CALL_LOG = 'android.permission.WRITE_CALL_LOG' + WRITE_CONTACTS = 'android.permission.WRITE_CONTACTS' + WRITE_EXTERNAL_STORAGE = 'android.permission.WRITE_EXTERNAL_STORAGE' + + implied = [] + + implied_WRITE_EXTERNAL_STORAGE = False + if target_sdk_version < 4: + if WRITE_EXTERNAL_STORAGE not in self.permissions: + implied.append([WRITE_EXTERNAL_STORAGE, None]) + implied_WRITE_EXTERNAL_STORAGE = True + if READ_PHONE_STATE not in self.permissions: + implied.append([READ_PHONE_STATE, None]) + + if (WRITE_EXTERNAL_STORAGE in self.permissions or implied_WRITE_EXTERNAL_STORAGE) \ + and READ_EXTERNAL_STORAGE not in self.permissions: + maxSdkVersion = None + for name, version in self.uses_permissions: + if name == WRITE_EXTERNAL_STORAGE: + maxSdkVersion = version + break + implied.append([READ_EXTERNAL_STORAGE, maxSdkVersion]) + + if target_sdk_version < 16: + if READ_CONTACTS in self.permissions \ + and READ_CALL_LOG not in self.permissions: + implied.append([READ_CALL_LOG, None]) + if WRITE_CONTACTS in self.permissions \ + and WRITE_CALL_LOG not in self.permissions: + implied.append([WRITE_CALL_LOG, None]) + + return implied + + def get_details_permissions(self): + """ + Return permissions with details + + :rtype: dict of {permission: [protectionLevel, label, description]} + """ + l = {} + + for i in self.permissions: + if i in self.permission_module: + x = self.permission_module[i] + l[i] = [x["protectionLevel"], x["label"], x["description"]] + else: + # FIXME: the permission might be signature, if it is defined by the app itself! + l[i] = ["normal", "Unknown permission from android reference", + "Unknown permission from android reference"] + return l + + @DeprecationWarning + def get_requested_permissions(self): + """ + Returns all requested permissions. + + It has the same result as :meth:`get_permissions` and might be removed in the future + + :rtype: list of str + """ + return self.get_permissions() + + def get_requested_aosp_permissions(self): + """ + Returns requested permissions declared within AOSP project. + + This includes several other permissions as well, which are in the platform apps. + + :rtype: list of str + """ + aosp_permissions = [] + all_permissions = self.get_permissions() + for perm in all_permissions: + if perm in list(self.permission_module.keys()): + aosp_permissions.append(perm) + return aosp_permissions + + def get_requested_aosp_permissions_details(self): + """ + Returns requested aosp permissions with details. + + :rtype: dictionary + """ + l = {} + for i in self.permissions: + try: + l[i] = self.permission_module[i] + except KeyError: + # if we have not found permission do nothing + continue + return l + + def get_requested_third_party_permissions(self): + """ + Returns list of requested permissions not declared within AOSP project. + + :rtype: list of strings + """ + third_party_permissions = [] + all_permissions = self.get_permissions() + for perm in all_permissions: + if perm not in list(self.permission_module.keys()): + third_party_permissions.append(perm) + return third_party_permissions + + def get_declared_permissions(self): + """ + Returns list of the declared permissions. + + :rtype: list of strings + """ + return list(self.declared_permissions.keys()) + + def get_declared_permissions_details(self): + """ + Returns declared permissions with the details. + + :rtype: dict + """ + return self.declared_permissions + + def get_max_sdk_version(self): + """ + Return the android:maxSdkVersion attribute + + :rtype: string + """ + return self.get_attribute_value("uses-sdk", "maxSdkVersion") + + def get_min_sdk_version(self): + """ + Return the android:minSdkVersion attribute + + :rtype: string + """ + return self.get_attribute_value("uses-sdk", "minSdkVersion") + + def get_target_sdk_version(self): + """ + Return the android:targetSdkVersion attribute + + :rtype: string + """ + return self.get_attribute_value("uses-sdk", "targetSdkVersion") + + def get_effective_target_sdk_version(self): + """ + Return the effective targetSdkVersion, always returns int > 0. + + If the targetSdkVersion is not set, it defaults to 1. This is + set based on defaults as defined in: + https://developer.android.com/guide/topics/manifest/uses-sdk-element.html + + :rtype: int + """ + target_sdk_version = self.get_target_sdk_version() + if not target_sdk_version: + target_sdk_version = self.get_min_sdk_version() + try: + return int(target_sdk_version) + except (ValueError, TypeError): + return 1 + + def get_libraries(self): + """ + Return the android:name attributes for libraries + + :rtype: list + """ + return list(self.get_all_attribute_value("uses-library", "name")) + + def get_features(self): + """ + Return a list of all android:names found for the tag uses-feature + in the AndroidManifest.xml + + :return: list + """ + return list(self.get_all_attribute_value("uses-feature", "name")) + + def is_wearable(self): + """ + Checks if this application is build for wearables by + checking if it uses the feature 'android.hardware.type.watch' + See: https://developer.android.com/training/wearables/apps/creating.html for more information. + + Not every app is setting this feature (not even the example Google provides), + so it might be wise to not 100% rely on this feature. + + :return: True if wearable, False otherwise + """ + return 'android.hardware.type.watch' in self.get_features() + + def is_leanback(self): + """ + Checks if this application is build for TV (Leanback support) + by checkin if it uses the feature 'android.software.leanback' + + :return: True if leanback feature is used, false otherwise + """ + return 'android.software.leanback' in self.get_features() + + def is_androidtv(self): + """ + Checks if this application does not require a touchscreen, + as this is the rule to get into the TV section of the Play Store + See: https://developer.android.com/training/tv/start/start.html for more information. + + :return: True if 'android.hardware.touchscreen' is not required, False otherwise + """ + return self.get_attribute_value( + 'uses-feature', 'name', required="false", + name="android.hardware.touchscreen" + ) == "android.hardware.touchscreen" + + def new_zip(self, filename, deleted_files=None, new_files={}): + """ + Create a new zip file + + :param filename: the output filename of the zip + :param deleted_files: a regex pattern to remove specific file + :param new_files: a dictionnary of new files + + :type filename: string + :type deleted_files: None or a string + :type new_files: a dictionnary (key:filename, value:content of the file) + """ + zout = zipfile.ZipFile(filename, 'w') + + for item in self.zip.infolist(): + # Block one: deleted_files, or deleted_files and new_files + if deleted_files is not None: + if re.match(deleted_files, item.filename) is None: + # if the regex of deleted_files doesn't match the filename + if new_files is not False: + if item.filename in new_files: + # and if the filename is in new_files + zout.writestr(item, new_files[item.filename]) + continue + # Otherwise, write the original file. + buffer = self.zip.read(item.filename) + zout.writestr(item, buffer) + # Block two: deleted_files is None, new_files is not empty + elif new_files is not False: + if item.filename in new_files: + zout.writestr(item, new_files[item.filename]) + else: + buffer = self.zip.read(item.filename) + zout.writestr(item, buffer) + # Block three: deleted_files is None, new_files is empty. + # Just write out the default zip + else: + buffer = self.zip.read(item.filename) + zout.writestr(item, buffer) + zout.close() + + def get_android_manifest_axml(self): + """ + Return the :class:`AXMLPrinter` object which corresponds to the AndroidManifest.xml file + + :rtype: :class:`~androguard.core.bytecodes.axml.AXMLPrinter` + """ + try: + return self.axml["AndroidManifest.xml"] + except KeyError: + return None + + def get_android_manifest_xml(self): + """ + Return the parsed xml object which corresponds to the AndroidManifest.xml file + + :rtype: :class:`~lxml.etree.Element` + """ + try: + return self.xml["AndroidManifest.xml"] + except KeyError: + return None + + def get_android_resources(self): + """ + Return the :class:`~androguard.core.bytecodes.axml.ARSCParser` + object which corresponds to the resources.arsc file + + :rtype: :class:`~androguard.core.bytecodes.axml.ARSCParser` + """ + try: + return self.arsc["resources.arsc"] + except KeyError: + if "resources.arsc" not in self.zip.namelist(): + # There is a rare case, that no resource file is supplied. + # Maybe it was added manually, thus we check here + return None + self.arsc["resources.arsc"] = ARSCParser(self.zip.read("resources.arsc")) + return self.arsc["resources.arsc"] + + def get_certificate_der(self, filename): + """ + Return the DER coded X.509 certificate from the signature file. + + :param filename: Signature filename in APK + :returns: DER coded X.509 certificate as binary + """ + pkcs7message = self.get_file(filename) + + pkcs7obj = cms.ContentInfo.load(pkcs7message) + cert = pkcs7obj['content']['certificates'][0].chosen.dump() + return cert + + def get_certificate(self, filename): + """ + Return a X.509 certificate object by giving the name in the apk file + + :param filename: filename of the signature file in the APK + :returns: a :class:`Certificate` certificate + """ + cert = self.get_certificate_der(filename) + certificate = x509.Certificate.load(cert) + + return certificate + + + def is_signed(self): + """ + Returns true if any of v1, v2, or v3 signatures were found. + """ + return self.is_signed_v1() or self.is_signed_v2() or self.is_signed_v3() + + def is_signed_v1(self): + """ + Returns true if a v1 / JAR signature was found. + + Returning `True` does not mean that the file is properly signed! + It just says that there is a signature file which needs to be validated. + """ + return self.get_signature_name() is not None + + def is_signed_v2(self): + """ + Returns true of a v2 / APK signature was found. + + Returning `True` does not mean that the file is properly signed! + It just says that there is a signature file which needs to be validated. + """ + if self._is_signed_v2 is None: + self.parse_v2_v3_signature() + + return self._is_signed_v2 + + def is_signed_v3(self): + """ + Returns true of a v3 / APK signature was found. + + Returning `True` does not mean that the file is properly signed! + It just says that there is a signature file which needs to be validated. + """ + if self._is_signed_v3 is None: + self.parse_v2_v3_signature() + + return self._is_signed_v3 + + def read_uint32_le(self, io_stream): + value, = unpack('<I', io_stream.read(4)) + return value + + def parse_signatures_or_digests(self, digest_bytes): + """ Parse digests """ + + if not len(digest_bytes): + return [] + + digests = [] + block = io.BytesIO(digest_bytes) + + data_len = self.read_uint32_le(block) + while block.tell() < data_len: + + algorithm_id = self.read_uint32_le(block) + digest_len = self.read_uint32_le(block) + digest = block.read(digest_len) + + digests.append((algorithm_id, digest)) + + return digests + + def parse_v2_v3_signature(self): + # Need to find an v2 Block in the APK. + # The Google Docs gives you the following rule: + # * go to the end of the ZIP File + # * search for the End of Central directory + # * then jump to the beginning of the central directory + # * Read now the magic of the signing block + # * before the magic there is the size_of_block, so we can jump to + # the beginning. + # * There should be again the size_of_block + # * Now we can read the Key-Values + # * IDs with an unknown value should be ignored. + f = io.BytesIO(self.get_raw()) + + size_central = None + offset_central = None + + # Go to the end + f.seek(-1, io.SEEK_END) + # we know the minimal length for the central dir is 16+4+2 + f.seek(-20, io.SEEK_CUR) + + while f.tell() > 0: + f.seek(-1, io.SEEK_CUR) + r, = unpack('<4s', f.read(4)) + if r == self._PK_END_OF_CENTRAL_DIR: + # Read central dir + this_disk, disk_central, this_entries, total_entries, \ + size_central, offset_central = unpack('<HHHHII', f.read(16)) + # TODO according to the standard we need to check if the + # end of central directory is the last item in the zip file + # TODO We also need to check if the central dir is exactly + # before the end of central dir... + + # These things should not happen for APKs + if this_disk != 0: + raise BrokenAPKError("Not sure what to do with multi disk ZIP!") + if disk_central != 0: + raise BrokenAPKError("Not sure what to do with multi disk ZIP!") + break + f.seek(-4, io.SEEK_CUR) + + if not offset_central: + return + + f.seek(offset_central) + r, = unpack('<4s', f.read(4)) + f.seek(-4, io.SEEK_CUR) + if r != self._PK_CENTRAL_DIR: + raise BrokenAPKError("No Central Dir at specified offset") + + # Go back and check if we have a magic + end_offset = f.tell() + f.seek(-24, io.SEEK_CUR) + size_of_block, magic = unpack('<Q16s', f.read(24)) + + self._is_signed_v2 = False + self._is_signed_v3 = False + + if magic != self._APK_SIG_MAGIC: + return + + # go back size_of_blocks + 8 and read size_of_block again + f.seek(-(size_of_block + 8), io.SEEK_CUR) + size_of_block_start, = unpack("<Q", f.read(8)) + if size_of_block_start != size_of_block: + raise BrokenAPKError("Sizes at beginning and and does not match!") + + # Store all blocks + while f.tell() < end_offset - 24: + size, key = unpack('<QI', f.read(12)) + value = f.read(size - 4) + self._v2_blocks[key] = value + + # Test if a signature is found + if self._APK_SIG_KEY_V2_SIGNATURE in self._v2_blocks: + self._is_signed_v2 = True + + if self._APK_SIG_KEY_V3_SIGNATURE in self._v2_blocks: + self._is_signed_v3 = True + + + def parse_v3_signing_block(self): + """ + Parse the V2 signing block and extract all features + """ + + self._v3_signing_data = [] + + # calling is_signed_v3 should also load the signature, if any + if not self.is_signed_v3(): + return + + block_bytes = self._v2_blocks[self._APK_SIG_KEY_V3_SIGNATURE] + block = io.BytesIO(block_bytes) + view = block.getvalue() + + # V3 signature Block data format: + # + # * signer: + # * signed data: + # * digests: + # * signature algorithm ID (uint32) + # * digest (length-prefixed) + # * certificates + # * minSDK + # * maxSDK + # * additional attributes + # * minSDK + # * maxSDK + # * signatures + # * publickey + size_sequence = self.read_uint32_le(block) + if size_sequence + 4 != len(block_bytes): + raise BrokenAPKError("size of sequence and blocksize does not match") + + while block.tell() < len(block_bytes): + off_signer = block.tell() + size_signer = self.read_uint32_le(block) + + # read whole signed data, since we might to parse + # content within the signed data, and mess up offset + len_signed_data = self.read_uint32_le(block) + signed_data_bytes = block.read(len_signed_data) + signed_data = io.BytesIO(signed_data_bytes) + + # Digests + len_digests = self.read_uint32_le(signed_data) + raw_digests = signed_data.read(len_digests) + digests = self.parse_signatures_or_digests(raw_digests) + + + # Certs + certs = [] + len_certs = self.read_uint32_le(signed_data) + start_certs = signed_data.tell() + while signed_data.tell() < start_certs + len_certs: + + len_cert = self.read_uint32_le(signed_data) + cert = signed_data.read(len_cert) + certs.append(cert) + + # versions + signed_data_min_sdk = self.read_uint32_le(signed_data) + signed_data_max_sdk = self.read_uint32_le(signed_data) + + # Addional attributes + len_attr = self.read_uint32_le(signed_data) + attr = signed_data.read(len_attr) + + signed_data_object = APKV3SignedData() + signed_data_object._bytes = signed_data_bytes + signed_data_object.digests = digests + signed_data_object.certificates = certs + signed_data_object.additional_attributes = attr + signed_data_object.minSDK = signed_data_min_sdk + signed_data_object.maxSDK = signed_data_max_sdk + + # versions (should be the same as signed data's versions) + signer_min_sdk = self.read_uint32_le(block) + signer_max_sdk = self.read_uint32_le(block) + + # Signatures + len_sigs = self.read_uint32_le(block) + raw_sigs = block.read(len_sigs) + sigs = self.parse_signatures_or_digests(raw_sigs) + + # PublicKey + len_publickey = self.read_uint32_le(block) + publickey = block.read(len_publickey) + + signer = APKV3Signer() + signer._bytes = view[off_signer:off_signer+size_signer] + signer.signed_data = signed_data_object + signer.signatures = sigs + signer.public_key = publickey + signer.minSDK = signer_min_sdk + signer.maxSDK = signer_max_sdk + + self._v3_signing_data.append(signer) + + def parse_v2_signing_block(self): + """ + Parse the V2 signing block and extract all features + """ + + self._v2_signing_data = [] + + # calling is_signed_v2 should also load the signature + if not self.is_signed_v2(): + return + + block_bytes = self._v2_blocks[self._APK_SIG_KEY_V2_SIGNATURE] + block = io.BytesIO(block_bytes) + view = block.getvalue() + + # V2 signature Block data format: + # + # * signer: + # * signed data: + # * digests: + # * signature algorithm ID (uint32) + # * digest (length-prefixed) + # * certificates + # * additional attributes + # * signatures + # * publickey + + size_sequence = self.read_uint32_le(block) + if size_sequence + 4 != len(block_bytes): + raise BrokenAPKError("size of sequence and blocksize does not match") + + while block.tell() < len(block_bytes): + off_signer = block.tell() + size_signer = self.read_uint32_le(block) + + # read whole signed data, since we might to parse + # content within the signed data, and mess up offset + len_signed_data = self.read_uint32_le(block) + signed_data_bytes = block.read(len_signed_data) + signed_data = io.BytesIO(signed_data_bytes) + + # Digests + len_digests = self.read_uint32_le(signed_data) + raw_digests = signed_data.read(len_digests) + digests = self.parse_signatures_or_digests(raw_digests) + + # Certs + certs = [] + len_certs = self.read_uint32_le(signed_data) + start_certs = signed_data.tell() + while signed_data.tell() < start_certs + len_certs: + len_cert = self.read_uint32_le(signed_data) + cert = signed_data.read(len_cert) + certs.append(cert) + + # Additional attributes + len_attr = self.read_uint32_le(signed_data) + attributes = signed_data.read(len_attr) + + signed_data_object = APKV2SignedData() + signed_data_object._bytes = signed_data_bytes + signed_data_object.digests = digests + signed_data_object.certificates = certs + signed_data_object.additional_attributes = attributes + + # Signatures + len_sigs = self.read_uint32_le(block) + raw_sigs = block.read(len_sigs) + sigs = self.parse_signatures_or_digests(raw_sigs) + + # PublicKey + len_publickey = self.read_uint32_le(block) + publickey = block.read(len_publickey) + + signer = APKV2Signer() + signer._bytes = view[off_signer:off_signer+size_signer] + signer.signed_data = signed_data_object + signer.signatures = sigs + signer.public_key = publickey + + self._v2_signing_data.append(signer) + + def get_public_keys_der_v3(self): + """ + Return a list of DER coded X.509 public keys from the v3 signature block + """ + + if self._v3_signing_data is None: + self.parse_v3_signing_block() + + public_keys = [] + + for signer in self._v3_signing_data: + public_keys.append(signer.public_key) + + return public_keys + + def get_public_keys_der_v2(self): + """ + Return a list of DER coded X.509 public keys from the v3 signature block + """ + + if self._v2_signing_data is None: + self.parse_v2_signing_block() + + public_keys = [] + + for signer in self._v2_signing_data: + public_keys.append(signer.public_key) + + return public_keys + + def get_certificates_der_v3(self): + """ + Return a list of DER coded X.509 certificates from the v3 signature block + """ + + if self._v3_signing_data is None: + self.parse_v3_signing_block() + + certs = [] + for signed_data in [signer.signed_data for signer in self._v3_signing_data]: + for cert in signed_data.certificates: + certs.append(cert) + + return certs + + def get_certificates_der_v2(self): + """ + Return a list of DER coded X.509 certificates from the v3 signature block + """ + + if self._v2_signing_data is None: + self.parse_v2_signing_block() + + certs = [] + for signed_data in [signer.signed_data for signer in self._v2_signing_data]: + for cert in signed_data.certificates: + certs.append(cert) + + return certs + + def get_public_keys_v3(self): + """ + Return a list of :class:`asn1crypto.keys.PublicKeyInfo` which are found + in the v3 signing block. + """ + return [ keys.PublicKeyInfo.load(pkey) for pkey in self.get_public_keys_der_v3()] + + def get_public_keys_v2(self): + """ + Return a list of :class:`asn1crypto.keys.PublicKeyInfo` which are found + in the v2 signing block. + """ + return [ keys.PublicKeyInfo.load(pkey) for pkey in self.get_public_keys_der_v2()] + + def get_certificates_v3(self): + """ + Return a list of :class:`asn1crypto.x509.Certificate` which are found + in the v3 signing block. + Note that we simply extract all certificates regardless of the signer. + Therefore this is just a list of all certificates found in all signers. + """ + return [ x509.Certificate.load(cert) for cert in self.get_certificates_der_v3()] + + def get_certificates_v2(self): + """ + Return a list of :class:`asn1crypto.x509.Certificate` which are found + in the v2 signing block. + Note that we simply extract all certificates regardless of the signer. + Therefore this is just a list of all certificates found in all signers. + """ + return [ x509.Certificate.load(cert) for cert in self.get_certificates_der_v2()] + + def get_certificates_v1(self): + """ + Return a list of :class:`asn1crypto.x509.Certificate` which are found + in the META-INF folder (v1 signing). + Note that we simply extract all certificates regardless of the signer. + Therefore this is just a list of all certificates found in all signers. + """ + certs = [] + for x in self.get_signature_names(): + certs.append(x509.Certificate.load(self.get_certificate_der(x))) + + return certs + + def get_certificates(self): + """ + Return a list of unique :class:`asn1crypto.x509.Certificate` which are found + in v1, v2 and v3 signing + Note that we simply extract all certificates regardless of the signer. + Therefore this is just a list of all certificates found in all signers. + """ + fps = [] + certs = [] + for x in self.get_certificates_v1() + self.get_certificates_v2() + self.get_certificates_v3(): + if x.sha256 not in fps: + fps.append(x.sha256) + certs.append(x) + return certs + + def get_signature_name(self): + """ + Return the name of the first signature file found. + """ + if self.get_signature_names(): + return self.get_signature_names()[0] + else: + # Unsigned APK + return None + + def get_signature_names(self): + """ + Return a list of the signature file names (v1 Signature / JAR + Signature) + + :rtype: List of filenames matching a Signature + """ + signature_expr = re.compile(r"^(META-INF/)(.*)(\.RSA|\.EC|\.DSA)$") + signatures = [] + + for i in self.get_files(): + if signature_expr.search(i): + if "{}.SF".format(i.rsplit(".", 1)[0]) in self.get_files(): + signatures.append(i) + else: + log.warning("v1 signature file {} missing .SF file - Partial signature!".format(i)) + + return signatures + + def get_signature(self): + """ + Return the data of the first signature file found (v1 Signature / JAR + Signature) + + :rtype: First signature name or None if not signed + """ + if self.get_signatures(): + return self.get_signatures()[0] + else: + return None + + def get_signatures(self): + """ + Return a list of the data of the signature files. + Only v1 / JAR Signing. + + :rtype: list of bytes + """ + signature_expr = re.compile(r"^(META-INF/)(.*)(\.RSA|\.EC|\.DSA)$") + signature_datas = [] + + for i in self.get_files(): + if signature_expr.search(i): + signature_datas.append(self.get_file(i)) + + return signature_datas + + + def show(self): + self.get_files_types() + + print("FILES: ") + for i in self.get_files(): + try: + print("\t", i, self._files[i], "%x" % self.files_crc32[i]) + except KeyError: + print("\t", i, "%x" % self.files_crc32[i]) + + print("DECLARED PERMISSIONS:") + declared_permissions = self.get_declared_permissions() + for i in declared_permissions: + print("\t", i) + + print("REQUESTED PERMISSIONS:") + requested_permissions = self.get_permissions() + for i in requested_permissions: + print("\t", i) + + print("MAIN ACTIVITY: ", self.get_main_activity()) + + print("ACTIVITIES: ") + activities = self.get_activities() + for i in activities: + filters = self.get_intent_filters("activity", i) + print("\t", i, filters or "") + + print("SERVICES: ") + services = self.get_services() + for i in services: + filters = self.get_intent_filters("service", i) + print("\t", i, filters or "") + + print("RECEIVERS: ") + receivers = self.get_receivers() + for i in receivers: + filters = self.get_intent_filters("receiver", i) + print("\t", i, filters or "") + + print("PROVIDERS: ", self.get_providers()) + + @property + def application(self): + return self.get_app_name() + + @property + def packagename(self): + return self.get_package() + + @property + def version_name(self): + return self.get_androidversion_name() + + @property + def version_code(self): + return self.get_androidversion_code() + + @property + def icon_info(self): + return self.get_app_icon() + + @property + def icon_data(self): + app_icon_file = self.get_app_icon() + if not app_icon_file: + return None + + app_icon_data = None + try: + app_icon_data = self.get_file(app_icon_file) + except FileNotPresent: + try: + app_icon_data = self.get_file(app_icon_file.encode().decode('cp437')) + except FileNotPresent: + return None + return app_icon_data + + @property + def signed(self): + return self.is_signed() + + @property + def signed_v1(self): + return self.is_signed_v1() + + @property + def signed_v2(self): + return self.is_signed_v2() + + @property + def signed_v3(self): + return self.is_signed_v3() + + +def ensure_final_value(packageName, arsc, value): + """Ensure incoming value is always the value, not the resid + + androguard will sometimes return the Android "resId" aka + Resource ID instead of the actual value. This checks whether + the value is actually a resId, then performs the Android + Resource lookup as needed. + + """ + if value: + returnValue = value + if value[0] == '@': + try: # can be a literal value or a resId + res_id = int('0x' + value[1:], 16) + res_id = arsc.get_id(packageName, res_id)[1] + returnValue = arsc.get_string(packageName, res_id)[1] + except (ValueError, TypeError): + pass + return returnValue + return '' + + +def get_apkid(apkfile): + """Read (appid, versionCode, versionName) from an APK + + This first tries to do quick binary XML parsing to just get the + values that are needed. It will fallback to full androguard + parsing, which is slow, if it can't find the versionName value or + versionName is set to a Android String Resource (e.g. an integer + hex value that starts with @). + + """ + if not os.path.exists(apkfile): + log.error("'{apkfile}' does not exist!".format(apkfile=apkfile)) + + appid = None + versionCode = None + versionName = None + with zipfile.ZipFile(apkfile) as apk: + with apk.open('AndroidManifest.xml') as manifest: + axml = AXMLParser(manifest.read()) + count = 0 + while axml.is_valid(): + _type = next(axml) + count += 1 + if _type == const.START_TAG: + for i in range(0, axml.getAttributeCount()): + name = axml.getAttributeName(i) + _type = axml.getAttributeValueType(i) + _data = axml.getAttributeValueData(i) + value = format_value(_type, _data, lambda _: axml.getAttributeValue(i)) + if appid is None and name == 'package': + appid = value + elif versionCode is None and name == 'versionCode': + if value.startswith('0x'): + versionCode = str(int(value, 16)) + else: + versionCode = value + elif versionName is None and name == 'versionName': + versionName = value + + if axml.name == 'manifest': + break + elif _type == const.END_TAG or _type == const.TEXT or _type == const.END_DOCUMENT: + raise RuntimeError( + '{path}: <manifest> must be the first element in ' + 'AndroidManifest.xml'.format(path=apkfile) + ) + + if not versionName or versionName[0] == '@': + a = APK(apkfile) + versionName = ensure_final_value(a.package, a.get_android_resources(), a.get_androidversion_name()) + if not versionName: + versionName = '' # versionName is expected to always be a str + + return appid, versionCode, versionName.strip('\0') + + +def is_android_raw(raw): + """ + Returns a string that describes the type of file, for common Android + specific formats + """ + val = None + + # We do not check for META-INF/MANIFEST.MF, + # as you also want to analyze unsigned APKs... + # AndroidManifest.xml should be in every APK. + # classes.dex and resources.arsc are not required! + # if raw[0:2] == b"PK" and b'META-INF/MANIFEST.MF' in raw: + # TODO this check might be still invalid. A ZIP file with stored APK inside would match as well. + # probably it would be better to rewrite this and add more sanity checks. + if raw[0:2] == b"PK" and b'AndroidManifest.xml' in raw: + val = "APK" + elif raw[0:3] == b"dex": + val = "DEX" + elif raw[0:3] == b"dey": + val = "DEY" + elif raw[0:4] == b"\x03\x00\x08\x00" or raw[0:4] == b"\x00\x00\x08\x00": + val = "AXML" + elif raw[0:4] == b"\x02\x00\x0C\x00": + val = "ARSC" + + return val diff --git a/pyaxmlparser/resources/__init__.py b/pyaxmlparser/resources/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/pyaxmlparser/resources/__init__.py diff --git a/pyaxmlparser/resources/public.json b/pyaxmlparser/resources/public.json new file mode 100644 index 0000000..9fb8b90 --- /dev/null +++ b/pyaxmlparser/resources/public.json @@ -0,0 +1,2510 @@ +{ + "attr": { + "theme": 16842752, + "label": 16842753, + "icon": 16842754, + "name": 16842755, + "manageSpaceActivity": 16842756, + "allowClearUserData": 16842757, + "permission": 16842758, + "readPermission": 16842759, + "writePermission": 16842760, + "protectionLevel": 16842761, + "permissionGroup": 16842762, + "sharedUserId": 16842763, + "hasCode": 16842764, + "persistent": 16842765, + "enabled": 16842766, + "debuggable": 16842767, + "exported": 16842768, + "process": 16842769, + "taskAffinity": 16842770, + "multiprocess": 16842771, + "finishOnTaskLaunch": 16842772, + "clearTaskOnLaunch": 16842773, + "stateNotNeeded": 16842774, + "excludeFromRecents": 16842775, + "authorities": 16842776, + "syncable": 16842777, + "initOrder": 16842778, + "grantUriPermissions": 16842779, + "priority": 16842780, + "launchMode": 16842781, + "screenOrientation": 16842782, + "configChanges": 16842783, + "description": 16842784, + "targetPackage": 16842785, + "handleProfiling": 16842786, + "functionalTest": 16842787, + "value": 16842788, + "resource": 16842789, + "mimeType": 16842790, + "scheme": 16842791, + "host": 16842792, + "port": 16842793, + "path": 16842794, + "pathPrefix": 16842795, + "pathPattern": 16842796, + "action": 16842797, + "data": 16842798, + "targetClass": 16842799, + "colorForeground": 16842800, + "colorBackground": 16842801, + "backgroundDimAmount": 16842802, + "disabledAlpha": 16842803, + "textAppearance": 16842804, + "textAppearanceInverse": 16842805, + "textColorPrimary": 16842806, + "textColorPrimaryDisableOnly": 16842807, + "textColorSecondary": 16842808, + "textColorPrimaryInverse": 16842809, + "textColorSecondaryInverse": 16842810, + "textColorPrimaryNoDisable": 16842811, + "textColorSecondaryNoDisable": 16842812, + "textColorPrimaryInverseNoDisable": 16842813, + "textColorSecondaryInverseNoDisable": 16842814, + "textColorHintInverse": 16842815, + "textAppearanceLarge": 16842816, + "textAppearanceMedium": 16842817, + "textAppearanceSmall": 16842818, + "textAppearanceLargeInverse": 16842819, + "textAppearanceMediumInverse": 16842820, + "textAppearanceSmallInverse": 16842821, + "textCheckMark": 16842822, + "textCheckMarkInverse": 16842823, + "buttonStyle": 16842824, + "buttonStyleSmall": 16842825, + "buttonStyleInset": 16842826, + "buttonStyleToggle": 16842827, + "galleryItemBackground": 16842828, + "listPreferredItemHeight": 16842829, + "expandableListPreferredItemPaddingLeft": 16842830, + "expandableListPreferredChildPaddingLeft": 16842831, + "expandableListPreferredItemIndicatorLeft": 16842832, + "expandableListPreferredItemIndicatorRight": 16842833, + "expandableListPreferredChildIndicatorLeft": 16842834, + "expandableListPreferredChildIndicatorRight": 16842835, + "windowBackground": 16842836, + "windowFrame": 16842837, + "windowNoTitle": 16842838, + "windowIsFloating": 16842839, + "windowIsTranslucent": 16842840, + "windowContentOverlay": 16842841, + "windowTitleSize": 16842842, + "windowTitleStyle": 16842843, + "windowTitleBackgroundStyle": 16842844, + "alertDialogStyle": 16842845, + "panelBackground": 16842846, + "panelFullBackground": 16842847, + "panelColorForeground": 16842848, + "panelColorBackground": 16842849, + "panelTextAppearance": 16842850, + "scrollbarSize": 16842851, + "scrollbarThumbHorizontal": 16842852, + "scrollbarThumbVertical": 16842853, + "scrollbarTrackHorizontal": 16842854, + "scrollbarTrackVertical": 16842855, + "scrollbarAlwaysDrawHorizontalTrack": 16842856, + "scrollbarAlwaysDrawVerticalTrack": 16842857, + "absListViewStyle": 16842858, + "autoCompleteTextViewStyle": 16842859, + "checkboxStyle": 16842860, + "dropDownListViewStyle": 16842861, + "editTextStyle": 16842862, + "expandableListViewStyle": 16842863, + "galleryStyle": 16842864, + "gridViewStyle": 16842865, + "imageButtonStyle": 16842866, + "imageWellStyle": 16842867, + "listViewStyle": 16842868, + "listViewWhiteStyle": 16842869, + "popupWindowStyle": 16842870, + "progressBarStyle": 16842871, + "progressBarStyleHorizontal": 16842872, + "progressBarStyleSmall": 16842873, + "progressBarStyleLarge": 16842874, + "seekBarStyle": 16842875, + "ratingBarStyle": 16842876, + "ratingBarStyleSmall": 16842877, + "radioButtonStyle": 16842878, + "scrollbarStyle": 16842879, + "scrollViewStyle": 16842880, + "spinnerStyle": 16842881, + "starStyle": 16842882, + "tabWidgetStyle": 16842883, + "textViewStyle": 16842884, + "webViewStyle": 16842885, + "dropDownItemStyle": 16842886, + "spinnerDropDownItemStyle": 16842887, + "dropDownHintAppearance": 16842888, + "spinnerItemStyle": 16842889, + "mapViewStyle": 16842890, + "preferenceScreenStyle": 16842891, + "preferenceCategoryStyle": 16842892, + "preferenceInformationStyle": 16842893, + "preferenceStyle": 16842894, + "checkBoxPreferenceStyle": 16842895, + "yesNoPreferenceStyle": 16842896, + "dialogPreferenceStyle": 16842897, + "editTextPreferenceStyle": 16842898, + "ringtonePreferenceStyle": 16842899, + "preferenceLayoutChild": 16842900, + "textSize": 16842901, + "typeface": 16842902, + "textStyle": 16842903, + "textColor": 16842904, + "textColorHighlight": 16842905, + "textColorHint": 16842906, + "textColorLink": 16842907, + "state_focused": 16842908, + "state_window_focused": 16842909, + "state_enabled": 16842910, + "state_checkable": 16842911, + "state_checked": 16842912, + "state_selected": 16842913, + "state_active": 16842914, + "state_single": 16842915, + "state_first": 16842916, + "state_middle": 16842917, + "state_last": 16842918, + "state_pressed": 16842919, + "state_expanded": 16842920, + "state_empty": 16842921, + "state_above_anchor": 16842922, + "ellipsize": 16842923, + "x": 16842924, + "y": 16842925, + "windowAnimationStyle": 16842926, + "gravity": 16842927, + "autoLink": 16842928, + "linksClickable": 16842929, + "entries": 16842930, + "layout_gravity": 16842931, + "windowEnterAnimation": 16842932, + "windowExitAnimation": 16842933, + "windowShowAnimation": 16842934, + "windowHideAnimation": 16842935, + "activityOpenEnterAnimation": 16842936, + "activityOpenExitAnimation": 16842937, + "activityCloseEnterAnimation": 16842938, + "activityCloseExitAnimation": 16842939, + "taskOpenEnterAnimation": 16842940, + "taskOpenExitAnimation": 16842941, + "taskCloseEnterAnimation": 16842942, + "taskCloseExitAnimation": 16842943, + "taskToFrontEnterAnimation": 16842944, + "taskToFrontExitAnimation": 16842945, + "taskToBackEnterAnimation": 16842946, + "taskToBackExitAnimation": 16842947, + "orientation": 16842948, + "keycode": 16842949, + "fullDark": 16842950, + "topDark": 16842951, + "centerDark": 16842952, + "bottomDark": 16842953, + "fullBright": 16842954, + "topBright": 16842955, + "centerBright": 16842956, + "bottomBright": 16842957, + "bottomMedium": 16842958, + "centerMedium": 16842959, + "id": 16842960, + "tag": 16842961, + "scrollX": 16842962, + "scrollY": 16842963, + "background": 16842964, + "padding": 16842965, + "paddingLeft": 16842966, + "paddingTop": 16842967, + "paddingRight": 16842968, + "paddingBottom": 16842969, + "focusable": 16842970, + "focusableInTouchMode": 16842971, + "visibility": 16842972, + "fitsSystemWindows": 16842973, + "scrollbars": 16842974, + "fadingEdge": 16842975, + "fadingEdgeLength": 16842976, + "nextFocusLeft": 16842977, + "nextFocusRight": 16842978, + "nextFocusUp": 16842979, + "nextFocusDown": 16842980, + "clickable": 16842981, + "longClickable": 16842982, + "saveEnabled": 16842983, + "drawingCacheQuality": 16842984, + "duplicateParentState": 16842985, + "clipChildren": 16842986, + "clipToPadding": 16842987, + "layoutAnimation": 16842988, + "animationCache": 16842989, + "persistentDrawingCache": 16842990, + "alwaysDrawnWithCache": 16842991, + "addStatesFromChildren": 16842992, + "descendantFocusability": 16842993, + "layout": 16842994, + "inflatedId": 16842995, + "layout_width": 16842996, + "layout_height": 16842997, + "layout_margin": 16842998, + "layout_marginLeft": 16842999, + "layout_marginTop": 16843000, + "layout_marginRight": 16843001, + "layout_marginBottom": 16843002, + "listSelector": 16843003, + "drawSelectorOnTop": 16843004, + "stackFromBottom": 16843005, + "scrollingCache": 16843006, + "textFilterEnabled": 16843007, + "transcriptMode": 16843008, + "cacheColorHint": 16843009, + "dial": 16843010, + "hand_hour": 16843011, + "hand_minute": 16843012, + "format": 16843013, + "checked": 16843014, + "button": 16843015, + "checkMark": 16843016, + "foreground": 16843017, + "measureAllChildren": 16843018, + "groupIndicator": 16843019, + "childIndicator": 16843020, + "indicatorLeft": 16843021, + "indicatorRight": 16843022, + "childIndicatorLeft": 16843023, + "childIndicatorRight": 16843024, + "childDivider": 16843025, + "animationDuration": 16843026, + "spacing": 16843027, + "horizontalSpacing": 16843028, + "verticalSpacing": 16843029, + "stretchMode": 16843030, + "columnWidth": 16843031, + "numColumns": 16843032, + "src": 16843033, + "antialias": 16843034, + "filter": 16843035, + "dither": 16843036, + "scaleType": 16843037, + "adjustViewBounds": 16843038, + "maxWidth": 16843039, + "maxHeight": 16843040, + "tint": 16843041, + "baselineAlignBottom": 16843042, + "cropToPadding": 16843043, + "textOn": 16843044, + "textOff": 16843045, + "baselineAligned": 16843046, + "baselineAlignedChildIndex": 16843047, + "weightSum": 16843048, + "divider": 16843049, + "dividerHeight": 16843050, + "choiceMode": 16843051, + "itemTextAppearance": 16843052, + "horizontalDivider": 16843053, + "verticalDivider": 16843054, + "headerBackground": 16843055, + "itemBackground": 16843056, + "itemIconDisabledAlpha": 16843057, + "rowHeight": 16843058, + "maxRows": 16843059, + "maxItemsPerRow": 16843060, + "moreIcon": 16843061, + "max": 16843062, + "progress": 16843063, + "secondaryProgress": 16843064, + "indeterminate": 16843065, + "indeterminateOnly": 16843066, + "indeterminateDrawable": 16843067, + "progressDrawable": 16843068, + "indeterminateDuration": 16843069, + "indeterminateBehavior": 16843070, + "minWidth": 16843071, + "minHeight": 16843072, + "interpolator": 16843073, + "thumb": 16843074, + "thumbOffset": 16843075, + "numStars": 16843076, + "rating": 16843077, + "stepSize": 16843078, + "isIndicator": 16843079, + "checkedButton": 16843080, + "stretchColumns": 16843081, + "shrinkColumns": 16843082, + "collapseColumns": 16843083, + "layout_column": 16843084, + "layout_span": 16843085, + "bufferType": 16843086, + "text": 16843087, + "hint": 16843088, + "textScaleX": 16843089, + "cursorVisible": 16843090, + "maxLines": 16843091, + "lines": 16843092, + "height": 16843093, + "minLines": 16843094, + "maxEms": 16843095, + "ems": 16843096, + "width": 16843097, + "minEms": 16843098, + "scrollHorizontally": 16843099, + "password": 16843100, + "singleLine": 16843101, + "selectAllOnFocus": 16843102, + "includeFontPadding": 16843103, + "maxLength": 16843104, + "shadowColor": 16843105, + "shadowDx": 16843106, + "shadowDy": 16843107, + "shadowRadius": 16843108, + "numeric": 16843109, + "digits": 16843110, + "phoneNumber": 16843111, + "inputMethod": 16843112, + "capitalize": 16843113, + "autoText": 16843114, + "editable": 16843115, + "freezesText": 16843116, + "drawableTop": 16843117, + "drawableBottom": 16843118, + "drawableLeft": 16843119, + "drawableRight": 16843120, + "drawablePadding": 16843121, + "completionHint": 16843122, + "completionHintView": 16843123, + "completionThreshold": 16843124, + "dropDownSelector": 16843125, + "popupBackground": 16843126, + "inAnimation": 16843127, + "outAnimation": 16843128, + "flipInterval": 16843129, + "fillViewport": 16843130, + "prompt": 16843131, + "startYear": 16843132, + "endYear": 16843133, + "mode": 16843134, + "layout_x": 16843135, + "layout_y": 16843136, + "layout_weight": 16843137, + "layout_toLeftOf": 16843138, + "layout_toRightOf": 16843139, + "layout_above": 16843140, + "layout_below": 16843141, + "layout_alignBaseline": 16843142, + "layout_alignLeft": 16843143, + "layout_alignTop": 16843144, + "layout_alignRight": 16843145, + "layout_alignBottom": 16843146, + "layout_alignParentLeft": 16843147, + "layout_alignParentTop": 16843148, + "layout_alignParentRight": 16843149, + "layout_alignParentBottom": 16843150, + "layout_centerInParent": 16843151, + "layout_centerHorizontal": 16843152, + "layout_centerVertical": 16843153, + "layout_alignWithParentIfMissing": 16843154, + "layout_scale": 16843155, + "visible": 16843156, + "variablePadding": 16843157, + "constantSize": 16843158, + "oneshot": 16843159, + "duration": 16843160, + "drawable": 16843161, + "shape": 16843162, + "innerRadiusRatio": 16843163, + "thicknessRatio": 16843164, + "startColor": 16843165, + "endColor": 16843166, + "useLevel": 16843167, + "angle": 16843168, + "type": 16843169, + "centerX": 16843170, + "centerY": 16843171, + "gradientRadius": 16843172, + "color": 16843173, + "dashWidth": 16843174, + "dashGap": 16843175, + "radius": 16843176, + "topLeftRadius": 16843177, + "topRightRadius": 16843178, + "bottomLeftRadius": 16843179, + "bottomRightRadius": 16843180, + "left": 16843181, + "top": 16843182, + "right": 16843183, + "bottom": 16843184, + "minLevel": 16843185, + "maxLevel": 16843186, + "fromDegrees": 16843187, + "toDegrees": 16843188, + "pivotX": 16843189, + "pivotY": 16843190, + "insetLeft": 16843191, + "insetRight": 16843192, + "insetTop": 16843193, + "insetBottom": 16843194, + "shareInterpolator": 16843195, + "fillBefore": 16843196, + "fillAfter": 16843197, + "startOffset": 16843198, + "repeatCount": 16843199, + "repeatMode": 16843200, + "zAdjustment": 16843201, + "fromXScale": 16843202, + "toXScale": 16843203, + "fromYScale": 16843204, + "toYScale": 16843205, + "fromXDelta": 16843206, + "toXDelta": 16843207, + "fromYDelta": 16843208, + "toYDelta": 16843209, + "fromAlpha": 16843210, + "toAlpha": 16843211, + "delay": 16843212, + "animation": 16843213, + "animationOrder": 16843214, + "columnDelay": 16843215, + "rowDelay": 16843216, + "direction": 16843217, + "directionPriority": 16843218, + "factor": 16843219, + "cycles": 16843220, + "searchMode": 16843221, + "searchSuggestAuthority": 16843222, + "searchSuggestPath": 16843223, + "searchSuggestSelection": 16843224, + "searchSuggestIntentAction": 16843225, + "searchSuggestIntentData": 16843226, + "queryActionMsg": 16843227, + "suggestActionMsg": 16843228, + "suggestActionMsgColumn": 16843229, + "menuCategory": 16843230, + "orderInCategory": 16843231, + "checkableBehavior": 16843232, + "title": 16843233, + "titleCondensed": 16843234, + "alphabeticShortcut": 16843235, + "numericShortcut": 16843236, + "checkable": 16843237, + "selectable": 16843238, + "orderingFromXml": 16843239, + "key": 16843240, + "summary": 16843241, + "order": 16843242, + "widgetLayout": 16843243, + "dependency": 16843244, + "defaultValue": 16843245, + "shouldDisableView": 16843246, + "summaryOn": 16843247, + "summaryOff": 16843248, + "disableDependentsState": 16843249, + "dialogTitle": 16843250, + "dialogMessage": 16843251, + "dialogIcon": 16843252, + "positiveButtonText": 16843253, + "negativeButtonText": 16843254, + "dialogLayout": 16843255, + "entryValues": 16843256, + "ringtoneType": 16843257, + "showDefault": 16843258, + "showSilent": 16843259, + "scaleWidth": 16843260, + "scaleHeight": 16843261, + "scaleGravity": 16843262, + "ignoreGravity": 16843263, + "foregroundGravity": 16843264, + "tileMode": 16843265, + "targetActivity": 16843266, + "alwaysRetainTaskState": 16843267, + "allowTaskReparenting": 16843268, + "searchButtonText": 16843269, + "colorForegroundInverse": 16843270, + "textAppearanceButton": 16843271, + "listSeparatorTextViewStyle": 16843272, + "streamType": 16843273, + "clipOrientation": 16843274, + "centerColor": 16843275, + "minSdkVersion": 16843276, + "windowFullscreen": 16843277, + "unselectedAlpha": 16843278, + "progressBarStyleSmallTitle": 16843279, + "ratingBarStyleIndicator": 16843280, + "apiKey": 16843281, + "textColorTertiary": 16843282, + "textColorTertiaryInverse": 16843283, + "listDivider": 16843284, + "soundEffectsEnabled": 16843285, + "keepScreenOn": 16843286, + "lineSpacingExtra": 16843287, + "lineSpacingMultiplier": 16843288, + "listChoiceIndicatorSingle": 16843289, + "listChoiceIndicatorMultiple": 16843290, + "versionCode": 16843291, + "versionName": 16843292, + "marqueeRepeatLimit": 16843293, + "windowNoDisplay": 16843294, + "backgroundDimEnabled": 16843295, + "inputType": 16843296, + "isDefault": 16843297, + "windowDisablePreview": 16843298, + "privateImeOptions": 16843299, + "editorExtras": 16843300, + "settingsActivity": 16843301, + "fastScrollEnabled": 16843302, + "reqTouchScreen": 16843303, + "reqKeyboardType": 16843304, + "reqHardKeyboard": 16843305, + "reqNavigation": 16843306, + "windowSoftInputMode": 16843307, + "imeFullscreenBackground": 16843308, + "noHistory": 16843309, + "headerDividersEnabled": 16843310, + "footerDividersEnabled": 16843311, + "candidatesTextStyleSpans": 16843312, + "smoothScrollbar": 16843313, + "reqFiveWayNav": 16843314, + "keyBackground": 16843315, + "keyTextSize": 16843316, + "labelTextSize": 16843317, + "keyTextColor": 16843318, + "keyPreviewLayout": 16843319, + "keyPreviewOffset": 16843320, + "keyPreviewHeight": 16843321, + "verticalCorrection": 16843322, + "popupLayout": 16843323, + "state_long_pressable": 16843324, + "keyWidth": 16843325, + "keyHeight": 16843326, + "horizontalGap": 16843327, + "verticalGap": 16843328, + "rowEdgeFlags": 16843329, + "codes": 16843330, + "popupKeyboard": 16843331, + "popupCharacters": 16843332, + "keyEdgeFlags": 16843333, + "isModifier": 16843334, + "isSticky": 16843335, + "isRepeatable": 16843336, + "iconPreview": 16843337, + "keyOutputText": 16843338, + "keyLabel": 16843339, + "keyIcon": 16843340, + "keyboardMode": 16843341, + "isScrollContainer": 16843342, + "fillEnabled": 16843343, + "updatePeriodMillis": 16843344, + "initialLayout": 16843345, + "voiceSearchMode": 16843346, + "voiceLanguageModel": 16843347, + "voicePromptText": 16843348, + "voiceLanguage": 16843349, + "voiceMaxResults": 16843350, + "bottomOffset": 16843351, + "topOffset": 16843352, + "allowSingleTap": 16843353, + "handle": 16843354, + "content": 16843355, + "animateOnClick": 16843356, + "configure": 16843357, + "hapticFeedbackEnabled": 16843358, + "innerRadius": 16843359, + "thickness": 16843360, + "sharedUserLabel": 16843361, + "dropDownWidth": 16843362, + "dropDownAnchor": 16843363, + "imeOptions": 16843364, + "imeActionLabel": 16843365, + "imeActionId": 16843366, + "imeExtractEnterAnimation": 16843368, + "imeExtractExitAnimation": 16843369, + "tension": 16843370, + "extraTension": 16843371, + "anyDensity": 16843372, + "searchSuggestThreshold": 16843373, + "includeInGlobalSearch": 16843374, + "onClick": 16843375, + "targetSdkVersion": 16843376, + "maxSdkVersion": 16843377, + "testOnly": 16843378, + "contentDescription": 16843379, + "gestureStrokeWidth": 16843380, + "gestureColor": 16843381, + "uncertainGestureColor": 16843382, + "fadeOffset": 16843383, + "fadeDuration": 16843384, + "gestureStrokeType": 16843385, + "gestureStrokeLengthThreshold": 16843386, + "gestureStrokeSquarenessThreshold": 16843387, + "gestureStrokeAngleThreshold": 16843388, + "eventsInterceptionEnabled": 16843389, + "fadeEnabled": 16843390, + "backupAgent": 16843391, + "allowBackup": 16843392, + "glEsVersion": 16843393, + "queryAfterZeroResults": 16843394, + "dropDownHeight": 16843395, + "smallScreens": 16843396, + "normalScreens": 16843397, + "largeScreens": 16843398, + "progressBarStyleInverse": 16843399, + "progressBarStyleSmallInverse": 16843400, + "progressBarStyleLargeInverse": 16843401, + "searchSettingsDescription": 16843402, + "textColorPrimaryInverseDisableOnly": 16843403, + "autoUrlDetect": 16843404, + "resizeable": 16843405, + "required": 16843406, + "accountType": 16843407, + "contentAuthority": 16843408, + "userVisible": 16843409, + "windowShowWallpaper": 16843410, + "wallpaperOpenEnterAnimation": 16843411, + "wallpaperOpenExitAnimation": 16843412, + "wallpaperCloseEnterAnimation": 16843413, + "wallpaperCloseExitAnimation": 16843414, + "wallpaperIntraOpenEnterAnimation": 16843415, + "wallpaperIntraOpenExitAnimation": 16843416, + "wallpaperIntraCloseEnterAnimation": 16843417, + "wallpaperIntraCloseExitAnimation": 16843418, + "supportsUploading": 16843419, + "killAfterRestore": 16843420, + "restoreNeedsApplication": 16843421, + "smallIcon": 16843422, + "accountPreferences": 16843423, + "textAppearanceSearchResultSubtitle": 16843424, + "textAppearanceSearchResultTitle": 16843425, + "summaryColumn": 16843426, + "detailColumn": 16843427, + "detailSocialSummary": 16843428, + "thumbnail": 16843429, + "detachWallpaper": 16843430, + "finishOnCloseSystemDialogs": 16843431, + "scrollbarFadeDuration": 16843432, + "scrollbarDefaultDelayBeforeFade": 16843433, + "fadeScrollbars": 16843434, + "colorBackgroundCacheHint": 16843435, + "dropDownHorizontalOffset": 16843436, + "dropDownVerticalOffset": 16843437, + "quickContactBadgeStyleWindowSmall": 16843438, + "quickContactBadgeStyleWindowMedium": 16843439, + "quickContactBadgeStyleWindowLarge": 16843440, + "quickContactBadgeStyleSmallWindowSmall": 16843441, + "quickContactBadgeStyleSmallWindowMedium": 16843442, + "quickContactBadgeStyleSmallWindowLarge": 16843443, + "author": 16843444, + "autoStart": 16843445, + "expandableListViewWhiteStyle": 16843446, + "installLocation": 16843447, + "vmSafeMode": 16843448, + "webTextViewStyle": 16843449, + "restoreAnyVersion": 16843450, + "tabStripLeft": 16843451, + "tabStripRight": 16843452, + "tabStripEnabled": 16843453, + "logo": 16843454, + "xlargeScreens": 16843455, + "immersive": 16843456, + "overScrollMode": 16843457, + "overScrollHeader": 16843458, + "overScrollFooter": 16843459, + "filterTouchesWhenObscured": 16843460, + "textSelectHandleLeft": 16843461, + "textSelectHandleRight": 16843462, + "textSelectHandle": 16843463, + "textSelectHandleWindowStyle": 16843464, + "popupAnimationStyle": 16843465, + "screenSize": 16843466, + "screenDensity": 16843467, + "allContactsName": 16843468, + "windowActionBar": 16843469, + "actionBarStyle": 16843470, + "navigationMode": 16843471, + "displayOptions": 16843472, + "subtitle": 16843473, + "customNavigationLayout": 16843474, + "hardwareAccelerated": 16843475, + "measureWithLargestChild": 16843476, + "animateFirstView": 16843477, + "dropDownSpinnerStyle": 16843478, + "actionDropDownStyle": 16843479, + "actionButtonStyle": 16843480, + "showAsAction": 16843481, + "previewImage": 16843482, + "actionModeBackground": 16843483, + "actionModeCloseDrawable": 16843484, + "windowActionModeOverlay": 16843485, + "valueFrom": 16843486, + "valueTo": 16843487, + "valueType": 16843488, + "propertyName": 16843489, + "ordering": 16843490, + "fragment": 16843491, + "windowActionBarOverlay": 16843492, + "fragmentOpenEnterAnimation": 16843493, + "fragmentOpenExitAnimation": 16843494, + "fragmentCloseEnterAnimation": 16843495, + "fragmentCloseExitAnimation": 16843496, + "fragmentFadeEnterAnimation": 16843497, + "fragmentFadeExitAnimation": 16843498, + "actionBarSize": 16843499, + "imeSubtypeLocale": 16843500, + "imeSubtypeMode": 16843501, + "imeSubtypeExtraValue": 16843502, + "splitMotionEvents": 16843503, + "listChoiceBackgroundIndicator": 16843504, + "spinnerMode": 16843505, + "animateLayoutChanges": 16843506, + "actionBarTabStyle": 16843507, + "actionBarTabBarStyle": 16843508, + "actionBarTabTextStyle": 16843509, + "actionOverflowButtonStyle": 16843510, + "actionModeCloseButtonStyle": 16843511, + "titleTextStyle": 16843512, + "subtitleTextStyle": 16843513, + "iconifiedByDefault": 16843514, + "actionLayout": 16843515, + "actionViewClass": 16843516, + "activatedBackgroundIndicator": 16843517, + "state_activated": 16843518, + "listPopupWindowStyle": 16843519, + "popupMenuStyle": 16843520, + "textAppearanceLargePopupMenu": 16843521, + "textAppearanceSmallPopupMenu": 16843522, + "breadCrumbTitle": 16843523, + "breadCrumbShortTitle": 16843524, + "listDividerAlertDialog": 16843525, + "textColorAlertDialogListItem": 16843526, + "loopViews": 16843527, + "dialogTheme": 16843528, + "alertDialogTheme": 16843529, + "dividerVertical": 16843530, + "homeAsUpIndicator": 16843531, + "enterFadeDuration": 16843532, + "exitFadeDuration": 16843533, + "selectableItemBackground": 16843534, + "autoAdvanceViewId": 16843535, + "useIntrinsicSizeAsMinimum": 16843536, + "actionModeCutDrawable": 16843537, + "actionModeCopyDrawable": 16843538, + "actionModePasteDrawable": 16843539, + "textEditPasteWindowLayout": 16843540, + "textEditNoPasteWindowLayout": 16843541, + "textIsSelectable": 16843542, + "windowEnableSplitTouch": 16843543, + "indeterminateProgressStyle": 16843544, + "progressBarPadding": 16843545, + "animationResolution": 16843546, + "state_accelerated": 16843547, + "baseline": 16843548, + "homeLayout": 16843549, + "opacity": 16843550, + "alpha": 16843551, + "transformPivotX": 16843552, + "transformPivotY": 16843553, + "translationX": 16843554, + "translationY": 16843555, + "scaleX": 16843556, + "scaleY": 16843557, + "rotation": 16843558, + "rotationX": 16843559, + "rotationY": 16843560, + "showDividers": 16843561, + "dividerPadding": 16843562, + "borderlessButtonStyle": 16843563, + "dividerHorizontal": 16843564, + "itemPadding": 16843565, + "buttonBarStyle": 16843566, + "buttonBarButtonStyle": 16843567, + "segmentedButtonStyle": 16843568, + "staticWallpaperPreview": 16843569, + "allowParallelSyncs": 16843570, + "isAlwaysSyncable": 16843571, + "verticalScrollbarPosition": 16843572, + "fastScrollAlwaysVisible": 16843573, + "fastScrollThumbDrawable": 16843574, + "fastScrollPreviewBackgroundLeft": 16843575, + "fastScrollPreviewBackgroundRight": 16843576, + "fastScrollTrackDrawable": 16843577, + "fastScrollOverlayPosition": 16843578, + "customTokens": 16843579, + "nextFocusForward": 16843580, + "firstDayOfWeek": 16843581, + "showWeekNumber": 16843582, + "minDate": 16843583, + "maxDate": 16843584, + "shownWeekCount": 16843585, + "selectedWeekBackgroundColor": 16843586, + "focusedMonthDateColor": 16843587, + "unfocusedMonthDateColor": 16843588, + "weekNumberColor": 16843589, + "weekSeparatorLineColor": 16843590, + "selectedDateVerticalBar": 16843591, + "weekDayTextAppearance": 16843592, + "dateTextAppearance": 16843593, + "solidColor": 16843594, + "spinnersShown": 16843595, + "calendarViewShown": 16843596, + "state_multiline": 16843597, + "detailsElementBackground": 16843598, + "textColorHighlightInverse": 16843599, + "textColorLinkInverse": 16843600, + "editTextColor": 16843601, + "editTextBackground": 16843602, + "horizontalScrollViewStyle": 16843603, + "layerType": 16843604, + "alertDialogIcon": 16843605, + "windowMinWidthMajor": 16843606, + "windowMinWidthMinor": 16843607, + "queryHint": 16843608, + "fastScrollTextColor": 16843609, + "largeHeap": 16843610, + "windowCloseOnTouchOutside": 16843611, + "datePickerStyle": 16843612, + "calendarViewStyle": 16843613, + "textEditSidePasteWindowLayout": 16843614, + "textEditSideNoPasteWindowLayout": 16843615, + "actionMenuTextAppearance": 16843616, + "actionMenuTextColor": 16843617, + "textCursorDrawable": 16843618, + "resizeMode": 16843619, + "requiresSmallestWidthDp": 16843620, + "compatibleWidthLimitDp": 16843621, + "largestWidthLimitDp": 16843622, + "state_hovered": 16843623, + "state_drag_can_accept": 16843624, + "state_drag_hovered": 16843625, + "stopWithTask": 16843626, + "switchTextOn": 16843627, + "switchTextOff": 16843628, + "switchPreferenceStyle": 16843629, + "switchTextAppearance": 16843630, + "track": 16843631, + "switchMinWidth": 16843632, + "switchPadding": 16843633, + "thumbTextPadding": 16843634, + "textSuggestionsWindowStyle": 16843635, + "textEditSuggestionItemLayout": 16843636, + "rowCount": 16843637, + "rowOrderPreserved": 16843638, + "columnCount": 16843639, + "columnOrderPreserved": 16843640, + "useDefaultMargins": 16843641, + "alignmentMode": 16843642, + "layout_row": 16843643, + "layout_rowSpan": 16843644, + "layout_columnSpan": 16843645, + "actionModeSelectAllDrawable": 16843646, + "isAuxiliary": 16843647, + "accessibilityEventTypes": 16843648, + "packageNames": 16843649, + "accessibilityFeedbackType": 16843650, + "notificationTimeout": 16843651, + "accessibilityFlags": 16843652, + "canRetrieveWindowContent": 16843653, + "listPreferredItemHeightLarge": 16843654, + "listPreferredItemHeightSmall": 16843655, + "actionBarSplitStyle": 16843656, + "actionProviderClass": 16843657, + "backgroundStacked": 16843658, + "backgroundSplit": 16843659, + "textAllCaps": 16843660, + "colorPressedHighlight": 16843661, + "colorLongPressedHighlight": 16843662, + "colorFocusedHighlight": 16843663, + "colorActivatedHighlight": 16843664, + "colorMultiSelectHighlight": 16843665, + "drawableStart": 16843666, + "drawableEnd": 16843667, + "actionModeStyle": 16843668, + "minResizeWidth": 16843669, + "minResizeHeight": 16843670, + "actionBarWidgetTheme": 16843671, + "uiOptions": 16843672, + "subtypeLocale": 16843673, + "subtypeExtraValue": 16843674, + "actionBarDivider": 16843675, + "actionBarItemBackground": 16843676, + "actionModeSplitBackground": 16843677, + "textAppearanceListItem": 16843678, + "textAppearanceListItemSmall": 16843679, + "targetDescriptions": 16843680, + "directionDescriptions": 16843681, + "overridesImplicitlyEnabledSubtype": 16843682, + "listPreferredItemPaddingLeft": 16843683, + "listPreferredItemPaddingRight": 16843684, + "requiresFadingEdge": 16843685, + "publicKey": 16843686, + "parentActivityName": 16843687, + "isolatedProcess": 16843689, + "importantForAccessibility": 16843690, + "keyboardLayout": 16843691, + "fontFamily": 16843692, + "mediaRouteButtonStyle": 16843693, + "mediaRouteTypes": 16843694, + "supportsRtl": 16843695, + "textDirection": 16843696, + "textAlignment": 16843697, + "layoutDirection": 16843698, + "paddingStart": 16843699, + "paddingEnd": 16843700, + "layout_marginStart": 16843701, + "layout_marginEnd": 16843702, + "layout_toStartOf": 16843703, + "layout_toEndOf": 16843704, + "layout_alignStart": 16843705, + "layout_alignEnd": 16843706, + "layout_alignParentStart": 16843707, + "layout_alignParentEnd": 16843708, + "listPreferredItemPaddingStart": 16843709, + "listPreferredItemPaddingEnd": 16843710, + "singleUser": 16843711, + "presentationTheme": 16843712, + "subtypeId": 16843713, + "initialKeyguardLayout": 16843714, + "widgetCategory": 16843716, + "permissionGroupFlags": 16843717, + "labelFor": 16843718, + "permissionFlags": 16843719, + "checkedTextViewStyle": 16843720, + "showOnLockScreen": 16843721, + "format12Hour": 16843722, + "format24Hour": 16843723, + "timeZone": 16843724, + "mipMap": 16843725, + "mirrorForRtl": 16843726, + "windowOverscan": 16843727, + "requiredForAllUsers": 16843728, + "indicatorStart": 16843729, + "indicatorEnd": 16843730, + "childIndicatorStart": 16843731, + "childIndicatorEnd": 16843732, + "restrictedAccountType": 16843733, + "requiredAccountType": 16843734, + "canRequestTouchExplorationMode": 16843735, + "canRequestEnhancedWebAccessibility": 16843736, + "canRequestFilterKeyEvents": 16843737, + "layoutMode": 16843738, + "keySet": 16843739, + "targetId": 16843740, + "fromScene": 16843741, + "toScene": 16843742, + "transition": 16843743, + "transitionOrdering": 16843744, + "fadingMode": 16843745, + "startDelay": 16843746, + "ssp": 16843747, + "sspPrefix": 16843748, + "sspPattern": 16843749, + "addPrintersActivity": 16843750, + "vendor": 16843751, + "category": 16843752, + "isAsciiCapable": 16843753, + "autoMirrored": 16843754, + "supportsSwitchingToNextInputMethod": 16843755, + "requireDeviceUnlock": 16843756, + "apduServiceBanner": 16843757, + "accessibilityLiveRegion": 16843758, + "windowTranslucentStatus": 16843759, + "windowTranslucentNavigation": 16843760, + "advancedPrintOptionsActivity": 16843761, + "banner": 16843762, + "windowSwipeToDismiss": 16843763, + "isGame": 16843764, + "allowEmbedded": 16843765, + "setupActivity": 16843766, + "fastScrollStyle": 16843767, + "windowContentTransitions": 16843768, + "windowContentTransitionManager": 16843769, + "translationZ": 16843770, + "tintMode": 16843771, + "controlX1": 16843772, + "controlY1": 16843773, + "controlX2": 16843774, + "controlY2": 16843775, + "transitionName": 16843776, + "transitionGroup": 16843777, + "viewportWidth": 16843778, + "viewportHeight": 16843779, + "fillColor": 16843780, + "pathData": 16843781, + "strokeColor": 16843782, + "strokeWidth": 16843783, + "trimPathStart": 16843784, + "trimPathEnd": 16843785, + "trimPathOffset": 16843786, + "strokeLineCap": 16843787, + "strokeLineJoin": 16843788, + "strokeMiterLimit": 16843789, + "colorControlNormal": 16843817, + "colorControlActivated": 16843818, + "colorButtonNormal": 16843819, + "colorControlHighlight": 16843820, + "persistableMode": 16843821, + "titleTextAppearance": 16843822, + "subtitleTextAppearance": 16843823, + "slideEdge": 16843824, + "actionBarTheme": 16843825, + "textAppearanceListItemSecondary": 16843826, + "colorPrimary": 16843827, + "colorPrimaryDark": 16843828, + "colorAccent": 16843829, + "nestedScrollingEnabled": 16843830, + "windowEnterTransition": 16843831, + "windowExitTransition": 16843832, + "windowSharedElementEnterTransition": 16843833, + "windowSharedElementExitTransition": 16843834, + "windowAllowReturnTransitionOverlap": 16843835, + "windowAllowEnterTransitionOverlap": 16843836, + "sessionService": 16843837, + "stackViewStyle": 16843838, + "switchStyle": 16843839, + "elevation": 16843840, + "excludeId": 16843841, + "excludeClass": 16843842, + "hideOnContentScroll": 16843843, + "actionOverflowMenuStyle": 16843844, + "documentLaunchMode": 16843845, + "maxRecents": 16843846, + "autoRemoveFromRecents": 16843847, + "stateListAnimator": 16843848, + "toId": 16843849, + "fromId": 16843850, + "reversible": 16843851, + "splitTrack": 16843852, + "targetName": 16843853, + "excludeName": 16843854, + "matchOrder": 16843855, + "windowDrawsSystemBarBackgrounds": 16843856, + "statusBarColor": 16843857, + "navigationBarColor": 16843858, + "contentInsetStart": 16843859, + "contentInsetEnd": 16843860, + "contentInsetLeft": 16843861, + "contentInsetRight": 16843862, + "paddingMode": 16843863, + "layout_rowWeight": 16843864, + "layout_columnWeight": 16843865, + "translateX": 16843866, + "translateY": 16843867, + "selectableItemBackgroundBorderless": 16843868, + "elegantTextHeight": 16843869, + "searchKeyphraseId": 16843870, + "searchKeyphrase": 16843871, + "searchKeyphraseSupportedLocales": 16843872, + "windowTransitionBackgroundFadeDuration": 16843873, + "overlapAnchor": 16843874, + "progressTint": 16843875, + "progressTintMode": 16843876, + "progressBackgroundTint": 16843877, + "progressBackgroundTintMode": 16843878, + "secondaryProgressTint": 16843879, + "secondaryProgressTintMode": 16843880, + "indeterminateTint": 16843881, + "indeterminateTintMode": 16843882, + "backgroundTint": 16843883, + "backgroundTintMode": 16843884, + "foregroundTint": 16843885, + "foregroundTintMode": 16843886, + "buttonTint": 16843887, + "buttonTintMode": 16843888, + "thumbTint": 16843889, + "thumbTintMode": 16843890, + "fullBackupOnly": 16843891, + "propertyXName": 16843892, + "propertyYName": 16843893, + "relinquishTaskIdentity": 16843894, + "tileModeX": 16843895, + "tileModeY": 16843896, + "actionModeShareDrawable": 16843897, + "actionModeFindDrawable": 16843898, + "actionModeWebSearchDrawable": 16843899, + "transitionVisibilityMode": 16843900, + "minimumHorizontalAngle": 16843901, + "minimumVerticalAngle": 16843902, + "maximumAngle": 16843903, + "searchViewStyle": 16843904, + "closeIcon": 16843905, + "goIcon": 16843906, + "searchIcon": 16843907, + "voiceIcon": 16843908, + "commitIcon": 16843909, + "suggestionRowLayout": 16843910, + "queryBackground": 16843911, + "submitBackground": 16843912, + "buttonBarPositiveButtonStyle": 16843913, + "buttonBarNeutralButtonStyle": 16843914, + "buttonBarNegativeButtonStyle": 16843915, + "popupElevation": 16843916, + "actionBarPopupTheme": 16843917, + "multiArch": 16843918, + "touchscreenBlocksFocus": 16843919, + "windowElevation": 16843920, + "launchTaskBehindTargetAnimation": 16843921, + "launchTaskBehindSourceAnimation": 16843922, + "restrictionType": 16843923, + "dayOfWeekBackground": 16843924, + "dayOfWeekTextAppearance": 16843925, + "headerMonthTextAppearance": 16843926, + "headerDayOfMonthTextAppearance": 16843927, + "headerYearTextAppearance": 16843928, + "yearListItemTextAppearance": 16843929, + "yearListSelectorColor": 16843930, + "calendarTextColor": 16843931, + "recognitionService": 16843932, + "timePickerStyle": 16843933, + "timePickerDialogTheme": 16843934, + "headerTimeTextAppearance": 16843935, + "headerAmPmTextAppearance": 16843936, + "numbersTextColor": 16843937, + "numbersBackgroundColor": 16843938, + "numbersSelectorColor": 16843939, + "amPmTextColor": 16843940, + "amPmBackgroundColor": 16843941, + "searchKeyphraseRecognitionFlags": 16843942, + "checkMarkTint": 16843943, + "checkMarkTintMode": 16843944, + "popupTheme": 16843945, + "toolbarStyle": 16843946, + "windowClipToOutline": 16843947, + "datePickerDialogTheme": 16843948, + "showText": 16843949, + "windowReturnTransition": 16843950, + "windowReenterTransition": 16843951, + "windowSharedElementReturnTransition": 16843952, + "windowSharedElementReenterTransition": 16843953, + "resumeWhilePausing": 16843954, + "datePickerMode": 16843955, + "timePickerMode": 16843956, + "inset": 16843957, + "letterSpacing": 16843958, + "fontFeatureSettings": 16843959, + "outlineProvider": 16843960, + "contentAgeHint": 16843961, + "country": 16843962, + "windowSharedElementsUseOverlay": 16843963, + "reparent": 16843964, + "reparentWithOverlay": 16843965, + "ambientShadowAlpha": 16843966, + "spotShadowAlpha": 16843967, + "navigationIcon": 16843968, + "navigationContentDescription": 16843969, + "fragmentExitTransition": 16843970, + "fragmentEnterTransition": 16843971, + "fragmentSharedElementEnterTransition": 16843972, + "fragmentReturnTransition": 16843973, + "fragmentSharedElementReturnTransition": 16843974, + "fragmentReenterTransition": 16843975, + "fragmentAllowEnterTransitionOverlap": 16843976, + "fragmentAllowReturnTransitionOverlap": 16843977, + "patternPathData": 16843978, + "strokeAlpha": 16843979, + "fillAlpha": 16843980, + "windowActivityTransitions": 16843981, + "colorEdgeEffect": 16843982, + "resizeClip": 16843983, + "collapseContentDescription": 16843984, + "accessibilityTraversalBefore": 16843985, + "accessibilityTraversalAfter": 16843986, + "dialogPreferredPadding": 16843987, + "searchHintIcon": 16843988, + "revisionCode": 16843989, + "drawableTint": 16843990, + "drawableTintMode": 16843991, + "fraction": 16843992, + "trackTint": 16843993, + "trackTintMode": 16843994, + "start": 16843995, + "end": 16843996, + "breakStrategy": 16843997, + "hyphenationFrequency": 16843998, + "allowUndo": 16843999, + "windowLightStatusBar": 16844000, + "numbersInnerTextColor": 16844001, + "colorBackgroundFloating": 16844002, + "titleTextColor": 16844003, + "subtitleTextColor": 16844004, + "thumbPosition": 16844005, + "scrollIndicators": 16844006, + "contextClickable": 16844007, + "fingerprintAuthDrawable": 16844008, + "logoDescription": 16844009, + "extractNativeLibs": 16844010, + "fullBackupContent": 16844011, + "usesCleartextTraffic": 16844012, + "lockTaskMode": 16844013, + "autoVerify": 16844014, + "showForAllUsers": 16844015, + "supportsAssist": 16844016, + "supportsLaunchVoiceAssistFromKeyguard": 16844017, + "listMenuViewStyle": 16844018, + "subMenuArrow": 16844019, + "defaultWidth": 16844020, + "defaultHeight": 16844021, + "resizeableActivity": 16844022, + "supportsPictureInPicture": 16844023, + "titleMargin": 16844024, + "titleMarginStart": 16844025, + "titleMarginEnd": 16844026, + "titleMarginTop": 16844027, + "titleMarginBottom": 16844028, + "maxButtonHeight": 16844029, + "buttonGravity": 16844030, + "collapseIcon": 16844031, + "level": 16844032, + "contextPopupMenuStyle": 16844033, + "textAppearancePopupMenuHeader": 16844034, + "windowBackgroundFallback": 16844035, + "defaultToDeviceProtectedStorage": 16844036, + "directBootAware": 16844037, + "preferenceFragmentStyle": 16844038, + "canControlMagnification": 16844039, + "languageTag": 16844040, + "pointerIcon": 16844041, + "tickMark": 16844042, + "tickMarkTint": 16844043, + "tickMarkTintMode": 16844044, + "canPerformGestures": 16844045, + "externalService": 16844046, + "supportsLocalInteraction": 16844047, + "startX": 16844048, + "startY": 16844049, + "endX": 16844050, + "endY": 16844051, + "offset": 16844052, + "use32bitAbi": 16844053, + "bitmap": 16844054, + "hotSpotX": 16844055, + "hotSpotY": 16844056, + "version": 16844057, + "backupInForeground": 16844058, + "countDown": 16844059, + "canRecord": 16844060, + "tunerCount": 16844061, + "fillType": 16844062, + "popupEnterTransition": 16844063, + "popupExitTransition": 16844064, + "forceHasOverlappingRendering": 16844065, + "contentInsetStartWithNavigation": 16844066, + "contentInsetEndWithActions": 16844067, + "numberPickerStyle": 16844068, + "enableVrMode": 16844069, + "hash": 16844070, + "networkSecurityConfig": 16844071, + "shortcutId": 16844072, + "shortcutShortLabel": 16844073, + "shortcutLongLabel": 16844074, + "shortcutDisabledMessage": 16844075, + "roundIcon": 16844076, + "contextUri": 16844077, + "contextDescription": 16844078, + "showMetadataInPreview": 16844079, + "colorSecondary": 16844080, + "visibleToInstantApps": 16844081, + "font": 16844082, + "fontWeight": 16844083, + "tooltipText": 16844084, + "autoSizeTextType": 16844085, + "autoSizeStepGranularity": 16844086, + "autoSizePresetSizes": 16844087, + "autoSizeMinTextSize": 16844088, + "min": 16844089, + "rotationAnimation": 16844090, + "layout_marginHorizontal": 16844091, + "layout_marginVertical": 16844092, + "paddingHorizontal": 16844093, + "paddingVertical": 16844094, + "fontStyle": 16844095, + "keyboardNavigationCluster": 16844096, + "targetProcesses": 16844097, + "nextClusterForward": 16844098, + "colorError": 16844099, + "focusedByDefault": 16844100, + "appCategory": 16844101, + "autoSizeMaxTextSize": 16844102, + "recreateOnConfigChanges": 16844103, + "certDigest": 16844104, + "splitName": 16844105, + "colorMode": 16844106, + "isolatedSplits": 16844107, + "targetSandboxVersion": 16844108, + "canRequestFingerprintGestures": 16844109, + "alphabeticModifiers": 16844110, + "numericModifiers": 16844111, + "fontProviderAuthority": 16844112, + "fontProviderQuery": 16844113, + "primaryContentAlpha": 16844114, + "secondaryContentAlpha": 16844115, + "requiredFeature": 16844116, + "requiredNotFeature": 16844117, + "autofillHints": 16844118, + "fontProviderPackage": 16844119, + "importantForAutofill": 16844120, + "recycleEnabled": 16844121, + "isStatic": 16844122, + "isFeatureSplit": 16844123, + "singleLineTitle": 16844124, + "fontProviderCerts": 16844125, + "iconTint": 16844126, + "iconTintMode": 16844127, + "maxAspectRatio": 16844128, + "iconSpaceReserved": 16844129, + "defaultFocusHighlightEnabled": 16844130, + "persistentWhenFeatureAvailable": 16844131, + "windowSplashscreenContent": 16844132, + "requiredSystemPropertyName": 16844133, + "requiredSystemPropertyValue": 16844134, + "justificationMode": 16844135, + "autofilledHighlight": 16844136, + "showWhenLocked": 16844137, + "turnScreenOn": 16844138, + "classLoader": 16844139, + "windowLightNavigationBar": 16844140, + "navigationBarDividerColor": 16844141 + }, + "id": { + "background": 16908288, + "checkbox": 16908289, + "content": 16908290, + "edit": 16908291, + "empty": 16908292, + "hint": 16908293, + "icon": 16908294, + "icon1": 16908295, + "icon2": 16908296, + "input": 16908297, + "list": 16908298, + "message": 16908299, + "primary": 16908300, + "progress": 16908301, + "selectedIcon": 16908302, + "secondaryProgress": 16908303, + "summary": 16908304, + "tabcontent": 16908305, + "tabhost": 16908306, + "tabs": 16908307, + "text1": 16908308, + "text2": 16908309, + "title": 16908310, + "toggle": 16908311, + "widget_frame": 16908312, + "button1": 16908313, + "button2": 16908314, + "button3": 16908315, + "extractArea": 16908316, + "candidatesArea": 16908317, + "inputArea": 16908318, + "selectAll": 16908319, + "cut": 16908320, + "copy": 16908321, + "paste": 16908322, + "copyUrl": 16908323, + "switchInputMethod": 16908324, + "inputExtractEditText": 16908325, + "keyboardView": 16908326, + "closeButton": 16908327, + "startSelectingText": 16908328, + "stopSelectingText": 16908329, + "addToDictionary": 16908330, + "custom": 16908331, + "home": 16908332, + "selectTextMode": 16908333, + "mask": 16908334, + "statusBarBackground": 16908335, + "navigationBarBackground": 16908336, + "pasteAsPlainText": 16908337, + "undo": 16908338, + "redo": 16908339, + "replaceText": 16908340, + "shareText": 16908341, + "accessibilityActionShowOnScreen": 16908342, + "accessibilityActionScrollToPosition": 16908343, + "accessibilityActionScrollUp": 16908344, + "accessibilityActionScrollLeft": 16908345, + "accessibilityActionScrollDown": 16908346, + "accessibilityActionScrollRight": 16908347, + "accessibilityActionContextClick": 16908348, + "accessibilityActionSetProgress": 16908349, + "icon_frame": 16908350, + "list_container": 16908351, + "switch_widget": 16908352, + "textAssist": 16908353, + "accessibilityActionMoveWindow": 16908354, + "autofill": 16908355 + }, + "style": { + "Animation": 16973824, + "Animation.Activity": 16973825, + "Animation.Dialog": 16973826, + "Animation.Translucent": 16973827, + "Animation.Toast": 16973828, + "Theme": 16973829, + "Theme.NoTitleBar": 16973830, + "Theme.NoTitleBar.Fullscreen": 16973831, + "Theme.Black": 16973832, + "Theme.Black.NoTitleBar": 16973833, + "Theme.Black.NoTitleBar.Fullscreen": 16973834, + "Theme.Dialog": 16973835, + "Theme.Light": 16973836, + "Theme.Light.NoTitleBar": 16973837, + "Theme.Light.NoTitleBar.Fullscreen": 16973838, + "Theme.Translucent": 16973839, + "Theme.Translucent.NoTitleBar": 16973840, + "Theme.Translucent.NoTitleBar.Fullscreen": 16973841, + "Widget": 16973842, + "Widget.AbsListView": 16973843, + "Widget.Button": 16973844, + "Widget.Button.Inset": 16973845, + "Widget.Button.Small": 16973846, + "Widget.Button.Toggle": 16973847, + "Widget.CompoundButton": 16973848, + "Widget.CompoundButton.CheckBox": 16973849, + "Widget.CompoundButton.RadioButton": 16973850, + "Widget.CompoundButton.Star": 16973851, + "Widget.ProgressBar": 16973852, + "Widget.ProgressBar.Large": 16973853, + "Widget.ProgressBar.Small": 16973854, + "Widget.ProgressBar.Horizontal": 16973855, + "Widget.SeekBar": 16973856, + "Widget.RatingBar": 16973857, + "Widget.TextView": 16973858, + "Widget.EditText": 16973859, + "Widget.ExpandableListView": 16973860, + "Widget.ImageWell": 16973861, + "Widget.ImageButton": 16973862, + "Widget.AutoCompleteTextView": 16973863, + "Widget.Spinner": 16973864, + "Widget.TextView.PopupMenu": 16973865, + "Widget.TextView.SpinnerItem": 16973866, + "Widget.DropDownItem": 16973867, + "Widget.DropDownItem.Spinner": 16973868, + "Widget.ScrollView": 16973869, + "Widget.ListView": 16973870, + "Widget.ListView.White": 16973871, + "Widget.ListView.DropDown": 16973872, + "Widget.ListView.Menu": 16973873, + "Widget.GridView": 16973874, + "Widget.WebView": 16973875, + "Widget.TabWidget": 16973876, + "Widget.Gallery": 16973877, + "Widget.PopupWindow": 16973878, + "MediaButton": 16973879, + "MediaButton.Previous": 16973880, + "MediaButton.Next": 16973881, + "MediaButton.Play": 16973882, + "MediaButton.Ffwd": 16973883, + "MediaButton.Rew": 16973884, + "MediaButton.Pause": 16973885, + "TextAppearance": 16973886, + "TextAppearance.Inverse": 16973887, + "TextAppearance.Theme": 16973888, + "TextAppearance.DialogWindowTitle": 16973889, + "TextAppearance.Large": 16973890, + "TextAppearance.Large.Inverse": 16973891, + "TextAppearance.Medium": 16973892, + "TextAppearance.Medium.Inverse": 16973893, + "TextAppearance.Small": 16973894, + "TextAppearance.Small.Inverse": 16973895, + "TextAppearance.Theme.Dialog": 16973896, + "TextAppearance.Widget": 16973897, + "TextAppearance.Widget.Button": 16973898, + "TextAppearance.Widget.IconMenu.Item": 16973899, + "TextAppearance.Widget.EditText": 16973900, + "TextAppearance.Widget.TabWidget": 16973901, + "TextAppearance.Widget.TextView": 16973902, + "TextAppearance.Widget.TextView.PopupMenu": 16973903, + "TextAppearance.Widget.DropDownHint": 16973904, + "TextAppearance.Widget.DropDownItem": 16973905, + "TextAppearance.Widget.TextView.SpinnerItem": 16973906, + "TextAppearance.WindowTitle": 16973907, + "Theme.InputMethod": 16973908, + "Theme.NoDisplay": 16973909, + "Animation.InputMethod": 16973910, + "Widget.KeyboardView": 16973911, + "ButtonBar": 16973912, + "Theme.Panel": 16973913, + "Theme.Light.Panel": 16973914, + "Widget.ProgressBar.Inverse": 16973915, + "Widget.ProgressBar.Large.Inverse": 16973916, + "Widget.ProgressBar.Small.Inverse": 16973917, + "Theme.Wallpaper": 16973918, + "Theme.Wallpaper.NoTitleBar": 16973919, + "Theme.Wallpaper.NoTitleBar.Fullscreen": 16973920, + "Theme.WallpaperSettings": 16973921, + "Theme.Light.WallpaperSettings": 16973922, + "TextAppearance.SearchResult.Title": 16973923, + "TextAppearance.SearchResult.Subtitle": 16973924, + "TextAppearance.StatusBar.Title": 16973925, + "TextAppearance.StatusBar.Icon": 16973926, + "TextAppearance.StatusBar.EventContent": 16973927, + "TextAppearance.StatusBar.EventContent.Title": 16973928, + "Theme.WithActionBar": 16973929, + "Theme.NoTitleBar.OverlayActionModes": 16973930, + "Theme.Holo": 16973931, + "Theme.Holo.NoActionBar": 16973932, + "Theme.Holo.NoActionBar.Fullscreen": 16973933, + "Theme.Holo.Light": 16973934, + "Theme.Holo.Dialog": 16973935, + "Theme.Holo.Dialog.MinWidth": 16973936, + "Theme.Holo.Dialog.NoActionBar": 16973937, + "Theme.Holo.Dialog.NoActionBar.MinWidth": 16973938, + "Theme.Holo.Light.Dialog": 16973939, + "Theme.Holo.Light.Dialog.MinWidth": 16973940, + "Theme.Holo.Light.Dialog.NoActionBar": 16973941, + "Theme.Holo.Light.Dialog.NoActionBar.MinWidth": 16973942, + "Theme.Holo.DialogWhenLarge": 16973943, + "Theme.Holo.DialogWhenLarge.NoActionBar": 16973944, + "Theme.Holo.Light.DialogWhenLarge": 16973945, + "Theme.Holo.Light.DialogWhenLarge.NoActionBar": 16973946, + "Theme.Holo.Panel": 16973947, + "Theme.Holo.Light.Panel": 16973948, + "Theme.Holo.Wallpaper": 16973949, + "Theme.Holo.Wallpaper.NoTitleBar": 16973950, + "Theme.Holo.InputMethod": 16973951, + "TextAppearance.Widget.PopupMenu.Large": 16973952, + "TextAppearance.Widget.PopupMenu.Small": 16973953, + "Widget.ActionBar": 16973954, + "Widget.Spinner.DropDown": 16973955, + "Widget.ActionButton": 16973956, + "Widget.ListPopupWindow": 16973957, + "Widget.PopupMenu": 16973958, + "Widget.ActionButton.Overflow": 16973959, + "Widget.ActionButton.CloseMode": 16973960, + "Widget.FragmentBreadCrumbs": 16973961, + "Widget.Holo": 16973962, + "Widget.Holo.Button": 16973963, + "Widget.Holo.Button.Small": 16973964, + "Widget.Holo.Button.Inset": 16973965, + "Widget.Holo.Button.Toggle": 16973966, + "Widget.Holo.TextView": 16973967, + "Widget.Holo.AutoCompleteTextView": 16973968, + "Widget.Holo.CompoundButton.CheckBox": 16973969, + "Widget.Holo.ListView.DropDown": 16973970, + "Widget.Holo.EditText": 16973971, + "Widget.Holo.ExpandableListView": 16973972, + "Widget.Holo.GridView": 16973973, + "Widget.Holo.ImageButton": 16973974, + "Widget.Holo.ListView": 16973975, + "Widget.Holo.PopupWindow": 16973976, + "Widget.Holo.ProgressBar": 16973977, + "Widget.Holo.ProgressBar.Horizontal": 16973978, + "Widget.Holo.ProgressBar.Small": 16973979, + "Widget.Holo.ProgressBar.Small.Title": 16973980, + "Widget.Holo.ProgressBar.Large": 16973981, + "Widget.Holo.SeekBar": 16973982, + "Widget.Holo.RatingBar": 16973983, + "Widget.Holo.RatingBar.Indicator": 16973984, + "Widget.Holo.RatingBar.Small": 16973985, + "Widget.Holo.CompoundButton.RadioButton": 16973986, + "Widget.Holo.ScrollView": 16973987, + "Widget.Holo.HorizontalScrollView": 16973988, + "Widget.Holo.Spinner": 16973989, + "Widget.Holo.CompoundButton.Star": 16973990, + "Widget.Holo.TabWidget": 16973991, + "Widget.Holo.WebTextView": 16973992, + "Widget.Holo.WebView": 16973993, + "Widget.Holo.DropDownItem": 16973994, + "Widget.Holo.DropDownItem.Spinner": 16973995, + "Widget.Holo.TextView.SpinnerItem": 16973996, + "Widget.Holo.ListPopupWindow": 16973997, + "Widget.Holo.PopupMenu": 16973998, + "Widget.Holo.ActionButton": 16973999, + "Widget.Holo.ActionButton.Overflow": 16974000, + "Widget.Holo.ActionButton.TextButton": 16974001, + "Widget.Holo.ActionMode": 16974002, + "Widget.Holo.ActionButton.CloseMode": 16974003, + "Widget.Holo.ActionBar": 16974004, + "Widget.Holo.Light": 16974005, + "Widget.Holo.Light.Button": 16974006, + "Widget.Holo.Light.Button.Small": 16974007, + "Widget.Holo.Light.Button.Inset": 16974008, + "Widget.Holo.Light.Button.Toggle": 16974009, + "Widget.Holo.Light.TextView": 16974010, + "Widget.Holo.Light.AutoCompleteTextView": 16974011, + "Widget.Holo.Light.CompoundButton.CheckBox": 16974012, + "Widget.Holo.Light.ListView.DropDown": 16974013, + "Widget.Holo.Light.EditText": 16974014, + "Widget.Holo.Light.ExpandableListView": 16974015, + "Widget.Holo.Light.GridView": 16974016, + "Widget.Holo.Light.ImageButton": 16974017, + "Widget.Holo.Light.ListView": 16974018, + "Widget.Holo.Light.PopupWindow": 16974019, + "Widget.Holo.Light.ProgressBar": 16974020, + "Widget.Holo.Light.ProgressBar.Horizontal": 16974021, + "Widget.Holo.Light.ProgressBar.Small": 16974022, + "Widget.Holo.Light.ProgressBar.Small.Title": 16974023, + "Widget.Holo.Light.ProgressBar.Large": 16974024, + "Widget.Holo.Light.ProgressBar.Inverse": 16974025, + "Widget.Holo.Light.ProgressBar.Small.Inverse": 16974026, + "Widget.Holo.Light.ProgressBar.Large.Inverse": 16974027, + "Widget.Holo.Light.SeekBar": 16974028, + "Widget.Holo.Light.RatingBar": 16974029, + "Widget.Holo.Light.RatingBar.Indicator": 16974030, + "Widget.Holo.Light.RatingBar.Small": 16974031, + "Widget.Holo.Light.CompoundButton.RadioButton": 16974032, + "Widget.Holo.Light.ScrollView": 16974033, + "Widget.Holo.Light.HorizontalScrollView": 16974034, + "Widget.Holo.Light.Spinner": 16974035, + "Widget.Holo.Light.CompoundButton.Star": 16974036, + "Widget.Holo.Light.TabWidget": 16974037, + "Widget.Holo.Light.WebTextView": 16974038, + "Widget.Holo.Light.WebView": 16974039, + "Widget.Holo.Light.DropDownItem": 16974040, + "Widget.Holo.Light.DropDownItem.Spinner": 16974041, + "Widget.Holo.Light.TextView.SpinnerItem": 16974042, + "Widget.Holo.Light.ListPopupWindow": 16974043, + "Widget.Holo.Light.PopupMenu": 16974044, + "Widget.Holo.Light.ActionButton": 16974045, + "Widget.Holo.Light.ActionButton.Overflow": 16974046, + "Widget.Holo.Light.ActionMode": 16974047, + "Widget.Holo.Light.ActionButton.CloseMode": 16974048, + "Widget.Holo.Light.ActionBar": 16974049, + "Widget.Holo.Button.Borderless": 16974050, + "Widget.Holo.Tab": 16974051, + "Widget.Holo.Light.Tab": 16974052, + "Holo.ButtonBar": 16974053, + "Holo.Light.ButtonBar": 16974054, + "Holo.ButtonBar.AlertDialog": 16974055, + "Holo.Light.ButtonBar.AlertDialog": 16974056, + "Holo.SegmentedButton": 16974057, + "Holo.Light.SegmentedButton": 16974058, + "Widget.CalendarView": 16974059, + "Widget.Holo.CalendarView": 16974060, + "Widget.Holo.Light.CalendarView": 16974061, + "Widget.DatePicker": 16974062, + "Widget.Holo.DatePicker": 16974063, + "Theme.Holo.Light.NoActionBar": 16974064, + "Theme.Holo.Light.NoActionBar.Fullscreen": 16974065, + "Widget.ActionBar.TabView": 16974066, + "Widget.ActionBar.TabText": 16974067, + "Widget.ActionBar.TabBar": 16974068, + "Widget.Holo.ActionBar.TabView": 16974069, + "Widget.Holo.ActionBar.TabText": 16974070, + "Widget.Holo.ActionBar.TabBar": 16974071, + "Widget.Holo.Light.ActionBar.TabView": 16974072, + "Widget.Holo.Light.ActionBar.TabText": 16974073, + "Widget.Holo.Light.ActionBar.TabBar": 16974074, + "TextAppearance.Holo": 16974075, + "TextAppearance.Holo.Inverse": 16974076, + "TextAppearance.Holo.Large": 16974077, + "TextAppearance.Holo.Large.Inverse": 16974078, + "TextAppearance.Holo.Medium": 16974079, + "TextAppearance.Holo.Medium.Inverse": 16974080, + "TextAppearance.Holo.Small": 16974081, + "TextAppearance.Holo.Small.Inverse": 16974082, + "TextAppearance.Holo.SearchResult.Title": 16974083, + "TextAppearance.Holo.SearchResult.Subtitle": 16974084, + "TextAppearance.Holo.Widget": 16974085, + "TextAppearance.Holo.Widget.Button": 16974086, + "TextAppearance.Holo.Widget.IconMenu.Item": 16974087, + "TextAppearance.Holo.Widget.TabWidget": 16974088, + "TextAppearance.Holo.Widget.TextView": 16974089, + "TextAppearance.Holo.Widget.TextView.PopupMenu": 16974090, + "TextAppearance.Holo.Widget.DropDownHint": 16974091, + "TextAppearance.Holo.Widget.DropDownItem": 16974092, + "TextAppearance.Holo.Widget.TextView.SpinnerItem": 16974093, + "TextAppearance.Holo.Widget.EditText": 16974094, + "TextAppearance.Holo.Widget.PopupMenu": 16974095, + "TextAppearance.Holo.Widget.PopupMenu.Large": 16974096, + "TextAppearance.Holo.Widget.PopupMenu.Small": 16974097, + "TextAppearance.Holo.Widget.ActionBar.Title": 16974098, + "TextAppearance.Holo.Widget.ActionBar.Subtitle": 16974099, + "TextAppearance.Holo.Widget.ActionMode.Title": 16974100, + "TextAppearance.Holo.Widget.ActionMode.Subtitle": 16974101, + "TextAppearance.Holo.WindowTitle": 16974102, + "TextAppearance.Holo.DialogWindowTitle": 16974103, + "TextAppearance.SuggestionHighlight": 16974104, + "Theme.Holo.Light.DarkActionBar": 16974105, + "Widget.Holo.Button.Borderless.Small": 16974106, + "Widget.Holo.Light.Button.Borderless.Small": 16974107, + "TextAppearance.Holo.Widget.ActionBar.Title.Inverse": 16974108, + "TextAppearance.Holo.Widget.ActionBar.Subtitle.Inverse": 16974109, + "TextAppearance.Holo.Widget.ActionMode.Title.Inverse": 16974110, + "TextAppearance.Holo.Widget.ActionMode.Subtitle.Inverse": 16974111, + "TextAppearance.Holo.Widget.ActionBar.Menu": 16974112, + "Widget.Holo.ActionBar.Solid": 16974113, + "Widget.Holo.Light.ActionBar.Solid": 16974114, + "Widget.Holo.Light.ActionBar.Solid.Inverse": 16974115, + "Widget.Holo.Light.ActionBar.TabBar.Inverse": 16974116, + "Widget.Holo.Light.ActionBar.TabView.Inverse": 16974117, + "Widget.Holo.Light.ActionBar.TabText.Inverse": 16974118, + "Widget.Holo.Light.ActionMode.Inverse": 16974119, + "Theme.DeviceDefault": 16974120, + "Theme.DeviceDefault.NoActionBar": 16974121, + "Theme.DeviceDefault.NoActionBar.Fullscreen": 16974122, + "Theme.DeviceDefault.Light": 16974123, + "Theme.DeviceDefault.Light.NoActionBar": 16974124, + "Theme.DeviceDefault.Light.NoActionBar.Fullscreen": 16974125, + "Theme.DeviceDefault.Dialog": 16974126, + "Theme.DeviceDefault.Dialog.MinWidth": 16974127, + "Theme.DeviceDefault.Dialog.NoActionBar": 16974128, + "Theme.DeviceDefault.Dialog.NoActionBar.MinWidth": 16974129, + "Theme.DeviceDefault.Light.Dialog": 16974130, + "Theme.DeviceDefault.Light.Dialog.MinWidth": 16974131, + "Theme.DeviceDefault.Light.Dialog.NoActionBar": 16974132, + "Theme.DeviceDefault.Light.Dialog.NoActionBar.MinWidth": 16974133, + "Theme.DeviceDefault.DialogWhenLarge": 16974134, + "Theme.DeviceDefault.DialogWhenLarge.NoActionBar": 16974135, + "Theme.DeviceDefault.Light.DialogWhenLarge": 16974136, + "Theme.DeviceDefault.Light.DialogWhenLarge.NoActionBar": 16974137, + "Theme.DeviceDefault.Panel": 16974138, + "Theme.DeviceDefault.Light.Panel": 16974139, + "Theme.DeviceDefault.Wallpaper": 16974140, + "Theme.DeviceDefault.Wallpaper.NoTitleBar": 16974141, + "Theme.DeviceDefault.InputMethod": 16974142, + "Theme.DeviceDefault.Light.DarkActionBar": 16974143, + "Widget.DeviceDefault": 16974144, + "Widget.DeviceDefault.Button": 16974145, + "Widget.DeviceDefault.Button.Small": 16974146, + "Widget.DeviceDefault.Button.Inset": 16974147, + "Widget.DeviceDefault.Button.Toggle": 16974148, + "Widget.DeviceDefault.Button.Borderless.Small": 16974149, + "Widget.DeviceDefault.TextView": 16974150, + "Widget.DeviceDefault.AutoCompleteTextView": 16974151, + "Widget.DeviceDefault.CompoundButton.CheckBox": 16974152, + "Widget.DeviceDefault.ListView.DropDown": 16974153, + "Widget.DeviceDefault.EditText": 16974154, + "Widget.DeviceDefault.ExpandableListView": 16974155, + "Widget.DeviceDefault.GridView": 16974156, + "Widget.DeviceDefault.ImageButton": 16974157, + "Widget.DeviceDefault.ListView": 16974158, + "Widget.DeviceDefault.PopupWindow": 16974159, + "Widget.DeviceDefault.ProgressBar": 16974160, + "Widget.DeviceDefault.ProgressBar.Horizontal": 16974161, + "Widget.DeviceDefault.ProgressBar.Small": 16974162, + "Widget.DeviceDefault.ProgressBar.Small.Title": 16974163, + "Widget.DeviceDefault.ProgressBar.Large": 16974164, + "Widget.DeviceDefault.SeekBar": 16974165, + "Widget.DeviceDefault.RatingBar": 16974166, + "Widget.DeviceDefault.RatingBar.Indicator": 16974167, + "Widget.DeviceDefault.RatingBar.Small": 16974168, + "Widget.DeviceDefault.CompoundButton.RadioButton": 16974169, + "Widget.DeviceDefault.ScrollView": 16974170, + "Widget.DeviceDefault.HorizontalScrollView": 16974171, + "Widget.DeviceDefault.Spinner": 16974172, + "Widget.DeviceDefault.CompoundButton.Star": 16974173, + "Widget.DeviceDefault.TabWidget": 16974174, + "Widget.DeviceDefault.WebTextView": 16974175, + "Widget.DeviceDefault.WebView": 16974176, + "Widget.DeviceDefault.DropDownItem": 16974177, + "Widget.DeviceDefault.DropDownItem.Spinner": 16974178, + "Widget.DeviceDefault.TextView.SpinnerItem": 16974179, + "Widget.DeviceDefault.ListPopupWindow": 16974180, + "Widget.DeviceDefault.PopupMenu": 16974181, + "Widget.DeviceDefault.ActionButton": 16974182, + "Widget.DeviceDefault.ActionButton.Overflow": 16974183, + "Widget.DeviceDefault.ActionButton.TextButton": 16974184, + "Widget.DeviceDefault.ActionMode": 16974185, + "Widget.DeviceDefault.ActionButton.CloseMode": 16974186, + "Widget.DeviceDefault.ActionBar": 16974187, + "Widget.DeviceDefault.Button.Borderless": 16974188, + "Widget.DeviceDefault.Tab": 16974189, + "Widget.DeviceDefault.CalendarView": 16974190, + "Widget.DeviceDefault.DatePicker": 16974191, + "Widget.DeviceDefault.ActionBar.TabView": 16974192, + "Widget.DeviceDefault.ActionBar.TabText": 16974193, + "Widget.DeviceDefault.ActionBar.TabBar": 16974194, + "Widget.DeviceDefault.ActionBar.Solid": 16974195, + "Widget.DeviceDefault.Light": 16974196, + "Widget.DeviceDefault.Light.Button": 16974197, + "Widget.DeviceDefault.Light.Button.Small": 16974198, + "Widget.DeviceDefault.Light.Button.Inset": 16974199, + "Widget.DeviceDefault.Light.Button.Toggle": 16974200, + "Widget.DeviceDefault.Light.Button.Borderless.Small": 16974201, + "Widget.DeviceDefault.Light.TextView": 16974202, + "Widget.DeviceDefault.Light.AutoCompleteTextView": 16974203, + "Widget.DeviceDefault.Light.CompoundButton.CheckBox": 16974204, + "Widget.DeviceDefault.Light.ListView.DropDown": 16974205, + "Widget.DeviceDefault.Light.EditText": 16974206, + "Widget.DeviceDefault.Light.ExpandableListView": 16974207, + "Widget.DeviceDefault.Light.GridView": 16974208, + "Widget.DeviceDefault.Light.ImageButton": 16974209, + "Widget.DeviceDefault.Light.ListView": 16974210, + "Widget.DeviceDefault.Light.PopupWindow": 16974211, + "Widget.DeviceDefault.Light.ProgressBar": 16974212, + "Widget.DeviceDefault.Light.ProgressBar.Horizontal": 16974213, + "Widget.DeviceDefault.Light.ProgressBar.Small": 16974214, + "Widget.DeviceDefault.Light.ProgressBar.Small.Title": 16974215, + "Widget.DeviceDefault.Light.ProgressBar.Large": 16974216, + "Widget.DeviceDefault.Light.ProgressBar.Inverse": 16974217, + "Widget.DeviceDefault.Light.ProgressBar.Small.Inverse": 16974218, + "Widget.DeviceDefault.Light.ProgressBar.Large.Inverse": 16974219, + "Widget.DeviceDefault.Light.SeekBar": 16974220, + "Widget.DeviceDefault.Light.RatingBar": 16974221, + "Widget.DeviceDefault.Light.RatingBar.Indicator": 16974222, + "Widget.DeviceDefault.Light.RatingBar.Small": 16974223, + "Widget.DeviceDefault.Light.CompoundButton.RadioButton": 16974224, + "Widget.DeviceDefault.Light.ScrollView": 16974225, + "Widget.DeviceDefault.Light.HorizontalScrollView": 16974226, + "Widget.DeviceDefault.Light.Spinner": 16974227, + "Widget.DeviceDefault.Light.CompoundButton.Star": 16974228, + "Widget.DeviceDefault.Light.TabWidget": 16974229, + "Widget.DeviceDefault.Light.WebTextView": 16974230, + "Widget.DeviceDefault.Light.WebView": 16974231, + "Widget.DeviceDefault.Light.DropDownItem": 16974232, + "Widget.DeviceDefault.Light.DropDownItem.Spinner": 16974233, + "Widget.DeviceDefault.Light.TextView.SpinnerItem": 16974234, + "Widget.DeviceDefault.Light.ListPopupWindow": 16974235, + "Widget.DeviceDefault.Light.PopupMenu": 16974236, + "Widget.DeviceDefault.Light.Tab": 16974237, + "Widget.DeviceDefault.Light.CalendarView": 16974238, + "Widget.DeviceDefault.Light.ActionButton": 16974239, + "Widget.DeviceDefault.Light.ActionButton.Overflow": 16974240, + "Widget.DeviceDefault.Light.ActionMode": 16974241, + "Widget.DeviceDefault.Light.ActionButton.CloseMode": 16974242, + "Widget.DeviceDefault.Light.ActionBar": 16974243, + "Widget.DeviceDefault.Light.ActionBar.TabView": 16974244, + "Widget.DeviceDefault.Light.ActionBar.TabText": 16974245, + "Widget.DeviceDefault.Light.ActionBar.TabBar": 16974246, + "Widget.DeviceDefault.Light.ActionBar.Solid": 16974247, + "Widget.DeviceDefault.Light.ActionBar.Solid.Inverse": 16974248, + "Widget.DeviceDefault.Light.ActionBar.TabBar.Inverse": 16974249, + "Widget.DeviceDefault.Light.ActionBar.TabView.Inverse": 16974250, + "Widget.DeviceDefault.Light.ActionBar.TabText.Inverse": 16974251, + "Widget.DeviceDefault.Light.ActionMode.Inverse": 16974252, + "TextAppearance.DeviceDefault": 16974253, + "TextAppearance.DeviceDefault.Inverse": 16974254, + "TextAppearance.DeviceDefault.Large": 16974255, + "TextAppearance.DeviceDefault.Large.Inverse": 16974256, + "TextAppearance.DeviceDefault.Medium": 16974257, + "TextAppearance.DeviceDefault.Medium.Inverse": 16974258, + "TextAppearance.DeviceDefault.Small": 16974259, + "TextAppearance.DeviceDefault.Small.Inverse": 16974260, + "TextAppearance.DeviceDefault.SearchResult.Title": 16974261, + "TextAppearance.DeviceDefault.SearchResult.Subtitle": 16974262, + "TextAppearance.DeviceDefault.WindowTitle": 16974263, + "TextAppearance.DeviceDefault.DialogWindowTitle": 16974264, + "TextAppearance.DeviceDefault.Widget": 16974265, + "TextAppearance.DeviceDefault.Widget.Button": 16974266, + "TextAppearance.DeviceDefault.Widget.IconMenu.Item": 16974267, + "TextAppearance.DeviceDefault.Widget.TabWidget": 16974268, + "TextAppearance.DeviceDefault.Widget.TextView": 16974269, + "TextAppearance.DeviceDefault.Widget.TextView.PopupMenu": 16974270, + "TextAppearance.DeviceDefault.Widget.DropDownHint": 16974271, + "TextAppearance.DeviceDefault.Widget.DropDownItem": 16974272, + "TextAppearance.DeviceDefault.Widget.TextView.SpinnerItem": 16974273, + "TextAppearance.DeviceDefault.Widget.EditText": 16974274, + "TextAppearance.DeviceDefault.Widget.PopupMenu": 16974275, + "TextAppearance.DeviceDefault.Widget.PopupMenu.Large": 16974276, + "TextAppearance.DeviceDefault.Widget.PopupMenu.Small": 16974277, + "TextAppearance.DeviceDefault.Widget.ActionBar.Title": 16974278, + "TextAppearance.DeviceDefault.Widget.ActionBar.Subtitle": 16974279, + "TextAppearance.DeviceDefault.Widget.ActionMode.Title": 16974280, + "TextAppearance.DeviceDefault.Widget.ActionMode.Subtitle": 16974281, + "TextAppearance.DeviceDefault.Widget.ActionBar.Title.Inverse": 16974282, + "TextAppearance.DeviceDefault.Widget.ActionBar.Subtitle.Inverse": 16974283, + "TextAppearance.DeviceDefault.Widget.ActionMode.Title.Inverse": 16974284, + "TextAppearance.DeviceDefault.Widget.ActionMode.Subtitle.Inverse": 16974285, + "TextAppearance.DeviceDefault.Widget.ActionBar.Menu": 16974286, + "DeviceDefault.ButtonBar": 16974287, + "DeviceDefault.ButtonBar.AlertDialog": 16974288, + "DeviceDefault.SegmentedButton": 16974289, + "DeviceDefault.Light.ButtonBar": 16974290, + "DeviceDefault.Light.ButtonBar.AlertDialog": 16974291, + "DeviceDefault.Light.SegmentedButton": 16974292, + "Widget.Holo.MediaRouteButton": 16974293, + "Widget.Holo.Light.MediaRouteButton": 16974294, + "Widget.DeviceDefault.MediaRouteButton": 16974295, + "Widget.DeviceDefault.Light.MediaRouteButton": 16974296, + "Widget.Holo.CheckedTextView": 16974297, + "Widget.Holo.Light.CheckedTextView": 16974298, + "Widget.DeviceDefault.CheckedTextView": 16974299, + "Widget.DeviceDefault.Light.CheckedTextView": 16974300, + "Theme.Holo.NoActionBar.Overscan": 16974301, + "Theme.Holo.Light.NoActionBar.Overscan": 16974302, + "Theme.DeviceDefault.NoActionBar.Overscan": 16974303, + "Theme.DeviceDefault.Light.NoActionBar.Overscan": 16974304, + "Theme.Holo.NoActionBar.TranslucentDecor": 16974305, + "Theme.Holo.Light.NoActionBar.TranslucentDecor": 16974306, + "Theme.DeviceDefault.NoActionBar.TranslucentDecor": 16974307, + "Theme.DeviceDefault.Light.NoActionBar.TranslucentDecor": 16974308, + "Widget.FastScroll": 16974309, + "Widget.StackView": 16974310, + "Widget.Toolbar": 16974311, + "Widget.Toolbar.Button.Navigation": 16974312, + "Widget.DeviceDefault.FastScroll": 16974313, + "Widget.DeviceDefault.StackView": 16974314, + "Widget.DeviceDefault.Light.FastScroll": 16974315, + "Widget.DeviceDefault.Light.StackView": 16974316, + "TextAppearance.Material": 16974317, + "TextAppearance.Material.Button": 16974318, + "TextAppearance.Material.Body2": 16974319, + "TextAppearance.Material.Body1": 16974320, + "TextAppearance.Material.Caption": 16974321, + "TextAppearance.Material.DialogWindowTitle": 16974322, + "TextAppearance.Material.Display4": 16974323, + "TextAppearance.Material.Display3": 16974324, + "TextAppearance.Material.Display2": 16974325, + "TextAppearance.Material.Display1": 16974326, + "TextAppearance.Material.Headline": 16974327, + "TextAppearance.Material.Inverse": 16974328, + "TextAppearance.Material.Large": 16974329, + "TextAppearance.Material.Large.Inverse": 16974330, + "TextAppearance.Material.Medium": 16974331, + "TextAppearance.Material.Medium.Inverse": 16974332, + "TextAppearance.Material.Menu": 16974333, + "TextAppearance.Material.Notification": 16974334, + "TextAppearance.Material.Notification.Emphasis": 16974335, + "TextAppearance.Material.Notification.Info": 16974336, + "TextAppearance.Material.Notification.Line2": 16974337, + "TextAppearance.Material.Notification.Time": 16974338, + "TextAppearance.Material.Notification.Title": 16974339, + "TextAppearance.Material.SearchResult.Subtitle": 16974340, + "TextAppearance.Material.SearchResult.Title": 16974341, + "TextAppearance.Material.Small": 16974342, + "TextAppearance.Material.Small.Inverse": 16974343, + "TextAppearance.Material.Subhead": 16974344, + "TextAppearance.Material.Title": 16974345, + "TextAppearance.Material.WindowTitle": 16974346, + "TextAppearance.Material.Widget": 16974347, + "TextAppearance.Material.Widget.ActionBar.Menu": 16974348, + "TextAppearance.Material.Widget.ActionBar.Subtitle": 16974349, + "TextAppearance.Material.Widget.ActionBar.Subtitle.Inverse": 16974350, + "TextAppearance.Material.Widget.ActionBar.Title": 16974351, + "TextAppearance.Material.Widget.ActionBar.Title.Inverse": 16974352, + "TextAppearance.Material.Widget.ActionMode.Subtitle": 16974353, + "TextAppearance.Material.Widget.ActionMode.Subtitle.Inverse": 16974354, + "TextAppearance.Material.Widget.ActionMode.Title": 16974355, + "TextAppearance.Material.Widget.ActionMode.Title.Inverse": 16974356, + "TextAppearance.Material.Widget.Button": 16974357, + "TextAppearance.Material.Widget.DropDownHint": 16974358, + "TextAppearance.Material.Widget.DropDownItem": 16974359, + "TextAppearance.Material.Widget.EditText": 16974360, + "TextAppearance.Material.Widget.IconMenu.Item": 16974361, + "TextAppearance.Material.Widget.PopupMenu": 16974362, + "TextAppearance.Material.Widget.PopupMenu.Large": 16974363, + "TextAppearance.Material.Widget.PopupMenu.Small": 16974364, + "TextAppearance.Material.Widget.TabWidget": 16974365, + "TextAppearance.Material.Widget.TextView": 16974366, + "TextAppearance.Material.Widget.TextView.PopupMenu": 16974367, + "TextAppearance.Material.Widget.TextView.SpinnerItem": 16974368, + "TextAppearance.Material.Widget.Toolbar.Subtitle": 16974369, + "TextAppearance.Material.Widget.Toolbar.Title": 16974370, + "Theme.DeviceDefault.Settings": 16974371, + "Theme.Material": 16974372, + "Theme.Material.Dialog": 16974373, + "Theme.Material.Dialog.Alert": 16974374, + "Theme.Material.Dialog.MinWidth": 16974375, + "Theme.Material.Dialog.NoActionBar": 16974376, + "Theme.Material.Dialog.NoActionBar.MinWidth": 16974377, + "Theme.Material.Dialog.Presentation": 16974378, + "Theme.Material.DialogWhenLarge": 16974379, + "Theme.Material.DialogWhenLarge.NoActionBar": 16974380, + "Theme.Material.InputMethod": 16974381, + "Theme.Material.NoActionBar": 16974382, + "Theme.Material.NoActionBar.Fullscreen": 16974383, + "Theme.Material.NoActionBar.Overscan": 16974384, + "Theme.Material.NoActionBar.TranslucentDecor": 16974385, + "Theme.Material.Panel": 16974386, + "Theme.Material.Settings": 16974387, + "Theme.Material.Voice": 16974388, + "Theme.Material.Wallpaper": 16974389, + "Theme.Material.Wallpaper.NoTitleBar": 16974390, + "Theme.Material.Light": 16974391, + "Theme.Material.Light.DarkActionBar": 16974392, + "Theme.Material.Light.Dialog": 16974393, + "Theme.Material.Light.Dialog.Alert": 16974394, + "Theme.Material.Light.Dialog.MinWidth": 16974395, + "Theme.Material.Light.Dialog.NoActionBar": 16974396, + "Theme.Material.Light.Dialog.NoActionBar.MinWidth": 16974397, + "Theme.Material.Light.Dialog.Presentation": 16974398, + "Theme.Material.Light.DialogWhenLarge": 16974399, + "Theme.Material.Light.DialogWhenLarge.NoActionBar": 16974400, + "Theme.Material.Light.NoActionBar": 16974401, + "Theme.Material.Light.NoActionBar.Fullscreen": 16974402, + "Theme.Material.Light.NoActionBar.Overscan": 16974403, + "Theme.Material.Light.NoActionBar.TranslucentDecor": 16974404, + "Theme.Material.Light.Panel": 16974405, + "Theme.Material.Light.Voice": 16974406, + "ThemeOverlay": 16974407, + "ThemeOverlay.Material": 16974408, + "ThemeOverlay.Material.ActionBar": 16974409, + "ThemeOverlay.Material.Light": 16974410, + "ThemeOverlay.Material.Dark": 16974411, + "ThemeOverlay.Material.Dark.ActionBar": 16974412, + "Widget.Material": 16974413, + "Widget.Material.ActionBar": 16974414, + "Widget.Material.ActionBar.Solid": 16974415, + "Widget.Material.ActionBar.TabBar": 16974416, + "Widget.Material.ActionBar.TabText": 16974417, + "Widget.Material.ActionBar.TabView": 16974418, + "Widget.Material.ActionButton": 16974419, + "Widget.Material.ActionButton.CloseMode": 16974420, + "Widget.Material.ActionButton.Overflow": 16974421, + "Widget.Material.ActionMode": 16974422, + "Widget.Material.AutoCompleteTextView": 16974423, + "Widget.Material.Button": 16974424, + "Widget.Material.Button.Borderless": 16974425, + "Widget.Material.Button.Borderless.Colored": 16974426, + "Widget.Material.Button.Borderless.Small": 16974427, + "Widget.Material.Button.Inset": 16974428, + "Widget.Material.Button.Small": 16974429, + "Widget.Material.Button.Toggle": 16974430, + "Widget.Material.ButtonBar": 16974431, + "Widget.Material.ButtonBar.AlertDialog": 16974432, + "Widget.Material.CalendarView": 16974433, + "Widget.Material.CheckedTextView": 16974434, + "Widget.Material.CompoundButton.CheckBox": 16974435, + "Widget.Material.CompoundButton.RadioButton": 16974436, + "Widget.Material.CompoundButton.Star": 16974437, + "Widget.Material.DatePicker": 16974438, + "Widget.Material.DropDownItem": 16974439, + "Widget.Material.DropDownItem.Spinner": 16974440, + "Widget.Material.EditText": 16974441, + "Widget.Material.ExpandableListView": 16974442, + "Widget.Material.FastScroll": 16974443, + "Widget.Material.GridView": 16974444, + "Widget.Material.HorizontalScrollView": 16974445, + "Widget.Material.ImageButton": 16974446, + "Widget.Material.ListPopupWindow": 16974447, + "Widget.Material.ListView": 16974448, + "Widget.Material.ListView.DropDown": 16974449, + "Widget.Material.MediaRouteButton": 16974450, + "Widget.Material.PopupMenu": 16974451, + "Widget.Material.PopupMenu.Overflow": 16974452, + "Widget.Material.PopupWindow": 16974453, + "Widget.Material.ProgressBar": 16974454, + "Widget.Material.ProgressBar.Horizontal": 16974455, + "Widget.Material.ProgressBar.Large": 16974456, + "Widget.Material.ProgressBar.Small": 16974457, + "Widget.Material.ProgressBar.Small.Title": 16974458, + "Widget.Material.RatingBar": 16974459, + "Widget.Material.RatingBar.Indicator": 16974460, + "Widget.Material.RatingBar.Small": 16974461, + "Widget.Material.ScrollView": 16974462, + "Widget.Material.SearchView": 16974463, + "Widget.Material.SeekBar": 16974464, + "Widget.Material.SegmentedButton": 16974465, + "Widget.Material.StackView": 16974466, + "Widget.Material.Spinner": 16974467, + "Widget.Material.Spinner.Underlined": 16974468, + "Widget.Material.Tab": 16974469, + "Widget.Material.TabWidget": 16974470, + "Widget.Material.TextView": 16974471, + "Widget.Material.TextView.SpinnerItem": 16974472, + "Widget.Material.TimePicker": 16974473, + "Widget.Material.Toolbar": 16974474, + "Widget.Material.Toolbar.Button.Navigation": 16974475, + "Widget.Material.WebTextView": 16974476, + "Widget.Material.WebView": 16974477, + "Widget.Material.Light": 16974478, + "Widget.Material.Light.ActionBar": 16974479, + "Widget.Material.Light.ActionBar.Solid": 16974480, + "Widget.Material.Light.ActionBar.TabBar": 16974481, + "Widget.Material.Light.ActionBar.TabText": 16974482, + "Widget.Material.Light.ActionBar.TabView": 16974483, + "Widget.Material.Light.ActionButton": 16974484, + "Widget.Material.Light.ActionButton.CloseMode": 16974485, + "Widget.Material.Light.ActionButton.Overflow": 16974486, + "Widget.Material.Light.ActionMode": 16974487, + "Widget.Material.Light.AutoCompleteTextView": 16974488, + "Widget.Material.Light.Button": 16974489, + "Widget.Material.Light.Button.Borderless": 16974490, + "Widget.Material.Light.Button.Borderless.Colored": 16974491, + "Widget.Material.Light.Button.Borderless.Small": 16974492, + "Widget.Material.Light.Button.Inset": 16974493, + "Widget.Material.Light.Button.Small": 16974494, + "Widget.Material.Light.Button.Toggle": 16974495, + "Widget.Material.Light.ButtonBar": 16974496, + "Widget.Material.Light.ButtonBar.AlertDialog": 16974497, + "Widget.Material.Light.CalendarView": 16974498, + "Widget.Material.Light.CheckedTextView": 16974499, + "Widget.Material.Light.CompoundButton.CheckBox": 16974500, + "Widget.Material.Light.CompoundButton.RadioButton": 16974501, + "Widget.Material.Light.CompoundButton.Star": 16974502, + "Widget.Material.Light.DatePicker": 16974503, + "Widget.Material.Light.DropDownItem": 16974504, + "Widget.Material.Light.DropDownItem.Spinner": 16974505, + "Widget.Material.Light.EditText": 16974506, + "Widget.Material.Light.ExpandableListView": 16974507, + "Widget.Material.Light.FastScroll": 16974508, + "Widget.Material.Light.GridView": 16974509, + "Widget.Material.Light.HorizontalScrollView": 16974510, + "Widget.Material.Light.ImageButton": 16974511, + "Widget.Material.Light.ListPopupWindow": 16974512, + "Widget.Material.Light.ListView": 16974513, + "Widget.Material.Light.ListView.DropDown": 16974514, + "Widget.Material.Light.MediaRouteButton": 16974515, + "Widget.Material.Light.PopupMenu": 16974516, + "Widget.Material.Light.PopupMenu.Overflow": 16974517, + "Widget.Material.Light.PopupWindow": 16974518, + "Widget.Material.Light.ProgressBar": 16974519, + "Widget.Material.Light.ProgressBar.Horizontal": 16974520, + "Widget.Material.Light.ProgressBar.Inverse": 16974521, + "Widget.Material.Light.ProgressBar.Large": 16974522, + "Widget.Material.Light.ProgressBar.Large.Inverse": 16974523, + "Widget.Material.Light.ProgressBar.Small": 16974524, + "Widget.Material.Light.ProgressBar.Small.Inverse": 16974525, + "Widget.Material.Light.ProgressBar.Small.Title": 16974526, + "Widget.Material.Light.RatingBar": 16974527, + "Widget.Material.Light.RatingBar.Indicator": 16974528, + "Widget.Material.Light.RatingBar.Small": 16974529, + "Widget.Material.Light.ScrollView": 16974530, + "Widget.Material.Light.SearchView": 16974531, + "Widget.Material.Light.SeekBar": 16974532, + "Widget.Material.Light.SegmentedButton": 16974533, + "Widget.Material.Light.StackView": 16974534, + "Widget.Material.Light.Spinner": 16974535, + "Widget.Material.Light.Spinner.Underlined": 16974536, + "Widget.Material.Light.Tab": 16974537, + "Widget.Material.Light.TabWidget": 16974538, + "Widget.Material.Light.TextView": 16974539, + "Widget.Material.Light.TextView.SpinnerItem": 16974540, + "Widget.Material.Light.TimePicker": 16974541, + "Widget.Material.Light.WebTextView": 16974542, + "Widget.Material.Light.WebView": 16974543, + "Theme.Leanback.FormWizard": 16974544, + "Theme.DeviceDefault.Dialog.Alert": 16974545, + "Theme.DeviceDefault.Light.Dialog.Alert": 16974546, + "Widget.Material.Button.Colored": 16974547, + "TextAppearance.Material.Widget.Button.Inverse": 16974548, + "Theme.Material.Light.LightStatusBar": 16974549, + "ThemeOverlay.Material.Dialog": 16974550, + "ThemeOverlay.Material.Dialog.Alert": 16974551, + "Theme.Material.Light.DialogWhenLarge.DarkActionBar": 16974552, + "Widget.Material.SeekBar.Discrete": 16974553, + "Widget.Material.CompoundButton.Switch": 16974554, + "Widget.Material.Light.CompoundButton.Switch": 16974555, + "Widget.Material.NumberPicker": 16974556, + "Widget.Material.Light.NumberPicker": 16974557, + "TextAppearance.Material.Widget.Button.Colored": 16974558, + "TextAppearance.Material.Widget.Button.Borderless.Colored": 16974559 + }, + "string": { + "cancel": 17039360, + "copy": 17039361, + "copyUrl": 17039362, + "cut": 17039363, + "defaultVoiceMailAlphaTag": 17039364, + "defaultMsisdnAlphaTag": 17039365, + "emptyPhoneNumber": 17039366, + "httpErrorBadUrl": 17039367, + "httpErrorUnsupportedScheme": 17039368, + "no": 17039369, + "ok": 17039370, + "paste": 17039371, + "search_go": 17039372, + "selectAll": 17039373, + "unknownName": 17039374, + "untitled": 17039375, + "VideoView_error_button": 17039376, + "VideoView_error_text_unknown": 17039377, + "VideoView_error_title": 17039378, + "yes": 17039379, + "dialog_alert_title": 17039380, + "VideoView_error_text_invalid_progressive_playback": 17039381, + "selectTextMode": 17039382, + "status_bar_notification_info_overflow": 17039383, + "fingerprint_icon_content_description": 17039384, + "paste_as_plain_text": 17039385, + "autofill": 17039386 + }, + "dimen": { + "app_icon_size": 17104896, + "thumbnail_height": 17104897, + "thumbnail_width": 17104898, + "dialog_min_width_major": 17104899, + "dialog_min_width_minor": 17104900, + "notification_large_icon_width": 17104901, + "notification_large_icon_height": 17104902 + }, + "color": { + "darker_gray": 17170432, + "primary_text_dark": 17170433, + "primary_text_dark_nodisable": 17170434, + "primary_text_light": 17170435, + "primary_text_light_nodisable": 17170436, + "secondary_text_dark": 17170437, + "secondary_text_dark_nodisable": 17170438, + "secondary_text_light": 17170439, + "secondary_text_light_nodisable": 17170440, + "tab_indicator_text": 17170441, + "widget_edittext_dark": 17170442, + "white": 17170443, + "black": 17170444, + "transparent": 17170445, + "background_dark": 17170446, + "background_light": 17170447, + "tertiary_text_dark": 17170448, + "tertiary_text_light": 17170449, + "holo_blue_light": 17170450, + "holo_blue_dark": 17170451, + "holo_green_light": 17170452, + "holo_green_dark": 17170453, + "holo_red_light": 17170454, + "holo_red_dark": 17170455, + "holo_orange_light": 17170456, + "holo_orange_dark": 17170457, + "holo_purple": 17170458, + "holo_blue_bright": 17170459 + }, + "array": { + "emailAddressTypes": 17235968, + "imProtocols": 17235969, + "organizationTypes": 17235970, + "phoneTypes": 17235971, + "postalAddressTypes": 17235972, + "config_keySystemUuidMapping": 17235973 + }, + "drawable": { + "alert_dark_frame": 17301504, + "alert_light_frame": 17301505, + "arrow_down_float": 17301506, + "arrow_up_float": 17301507, + "btn_default": 17301508, + "btn_default_small": 17301509, + "btn_dropdown": 17301510, + "btn_minus": 17301511, + "btn_plus": 17301512, + "btn_radio": 17301513, + "btn_star": 17301514, + "btn_star_big_off": 17301515, + "btn_star_big_on": 17301516, + "button_onoff_indicator_on": 17301517, + "button_onoff_indicator_off": 17301518, + "checkbox_off_background": 17301519, + "checkbox_on_background": 17301520, + "dialog_frame": 17301521, + "divider_horizontal_bright": 17301522, + "divider_horizontal_textfield": 17301523, + "divider_horizontal_dark": 17301524, + "divider_horizontal_dim_dark": 17301525, + "edit_text": 17301526, + "btn_dialog": 17301527, + "editbox_background": 17301528, + "editbox_background_normal": 17301529, + "editbox_dropdown_dark_frame": 17301530, + "editbox_dropdown_light_frame": 17301531, + "gallery_thumb": 17301532, + "ic_delete": 17301533, + "ic_lock_idle_charging": 17301534, + "ic_lock_idle_lock": 17301535, + "ic_lock_idle_low_battery": 17301536, + "ic_media_ff": 17301537, + "ic_media_next": 17301538, + "ic_media_pause": 17301539, + "ic_media_play": 17301540, + "ic_media_previous": 17301541, + "ic_media_rew": 17301542, + "ic_dialog_alert": 17301543, + "ic_dialog_dialer": 17301544, + "ic_dialog_email": 17301545, + "ic_dialog_map": 17301546, + "ic_input_add": 17301547, + "ic_input_delete": 17301548, + "ic_input_get": 17301549, + "ic_lock_idle_alarm": 17301550, + "ic_lock_lock": 17301551, + "ic_lock_power_off": 17301552, + "ic_lock_silent_mode": 17301553, + "ic_lock_silent_mode_off": 17301554, + "ic_menu_add": 17301555, + "ic_menu_agenda": 17301556, + "ic_menu_always_landscape_portrait": 17301557, + "ic_menu_call": 17301558, + "ic_menu_camera": 17301559, + "ic_menu_close_clear_cancel": 17301560, + "ic_menu_compass": 17301561, + "ic_menu_crop": 17301562, + "ic_menu_day": 17301563, + "ic_menu_delete": 17301564, + "ic_menu_directions": 17301565, + "ic_menu_edit": 17301566, + "ic_menu_gallery": 17301567, + "ic_menu_help": 17301568, + "ic_menu_info_details": 17301569, + "ic_menu_manage": 17301570, + "ic_menu_mapmode": 17301571, + "ic_menu_month": 17301572, + "ic_menu_more": 17301573, + "ic_menu_my_calendar": 17301574, + "ic_menu_mylocation": 17301575, + "ic_menu_myplaces": 17301576, + "ic_menu_preferences": 17301577, + "ic_menu_recent_history": 17301578, + "ic_menu_report_image": 17301579, + "ic_menu_revert": 17301580, + "ic_menu_rotate": 17301581, + "ic_menu_save": 17301582, + "ic_menu_search": 17301583, + "ic_menu_send": 17301584, + "ic_menu_set_as": 17301585, + "ic_menu_share": 17301586, + "ic_menu_slideshow": 17301587, + "ic_menu_today": 17301588, + "ic_menu_upload": 17301589, + "ic_menu_upload_you_tube": 17301590, + "ic_menu_view": 17301591, + "ic_menu_week": 17301592, + "ic_menu_zoom": 17301593, + "ic_notification_clear_all": 17301594, + "ic_notification_overlay": 17301595, + "ic_partial_secure": 17301596, + "ic_popup_disk_full": 17301597, + "ic_popup_reminder": 17301598, + "ic_popup_sync": 17301599, + "ic_search_category_default": 17301600, + "ic_secure": 17301601, + "list_selector_background": 17301602, + "menu_frame": 17301603, + "menu_full_frame": 17301604, + "menuitem_background": 17301605, + "picture_frame": 17301606, + "presence_away": 17301607, + "presence_busy": 17301608, + "presence_invisible": 17301609, + "presence_offline": 17301610, + "presence_online": 17301611, + "progress_horizontal": 17301612, + "progress_indeterminate_horizontal": 17301613, + "radiobutton_off_background": 17301614, + "radiobutton_on_background": 17301615, + "spinner_background": 17301616, + "spinner_dropdown_background": 17301617, + "star_big_on": 17301618, + "star_big_off": 17301619, + "star_on": 17301620, + "star_off": 17301621, + "stat_notify_call_mute": 17301622, + "stat_notify_chat": 17301623, + "stat_notify_error": 17301624, + "stat_notify_more": 17301625, + "stat_notify_sdcard": 17301626, + "stat_notify_sdcard_usb": 17301627, + "stat_notify_sync": 17301628, + "stat_notify_sync_noanim": 17301629, + "stat_notify_voicemail": 17301630, + "stat_notify_missed_call": 17301631, + "stat_sys_data_bluetooth": 17301632, + "stat_sys_download": 17301633, + "stat_sys_download_done": 17301634, + "stat_sys_headset": 17301635, + "stat_sys_phone_call": 17301636, + "stat_sys_phone_call_forward": 17301637, + "stat_sys_phone_call_on_hold": 17301638, + "stat_sys_speakerphone": 17301639, + "stat_sys_upload": 17301640, + "stat_sys_upload_done": 17301641, + "stat_sys_warning": 17301642, + "status_bar_item_app_background": 17301643, + "status_bar_item_background": 17301644, + "sym_action_call": 17301645, + "sym_action_chat": 17301646, + "sym_action_email": 17301647, + "sym_call_incoming": 17301648, + "sym_call_missed": 17301649, + "sym_call_outgoing": 17301650, + "sym_def_app_icon": 17301651, + "sym_contact_card": 17301652, + "title_bar": 17301653, + "toast_frame": 17301654, + "zoom_plate": 17301655, + "screen_background_dark": 17301656, + "screen_background_light": 17301657, + "bottom_bar": 17301658, + "ic_dialog_info": 17301659, + "ic_menu_sort_alphabetically": 17301660, + "ic_menu_sort_by_size": 17301661, + "ic_btn_speak_now": 17301668, + "dark_header": 17301669, + "title_bar_tall": 17301670, + "stat_sys_vp_phone_call": 17301671, + "stat_sys_vp_phone_call_on_hold": 17301672, + "screen_background_dark_transparent": 17301673, + "screen_background_light_transparent": 17301674, + "stat_notify_sdcard_prepare": 17301675, + "presence_video_away": 17301676, + "presence_video_busy": 17301677, + "presence_video_online": 17301678, + "presence_audio_away": 17301679, + "presence_audio_busy": 17301680, + "presence_audio_online": 17301681, + "dialog_holo_dark_frame": 17301682, + "dialog_holo_light_frame": 17301683 + }, + "layout": { + "activity_list_item": 17367040, + "expandable_list_content": 17367041, + "preference_category": 17367042, + "simple_list_item_1": 17367043, + "simple_list_item_2": 17367044, + "simple_list_item_checked": 17367045, + "simple_expandable_list_item_1": 17367046, + "simple_expandable_list_item_2": 17367047, + "simple_spinner_item": 17367048, + "simple_spinner_dropdown_item": 17367049, + "simple_dropdown_item_1line": 17367050, + "simple_gallery_item": 17367051, + "test_list_item": 17367052, + "two_line_list_item": 17367053, + "browser_link_context_header": 17367054, + "simple_list_item_single_choice": 17367055, + "simple_list_item_multiple_choice": 17367056, + "select_dialog_item": 17367057, + "select_dialog_singlechoice": 17367058, + "select_dialog_multichoice": 17367059, + "list_content": 17367060, + "simple_selectable_list_item": 17367061, + "simple_list_item_activated_1": 17367062, + "simple_list_item_activated_2": 17367063 + }, + "anim": { + "fade_in": 17432576, + "fade_out": 17432577, + "slide_in_left": 17432578, + "slide_out_right": 17432579, + "accelerate_decelerate_interpolator": 17432580, + "accelerate_interpolator": 17432581, + "decelerate_interpolator": 17432582, + "anticipate_interpolator": 17432583, + "overshoot_interpolator": 17432584, + "anticipate_overshoot_interpolator": 17432585, + "bounce_interpolator": 17432586, + "linear_interpolator": 17432587, + "cycle_interpolator": 17432588 + }, + "integer": { + "config_shortAnimTime": 17694720, + "config_mediumAnimTime": 17694721, + "config_longAnimTime": 17694722, + "status_bar_notification_info_maxnum": 17694723 + }, + "animator": { + "fade_in": 17498112, + "fade_out": 17498113 + }, + "interpolator": { + "accelerate_quad": 17563648, + "decelerate_quad": 17563649, + "accelerate_cubic": 17563650, + "decelerate_cubic": 17563651, + "accelerate_quint": 17563652, + "decelerate_quint": 17563653, + "accelerate_decelerate": 17563654, + "anticipate": 17563655, + "overshoot": 17563656, + "anticipate_overshoot": 17563657, + "bounce": 17563658, + "linear": 17563659, + "cycle": 17563660, + "fast_out_slow_in": 17563661, + "linear_out_slow_in": 17563662, + "fast_out_linear_in": 17563663 + }, + "mipmap": { + "sym_def_app_icon": 17629184 + }, + "transition": { + "no_transition": 17760256, + "move": 17760257, + "fade": 17760258, + "explode": 17760259, + "slide_bottom": 17760260, + "slide_top": 17760261, + "slide_right": 17760262, + "slide_left": 17760263 + }, + "raw": { + "loaderror": 17825792, + "nodomain": 17825793 + } +} diff --git a/pyaxmlparser/resources/public.py b/pyaxmlparser/resources/public.py new file mode 100644 index 0000000..d7465af --- /dev/null +++ b/pyaxmlparser/resources/public.py @@ -0,0 +1,63 @@ +import os +from xml.dom import minidom + +_public_res = None +# copy the newest sdk/platforms/android-?/data/res/values/public.xml here +if _public_res is None: + _public_res = {} + root = os.path.dirname(os.path.realpath(__file__)) + xmlfile = os.path.join(root, "public.xml") + if os.path.isfile(xmlfile): + with open(xmlfile, "r") as fp: + _xml = minidom.parseString(fp.read()) + for element in _xml.getElementsByTagName("public"): + _type = element.getAttribute('type') + _name = element.getAttribute('name') + _id = int(element.getAttribute('id'), 16) + if _type not in _public_res: + _public_res[_type] = {} + _public_res[_type][_name] = _id + else: + raise Exception("need to copy the sdk/platforms/android-?/data/res/values/public.xml here") + +SYSTEM_RESOURCES = { + "attributes": { + "forward": {k: v for k, v in _public_res['attr'].items()}, + "inverse": {v: k for k, v in _public_res['attr'].items()} + }, + "styles": { + "forward": {k: v for k, v in _public_res['style'].items()}, + "inverse": {v: k for k, v in _public_res['style'].items()} + }, + "drawables": { + "forward": {k: v for k, v in _public_res['drawable'].items()}, + "inverse": {v: k for k, v in _public_res['drawable'].items()} + }, + "mipmaps": { + "forward": {k: v for k, v in _public_res['mipmap'].items()}, + "inverse": {v: k for k, v in _public_res['mipmap'].items()} + } +} + + +if __name__ == '__main__': + import json + _resources = None + if _resources is None: + root = os.path.dirname(os.path.realpath(__file__)) + resfile = os.path.join(root, "public.json") + + if os.path.isfile(resfile): + with open(resfile, "r") as fp: + _resources = json.load(fp) + else: + # TODO raise error instead? + _resources = {} + for _type in set([] + list(_public_res.keys()) + list(_resources.keys())): + for k in set([] + list(_public_res.get(_type, {}).keys()) + + list(_resources.get(_type, {}).keys())): + a, b = _public_res.get(_type, {}).get(k), \ + _resources.get(_type, {}).get(k), + if a != b: + print(k, a, b) + print(None) diff --git a/pyaxmlparser/resources/public.xml b/pyaxmlparser/resources/public.xml new file mode 100644 index 0000000..bbd29c5 --- /dev/null +++ b/pyaxmlparser/resources/public.xml @@ -0,0 +1,2861 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- This file defines the base public resources exported by the + platform, which must always exist. --> + +<!-- *************************************************************** + *************************************************************** + IMPORTANT NOTE FOR ANYONE MODIFYING THIS FILE + READ THIS BEFORE YOU MAKE ANY CHANGES + + This file defines the binary compatibility for resources. As such, + you must be very careful when making changes here, or you will + completely break backwards compatibility with old applications. + + To avoid breaking compatibility, all new resources must be placed + at the end of the list of resources of the same type. Placing a resource + in the middle of type will cause all following resources to be + assigned new resource numbers, breaking compatibility. + + *************************************************************** + *************************************************************** --> +<resources> + +<!-- =============================================================== + Resources for version 1 of the platform. + =============================================================== --> + <eat-comment /> + + <public type="attr" name="theme" id="0x01010000" /> + <public type="attr" name="label" id="0x01010001" /> + <public type="attr" name="icon" id="0x01010002" /> + <public type="attr" name="name" id="0x01010003" /> + <public type="attr" name="manageSpaceActivity" id="0x01010004" /> + <public type="attr" name="allowClearUserData" id="0x01010005" /> + <public type="attr" name="permission" id="0x01010006" /> + <public type="attr" name="readPermission" id="0x01010007" /> + <public type="attr" name="writePermission" id="0x01010008" /> + <public type="attr" name="protectionLevel" id="0x01010009" /> + <public type="attr" name="permissionGroup" id="0x0101000a" /> + <public type="attr" name="sharedUserId" id="0x0101000b" /> + <public type="attr" name="hasCode" id="0x0101000c" /> + <public type="attr" name="persistent" id="0x0101000d" /> + <public type="attr" name="enabled" id="0x0101000e" /> + <public type="attr" name="debuggable" id="0x0101000f" /> + <public type="attr" name="exported" id="0x01010010" /> + <public type="attr" name="process" id="0x01010011" /> + <public type="attr" name="taskAffinity" id="0x01010012" /> + <public type="attr" name="multiprocess" id="0x01010013" /> + <public type="attr" name="finishOnTaskLaunch" id="0x01010014" /> + <public type="attr" name="clearTaskOnLaunch" id="0x01010015" /> + <public type="attr" name="stateNotNeeded" id="0x01010016" /> + <public type="attr" name="excludeFromRecents" id="0x01010017" /> + <public type="attr" name="authorities" id="0x01010018" /> + <public type="attr" name="syncable" id="0x01010019" /> + <public type="attr" name="initOrder" id="0x0101001a" /> + <public type="attr" name="grantUriPermissions" id="0x0101001b" /> + <public type="attr" name="priority" id="0x0101001c" /> + <public type="attr" name="launchMode" id="0x0101001d" /> + <public type="attr" name="screenOrientation" id="0x0101001e" /> + <public type="attr" name="configChanges" id="0x0101001f" /> + <public type="attr" name="description" id="0x01010020" /> + <public type="attr" name="targetPackage" id="0x01010021" /> + <public type="attr" name="handleProfiling" id="0x01010022" /> + <public type="attr" name="functionalTest" id="0x01010023" /> + <public type="attr" name="value" id="0x01010024" /> + <public type="attr" name="resource" id="0x01010025" /> + <public type="attr" name="mimeType" id="0x01010026" /> + <public type="attr" name="scheme" id="0x01010027" /> + <public type="attr" name="host" id="0x01010028" /> + <public type="attr" name="port" id="0x01010029" /> + <public type="attr" name="path" id="0x0101002a" /> + <public type="attr" name="pathPrefix" id="0x0101002b" /> + <public type="attr" name="pathPattern" id="0x0101002c" /> + <public type="attr" name="action" id="0x0101002d" /> + <public type="attr" name="data" id="0x0101002e" /> + <public type="attr" name="targetClass" id="0x0101002f" /> + <public type="attr" name="colorForeground" id="0x01010030" /> + <public type="attr" name="colorBackground" id="0x01010031" /> + <public type="attr" name="backgroundDimAmount" id="0x01010032" /> + <public type="attr" name="disabledAlpha" id="0x01010033" /> + <public type="attr" name="textAppearance" id="0x01010034" /> + <public type="attr" name="textAppearanceInverse" id="0x01010035" /> + <public type="attr" name="textColorPrimary" id="0x01010036" /> + <public type="attr" name="textColorPrimaryDisableOnly" id="0x01010037" /> + <public type="attr" name="textColorSecondary" id="0x01010038" /> + <public type="attr" name="textColorPrimaryInverse" id="0x01010039" /> + <public type="attr" name="textColorSecondaryInverse" id="0x0101003a" /> + <public type="attr" name="textColorPrimaryNoDisable" id="0x0101003b" /> + <public type="attr" name="textColorSecondaryNoDisable" id="0x0101003c" /> + <public type="attr" name="textColorPrimaryInverseNoDisable" id="0x0101003d" /> + <public type="attr" name="textColorSecondaryInverseNoDisable" id="0x0101003e" /> + <public type="attr" name="textColorHintInverse" id="0x0101003f" /> + <public type="attr" name="textAppearanceLarge" id="0x01010040" /> + <public type="attr" name="textAppearanceMedium" id="0x01010041" /> + <public type="attr" name="textAppearanceSmall" id="0x01010042" /> + <public type="attr" name="textAppearanceLargeInverse" id="0x01010043" /> + <public type="attr" name="textAppearanceMediumInverse" id="0x01010044" /> + <public type="attr" name="textAppearanceSmallInverse" id="0x01010045" /> + <public type="attr" name="textCheckMark" id="0x01010046" /> + <public type="attr" name="textCheckMarkInverse" id="0x01010047" /> + <public type="attr" name="buttonStyle" id="0x01010048" /> + <public type="attr" name="buttonStyleSmall" id="0x01010049" /> + <public type="attr" name="buttonStyleInset" id="0x0101004a" /> + <public type="attr" name="buttonStyleToggle" id="0x0101004b" /> + <public type="attr" name="galleryItemBackground" id="0x0101004c" /> + <public type="attr" name="listPreferredItemHeight" id="0x0101004d" /> + <public type="attr" name="expandableListPreferredItemPaddingLeft" id="0x0101004e" /> + <public type="attr" name="expandableListPreferredChildPaddingLeft" id="0x0101004f" /> + <public type="attr" name="expandableListPreferredItemIndicatorLeft" id="0x01010050" /> + <public type="attr" name="expandableListPreferredItemIndicatorRight" id="0x01010051" /> + <public type="attr" name="expandableListPreferredChildIndicatorLeft" id="0x01010052" /> + <public type="attr" name="expandableListPreferredChildIndicatorRight" id="0x01010053" /> + <public type="attr" name="windowBackground" id="0x01010054" /> + <public type="attr" name="windowFrame" id="0x01010055" /> + <public type="attr" name="windowNoTitle" id="0x01010056" /> + <public type="attr" name="windowIsFloating" id="0x01010057" /> + <public type="attr" name="windowIsTranslucent" id="0x01010058" /> + <public type="attr" name="windowContentOverlay" id="0x01010059" /> + <public type="attr" name="windowTitleSize" id="0x0101005a" /> + <public type="attr" name="windowTitleStyle" id="0x0101005b" /> + <public type="attr" name="windowTitleBackgroundStyle" id="0x0101005c" /> + <public type="attr" name="alertDialogStyle" id="0x0101005d" /> + <public type="attr" name="panelBackground" id="0x0101005e" /> + <public type="attr" name="panelFullBackground" id="0x0101005f" /> + <public type="attr" name="panelColorForeground" id="0x01010060" /> + <public type="attr" name="panelColorBackground" id="0x01010061" /> + <public type="attr" name="panelTextAppearance" id="0x01010062" /> + <public type="attr" name="scrollbarSize" id="0x01010063" /> + <public type="attr" name="scrollbarThumbHorizontal" id="0x01010064" /> + <public type="attr" name="scrollbarThumbVertical" id="0x01010065" /> + <public type="attr" name="scrollbarTrackHorizontal" id="0x01010066" /> + <public type="attr" name="scrollbarTrackVertical" id="0x01010067" /> + <public type="attr" name="scrollbarAlwaysDrawHorizontalTrack" id="0x01010068" /> + <public type="attr" name="scrollbarAlwaysDrawVerticalTrack" id="0x01010069" /> + <public type="attr" name="absListViewStyle" id="0x0101006a" /> + <public type="attr" name="autoCompleteTextViewStyle" id="0x0101006b" /> + <public type="attr" name="checkboxStyle" id="0x0101006c" /> + <public type="attr" name="dropDownListViewStyle" id="0x0101006d" /> + <public type="attr" name="editTextStyle" id="0x0101006e" /> + <public type="attr" name="expandableListViewStyle" id="0x0101006f" /> + <public type="attr" name="galleryStyle" id="0x01010070" /> + <public type="attr" name="gridViewStyle" id="0x01010071" /> + <public type="attr" name="imageButtonStyle" id="0x01010072" /> + <public type="attr" name="imageWellStyle" id="0x01010073" /> + <public type="attr" name="listViewStyle" id="0x01010074" /> + <public type="attr" name="listViewWhiteStyle" id="0x01010075" /> + <public type="attr" name="popupWindowStyle" id="0x01010076" /> + <public type="attr" name="progressBarStyle" id="0x01010077" /> + <public type="attr" name="progressBarStyleHorizontal" id="0x01010078" /> + <public type="attr" name="progressBarStyleSmall" id="0x01010079" /> + <public type="attr" name="progressBarStyleLarge" id="0x0101007a" /> + <public type="attr" name="seekBarStyle" id="0x0101007b" /> + <public type="attr" name="ratingBarStyle" id="0x0101007c" /> + <public type="attr" name="ratingBarStyleSmall" id="0x0101007d" /> + <public type="attr" name="radioButtonStyle" id="0x0101007e" /> + <public type="attr" name="scrollbarStyle" id="0x0101007f" /> + <public type="attr" name="scrollViewStyle" id="0x01010080" /> + <public type="attr" name="spinnerStyle" id="0x01010081" /> + <public type="attr" name="starStyle" id="0x01010082" /> + <public type="attr" name="tabWidgetStyle" id="0x01010083" /> + <public type="attr" name="textViewStyle" id="0x01010084" /> + <public type="attr" name="webViewStyle" id="0x01010085" /> + <public type="attr" name="dropDownItemStyle" id="0x01010086" /> + <public type="attr" name="spinnerDropDownItemStyle" id="0x01010087" /> + <public type="attr" name="dropDownHintAppearance" id="0x01010088" /> + <public type="attr" name="spinnerItemStyle" id="0x01010089" /> + <public type="attr" name="mapViewStyle" id="0x0101008a" /> + <public type="attr" name="preferenceScreenStyle" id="0x0101008b" /> + <public type="attr" name="preferenceCategoryStyle" id="0x0101008c" /> + <public type="attr" name="preferenceInformationStyle" id="0x0101008d" /> + <public type="attr" name="preferenceStyle" id="0x0101008e" /> + <public type="attr" name="checkBoxPreferenceStyle" id="0x0101008f" /> + <public type="attr" name="yesNoPreferenceStyle" id="0x01010090" /> + <public type="attr" name="dialogPreferenceStyle" id="0x01010091" /> + <public type="attr" name="editTextPreferenceStyle" id="0x01010092" /> + <public type="attr" name="ringtonePreferenceStyle" id="0x01010093" /> + <public type="attr" name="preferenceLayoutChild" id="0x01010094" /> + <public type="attr" name="textSize" id="0x01010095" /> + <public type="attr" name="typeface" id="0x01010096" /> + <public type="attr" name="textStyle" id="0x01010097" /> + <public type="attr" name="textColor" id="0x01010098" /> + <public type="attr" name="textColorHighlight" id="0x01010099" /> + <public type="attr" name="textColorHint" id="0x0101009a" /> + <public type="attr" name="textColorLink" id="0x0101009b" /> + <public type="attr" name="state_focused" id="0x0101009c" /> + <public type="attr" name="state_window_focused" id="0x0101009d" /> + <public type="attr" name="state_enabled" id="0x0101009e" /> + <public type="attr" name="state_checkable" id="0x0101009f" /> + <public type="attr" name="state_checked" id="0x010100a0" /> + <public type="attr" name="state_selected" id="0x010100a1" /> + <public type="attr" name="state_active" id="0x010100a2" /> + <public type="attr" name="state_single" id="0x010100a3" /> + <public type="attr" name="state_first" id="0x010100a4" /> + <public type="attr" name="state_middle" id="0x010100a5" /> + <public type="attr" name="state_last" id="0x010100a6" /> + <public type="attr" name="state_pressed" id="0x010100a7" /> + <public type="attr" name="state_expanded" id="0x010100a8" /> + <public type="attr" name="state_empty" id="0x010100a9" /> + <public type="attr" name="state_above_anchor" id="0x010100aa" /> + <public type="attr" name="ellipsize" id="0x010100ab" /> + <public type="attr" name="x" id="0x010100ac" /> + <public type="attr" name="y" id="0x010100ad" /> + <public type="attr" name="windowAnimationStyle" id="0x010100ae" /> + <public type="attr" name="gravity" id="0x010100af" /> + <public type="attr" name="autoLink" id="0x010100b0" /> + <public type="attr" name="linksClickable" id="0x010100b1" /> + <public type="attr" name="entries" id="0x010100b2" /> + <public type="attr" name="layout_gravity" id="0x010100b3" /> + <public type="attr" name="windowEnterAnimation" id="0x010100b4" /> + <public type="attr" name="windowExitAnimation" id="0x010100b5" /> + <public type="attr" name="windowShowAnimation" id="0x010100b6" /> + <public type="attr" name="windowHideAnimation" id="0x010100b7" /> + <public type="attr" name="activityOpenEnterAnimation" id="0x010100b8" /> + <public type="attr" name="activityOpenExitAnimation" id="0x010100b9" /> + <public type="attr" name="activityCloseEnterAnimation" id="0x010100ba" /> + <public type="attr" name="activityCloseExitAnimation" id="0x010100bb" /> + <public type="attr" name="taskOpenEnterAnimation" id="0x010100bc" /> + <public type="attr" name="taskOpenExitAnimation" id="0x010100bd" /> + <public type="attr" name="taskCloseEnterAnimation" id="0x010100be" /> + <public type="attr" name="taskCloseExitAnimation" id="0x010100bf" /> + <public type="attr" name="taskToFrontEnterAnimation" id="0x010100c0" /> + <public type="attr" name="taskToFrontExitAnimation" id="0x010100c1" /> + <public type="attr" name="taskToBackEnterAnimation" id="0x010100c2" /> + <public type="attr" name="taskToBackExitAnimation" id="0x010100c3" /> + <public type="attr" name="orientation" id="0x010100c4" /> + <public type="attr" name="keycode" id="0x010100c5" /> + <public type="attr" name="fullDark" id="0x010100c6" /> + <public type="attr" name="topDark" id="0x010100c7" /> + <public type="attr" name="centerDark" id="0x010100c8" /> + <public type="attr" name="bottomDark" id="0x010100c9" /> + <public type="attr" name="fullBright" id="0x010100ca" /> + <public type="attr" name="topBright" id="0x010100cb" /> + <public type="attr" name="centerBright" id="0x010100cc" /> + <public type="attr" name="bottomBright" id="0x010100cd" /> + <public type="attr" name="bottomMedium" id="0x010100ce" /> + <public type="attr" name="centerMedium" id="0x010100cf" /> + <public type="attr" name="id" id="0x010100d0" /> + <public type="attr" name="tag" id="0x010100d1" /> + <public type="attr" name="scrollX" id="0x010100d2" /> + <public type="attr" name="scrollY" id="0x010100d3" /> + <public type="attr" name="background" id="0x010100d4" /> + <public type="attr" name="padding" id="0x010100d5" /> + <public type="attr" name="paddingLeft" id="0x010100d6" /> + <public type="attr" name="paddingTop" id="0x010100d7" /> + <public type="attr" name="paddingRight" id="0x010100d8" /> + <public type="attr" name="paddingBottom" id="0x010100d9" /> + <public type="attr" name="focusable" id="0x010100da" /> + <public type="attr" name="focusableInTouchMode" id="0x010100db" /> + <public type="attr" name="visibility" id="0x010100dc" /> + <public type="attr" name="fitsSystemWindows" id="0x010100dd" /> + <public type="attr" name="scrollbars" id="0x010100de" /> + <public type="attr" name="fadingEdge" id="0x010100df" /> + <public type="attr" name="fadingEdgeLength" id="0x010100e0" /> + <public type="attr" name="nextFocusLeft" id="0x010100e1" /> + <public type="attr" name="nextFocusRight" id="0x010100e2" /> + <public type="attr" name="nextFocusUp" id="0x010100e3" /> + <public type="attr" name="nextFocusDown" id="0x010100e4" /> + <public type="attr" name="clickable" id="0x010100e5" /> + <public type="attr" name="longClickable" id="0x010100e6" /> + <public type="attr" name="saveEnabled" id="0x010100e7" /> + <public type="attr" name="drawingCacheQuality" id="0x010100e8" /> + <public type="attr" name="duplicateParentState" id="0x010100e9" /> + <public type="attr" name="clipChildren" id="0x010100ea" /> + <public type="attr" name="clipToPadding" id="0x010100eb" /> + <public type="attr" name="layoutAnimation" id="0x010100ec" /> + <public type="attr" name="animationCache" id="0x010100ed" /> + <public type="attr" name="persistentDrawingCache" id="0x010100ee" /> + <public type="attr" name="alwaysDrawnWithCache" id="0x010100ef" /> + <public type="attr" name="addStatesFromChildren" id="0x010100f0" /> + <public type="attr" name="descendantFocusability" id="0x010100f1" /> + <public type="attr" name="layout" id="0x010100f2" /> + <public type="attr" name="inflatedId" id="0x010100f3" /> + <public type="attr" name="layout_width" id="0x010100f4" /> + <public type="attr" name="layout_height" id="0x010100f5" /> + <public type="attr" name="layout_margin" id="0x010100f6" /> + <public type="attr" name="layout_marginLeft" id="0x010100f7" /> + <public type="attr" name="layout_marginTop" id="0x010100f8" /> + <public type="attr" name="layout_marginRight" id="0x010100f9" /> + <public type="attr" name="layout_marginBottom" id="0x010100fa" /> + <public type="attr" name="listSelector" id="0x010100fb" /> + <public type="attr" name="drawSelectorOnTop" id="0x010100fc" /> + <public type="attr" name="stackFromBottom" id="0x010100fd" /> + <public type="attr" name="scrollingCache" id="0x010100fe" /> + <public type="attr" name="textFilterEnabled" id="0x010100ff" /> + <public type="attr" name="transcriptMode" id="0x01010100" /> + <public type="attr" name="cacheColorHint" id="0x01010101" /> + <public type="attr" name="dial" id="0x01010102" /> + <public type="attr" name="hand_hour" id="0x01010103" /> + <public type="attr" name="hand_minute" id="0x01010104" /> + <public type="attr" name="format" id="0x01010105" /> + <public type="attr" name="checked" id="0x01010106" /> + <public type="attr" name="button" id="0x01010107" /> + <public type="attr" name="checkMark" id="0x01010108" /> + <public type="attr" name="foreground" id="0x01010109" /> + <public type="attr" name="measureAllChildren" id="0x0101010a" /> + <public type="attr" name="groupIndicator" id="0x0101010b" /> + <public type="attr" name="childIndicator" id="0x0101010c" /> + <public type="attr" name="indicatorLeft" id="0x0101010d" /> + <public type="attr" name="indicatorRight" id="0x0101010e" /> + <public type="attr" name="childIndicatorLeft" id="0x0101010f" /> + <public type="attr" name="childIndicatorRight" id="0x01010110" /> + <public type="attr" name="childDivider" id="0x01010111" /> + <public type="attr" name="animationDuration" id="0x01010112" /> + <public type="attr" name="spacing" id="0x01010113" /> + <public type="attr" name="horizontalSpacing" id="0x01010114" /> + <public type="attr" name="verticalSpacing" id="0x01010115" /> + <public type="attr" name="stretchMode" id="0x01010116" /> + <public type="attr" name="columnWidth" id="0x01010117" /> + <public type="attr" name="numColumns" id="0x01010118" /> + <public type="attr" name="src" id="0x01010119" /> + <public type="attr" name="antialias" id="0x0101011a" /> + <public type="attr" name="filter" id="0x0101011b" /> + <public type="attr" name="dither" id="0x0101011c" /> + <public type="attr" name="scaleType" id="0x0101011d" /> + <public type="attr" name="adjustViewBounds" id="0x0101011e" /> + <public type="attr" name="maxWidth" id="0x0101011f" /> + <public type="attr" name="maxHeight" id="0x01010120" /> + <public type="attr" name="tint" id="0x01010121" /> + <public type="attr" name="baselineAlignBottom" id="0x01010122" /> + <public type="attr" name="cropToPadding" id="0x01010123" /> + <public type="attr" name="textOn" id="0x01010124" /> + <public type="attr" name="textOff" id="0x01010125" /> + <public type="attr" name="baselineAligned" id="0x01010126" /> + <public type="attr" name="baselineAlignedChildIndex" id="0x01010127" /> + <public type="attr" name="weightSum" id="0x01010128" /> + <public type="attr" name="divider" id="0x01010129" /> + <public type="attr" name="dividerHeight" id="0x0101012a" /> + <public type="attr" name="choiceMode" id="0x0101012b" /> + <public type="attr" name="itemTextAppearance" id="0x0101012c" /> + <public type="attr" name="horizontalDivider" id="0x0101012d" /> + <public type="attr" name="verticalDivider" id="0x0101012e" /> + <public type="attr" name="headerBackground" id="0x0101012f" /> + <public type="attr" name="itemBackground" id="0x01010130" /> + <public type="attr" name="itemIconDisabledAlpha" id="0x01010131" /> + <public type="attr" name="rowHeight" id="0x01010132" /> + <public type="attr" name="maxRows" id="0x01010133" /> + <public type="attr" name="maxItemsPerRow" id="0x01010134" /> + <public type="attr" name="moreIcon" id="0x01010135" /> + <public type="attr" name="max" id="0x01010136" /> + <public type="attr" name="progress" id="0x01010137" /> + <public type="attr" name="secondaryProgress" id="0x01010138" /> + <public type="attr" name="indeterminate" id="0x01010139" /> + <public type="attr" name="indeterminateOnly" id="0x0101013a" /> + <public type="attr" name="indeterminateDrawable" id="0x0101013b" /> + <public type="attr" name="progressDrawable" id="0x0101013c" /> + <public type="attr" name="indeterminateDuration" id="0x0101013d" /> + <public type="attr" name="indeterminateBehavior" id="0x0101013e" /> + <public type="attr" name="minWidth" id="0x0101013f" /> + <public type="attr" name="minHeight" id="0x01010140" /> + <public type="attr" name="interpolator" id="0x01010141" /> + <public type="attr" name="thumb" id="0x01010142" /> + <public type="attr" name="thumbOffset" id="0x01010143" /> + <public type="attr" name="numStars" id="0x01010144" /> + <public type="attr" name="rating" id="0x01010145" /> + <public type="attr" name="stepSize" id="0x01010146" /> + <public type="attr" name="isIndicator" id="0x01010147" /> + <public type="attr" name="checkedButton" id="0x01010148" /> + <public type="attr" name="stretchColumns" id="0x01010149" /> + <public type="attr" name="shrinkColumns" id="0x0101014a" /> + <public type="attr" name="collapseColumns" id="0x0101014b" /> + <public type="attr" name="layout_column" id="0x0101014c" /> + <public type="attr" name="layout_span" id="0x0101014d" /> + <public type="attr" name="bufferType" id="0x0101014e" /> + <public type="attr" name="text" id="0x0101014f" /> + <public type="attr" name="hint" id="0x01010150" /> + <public type="attr" name="textScaleX" id="0x01010151" /> + <public type="attr" name="cursorVisible" id="0x01010152" /> + <public type="attr" name="maxLines" id="0x01010153" /> + <public type="attr" name="lines" id="0x01010154" /> + <public type="attr" name="height" id="0x01010155" /> + <public type="attr" name="minLines" id="0x01010156" /> + <public type="attr" name="maxEms" id="0x01010157" /> + <public type="attr" name="ems" id="0x01010158" /> + <public type="attr" name="width" id="0x01010159" /> + <public type="attr" name="minEms" id="0x0101015a" /> + <public type="attr" name="scrollHorizontally" id="0x0101015b" /> + <public type="attr" name="password" id="0x0101015c" /> + <public type="attr" name="singleLine" id="0x0101015d" /> + <public type="attr" name="selectAllOnFocus" id="0x0101015e" /> + <public type="attr" name="includeFontPadding" id="0x0101015f" /> + <public type="attr" name="maxLength" id="0x01010160" /> + <public type="attr" name="shadowColor" id="0x01010161" /> + <public type="attr" name="shadowDx" id="0x01010162" /> + <public type="attr" name="shadowDy" id="0x01010163" /> + <public type="attr" name="shadowRadius" id="0x01010164" /> + <public type="attr" name="numeric" id="0x01010165" /> + <public type="attr" name="digits" id="0x01010166" /> + <public type="attr" name="phoneNumber" id="0x01010167" /> + <public type="attr" name="inputMethod" id="0x01010168" /> + <public type="attr" name="capitalize" id="0x01010169" /> + <public type="attr" name="autoText" id="0x0101016a" /> + <public type="attr" name="editable" id="0x0101016b" /> + <public type="attr" name="freezesText" id="0x0101016c" /> + <public type="attr" name="drawableTop" id="0x0101016d" /> + <public type="attr" name="drawableBottom" id="0x0101016e" /> + <public type="attr" name="drawableLeft" id="0x0101016f" /> + <public type="attr" name="drawableRight" id="0x01010170" /> + <public type="attr" name="drawablePadding" id="0x01010171" /> + <public type="attr" name="completionHint" id="0x01010172" /> + <public type="attr" name="completionHintView" id="0x01010173" /> + <public type="attr" name="completionThreshold" id="0x01010174" /> + <public type="attr" name="dropDownSelector" id="0x01010175" /> + <public type="attr" name="popupBackground" id="0x01010176" /> + <public type="attr" name="inAnimation" id="0x01010177" /> + <public type="attr" name="outAnimation" id="0x01010178" /> + <public type="attr" name="flipInterval" id="0x01010179" /> + <public type="attr" name="fillViewport" id="0x0101017a" /> + <public type="attr" name="prompt" id="0x0101017b" /> + <!-- {@deprecated Use minDate instead.} --> + <public type="attr" name="startYear" id="0x0101017c" /> + <!-- {@deprecated Use maxDate instead.} --> + <public type="attr" name="endYear" id="0x0101017d" /> + <public type="attr" name="mode" id="0x0101017e" /> + <public type="attr" name="layout_x" id="0x0101017f" /> + <public type="attr" name="layout_y" id="0x01010180" /> + <public type="attr" name="layout_weight" id="0x01010181" /> + <public type="attr" name="layout_toLeftOf" id="0x01010182" /> + <public type="attr" name="layout_toRightOf" id="0x01010183" /> + <public type="attr" name="layout_above" id="0x01010184" /> + <public type="attr" name="layout_below" id="0x01010185" /> + <public type="attr" name="layout_alignBaseline" id="0x01010186" /> + <public type="attr" name="layout_alignLeft" id="0x01010187" /> + <public type="attr" name="layout_alignTop" id="0x01010188" /> + <public type="attr" name="layout_alignRight" id="0x01010189" /> + <public type="attr" name="layout_alignBottom" id="0x0101018a" /> + <public type="attr" name="layout_alignParentLeft" id="0x0101018b" /> + <public type="attr" name="layout_alignParentTop" id="0x0101018c" /> + <public type="attr" name="layout_alignParentRight" id="0x0101018d" /> + <public type="attr" name="layout_alignParentBottom" id="0x0101018e" /> + <public type="attr" name="layout_centerInParent" id="0x0101018f" /> + <public type="attr" name="layout_centerHorizontal" id="0x01010190" /> + <public type="attr" name="layout_centerVertical" id="0x01010191" /> + <public type="attr" name="layout_alignWithParentIfMissing" id="0x01010192" /> + <public type="attr" name="layout_scale" id="0x01010193" /> + <public type="attr" name="visible" id="0x01010194" /> + <public type="attr" name="variablePadding" id="0x01010195" /> + <public type="attr" name="constantSize" id="0x01010196" /> + <public type="attr" name="oneshot" id="0x01010197" /> + <public type="attr" name="duration" id="0x01010198" /> + <public type="attr" name="drawable" id="0x01010199" /> + <public type="attr" name="shape" id="0x0101019a" /> + <public type="attr" name="innerRadiusRatio" id="0x0101019b" /> + <public type="attr" name="thicknessRatio" id="0x0101019c" /> + <public type="attr" name="startColor" id="0x0101019d" /> + <public type="attr" name="endColor" id="0x0101019e" /> + <public type="attr" name="useLevel" id="0x0101019f" /> + <public type="attr" name="angle" id="0x010101a0" /> + <public type="attr" name="type" id="0x010101a1" /> + <public type="attr" name="centerX" id="0x010101a2" /> + <public type="attr" name="centerY" id="0x010101a3" /> + <public type="attr" name="gradientRadius" id="0x010101a4" /> + <public type="attr" name="color" id="0x010101a5" /> + <public type="attr" name="dashWidth" id="0x010101a6" /> + <public type="attr" name="dashGap" id="0x010101a7" /> + <public type="attr" name="radius" id="0x010101a8" /> + <public type="attr" name="topLeftRadius" id="0x010101a9" /> + <public type="attr" name="topRightRadius" id="0x010101aa" /> + <public type="attr" name="bottomLeftRadius" id="0x010101ab" /> + <public type="attr" name="bottomRightRadius" id="0x010101ac" /> + <public type="attr" name="left" id="0x010101ad" /> + <public type="attr" name="top" id="0x010101ae" /> + <public type="attr" name="right" id="0x010101af" /> + <public type="attr" name="bottom" id="0x010101b0" /> + <public type="attr" name="minLevel" id="0x010101b1" /> + <public type="attr" name="maxLevel" id="0x010101b2" /> + <public type="attr" name="fromDegrees" id="0x010101b3" /> + <public type="attr" name="toDegrees" id="0x010101b4" /> + <public type="attr" name="pivotX" id="0x010101b5" /> + <public type="attr" name="pivotY" id="0x010101b6" /> + <public type="attr" name="insetLeft" id="0x010101b7" /> + <public type="attr" name="insetRight" id="0x010101b8" /> + <public type="attr" name="insetTop" id="0x010101b9" /> + <public type="attr" name="insetBottom" id="0x010101ba" /> + <public type="attr" name="shareInterpolator" id="0x010101bb" /> + <public type="attr" name="fillBefore" id="0x010101bc" /> + <public type="attr" name="fillAfter" id="0x010101bd" /> + <public type="attr" name="startOffset" id="0x010101be" /> + <public type="attr" name="repeatCount" id="0x010101bf" /> + <public type="attr" name="repeatMode" id="0x010101c0" /> + <public type="attr" name="zAdjustment" id="0x010101c1" /> + <public type="attr" name="fromXScale" id="0x010101c2" /> + <public type="attr" name="toXScale" id="0x010101c3" /> + <public type="attr" name="fromYScale" id="0x010101c4" /> + <public type="attr" name="toYScale" id="0x010101c5" /> + <public type="attr" name="fromXDelta" id="0x010101c6" /> + <public type="attr" name="toXDelta" id="0x010101c7" /> + <public type="attr" name="fromYDelta" id="0x010101c8" /> + <public type="attr" name="toYDelta" id="0x010101c9" /> + <public type="attr" name="fromAlpha" id="0x010101ca" /> + <public type="attr" name="toAlpha" id="0x010101cb" /> + <public type="attr" name="delay" id="0x010101cc" /> + <public type="attr" name="animation" id="0x010101cd" /> + <public type="attr" name="animationOrder" id="0x010101ce" /> + <public type="attr" name="columnDelay" id="0x010101cf" /> + <public type="attr" name="rowDelay" id="0x010101d0" /> + <public type="attr" name="direction" id="0x010101d1" /> + <public type="attr" name="directionPriority" id="0x010101d2" /> + <public type="attr" name="factor" id="0x010101d3" /> + <public type="attr" name="cycles" id="0x010101d4" /> + <public type="attr" name="searchMode" id="0x010101d5" /> + <public type="attr" name="searchSuggestAuthority" id="0x010101d6" /> + <public type="attr" name="searchSuggestPath" id="0x010101d7" /> + <public type="attr" name="searchSuggestSelection" id="0x010101d8" /> + <public type="attr" name="searchSuggestIntentAction" id="0x010101d9" /> + <public type="attr" name="searchSuggestIntentData" id="0x010101da" /> + <public type="attr" name="queryActionMsg" id="0x010101db" /> + <public type="attr" name="suggestActionMsg" id="0x010101dc" /> + <public type="attr" name="suggestActionMsgColumn" id="0x010101dd" /> + <public type="attr" name="menuCategory" id="0x010101de" /> + <public type="attr" name="orderInCategory" id="0x010101df" /> + <public type="attr" name="checkableBehavior" id="0x010101e0" /> + <public type="attr" name="title" id="0x010101e1" /> + <public type="attr" name="titleCondensed" id="0x010101e2" /> + <public type="attr" name="alphabeticShortcut" id="0x010101e3" /> + <public type="attr" name="numericShortcut" id="0x010101e4" /> + <public type="attr" name="checkable" id="0x010101e5" /> + <public type="attr" name="selectable" id="0x010101e6" /> + <public type="attr" name="orderingFromXml" id="0x010101e7" /> + <public type="attr" name="key" id="0x010101e8" /> + <public type="attr" name="summary" id="0x010101e9" /> + <public type="attr" name="order" id="0x010101ea" /> + <public type="attr" name="widgetLayout" id="0x010101eb" /> + <public type="attr" name="dependency" id="0x010101ec" /> + <public type="attr" name="defaultValue" id="0x010101ed" /> + <public type="attr" name="shouldDisableView" id="0x010101ee" /> + <public type="attr" name="summaryOn" id="0x010101ef" /> + <public type="attr" name="summaryOff" id="0x010101f0" /> + <public type="attr" name="disableDependentsState" id="0x010101f1" /> + <public type="attr" name="dialogTitle" id="0x010101f2" /> + <public type="attr" name="dialogMessage" id="0x010101f3" /> + <public type="attr" name="dialogIcon" id="0x010101f4" /> + <public type="attr" name="positiveButtonText" id="0x010101f5" /> + <public type="attr" name="negativeButtonText" id="0x010101f6" /> + <public type="attr" name="dialogLayout" id="0x010101f7" /> + <public type="attr" name="entryValues" id="0x010101f8" /> + <public type="attr" name="ringtoneType" id="0x010101f9" /> + <public type="attr" name="showDefault" id="0x010101fa" /> + <public type="attr" name="showSilent" id="0x010101fb" /> + <public type="attr" name="scaleWidth" id="0x010101fc" /> + <public type="attr" name="scaleHeight" id="0x010101fd" /> + <public type="attr" name="scaleGravity" id="0x010101fe" /> + <public type="attr" name="ignoreGravity" id="0x010101ff" /> + <public type="attr" name="foregroundGravity" id="0x01010200" /> + <public type="attr" name="tileMode" id="0x01010201" /> + <public type="attr" name="targetActivity" id="0x01010202" /> + <public type="attr" name="alwaysRetainTaskState" id="0x01010203" /> + <public type="attr" name="allowTaskReparenting" id="0x01010204" /> + <public type="attr" name="searchButtonText" id="0x01010205" /> + <public type="attr" name="colorForegroundInverse" id="0x01010206" /> + <public type="attr" name="textAppearanceButton" id="0x01010207" /> + <public type="attr" name="listSeparatorTextViewStyle" id="0x01010208" /> + <public type="attr" name="streamType" id="0x01010209" /> + <public type="attr" name="clipOrientation" id="0x0101020a" /> + <public type="attr" name="centerColor" id="0x0101020b" /> + <public type="attr" name="minSdkVersion" id="0x0101020c" /> + <public type="attr" name="windowFullscreen" id="0x0101020d" /> + <public type="attr" name="unselectedAlpha" id="0x0101020e" /> + <public type="attr" name="progressBarStyleSmallTitle" id="0x0101020f" /> + <public type="attr" name="ratingBarStyleIndicator" id="0x01010210" /> + <public type="attr" name="apiKey" id="0x01010211" /> + <public type="attr" name="textColorTertiary" id="0x01010212" /> + <public type="attr" name="textColorTertiaryInverse" id="0x01010213" /> + <public type="attr" name="listDivider" id="0x01010214" /> + <public type="attr" name="soundEffectsEnabled" id="0x01010215" /> + <public type="attr" name="keepScreenOn" id="0x01010216" /> + <public type="attr" name="lineSpacingExtra" id="0x01010217" /> + <public type="attr" name="lineSpacingMultiplier" id="0x01010218" /> + <public type="attr" name="listChoiceIndicatorSingle" id="0x01010219" /> + <public type="attr" name="listChoiceIndicatorMultiple" id="0x0101021a" /> + <public type="attr" name="versionCode" id="0x0101021b" /> + <public type="attr" name="versionName" id="0x0101021c" /> + + <public type="id" name="background" id="0x01020000" /> + <public type="id" name="checkbox" id="0x01020001" /> + <public type="id" name="content" id="0x01020002" /> + <public type="id" name="edit" id="0x01020003" /> + <public type="id" name="empty" id="0x01020004" /> + <public type="id" name="hint" id="0x01020005" /> + <public type="id" name="icon" id="0x01020006" /> + <public type="id" name="icon1" id="0x01020007" /> + <public type="id" name="icon2" id="0x01020008" /> + <public type="id" name="input" id="0x01020009" /> + <public type="id" name="list" id="0x0102000a" /> + <public type="id" name="message" id="0x0102000b" /> + <public type="id" name="primary" id="0x0102000c" /> + <public type="id" name="progress" id="0x0102000d" /> + <public type="id" name="selectedIcon" id="0x0102000e" /> + <public type="id" name="secondaryProgress" id="0x0102000f" /> + <public type="id" name="summary" id="0x01020010" /> + <public type="id" name="tabcontent" id="0x01020011" /> + <public type="id" name="tabhost" id="0x01020012" /> + <public type="id" name="tabs" id="0x01020013" /> + <public type="id" name="text1" id="0x01020014" /> + <public type="id" name="text2" id="0x01020015" /> + <public type="id" name="title" id="0x01020016" /> + <public type="id" name="toggle" id="0x01020017" /> + <public type="id" name="widget_frame" id="0x01020018" /> + <public type="id" name="button1" id="0x01020019" /> + <public type="id" name="button2" id="0x0102001a" /> + <public type="id" name="button3" id="0x0102001b" /> + + <public type="style" name="Animation" id="0x01030000" /> + <public type="style" name="Animation.Activity" id="0x01030001" /> + <public type="style" name="Animation.Dialog" id="0x01030002" /> + <public type="style" name="Animation.Translucent" id="0x01030003" /> + <public type="style" name="Animation.Toast" id="0x01030004" /> + <public type="style" name="Theme" id="0x01030005" /> + <public type="style" name="Theme.NoTitleBar" id="0x01030006" /> + <public type="style" name="Theme.NoTitleBar.Fullscreen" id="0x01030007" /> + <public type="style" name="Theme.Black" id="0x01030008" /> + <public type="style" name="Theme.Black.NoTitleBar" id="0x01030009" /> + <public type="style" name="Theme.Black.NoTitleBar.Fullscreen" id="0x0103000a" /> + <public type="style" name="Theme.Dialog" id="0x0103000b" /> + <public type="style" name="Theme.Light" id="0x0103000c" /> + <public type="style" name="Theme.Light.NoTitleBar" id="0x0103000d" /> + <public type="style" name="Theme.Light.NoTitleBar.Fullscreen" id="0x0103000e" /> + <public type="style" name="Theme.Translucent" id="0x0103000f" /> + <public type="style" name="Theme.Translucent.NoTitleBar" id="0x01030010" /> + <public type="style" name="Theme.Translucent.NoTitleBar.Fullscreen" id="0x01030011" /> + <public type="style" name="Widget" id="0x01030012" /> + <public type="style" name="Widget.AbsListView" id="0x01030013" /> + <public type="style" name="Widget.Button" id="0x01030014" /> + <public type="style" name="Widget.Button.Inset" id="0x01030015" /> + <public type="style" name="Widget.Button.Small" id="0x01030016" /> + <public type="style" name="Widget.Button.Toggle" id="0x01030017" /> + <public type="style" name="Widget.CompoundButton" id="0x01030018" /> + <public type="style" name="Widget.CompoundButton.CheckBox" id="0x01030019" /> + <public type="style" name="Widget.CompoundButton.RadioButton" id="0x0103001a" /> + <public type="style" name="Widget.CompoundButton.Star" id="0x0103001b" /> + <public type="style" name="Widget.ProgressBar" id="0x0103001c" /> + <public type="style" name="Widget.ProgressBar.Large" id="0x0103001d" /> + <public type="style" name="Widget.ProgressBar.Small" id="0x0103001e" /> + <public type="style" name="Widget.ProgressBar.Horizontal" id="0x0103001f" /> + <public type="style" name="Widget.SeekBar" id="0x01030020" /> + <public type="style" name="Widget.RatingBar" id="0x01030021" /> + <public type="style" name="Widget.TextView" id="0x01030022" /> + <public type="style" name="Widget.EditText" id="0x01030023" /> + <public type="style" name="Widget.ExpandableListView" id="0x01030024" /> + <public type="style" name="Widget.ImageWell" id="0x01030025" /> + <public type="style" name="Widget.ImageButton" id="0x01030026" /> + <public type="style" name="Widget.AutoCompleteTextView" id="0x01030027" /> + <public type="style" name="Widget.Spinner" id="0x01030028" /> + <public type="style" name="Widget.TextView.PopupMenu" id="0x01030029" /> + <public type="style" name="Widget.TextView.SpinnerItem" id="0x0103002a" /> + <public type="style" name="Widget.DropDownItem" id="0x0103002b" /> + <public type="style" name="Widget.DropDownItem.Spinner" id="0x0103002c" /> + <public type="style" name="Widget.ScrollView" id="0x0103002d" /> + <public type="style" name="Widget.ListView" id="0x0103002e" /> + <public type="style" name="Widget.ListView.White" id="0x0103002f" /> + <public type="style" name="Widget.ListView.DropDown" id="0x01030030" /> + <public type="style" name="Widget.ListView.Menu" id="0x01030031" /> + <public type="style" name="Widget.GridView" id="0x01030032" /> + <public type="style" name="Widget.WebView" id="0x01030033" /> + <public type="style" name="Widget.TabWidget" id="0x01030034" /> + <public type="style" name="Widget.Gallery" id="0x01030035" /> + <public type="style" name="Widget.PopupWindow" id="0x01030036" /> + <public type="style" name="MediaButton" id="0x01030037" /> + <public type="style" name="MediaButton.Previous" id="0x01030038" /> + <public type="style" name="MediaButton.Next" id="0x01030039" /> + <public type="style" name="MediaButton.Play" id="0x0103003a" /> + <public type="style" name="MediaButton.Ffwd" id="0x0103003b" /> + <public type="style" name="MediaButton.Rew" id="0x0103003c" /> + <public type="style" name="MediaButton.Pause" id="0x0103003d" /> + <public type="style" name="TextAppearance" id="0x0103003e" /> + <public type="style" name="TextAppearance.Inverse" id="0x0103003f" /> + <public type="style" name="TextAppearance.Theme" id="0x01030040" /> + <public type="style" name="TextAppearance.DialogWindowTitle" id="0x01030041" /> + <public type="style" name="TextAppearance.Large" id="0x01030042" /> + <public type="style" name="TextAppearance.Large.Inverse" id="0x01030043" /> + <public type="style" name="TextAppearance.Medium" id="0x01030044" /> + <public type="style" name="TextAppearance.Medium.Inverse" id="0x01030045" /> + <public type="style" name="TextAppearance.Small" id="0x01030046" /> + <public type="style" name="TextAppearance.Small.Inverse" id="0x01030047" /> + <public type="style" name="TextAppearance.Theme.Dialog" id="0x01030048" /> + <public type="style" name="TextAppearance.Widget" id="0x01030049" /> + <public type="style" name="TextAppearance.Widget.Button" id="0x0103004a" /> + <public type="style" name="TextAppearance.Widget.IconMenu.Item" id="0x0103004b" /> + <public type="style" name="TextAppearance.Widget.EditText" id="0x0103004c" /> + <public type="style" name="TextAppearance.Widget.TabWidget" id="0x0103004d" /> + <public type="style" name="TextAppearance.Widget.TextView" id="0x0103004e" /> + <public type="style" name="TextAppearance.Widget.TextView.PopupMenu" id="0x0103004f" /> + <public type="style" name="TextAppearance.Widget.DropDownHint" id="0x01030050" /> + <public type="style" name="TextAppearance.Widget.DropDownItem" id="0x01030051" /> + <public type="style" name="TextAppearance.Widget.TextView.SpinnerItem" id="0x01030052" /> + <public type="style" name="TextAppearance.WindowTitle" id="0x01030053" /> + + <public type="string" name="cancel" id="0x01040000" /> + <public type="string" name="copy" id="0x01040001" /> + <public type="string" name="copyUrl" id="0x01040002" /> + <public type="string" name="cut" id="0x01040003" /> + <public type="string" name="defaultVoiceMailAlphaTag" id="0x01040004" /> + <public type="string" name="defaultMsisdnAlphaTag" id="0x01040005" /> + <public type="string" name="emptyPhoneNumber" id="0x01040006" /> + <public type="string" name="httpErrorBadUrl" id="0x01040007" /> + <public type="string" name="httpErrorUnsupportedScheme" id="0x01040008" /> + <public type="string" name="no" id="0x01040009" /> + <public type="string" name="ok" id="0x0104000a" /> + <public type="string" name="paste" id="0x0104000b" /> + <public type="string" name="search_go" id="0x0104000c" /> + <public type="string" name="selectAll" id="0x0104000d" /> + <public type="string" name="unknownName" id="0x0104000e" /> + <public type="string" name="untitled" id="0x0104000f" /> + <public type="string" name="VideoView_error_button" id="0x01040010" /> + <public type="string" name="VideoView_error_text_unknown" id="0x01040011" /> + <public type="string" name="VideoView_error_title" id="0x01040012" /> + <public type="string" name="yes" id="0x01040013" /> + + <public type="dimen" name="app_icon_size" id="0x01050000" /> + <public type="dimen" name="thumbnail_height" id="0x01050001" /> + <public type="dimen" name="thumbnail_width" id="0x01050002" /> + + <public type="color" name="darker_gray" id="0x01060000" /> + <public type="color" name="primary_text_dark" id="0x01060001" /> + <public type="color" name="primary_text_dark_nodisable" id="0x01060002" /> + <public type="color" name="primary_text_light" id="0x01060003" /> + <public type="color" name="primary_text_light_nodisable" id="0x01060004" /> + <public type="color" name="secondary_text_dark" id="0x01060005" /> + <public type="color" name="secondary_text_dark_nodisable" id="0x01060006" /> + <public type="color" name="secondary_text_light" id="0x01060007" /> + <public type="color" name="secondary_text_light_nodisable" id="0x01060008" /> + <public type="color" name="tab_indicator_text" id="0x01060009" /> + <public type="color" name="widget_edittext_dark" id="0x0106000a" /> + <public type="color" name="white" id="0x0106000b" /> + <public type="color" name="black" id="0x0106000c" /> + <public type="color" name="transparent" id="0x0106000d" /> + <public type="color" name="background_dark" id="0x0106000e" /> + <public type="color" name="background_light" id="0x0106000f" /> + <public type="color" name="tertiary_text_dark" id="0x01060010" /> + <public type="color" name="tertiary_text_light" id="0x01060011" /> + + <public type="array" name="emailAddressTypes" id="0x01070000" /> + <public type="array" name="imProtocols" id="0x01070001" /> + <public type="array" name="organizationTypes" id="0x01070002" /> + <public type="array" name="phoneTypes" id="0x01070003" /> + <public type="array" name="postalAddressTypes" id="0x01070004" /> + + <public type="drawable" name="alert_dark_frame" id="0x01080000" /> + <public type="drawable" name="alert_light_frame" id="0x01080001" /> + <public type="drawable" name="arrow_down_float" id="0x01080002" /> + <public type="drawable" name="arrow_up_float" id="0x01080003" /> + <public type="drawable" name="btn_default" id="0x01080004" /> + <public type="drawable" name="btn_default_small" id="0x01080005" /> + <public type="drawable" name="btn_dropdown" id="0x01080006" /> + <public type="drawable" name="btn_minus" id="0x01080007" /> + <public type="drawable" name="btn_plus" id="0x01080008" /> + <public type="drawable" name="btn_radio" id="0x01080009" /> + <public type="drawable" name="btn_star" id="0x0108000a" /> + <public type="drawable" name="btn_star_big_off" id="0x0108000b" /> + <public type="drawable" name="btn_star_big_on" id="0x0108000c" /> + <public type="drawable" name="button_onoff_indicator_on" id="0x0108000d" /> + <public type="drawable" name="button_onoff_indicator_off" id="0x0108000e" /> + <public type="drawable" name="checkbox_off_background" id="0x0108000f" /> + <public type="drawable" name="checkbox_on_background" id="0x01080010" /> + <public type="drawable" name="dialog_frame" id="0x01080011" /> + <public type="drawable" name="divider_horizontal_bright" id="0x01080012" /> + <public type="drawable" name="divider_horizontal_textfield" id="0x01080013" /> + <public type="drawable" name="divider_horizontal_dark" id="0x01080014" /> + <public type="drawable" name="divider_horizontal_dim_dark" id="0x01080015" /> + <public type="drawable" name="edit_text" id="0x01080016" /> + <public type="drawable" name="btn_dialog" id="0x01080017" /> + <public type="drawable" name="editbox_background" id="0x01080018" /> + <public type="drawable" name="editbox_background_normal" id="0x01080019" /> + <public type="drawable" name="editbox_dropdown_dark_frame" id="0x0108001a" /> + <public type="drawable" name="editbox_dropdown_light_frame" id="0x0108001b" /> + <public type="drawable" name="gallery_thumb" id="0x0108001c" /> + <public type="drawable" name="ic_delete" id="0x0108001d" /> + <public type="drawable" name="ic_lock_idle_charging" id="0x0108001e" /> + <public type="drawable" name="ic_lock_idle_lock" id="0x0108001f" /> + <public type="drawable" name="ic_lock_idle_low_battery" id="0x01080020" /> + <public type="drawable" name="ic_media_ff" id="0x01080021" /> + <public type="drawable" name="ic_media_next" id="0x01080022" /> + <public type="drawable" name="ic_media_pause" id="0x01080023" /> + <public type="drawable" name="ic_media_play" id="0x01080024" /> + <public type="drawable" name="ic_media_previous" id="0x01080025" /> + <public type="drawable" name="ic_media_rew" id="0x01080026" /> + <public type="drawable" name="ic_dialog_alert" id="0x01080027" /> + <public type="drawable" name="ic_dialog_dialer" id="0x01080028" /> + <public type="drawable" name="ic_dialog_email" id="0x01080029" /> + <public type="drawable" name="ic_dialog_map" id="0x0108002a" /> + <public type="drawable" name="ic_input_add" id="0x0108002b" /> + <public type="drawable" name="ic_input_delete" id="0x0108002c" /> + <public type="drawable" name="ic_input_get" id="0x0108002d" /> + <public type="drawable" name="ic_lock_idle_alarm" id="0x0108002e" /> + <public type="drawable" name="ic_lock_lock" id="0x0108002f" /> + <public type="drawable" name="ic_lock_power_off" id="0x01080030" /> + <public type="drawable" name="ic_lock_silent_mode" id="0x01080031" /> + <public type="drawable" name="ic_lock_silent_mode_off" id="0x01080032" /> + <public type="drawable" name="ic_menu_add" id="0x01080033" /> + <public type="drawable" name="ic_menu_agenda" id="0x01080034" /> + <public type="drawable" name="ic_menu_always_landscape_portrait" id="0x01080035" /> + <public type="drawable" name="ic_menu_call" id="0x01080036" /> + <public type="drawable" name="ic_menu_camera" id="0x01080037" /> + <public type="drawable" name="ic_menu_close_clear_cancel" id="0x01080038" /> + <public type="drawable" name="ic_menu_compass" id="0x01080039" /> + <public type="drawable" name="ic_menu_crop" id="0x0108003a" /> + <public type="drawable" name="ic_menu_day" id="0x0108003b" /> + <public type="drawable" name="ic_menu_delete" id="0x0108003c" /> + <public type="drawable" name="ic_menu_directions" id="0x0108003d" /> + <public type="drawable" name="ic_menu_edit" id="0x0108003e" /> + <public type="drawable" name="ic_menu_gallery" id="0x0108003f" /> + <public type="drawable" name="ic_menu_help" id="0x01080040" /> + <public type="drawable" name="ic_menu_info_details" id="0x01080041" /> + <public type="drawable" name="ic_menu_manage" id="0x01080042" /> + <public type="drawable" name="ic_menu_mapmode" id="0x01080043" /> + <public type="drawable" name="ic_menu_month" id="0x01080044" /> + <public type="drawable" name="ic_menu_more" id="0x01080045" /> + <public type="drawable" name="ic_menu_my_calendar" id="0x01080046" /> + <public type="drawable" name="ic_menu_mylocation" id="0x01080047" /> + <public type="drawable" name="ic_menu_myplaces" id="0x01080048" /> + <public type="drawable" name="ic_menu_preferences" id="0x01080049" /> + <public type="drawable" name="ic_menu_recent_history" id="0x0108004a" /> + <public type="drawable" name="ic_menu_report_image" id="0x0108004b" /> + <public type="drawable" name="ic_menu_revert" id="0x0108004c" /> + <public type="drawable" name="ic_menu_rotate" id="0x0108004d" /> + <public type="drawable" name="ic_menu_save" id="0x0108004e" /> + <public type="drawable" name="ic_menu_search" id="0x0108004f" /> + <public type="drawable" name="ic_menu_send" id="0x01080050" /> + <public type="drawable" name="ic_menu_set_as" id="0x01080051" /> + <public type="drawable" name="ic_menu_share" id="0x01080052" /> + <public type="drawable" name="ic_menu_slideshow" id="0x01080053" /> + <public type="drawable" name="ic_menu_today" id="0x01080054" /> + <public type="drawable" name="ic_menu_upload" id="0x01080055" /> + <public type="drawable" name="ic_menu_upload_you_tube" id="0x01080056" /> + <public type="drawable" name="ic_menu_view" id="0x01080057" /> + <public type="drawable" name="ic_menu_week" id="0x01080058" /> + <public type="drawable" name="ic_menu_zoom" id="0x01080059" /> + <public type="drawable" name="ic_notification_clear_all" id="0x0108005a" /> + <public type="drawable" name="ic_notification_overlay" id="0x0108005b" /> + <public type="drawable" name="ic_partial_secure" id="0x0108005c" /> + <public type="drawable" name="ic_popup_disk_full" id="0x0108005d" /> + <public type="drawable" name="ic_popup_reminder" id="0x0108005e" /> + <public type="drawable" name="ic_popup_sync" id="0x0108005f" /> + <public type="drawable" name="ic_search_category_default" id="0x01080060" /> + <public type="drawable" name="ic_secure" id="0x01080061" /> + <public type="drawable" name="list_selector_background" id="0x01080062" /> + <public type="drawable" name="menu_frame" id="0x01080063" /> + <public type="drawable" name="menu_full_frame" id="0x01080064" /> + <public type="drawable" name="menuitem_background" id="0x01080065" /> + <public type="drawable" name="picture_frame" id="0x01080066" /> + <public type="drawable" name="presence_away" id="0x01080067" /> + <public type="drawable" name="presence_busy" id="0x01080068" /> + <public type="drawable" name="presence_invisible" id="0x01080069" /> + <public type="drawable" name="presence_offline" id="0x0108006a" /> + <public type="drawable" name="presence_online" id="0x0108006b" /> + <public type="drawable" name="progress_horizontal" id="0x0108006c" /> + <public type="drawable" name="progress_indeterminate_horizontal" id="0x0108006d" /> + <public type="drawable" name="radiobutton_off_background" id="0x0108006e" /> + <public type="drawable" name="radiobutton_on_background" id="0x0108006f" /> + <public type="drawable" name="spinner_background" id="0x01080070" /> + <public type="drawable" name="spinner_dropdown_background" id="0x01080071" /> + <public type="drawable" name="star_big_on" id="0x01080072" /> + <public type="drawable" name="star_big_off" id="0x01080073" /> + <public type="drawable" name="star_on" id="0x01080074" /> + <public type="drawable" name="star_off" id="0x01080075" /> + <public type="drawable" name="stat_notify_call_mute" id="0x01080076" /> + <public type="drawable" name="stat_notify_chat" id="0x01080077" /> + <public type="drawable" name="stat_notify_error" id="0x01080078" /> + <public type="drawable" name="stat_notify_more" id="0x01080079" /> + <public type="drawable" name="stat_notify_sdcard" id="0x0108007a" /> + <public type="drawable" name="stat_notify_sdcard_usb" id="0x0108007b" /> + <public type="drawable" name="stat_notify_sync" id="0x0108007c" /> + <public type="drawable" name="stat_notify_sync_noanim" id="0x0108007d" /> + <public type="drawable" name="stat_notify_voicemail" id="0x0108007e" /> + <public type="drawable" name="stat_notify_missed_call" id="0x0108007f" /> + <public type="drawable" name="stat_sys_data_bluetooth" id="0x01080080" /> + <public type="drawable" name="stat_sys_download" id="0x01080081" /> + <public type="drawable" name="stat_sys_download_done" id="0x01080082" /> + <public type="drawable" name="stat_sys_headset" id="0x01080083" /> + <!-- @deprecated Replaced by a private asset in the phone app. --> + <public type="drawable" name="stat_sys_phone_call" id="0x01080084" /> + <!-- @deprecated Replaced by a private asset in the phone app. --> + <public type="drawable" name="stat_sys_phone_call_forward" id="0x01080085" /> + <!-- @deprecated Replaced by a private asset in the phone app. --> + <public type="drawable" name="stat_sys_phone_call_on_hold" id="0x01080086" /> + <public type="drawable" name="stat_sys_speakerphone" id="0x01080087" /> + <public type="drawable" name="stat_sys_upload" id="0x01080088" /> + <public type="drawable" name="stat_sys_upload_done" id="0x01080089" /> + <public type="drawable" name="stat_sys_warning" id="0x0108008a" /> + <public type="drawable" name="status_bar_item_app_background" id="0x0108008b" /> + <public type="drawable" name="status_bar_item_background" id="0x0108008c" /> + <public type="drawable" name="sym_action_call" id="0x0108008d" /> + <public type="drawable" name="sym_action_chat" id="0x0108008e" /> + <public type="drawable" name="sym_action_email" id="0x0108008f" /> + <public type="drawable" name="sym_call_incoming" id="0x01080090" /> + <public type="drawable" name="sym_call_missed" id="0x01080091" /> + <public type="drawable" name="sym_call_outgoing" id="0x01080092" /> + <public type="drawable" name="sym_def_app_icon" id="0x01080093" /> + <public type="drawable" name="sym_contact_card" id="0x01080094" /> + <public type="drawable" name="title_bar" id="0x01080095" /> + <public type="drawable" name="toast_frame" id="0x01080096" /> + <public type="drawable" name="zoom_plate" id="0x01080097" /> + <public type="drawable" name="screen_background_dark" id="0x01080098" /> + <public type="drawable" name="screen_background_light" id="0x01080099" /> + <public type="drawable" name="bottom_bar" id="0x0108009a" /> + <public type="drawable" name="ic_dialog_info" id="0x0108009b" /> + <public type="drawable" name="ic_menu_sort_alphabetically" id="0x0108009c" /> + <public type="drawable" name="ic_menu_sort_by_size" id="0x0108009d" /> + + <public type="layout" name="activity_list_item" id="0x01090000" /> + <public type="layout" name="expandable_list_content" id="0x01090001" /> + <public type="layout" name="preference_category" id="0x01090002" /> + <public type="layout" name="simple_list_item_1" id="0x01090003" /> + <public type="layout" name="simple_list_item_2" id="0x01090004" /> + <public type="layout" name="simple_list_item_checked" id="0x01090005" /> + <public type="layout" name="simple_expandable_list_item_1" id="0x01090006" /> + <public type="layout" name="simple_expandable_list_item_2" id="0x01090007" /> + <public type="layout" name="simple_spinner_item" id="0x01090008" /> + <public type="layout" name="simple_spinner_dropdown_item" id="0x01090009" /> + <public type="layout" name="simple_dropdown_item_1line" id="0x0109000a" /> + <public type="layout" name="simple_gallery_item" id="0x0109000b" /> + <public type="layout" name="test_list_item" id="0x0109000c" /> + <public type="layout" name="two_line_list_item" id="0x0109000d" /> + <public type="layout" name="browser_link_context_header" id="0x0109000e" /> + <public type="layout" name="simple_list_item_single_choice" id="0x0109000f" /> + <public type="layout" name="simple_list_item_multiple_choice" id="0x01090010" /> + <public type="layout" name="select_dialog_item" id="0x01090011" /> + <public type="layout" name="select_dialog_singlechoice" id="0x01090012" /> + <public type="layout" name="select_dialog_multichoice" id="0x01090013" /> + + <public type="anim" name="fade_in" id="0x010a0000" /> + <public type="anim" name="fade_out" id="0x010a0001" /> + <public type="anim" name="slide_in_left" id="0x010a0002" /> + <public type="anim" name="slide_out_right" id="0x010a0003" /> + <public type="anim" name="accelerate_decelerate_interpolator" id="0x010a0004" /> + <!-- Acceleration curve matching Flash's quadratic ease out function. --> + <public type="anim" name="accelerate_interpolator" id="0x010a0005" /> + <!-- Acceleration curve matching Flash's quadratic ease in function. --> + <public type="anim" name="decelerate_interpolator" id="0x010a0006" /> + +<!-- =============================================================== + Resources added in version 2 of the platform. + =============================================================== --> + <eat-comment /> + + <public type="attr" name="marqueeRepeatLimit" id="0x0101021d" /> + +<!-- =============================================================== + Resources added in version 3 of the platform (Cupcake). + =============================================================== --> + <eat-comment /> + + <public type="attr" name="windowNoDisplay" id="0x0101021e" /> + <public type="attr" name="backgroundDimEnabled" id="0x0101021f" /> + <public type="attr" name="inputType" id="0x01010220" /> + <public type="attr" name="isDefault" id="0x01010221" /> + <public type="attr" name="windowDisablePreview" id="0x01010222" /> + <public type="attr" name="privateImeOptions" id="0x01010223" /> + <public type="attr" name="editorExtras" id="0x01010224" /> + <public type="attr" name="settingsActivity" id="0x01010225" /> + <public type="attr" name="fastScrollEnabled" id="0x01010226" /> + <public type="attr" name="reqTouchScreen" id="0x01010227" /> + <public type="attr" name="reqKeyboardType" id="0x01010228" /> + <public type="attr" name="reqHardKeyboard" id="0x01010229" /> + <public type="attr" name="reqNavigation" id="0x0101022a" /> + <public type="attr" name="windowSoftInputMode" id="0x0101022b" /> + <public type="attr" name="imeFullscreenBackground" id="0x0101022c" /> + <public type="attr" name="noHistory" id="0x0101022d" /> + <public type="attr" name="headerDividersEnabled" id="0x0101022e" /> + <public type="attr" name="footerDividersEnabled" id="0x0101022f" /> + <public type="attr" name="candidatesTextStyleSpans" id="0x01010230" /> + <public type="attr" name="smoothScrollbar" id="0x01010231" /> + <public type="attr" name="reqFiveWayNav" id="0x01010232" /> + <public type="attr" name="keyBackground" id="0x01010233" /> + <public type="attr" name="keyTextSize" id="0x01010234" /> + <public type="attr" name="labelTextSize" id="0x01010235" /> + <public type="attr" name="keyTextColor" id="0x01010236" /> + <public type="attr" name="keyPreviewLayout" id="0x01010237" /> + <public type="attr" name="keyPreviewOffset" id="0x01010238" /> + <public type="attr" name="keyPreviewHeight" id="0x01010239" /> + <public type="attr" name="verticalCorrection" id="0x0101023a" /> + <public type="attr" name="popupLayout" id="0x0101023b" /> + <public type="attr" name="state_long_pressable" id="0x0101023c" /> + <public type="attr" name="keyWidth" id="0x0101023d" /> + <public type="attr" name="keyHeight" id="0x0101023e" /> + <public type="attr" name="horizontalGap" id="0x0101023f" /> + <public type="attr" name="verticalGap" id="0x01010240" /> + <public type="attr" name="rowEdgeFlags" id="0x01010241" /> + <public type="attr" name="codes" id="0x01010242" /> + <public type="attr" name="popupKeyboard" id="0x01010243" /> + <public type="attr" name="popupCharacters" id="0x01010244" /> + <public type="attr" name="keyEdgeFlags" id="0x01010245" /> + <public type="attr" name="isModifier" id="0x01010246" /> + <public type="attr" name="isSticky" id="0x01010247" /> + <public type="attr" name="isRepeatable" id="0x01010248" /> + <public type="attr" name="iconPreview" id="0x01010249" /> + <public type="attr" name="keyOutputText" id="0x0101024a" /> + <public type="attr" name="keyLabel" id="0x0101024b" /> + <public type="attr" name="keyIcon" id="0x0101024c" /> + <public type="attr" name="keyboardMode" id="0x0101024d" /> + <public type="attr" name="isScrollContainer" id="0x0101024e" /> + <public type="attr" name="fillEnabled" id="0x0101024f" /> + <public type="attr" name="updatePeriodMillis" id="0x01010250" /> + <public type="attr" name="initialLayout" id="0x01010251" /> + <public type="attr" name="voiceSearchMode" id="0x01010252" /> + <public type="attr" name="voiceLanguageModel" id="0x01010253" /> + <public type="attr" name="voicePromptText" id="0x01010254" /> + <public type="attr" name="voiceLanguage" id="0x01010255" /> + <public type="attr" name="voiceMaxResults" id="0x01010256" /> + <public type="attr" name="bottomOffset" id="0x01010257" /> + <public type="attr" name="topOffset" id="0x01010258" /> + <public type="attr" name="allowSingleTap" id="0x01010259" /> + <public type="attr" name="handle" id="0x0101025a" /> + <public type="attr" name="content" id="0x0101025b" /> + <public type="attr" name="animateOnClick" id="0x0101025c" /> + <public type="attr" name="configure" id="0x0101025d" /> + <public type="attr" name="hapticFeedbackEnabled" id="0x0101025e" /> + <public type="attr" name="innerRadius" id="0x0101025f" /> + <public type="attr" name="thickness" id="0x01010260" /> + <public type="attr" name="sharedUserLabel" id="0x01010261" /> + <public type="attr" name="dropDownWidth" id="0x01010262" /> + <public type="attr" name="dropDownAnchor" id="0x01010263" /> + <public type="attr" name="imeOptions" id="0x01010264" /> + <public type="attr" name="imeActionLabel" id="0x01010265" /> + <public type="attr" name="imeActionId" id="0x01010266" /> + <public type="attr" name="imeExtractEnterAnimation" id="0x01010268" /> + <public type="attr" name="imeExtractExitAnimation" id="0x01010269" /> + + <!-- The part of the UI shown by an + {@link android.inputmethodservice.InputMethodService} that contains the + views for interacting with the user in extraction mode. --> + <public type="id" name="extractArea" id="0x0102001c" /> + + <!-- The part of the UI shown by an + {@link android.inputmethodservice.InputMethodService} that contains the + views for displaying candidates for what the user has entered. --> + <public type="id" name="candidatesArea" id="0x0102001d" /> + + <!-- The part of the UI shown by an + {@link android.inputmethodservice.InputMethodService} that contains the + views for entering text using the screen. --> + <public type="id" name="inputArea" id="0x0102001e" /> + + <!-- Context menu ID for the "Select All" menu item to select all text + in a text view. --> + <public type="id" name="selectAll" id="0x0102001f" /> + <!-- Context menu ID for the "Cut" menu item to copy and delete the currently + selected (or all) text in a text view to the clipboard. --> + <public type="id" name="cut" id="0x01020020" /> + <!-- Context menu ID for the "Copy" menu item to copy the currently + selected (or all) text in a text view to the clipboard. --> + <public type="id" name="copy" id="0x01020021" /> + <!-- Context menu ID for the "Paste" menu item to copy the current contents + of the clipboard into the text view. --> + <public type="id" name="paste" id="0x01020022" /> + <!-- Context menu ID for the "Copy URL" menu item to copy the currently + selected URL from the text view to the clipboard. --> + <public type="id" name="copyUrl" id="0x01020023" /> + <!-- Context menu ID for the "Input Method" menu item to being up the + input method picker dialog, allowing the user to switch to another + input method. --> + <public type="id" name="switchInputMethod" id="0x01020024" /> + <!-- View ID of the text editor inside of an extracted text layout. --> + <public type="id" name="inputExtractEditText" id="0x01020025" /> + + <!-- View ID of the {@link android.inputmethodservice.KeyboardView} within + an input method's input area. --> + <public type="id" name="keyboardView" id="0x01020026" /> + <!-- View ID of a {@link android.view.View} to close a popup keyboard --> + <public type="id" name="closeButton" id="0x01020027" /> + + <!-- Menu ID to perform a "start selecting text" operation. --> + <public type="id" name="startSelectingText" id="0x01020028" /> + <!-- Menu ID to perform a "stop selecting text" operation. --> + <public type="id" name="stopSelectingText" id="0x01020029" /> + <!-- Menu ID to perform a "add to dictionary" operation. --> + <public type="id" name="addToDictionary" id="0x0102002a" /> + + <public type="style" name="Theme.InputMethod" id="0x01030054" /> + <public type="style" name="Theme.NoDisplay" id="0x01030055" /> + <public type="style" name="Animation.InputMethod" id="0x01030056" /> + <public type="style" name="Widget.KeyboardView" id="0x01030057" /> + <public type="style" name="ButtonBar" id="0x01030058" /> + <public type="style" name="Theme.Panel" id="0x01030059" /> + <public type="style" name="Theme.Light.Panel" id="0x0103005a" /> + + <public type="string" name="dialog_alert_title" id="0x01040014" /> + <public type="string" name="VideoView_error_text_invalid_progressive_playback" id="0x01040015" /> + + <public type="drawable" name="ic_btn_speak_now" id="0x010800a4" /> + + <!-- Drawable to use as a background for separators on a list with a dark background --> + <public type="drawable" name="dark_header" id="0x010800a5" /> + + <!-- Drawable to use as a background for a taller version of the titlebar --> + <public type="drawable" name="title_bar_tall" id="0x010800a6" /> + + <public type="integer" name="config_shortAnimTime" id="0x010e0000" /> + <public type="integer" name="config_mediumAnimTime" id="0x010e0001" /> + <public type="integer" name="config_longAnimTime" id="0x010e0002" /> + +<!-- =============================================================== + Resources added in version 4 of the platform (Donut). + =============================================================== --> + <eat-comment /> + + <public type="attr" name="tension" id="0x0101026a" /> + <public type="attr" name="extraTension" id="0x0101026b" /> + <public type="attr" name="anyDensity" id="0x0101026c" /> + <public type="attr" name="searchSuggestThreshold" id="0x0101026d" /> + <public type="attr" name="includeInGlobalSearch" id="0x0101026e" /> + <public type="attr" name="onClick" id="0x0101026f" /> + <public type="attr" name="targetSdkVersion" id="0x01010270" /> + <public type="attr" name="maxSdkVersion" id="0x01010271" /> + <public type="attr" name="testOnly" id="0x01010272" /> + <public type="attr" name="contentDescription" id="0x01010273" /> + <public type="attr" name="gestureStrokeWidth" id="0x01010274" /> + <public type="attr" name="gestureColor" id="0x01010275" /> + <public type="attr" name="uncertainGestureColor" id="0x01010276" /> + <public type="attr" name="fadeOffset" id="0x01010277" /> + <public type="attr" name="fadeDuration" id="0x01010278" /> + <public type="attr" name="gestureStrokeType" id="0x01010279" /> + <public type="attr" name="gestureStrokeLengthThreshold" id="0x0101027a" /> + <public type="attr" name="gestureStrokeSquarenessThreshold" id="0x0101027b" /> + <public type="attr" name="gestureStrokeAngleThreshold" id="0x0101027c" /> + <public type="attr" name="eventsInterceptionEnabled" id="0x0101027d" /> + <public type="attr" name="fadeEnabled" id="0x0101027e" /> + <public type="attr" name="backupAgent" id="0x0101027f" /> + <public type="attr" name="allowBackup" id="0x01010280" /> + <public type="attr" name="glEsVersion" id="0x01010281" /> + <public type="attr" name="queryAfterZeroResults" id="0x01010282" /> + <public type="attr" name="dropDownHeight" id="0x01010283" /> + <public type="attr" name="smallScreens" id="0x01010284" /> + <public type="attr" name="normalScreens" id="0x01010285" /> + <public type="attr" name="largeScreens" id="0x01010286" /> + <public type="attr" name="progressBarStyleInverse" id="0x01010287" /> + <public type="attr" name="progressBarStyleSmallInverse" id="0x01010288" /> + <public type="attr" name="progressBarStyleLargeInverse" id="0x01010289" /> + <public type="attr" name="searchSettingsDescription" id="0x0101028a" /> + <public type="attr" name="textColorPrimaryInverseDisableOnly" id="0x0101028b" /> + <public type="attr" name="autoUrlDetect" id="0x0101028c" /> + <public type="attr" name="resizeable" id="0x0101028d" /> + + <public type="style" name="Widget.ProgressBar.Inverse" id="0x0103005b" /> + <public type="style" name="Widget.ProgressBar.Large.Inverse" id="0x0103005c" /> + <public type="style" name="Widget.ProgressBar.Small.Inverse" id="0x0103005d" /> + + <!-- @deprecated Replaced by a private asset in the phone app. --> + <public type="drawable" name="stat_sys_vp_phone_call" id="0x010800a7" /> + <!-- @deprecated Replaced by a private asset in the phone app. --> + <public type="drawable" name="stat_sys_vp_phone_call_on_hold" id="0x010800a8" /> + + <public type="anim" name="anticipate_interpolator" id="0x010a0007" /> + <public type="anim" name="overshoot_interpolator" id="0x010a0008" /> + <public type="anim" name="anticipate_overshoot_interpolator" id="0x010a0009" /> + <public type="anim" name="bounce_interpolator" id="0x010a000a" /> + <public type="anim" name="linear_interpolator" id="0x010a000b" /> + +<!-- =============================================================== + Resources added in version 5 of the platform (Eclair). + =============================================================== --> + <eat-comment /> + + <public type="attr" name="required" id="0x0101028e" /> + <public type="attr" name="accountType" id="0x0101028f" /> + <public type="attr" name="contentAuthority" id="0x01010290" /> + <public type="attr" name="userVisible" id="0x01010291" /> + <public type="attr" name="windowShowWallpaper" id="0x01010292" /> + <public type="attr" name="wallpaperOpenEnterAnimation" id="0x01010293" /> + <public type="attr" name="wallpaperOpenExitAnimation" id="0x01010294" /> + <public type="attr" name="wallpaperCloseEnterAnimation" id="0x01010295" /> + <public type="attr" name="wallpaperCloseExitAnimation" id="0x01010296" /> + <public type="attr" name="wallpaperIntraOpenEnterAnimation" id="0x01010297" /> + <public type="attr" name="wallpaperIntraOpenExitAnimation" id="0x01010298" /> + <public type="attr" name="wallpaperIntraCloseEnterAnimation" id="0x01010299" /> + <public type="attr" name="wallpaperIntraCloseExitAnimation" id="0x0101029a" /> + <public type="attr" name="supportsUploading" id="0x0101029b" /> + <public type="attr" name="killAfterRestore" id="0x0101029c" /> + <public type="attr" name="restoreNeedsApplication" id="0x0101029d" /> + <public type="attr" name="smallIcon" id="0x0101029e" /> + <public type="attr" name="accountPreferences" id="0x0101029f" /> + <public type="attr" name="textAppearanceSearchResultSubtitle" id="0x010102a0" /> + <public type="attr" name="textAppearanceSearchResultTitle" id="0x010102a1" /> + <public type="attr" name="summaryColumn" id="0x010102a2" /> + <public type="attr" name="detailColumn" id="0x010102a3" /> + <public type="attr" name="detailSocialSummary" id="0x010102a4" /> + <public type="attr" name="thumbnail" id="0x010102a5" /> + <public type="attr" name="detachWallpaper" id="0x010102a6" /> + <public type="attr" name="finishOnCloseSystemDialogs" id="0x010102a7" /> + <public type="attr" name="scrollbarFadeDuration" id="0x010102a8" /> + <public type="attr" name="scrollbarDefaultDelayBeforeFade" id="0x010102a9" /> + <public type="attr" name="fadeScrollbars" id="0x010102aa" /> + <public type="attr" name="colorBackgroundCacheHint" id="0x010102ab" /> + <public type="attr" name="dropDownHorizontalOffset" id="0x010102ac" /> + <public type="attr" name="dropDownVerticalOffset" id="0x010102ad" /> + + <public type="style" name="Theme.Wallpaper" id="0x0103005e" /> + <public type="style" name="Theme.Wallpaper.NoTitleBar" id="0x0103005f" /> + <public type="style" name="Theme.Wallpaper.NoTitleBar.Fullscreen" id="0x01030060" /> + <public type="style" name="Theme.WallpaperSettings" id="0x01030061" /> + <public type="style" name="Theme.Light.WallpaperSettings" id="0x01030062" /> + <public type="style" name="TextAppearance.SearchResult.Title" id="0x01030063" /> + <public type="style" name="TextAppearance.SearchResult.Subtitle" id="0x01030064" /> + + <!-- Semi-transparent background that can be used when placing a dark + themed UI on top of some arbitrary background (such as the + wallpaper). This darkens the background sufficiently that the UI + can be seen. --> + <public type="drawable" name="screen_background_dark_transparent" id="0x010800a9" /> + <public type="drawable" name="screen_background_light_transparent" id="0x010800aa" /> + <public type="drawable" name="stat_notify_sdcard_prepare" id="0x010800ab" /> + +<!-- =============================================================== + Resources added in version 6 of the platform (Eclair 2.0.1). + =============================================================== --> + <eat-comment /> + + <public type="attr" name="quickContactBadgeStyleWindowSmall" id="0x010102ae" /> + <public type="attr" name="quickContactBadgeStyleWindowMedium" id="0x010102af" /> + <public type="attr" name="quickContactBadgeStyleWindowLarge" id="0x010102b0" /> + <public type="attr" name="quickContactBadgeStyleSmallWindowSmall" id="0x010102b1" /> + <public type="attr" name="quickContactBadgeStyleSmallWindowMedium" id="0x010102b2" /> + <public type="attr" name="quickContactBadgeStyleSmallWindowLarge" id="0x010102b3" /> + +<!-- =============================================================== + Resources added in version 7 of the platform (Eclair MR1). + =============================================================== --> + <eat-comment /> + + <public type="attr" name="author" id="0x010102b4" /> + <public type="attr" name="autoStart" id="0x010102b5" /> + + +<!-- =============================================================== + Resources added in version 8 of the platform (Eclair MR2). + =============================================================== --> + <eat-comment /> + + <public type="attr" name="expandableListViewWhiteStyle" id="0x010102b6" /> + +<!-- =============================================================== + Resources added in version 8 of the platform (Froyo / 2.2) + =============================================================== --> + <eat-comment /> + <public type="attr" name="installLocation" id="0x010102b7" /> + <public type="attr" name="vmSafeMode" id="0x010102b8" /> + <public type="attr" name="webTextViewStyle" id="0x010102b9" /> + <public type="attr" name="restoreAnyVersion" id="0x010102ba" /> + <public type="attr" name="tabStripLeft" id="0x010102bb" /> + <public type="attr" name="tabStripRight" id="0x010102bc" /> + <public type="attr" name="tabStripEnabled" id="0x010102bd" /> + + <public type="id" name="custom" id="0x0102002b" /> + + <public type="anim" name="cycle_interpolator" id="0x010a000c" /> + +<!-- =============================================================== + Resources added in version 9 of the platform (Gingerbread / 2.3) + =============================================================== --> + <eat-comment /> + <public type="attr" name="logo" id="0x010102be" /> + <public type="attr" name="xlargeScreens" id="0x010102bf" /> + <public type="attr" name="immersive" id="0x010102c0" /> + <public type="attr" name="overScrollMode" id="0x010102c1" /> + <public type="attr" name="overScrollHeader" id="0x010102c2" /> + <public type="attr" name="overScrollFooter" id="0x010102c3" /> + <public type="attr" name="filterTouchesWhenObscured" id="0x010102c4" /> + <public type="attr" name="textSelectHandleLeft" id="0x010102c5" /> + <public type="attr" name="textSelectHandleRight" id="0x010102c6" /> + <public type="attr" name="textSelectHandle" id="0x010102c7" /> + <public type="attr" name="textSelectHandleWindowStyle" id="0x010102c8" /> + <public type="attr" name="popupAnimationStyle" id="0x010102c9" /> + <public type="attr" name="screenSize" id="0x010102ca" /> + <public type="attr" name="screenDensity" id="0x010102cb" /> + + <!-- presence drawables for videochat or audiochat capable contacts --> + <public type="drawable" name="presence_video_away" id="0x010800ac" /> + <public type="drawable" name="presence_video_busy" id="0x010800ad" /> + <public type="drawable" name="presence_video_online" id="0x010800ae" /> + <public type="drawable" name="presence_audio_away" id="0x010800af" /> + <public type="drawable" name="presence_audio_busy" id="0x010800b0" /> + <public type="drawable" name="presence_audio_online" id="0x010800b1" /> + + <public type="style" name="TextAppearance.StatusBar.Title" id="0x01030065" /> + <public type="style" name="TextAppearance.StatusBar.Icon" id="0x01030066" /> + <public type="style" name="TextAppearance.StatusBar.EventContent" id="0x01030067" /> + <public type="style" name="TextAppearance.StatusBar.EventContent.Title" id="0x01030068" /> + +<!-- =============================================================== + Resources added in version 11 of the platform (Honeycomb / 3.0). + =============================================================== --> + <eat-comment /> + + <public type="attr" name="allContactsName" id="0x010102cc" /> + <public type="attr" name="windowActionBar" id="0x010102cd" /> + <public type="attr" name="actionBarStyle" id="0x010102ce" /> + <public type="attr" name="navigationMode" id="0x010102cf" /> + <public type="attr" name="displayOptions" id="0x010102d0" /> + <public type="attr" name="subtitle" id="0x010102d1" /> + <public type="attr" name="customNavigationLayout" id="0x010102d2" /> + <public type="attr" name="hardwareAccelerated" id="0x010102d3" /> + <public type="attr" name="measureWithLargestChild" id="0x010102d4" /> + <public type="attr" name="animateFirstView" id="0x010102d5" /> + <public type="attr" name="dropDownSpinnerStyle" id="0x010102d6" /> + <public type="attr" name="actionDropDownStyle" id="0x010102d7" /> + <public type="attr" name="actionButtonStyle" id="0x010102d8" /> + <public type="attr" name="showAsAction" id="0x010102d9" /> + <public type="attr" name="previewImage" id="0x010102da" /> + <public type="attr" name="actionModeBackground" id="0x010102db" /> + <public type="attr" name="actionModeCloseDrawable" id="0x010102dc" /> + <public type="attr" name="windowActionModeOverlay" id="0x010102dd" /> + <public type="attr" name="valueFrom" id="0x010102de" /> + <public type="attr" name="valueTo" id="0x010102df" /> + <public type="attr" name="valueType" id="0x010102e0" /> + <public type="attr" name="propertyName" id="0x010102e1" /> + <public type="attr" name="ordering" id="0x010102e2" /> + <public type="attr" name="fragment" id="0x010102e3" /> + <public type="attr" name="windowActionBarOverlay" id="0x010102e4" /> + <public type="attr" name="fragmentOpenEnterAnimation" id="0x010102e5" /> + <public type="attr" name="fragmentOpenExitAnimation" id="0x010102e6" /> + <public type="attr" name="fragmentCloseEnterAnimation" id="0x010102e7" /> + <public type="attr" name="fragmentCloseExitAnimation" id="0x010102e8" /> + <public type="attr" name="fragmentFadeEnterAnimation" id="0x010102e9" /> + <public type="attr" name="fragmentFadeExitAnimation" id="0x010102ea" /> + <public type="attr" name="actionBarSize" id="0x010102eb" /> + <public type="attr" name="imeSubtypeLocale" id="0x010102ec" /> + <public type="attr" name="imeSubtypeMode" id="0x010102ed" /> + <public type="attr" name="imeSubtypeExtraValue" id="0x010102ee" /> + <public type="attr" name="splitMotionEvents" id="0x010102ef" /> + <public type="attr" name="listChoiceBackgroundIndicator" id="0x010102f0" /> + <public type="attr" name="spinnerMode" id="0x010102f1" /> + <public type="attr" name="animateLayoutChanges" id="0x010102f2" /> + <public type="attr" name="actionBarTabStyle" id="0x010102f3" /> + <public type="attr" name="actionBarTabBarStyle" id="0x010102f4" /> + <public type="attr" name="actionBarTabTextStyle" id="0x010102f5" /> + <public type="attr" name="actionOverflowButtonStyle" id="0x010102f6" /> + <public type="attr" name="actionModeCloseButtonStyle" id="0x010102f7" /> + <public type="attr" name="titleTextStyle" id="0x010102f8" /> + <public type="attr" name="subtitleTextStyle" id="0x010102f9" /> + <public type="attr" name="iconifiedByDefault" id="0x010102fa" /> + <public type="attr" name="actionLayout" id="0x010102fb" /> + <public type="attr" name="actionViewClass" id="0x010102fc" /> + <public type="attr" name="activatedBackgroundIndicator" id="0x010102fd" /> + <public type="attr" name="state_activated" id="0x010102fe" /> + <public type="attr" name="listPopupWindowStyle" id="0x010102ff" /> + <public type="attr" name="popupMenuStyle" id="0x01010300" /> + <public type="attr" name="textAppearanceLargePopupMenu" id="0x01010301" /> + <public type="attr" name="textAppearanceSmallPopupMenu" id="0x01010302" /> + <public type="attr" name="breadCrumbTitle" id="0x01010303" /> + <public type="attr" name="breadCrumbShortTitle" id="0x01010304" /> + <public type="attr" name="listDividerAlertDialog" id="0x01010305" /> + <public type="attr" name="textColorAlertDialogListItem" id="0x01010306" /> + <public type="attr" name="loopViews" id="0x01010307" /> + <public type="attr" name="dialogTheme" id="0x01010308" /> + <public type="attr" name="alertDialogTheme" id="0x01010309" /> + <public type="attr" name="dividerVertical" id="0x0101030a" /> + <public type="attr" name="homeAsUpIndicator" id="0x0101030b" /> + <public type="attr" name="enterFadeDuration" id="0x0101030c" /> + <public type="attr" name="exitFadeDuration" id="0x0101030d" /> + <public type="attr" name="selectableItemBackground" id="0x0101030e" /> + <public type="attr" name="autoAdvanceViewId" id="0x0101030f" /> + <public type="attr" name="useIntrinsicSizeAsMinimum" id="0x01010310" /> + <public type="attr" name="actionModeCutDrawable" id="0x01010311" /> + <public type="attr" name="actionModeCopyDrawable" id="0x01010312" /> + <public type="attr" name="actionModePasteDrawable" id="0x01010313" /> + <public type="attr" name="textEditPasteWindowLayout" id="0x01010314" /> + <public type="attr" name="textEditNoPasteWindowLayout" id="0x01010315" /> + <public type="attr" name="textIsSelectable" id="0x01010316" /> + <public type="attr" name="windowEnableSplitTouch" id="0x01010317" /> + <public type="attr" name="indeterminateProgressStyle" id="0x01010318" /> + <public type="attr" name="progressBarPadding" id="0x01010319" /> + <!-- @deprecated Not used by the framework. --> + <public type="attr" name="animationResolution" id="0x0101031a" /> + <public type="attr" name="state_accelerated" id="0x0101031b" /> + <public type="attr" name="baseline" id="0x0101031c" /> + <public type="attr" name="homeLayout" id="0x0101031d" /> + <public type="attr" name="opacity" id="0x0101031e" /> + <public type="attr" name="alpha" id="0x0101031f" /> + <public type="attr" name="transformPivotX" id="0x01010320" /> + <public type="attr" name="transformPivotY" id="0x01010321" /> + <public type="attr" name="translationX" id="0x01010322" /> + <public type="attr" name="translationY" id="0x01010323" /> + <public type="attr" name="scaleX" id="0x01010324" /> + <public type="attr" name="scaleY" id="0x01010325" /> + <public type="attr" name="rotation" id="0x01010326" /> + <public type="attr" name="rotationX" id="0x01010327" /> + <public type="attr" name="rotationY" id="0x01010328" /> + <public type="attr" name="showDividers" id="0x01010329" /> + <public type="attr" name="dividerPadding" id="0x0101032a" /> + <public type="attr" name="borderlessButtonStyle" id="0x0101032b" /> + <public type="attr" name="dividerHorizontal" id="0x0101032c" /> + <public type="attr" name="itemPadding" id="0x0101032d" /> + <public type="attr" name="buttonBarStyle" id="0x0101032e" /> + <public type="attr" name="buttonBarButtonStyle" id="0x0101032f" /> + <public type="attr" name="segmentedButtonStyle" id="0x01010330" /> + <public type="attr" name="staticWallpaperPreview" id="0x01010331" /> + <public type="attr" name="allowParallelSyncs" id="0x01010332" /> + <public type="attr" name="isAlwaysSyncable" id="0x01010333" /> + <public type="attr" name="verticalScrollbarPosition" id="0x01010334" /> + <public type="attr" name="fastScrollAlwaysVisible" id="0x01010335" /> + <public type="attr" name="fastScrollThumbDrawable" id="0x01010336" /> + <public type="attr" name="fastScrollPreviewBackgroundLeft" id="0x01010337" /> + <public type="attr" name="fastScrollPreviewBackgroundRight" id="0x01010338" /> + <public type="attr" name="fastScrollTrackDrawable" id="0x01010339" /> + <public type="attr" name="fastScrollOverlayPosition" id="0x0101033a" /> + <public type="attr" name="customTokens" id="0x0101033b" /> + <public type="attr" name="nextFocusForward" id="0x0101033c" /> + <public type="attr" name="firstDayOfWeek" id="0x0101033d" /> + <public type="attr" name="showWeekNumber" id="0x0101033e" /> + <public type="attr" name="minDate" id="0x0101033f" /> + <public type="attr" name="maxDate" id="0x01010340" /> + <public type="attr" name="shownWeekCount" id="0x01010341" /> + <public type="attr" name="selectedWeekBackgroundColor" id="0x01010342" /> + <public type="attr" name="focusedMonthDateColor" id="0x01010343" /> + <public type="attr" name="unfocusedMonthDateColor" id="0x01010344" /> + <public type="attr" name="weekNumberColor" id="0x01010345" /> + <public type="attr" name="weekSeparatorLineColor" id="0x01010346" /> + <public type="attr" name="selectedDateVerticalBar" id="0x01010347" /> + <public type="attr" name="weekDayTextAppearance" id="0x01010348" /> + <public type="attr" name="dateTextAppearance" id="0x01010349" /> + <public type="attr" name="solidColor" id="0x0101034a" /> + <public type="attr" name="spinnersShown" id="0x0101034b" /> + <public type="attr" name="calendarViewShown" id="0x0101034c" /> + <public type="attr" name="state_multiline" id="0x0101034d" /> + <public type="attr" name="detailsElementBackground" id="0x0101034e" /> + <public type="attr" name="textColorHighlightInverse" id="0x0101034f" /> + <public type="attr" name="textColorLinkInverse" id="0x01010350" /> + <public type="attr" name="editTextColor" id="0x01010351" /> + <public type="attr" name="editTextBackground" id="0x01010352" /> + <public type="attr" name="horizontalScrollViewStyle" id="0x01010353" /> + <public type="attr" name="layerType" id="0x01010354" /> + <public type="attr" name="alertDialogIcon" id="0x01010355" /> + <public type="attr" name="windowMinWidthMajor" id="0x01010356" /> + <public type="attr" name="windowMinWidthMinor" id="0x01010357" /> + <public type="attr" name="queryHint" id="0x01010358" /> + <public type="attr" name="fastScrollTextColor" id="0x01010359" /> + <public type="attr" name="largeHeap" id="0x0101035a" /> + <public type="attr" name="windowCloseOnTouchOutside" id="0x0101035b" /> + <public type="attr" name="datePickerStyle" id="0x0101035c" /> + <public type="attr" name="calendarViewStyle" id="0x0101035d" /> + <public type="attr" name="textEditSidePasteWindowLayout" id="0x0101035e" /> + <public type="attr" name="textEditSideNoPasteWindowLayout" id="0x0101035f" /> + <public type="attr" name="actionMenuTextAppearance" id="0x01010360" /> + <public type="attr" name="actionMenuTextColor" id="0x01010361" /> + + <!-- A simple fade-in animation. --> + <public type="animator" name="fade_in" id="0x010b0000" /> + <!-- A simple fade-out animation. --> + <public type="animator" name="fade_out" id="0x010b0001" /> + + <!-- Acceleration curve matching a quadtratic ease out function. --> + <public type="interpolator" name="accelerate_quad" id="0x010c0000" /> + <!-- Acceleration curve matching a quadtratic ease in function. --> + <public type="interpolator" name="decelerate_quad" id="0x010c0001" /> + + <!-- Acceleration curve matching a cubic ease out function. --> + <public type="interpolator" name="accelerate_cubic" id="0x010c0002" /> + <!-- Acceleration curve matching a cubic ease in function. --> + <public type="interpolator" name="decelerate_cubic" id="0x010c0003" /> + <!-- Acceleration curve matching a quint ease out function. --> + <public type="interpolator" name="accelerate_quint" id="0x010c0004" /> + <!-- Acceleration curve matching a quint ease in function. --> + <public type="interpolator" name="decelerate_quint" id="0x010c0005" /> + <!-- Acceleration curve matching an ease in + ease out function --> + <public type="interpolator" name="accelerate_decelerate" id="0x010c0006" /> + <!-- An interpolator where the change starts backward then flings forward. --> + <public type="interpolator" name="anticipate" id="0x010c0007" /> + <!-- An interpolator where the change flings forward and overshoots the last + value then comes back. --> + <public type="interpolator" name="overshoot" id="0x010c0008" /> + <!-- An interpolator where the change starts backward then flings forward and + overshoots the target value and finally goes back to the final value. --> + <public type="interpolator" name="anticipate_overshoot" id="0x010c0009" /> + <!-- An interpolator where the change bounces at the end. --> + <public type="interpolator" name="bounce" id="0x010c000a" /> + <!-- An interpolator where the rate of change is constant. --> + <public type="interpolator" name="linear" id="0x010c000b" /> + <!-- Repeats the animation for one cycle. The rate of change follows a + sinusoidal pattern. --> + <public type="interpolator" name="cycle" id="0x010c000c" /> + + <public type="id" name="home" id="0x0102002c" /> + <!-- Context menu ID for the "Select text..." menu item to switch to text + selection context mode in text views. --> + <public type="id" name="selectTextMode" id="0x0102002d" /> + + <public type="dimen" name="dialog_min_width_major" id="0x01050003" /> + <public type="dimen" name="dialog_min_width_minor" id="0x01050004" /> + <public type="dimen" name="notification_large_icon_width" id="0x01050005" /> + <public type="dimen" name="notification_large_icon_height" id="0x01050006" /> + + <!-- Standard content view for a {@link android.app.ListFragment}. + If you are implementing a subclass of ListFragment with your + own customized content, you can include this layout in that + content to still retain all of the standard functionality of + the base class. --> + <public type="layout" name="list_content" id="0x01090014" /> + + <!-- A simple ListView item layout which can contain text and support (single or multiple) item selection. --> + <public type="layout" name="simple_selectable_list_item" id="0x01090015" /> + + <!-- A version of {@link #simple_list_item_1} that is able to change its + background state to indicate when it is activated (that is checked by + a ListView). --> + <public type="layout" name="simple_list_item_activated_1" id="0x01090016" /> + + <!-- A version of {@link #simple_list_item_2} that is able to change its + background state to indicate when it is activated (that is checked by + a ListView). --> + <public type="layout" name="simple_list_item_activated_2" id="0x01090017" /> + + <public type="drawable" name="dialog_holo_dark_frame" id="0x010800b2" /> + <public type="drawable" name="dialog_holo_light_frame" id="0x010800b3" /> + + <public type="style" name="Theme.WithActionBar" id="0x01030069" /> + <public type="style" name="Theme.NoTitleBar.OverlayActionModes" id="0x0103006a" /> + <public type="style" name="Theme.Holo" id="0x0103006b" /> + <public type="style" name="Theme.Holo.NoActionBar" id="0x0103006c" /> + <public type="style" name="Theme.Holo.NoActionBar.Fullscreen" id="0x0103006d" /> + <public type="style" name="Theme.Holo.Light" id="0x0103006e" /> + <public type="style" name="Theme.Holo.Dialog" id="0x0103006f" /> + <public type="style" name="Theme.Holo.Dialog.MinWidth" id="0x01030070" /> + <public type="style" name="Theme.Holo.Dialog.NoActionBar" id="0x01030071" /> + <public type="style" name="Theme.Holo.Dialog.NoActionBar.MinWidth" id="0x01030072" /> + <public type="style" name="Theme.Holo.Light.Dialog" id="0x01030073" /> + <public type="style" name="Theme.Holo.Light.Dialog.MinWidth" id="0x01030074" /> + <public type="style" name="Theme.Holo.Light.Dialog.NoActionBar" id="0x01030075" /> + <public type="style" name="Theme.Holo.Light.Dialog.NoActionBar.MinWidth" id="0x01030076" /> + <public type="style" name="Theme.Holo.DialogWhenLarge" id="0x01030077" /> + <public type="style" name="Theme.Holo.DialogWhenLarge.NoActionBar" id="0x01030078" /> + <public type="style" name="Theme.Holo.Light.DialogWhenLarge" id="0x01030079" /> + <public type="style" name="Theme.Holo.Light.DialogWhenLarge.NoActionBar" id="0x0103007a" /> + <public type="style" name="Theme.Holo.Panel" id="0x0103007b" /> + <public type="style" name="Theme.Holo.Light.Panel" id="0x0103007c" /> + <public type="style" name="Theme.Holo.Wallpaper" id="0x0103007d" /> + <public type="style" name="Theme.Holo.Wallpaper.NoTitleBar" id="0x0103007e" /> + <public type="style" name="Theme.Holo.InputMethod" id="0x0103007f" /> + <public type="style" name="TextAppearance.Widget.PopupMenu.Large" id="0x01030080" /> + <public type="style" name="TextAppearance.Widget.PopupMenu.Small" id="0x01030081" /> + <public type="style" name="Widget.ActionBar" id="0x01030082" /> + <public type="style" name="Widget.Spinner.DropDown" id="0x01030083" /> + <public type="style" name="Widget.ActionButton" id="0x01030084" /> + <public type="style" name="Widget.ListPopupWindow" id="0x01030085" /> + <public type="style" name="Widget.PopupMenu" id="0x01030086" /> + <public type="style" name="Widget.ActionButton.Overflow" id="0x01030087" /> + <public type="style" name="Widget.ActionButton.CloseMode" id="0x01030088" /> + <public type="style" name="Widget.FragmentBreadCrumbs" id="0x01030089" /> + <public type="style" name="Widget.Holo" id="0x0103008a" /> + <public type="style" name="Widget.Holo.Button" id="0x0103008b" /> + <public type="style" name="Widget.Holo.Button.Small" id="0x0103008c" /> + <public type="style" name="Widget.Holo.Button.Inset" id="0x0103008d" /> + <public type="style" name="Widget.Holo.Button.Toggle" id="0x0103008e" /> + <public type="style" name="Widget.Holo.TextView" id="0x0103008f" /> + <public type="style" name="Widget.Holo.AutoCompleteTextView" id="0x01030090" /> + <public type="style" name="Widget.Holo.CompoundButton.CheckBox" id="0x01030091" /> + <public type="style" name="Widget.Holo.ListView.DropDown" id="0x01030092" /> + <public type="style" name="Widget.Holo.EditText" id="0x01030093" /> + <public type="style" name="Widget.Holo.ExpandableListView" id="0x01030094" /> + <public type="style" name="Widget.Holo.GridView" id="0x01030095" /> + <public type="style" name="Widget.Holo.ImageButton" id="0x01030096" /> + <public type="style" name="Widget.Holo.ListView" id="0x01030097" /> + <public type="style" name="Widget.Holo.PopupWindow" id="0x01030098" /> + <public type="style" name="Widget.Holo.ProgressBar" id="0x01030099" /> + <public type="style" name="Widget.Holo.ProgressBar.Horizontal" id="0x0103009a" /> + <public type="style" name="Widget.Holo.ProgressBar.Small" id="0x0103009b" /> + <public type="style" name="Widget.Holo.ProgressBar.Small.Title" id="0x0103009c" /> + <public type="style" name="Widget.Holo.ProgressBar.Large" id="0x0103009d" /> + <public type="style" name="Widget.Holo.SeekBar" id="0x0103009e" /> + <public type="style" name="Widget.Holo.RatingBar" id="0x0103009f" /> + <public type="style" name="Widget.Holo.RatingBar.Indicator" id="0x010300a0" /> + <public type="style" name="Widget.Holo.RatingBar.Small" id="0x010300a1" /> + <public type="style" name="Widget.Holo.CompoundButton.RadioButton" id="0x010300a2" /> + <public type="style" name="Widget.Holo.ScrollView" id="0x010300a3" /> + <public type="style" name="Widget.Holo.HorizontalScrollView" id="0x010300a4" /> + <public type="style" name="Widget.Holo.Spinner" id="0x010300a5" /> + <public type="style" name="Widget.Holo.CompoundButton.Star" id="0x010300a6" /> + <public type="style" name="Widget.Holo.TabWidget" id="0x010300a7" /> + <public type="style" name="Widget.Holo.WebTextView" id="0x010300a8" /> + <public type="style" name="Widget.Holo.WebView" id="0x010300a9" /> + <public type="style" name="Widget.Holo.DropDownItem" id="0x010300aa" /> + <public type="style" name="Widget.Holo.DropDownItem.Spinner" id="0x010300ab" /> + <public type="style" name="Widget.Holo.TextView.SpinnerItem" id="0x010300ac" /> + <public type="style" name="Widget.Holo.ListPopupWindow" id="0x010300ad" /> + <public type="style" name="Widget.Holo.PopupMenu" id="0x010300ae" /> + <public type="style" name="Widget.Holo.ActionButton" id="0x010300af" /> + <public type="style" name="Widget.Holo.ActionButton.Overflow" id="0x010300b0" /> + <public type="style" name="Widget.Holo.ActionButton.TextButton" id="0x010300b1" /> + <public type="style" name="Widget.Holo.ActionMode" id="0x010300b2" /> + <public type="style" name="Widget.Holo.ActionButton.CloseMode" id="0x010300b3" /> + <public type="style" name="Widget.Holo.ActionBar" id="0x010300b4" /> + <public type="style" name="Widget.Holo.Light" id="0x010300b5" /> + <public type="style" name="Widget.Holo.Light.Button" id="0x010300b6" /> + <public type="style" name="Widget.Holo.Light.Button.Small" id="0x010300b7" /> + <public type="style" name="Widget.Holo.Light.Button.Inset" id="0x010300b8" /> + <public type="style" name="Widget.Holo.Light.Button.Toggle" id="0x010300b9" /> + <public type="style" name="Widget.Holo.Light.TextView" id="0x010300ba" /> + <public type="style" name="Widget.Holo.Light.AutoCompleteTextView" id="0x010300bb" /> + <public type="style" name="Widget.Holo.Light.CompoundButton.CheckBox" id="0x010300bc" /> + <public type="style" name="Widget.Holo.Light.ListView.DropDown" id="0x010300bd" /> + <public type="style" name="Widget.Holo.Light.EditText" id="0x010300be" /> + <public type="style" name="Widget.Holo.Light.ExpandableListView" id="0x010300bf" /> + <public type="style" name="Widget.Holo.Light.GridView" id="0x010300c0" /> + <public type="style" name="Widget.Holo.Light.ImageButton" id="0x010300c1" /> + <public type="style" name="Widget.Holo.Light.ListView" id="0x010300c2" /> + <public type="style" name="Widget.Holo.Light.PopupWindow" id="0x010300c3" /> + <public type="style" name="Widget.Holo.Light.ProgressBar" id="0x010300c4" /> + <public type="style" name="Widget.Holo.Light.ProgressBar.Horizontal" id="0x010300c5" /> + <public type="style" name="Widget.Holo.Light.ProgressBar.Small" id="0x010300c6" /> + <public type="style" name="Widget.Holo.Light.ProgressBar.Small.Title" id="0x010300c7" /> + <public type="style" name="Widget.Holo.Light.ProgressBar.Large" id="0x010300c8" /> + <public type="style" name="Widget.Holo.Light.ProgressBar.Inverse" id="0x010300c9" /> + <public type="style" name="Widget.Holo.Light.ProgressBar.Small.Inverse" id="0x010300ca" /> + <public type="style" name="Widget.Holo.Light.ProgressBar.Large.Inverse" id="0x010300cb" /> + <public type="style" name="Widget.Holo.Light.SeekBar" id="0x010300cc" /> + <public type="style" name="Widget.Holo.Light.RatingBar" id="0x010300cd" /> + <public type="style" name="Widget.Holo.Light.RatingBar.Indicator" id="0x010300ce" /> + <public type="style" name="Widget.Holo.Light.RatingBar.Small" id="0x010300cf" /> + <public type="style" name="Widget.Holo.Light.CompoundButton.RadioButton" id="0x010300d0" /> + <public type="style" name="Widget.Holo.Light.ScrollView" id="0x010300d1" /> + <public type="style" name="Widget.Holo.Light.HorizontalScrollView" id="0x010300d2" /> + <public type="style" name="Widget.Holo.Light.Spinner" id="0x010300d3" /> + <public type="style" name="Widget.Holo.Light.CompoundButton.Star" id="0x010300d4" /> + <public type="style" name="Widget.Holo.Light.TabWidget" id="0x010300d5" /> + <public type="style" name="Widget.Holo.Light.WebTextView" id="0x010300d6" /> + <public type="style" name="Widget.Holo.Light.WebView" id="0x010300d7" /> + <public type="style" name="Widget.Holo.Light.DropDownItem" id="0x010300d8" /> + <public type="style" name="Widget.Holo.Light.DropDownItem.Spinner" id="0x010300d9" /> + <public type="style" name="Widget.Holo.Light.TextView.SpinnerItem" id="0x010300da" /> + <public type="style" name="Widget.Holo.Light.ListPopupWindow" id="0x010300db" /> + <public type="style" name="Widget.Holo.Light.PopupMenu" id="0x010300dc" /> + <public type="style" name="Widget.Holo.Light.ActionButton" id="0x010300dd" /> + <public type="style" name="Widget.Holo.Light.ActionButton.Overflow" id="0x010300de" /> + <public type="style" name="Widget.Holo.Light.ActionMode" id="0x010300df" /> + <public type="style" name="Widget.Holo.Light.ActionButton.CloseMode" id="0x010300e0" /> + <public type="style" name="Widget.Holo.Light.ActionBar" id="0x010300e1" /> + <public type="style" name="Widget.Holo.Button.Borderless" id="0x010300e2" /> + <public type="style" name="Widget.Holo.Tab" id="0x010300e3" /> + <public type="style" name="Widget.Holo.Light.Tab" id="0x010300e4" /> + <public type="style" name="Holo.ButtonBar" id="0x010300e5" /> + <public type="style" name="Holo.Light.ButtonBar" id="0x010300e6" /> + <public type="style" name="Holo.ButtonBar.AlertDialog" id="0x010300e7" /> + <public type="style" name="Holo.Light.ButtonBar.AlertDialog" id="0x010300e8" /> + <public type="style" name="Holo.SegmentedButton" id="0x010300e9" /> + <public type="style" name="Holo.Light.SegmentedButton" id="0x010300ea" /> + <public type="style" name="Widget.CalendarView" id="0x010300eb" /> + <public type="style" name="Widget.Holo.CalendarView" id="0x010300ec" /> + <public type="style" name="Widget.Holo.Light.CalendarView" id="0x010300ed" /> + <public type="style" name="Widget.DatePicker" id="0x010300ee" /> + <public type="style" name="Widget.Holo.DatePicker" id="0x010300ef" /> + + <public type="string" name="selectTextMode" id="0x01040016" /> + + <!-- Default icon for applications that don't specify an icon. --> + <public type="mipmap" name="sym_def_app_icon" id="0x010d0000" /> + +<!-- =============================================================== + Resources added in version 12 of the platform (Honeycomb MR 1 / 3.1) + =============================================================== --> + <eat-comment /> + <public type="attr" name="textCursorDrawable" id="0x01010362" /> + <public type="attr" name="resizeMode" id="0x01010363" /> + +<!-- =============================================================== + Resources added in version 13 of the platform (Honeycomb MR 2 / 3.2) + =============================================================== --> + <eat-comment /> + <public type="attr" name="requiresSmallestWidthDp" id="0x01010364" /> + <public type="attr" name="compatibleWidthLimitDp" id="0x01010365" /> + <public type="attr" name="largestWidthLimitDp" id="0x01010366" /> + + <public type="style" name="Theme.Holo.Light.NoActionBar" id="0x010300f0" /> + <public type="style" name="Theme.Holo.Light.NoActionBar.Fullscreen" id="0x010300f1" /> + + <public type="style" name="Widget.ActionBar.TabView" id="0x010300f2" /> + <public type="style" name="Widget.ActionBar.TabText" id="0x010300f3" /> + <public type="style" name="Widget.ActionBar.TabBar" id="0x010300f4" /> + <public type="style" name="Widget.Holo.ActionBar.TabView" id="0x010300f5" /> + <public type="style" name="Widget.Holo.ActionBar.TabText" id="0x010300f6" /> + <public type="style" name="Widget.Holo.ActionBar.TabBar" id="0x010300f7" /> + <public type="style" name="Widget.Holo.Light.ActionBar.TabView" id="0x010300f8" /> + <public type="style" name="Widget.Holo.Light.ActionBar.TabText" id="0x010300f9" /> + <public type="style" name="Widget.Holo.Light.ActionBar.TabBar" id="0x010300fa" /> + <public type="style" name="TextAppearance.Holo" id="0x010300fb" /> + <public type="style" name="TextAppearance.Holo.Inverse" id="0x010300fc" /> + <public type="style" name="TextAppearance.Holo.Large" id="0x010300fd" /> + <public type="style" name="TextAppearance.Holo.Large.Inverse" id="0x010300fe" /> + <public type="style" name="TextAppearance.Holo.Medium" id="0x010300ff" /> + <public type="style" name="TextAppearance.Holo.Medium.Inverse" id="0x01030100" /> + <public type="style" name="TextAppearance.Holo.Small" id="0x01030101" /> + <public type="style" name="TextAppearance.Holo.Small.Inverse" id="0x01030102" /> + <public type="style" name="TextAppearance.Holo.SearchResult.Title" id="0x01030103" /> + <public type="style" name="TextAppearance.Holo.SearchResult.Subtitle" id="0x01030104" /> + <public type="style" name="TextAppearance.Holo.Widget" id="0x01030105" /> + <public type="style" name="TextAppearance.Holo.Widget.Button" id="0x01030106" /> + <public type="style" name="TextAppearance.Holo.Widget.IconMenu.Item" id="0x01030107" /> + <public type="style" name="TextAppearance.Holo.Widget.TabWidget" id="0x01030108" /> + <public type="style" name="TextAppearance.Holo.Widget.TextView" id="0x01030109" /> + <public type="style" name="TextAppearance.Holo.Widget.TextView.PopupMenu" id="0x0103010a" /> + <public type="style" name="TextAppearance.Holo.Widget.DropDownHint" id="0x0103010b" /> + <public type="style" name="TextAppearance.Holo.Widget.DropDownItem" id="0x0103010c" /> + <public type="style" name="TextAppearance.Holo.Widget.TextView.SpinnerItem" id="0x0103010d" /> + <public type="style" name="TextAppearance.Holo.Widget.EditText" id="0x0103010e" /> + <public type="style" name="TextAppearance.Holo.Widget.PopupMenu" id="0x0103010f" /> + <public type="style" name="TextAppearance.Holo.Widget.PopupMenu.Large" id="0x01030110" /> + <public type="style" name="TextAppearance.Holo.Widget.PopupMenu.Small" id="0x01030111" /> + <public type="style" name="TextAppearance.Holo.Widget.ActionBar.Title" id="0x01030112" /> + <public type="style" name="TextAppearance.Holo.Widget.ActionBar.Subtitle" id="0x01030113" /> + <public type="style" name="TextAppearance.Holo.Widget.ActionMode.Title" id="0x01030114" /> + <public type="style" name="TextAppearance.Holo.Widget.ActionMode.Subtitle" id="0x01030115" /> + <public type="style" name="TextAppearance.Holo.WindowTitle" id="0x01030116" /> + <public type="style" name="TextAppearance.Holo.DialogWindowTitle" id="0x01030117" /> + +<!-- =============================================================== + Resources added in version 14 of the platform (Ice Cream Sandwich / 4.0) + =============================================================== --> + <eat-comment /> + <public type="attr" name="state_hovered" id="0x01010367" /> + <public type="attr" name="state_drag_can_accept" id="0x01010368" /> + <public type="attr" name="state_drag_hovered" id="0x01010369" /> + <public type="attr" name="stopWithTask" id="0x0101036a" /> + <public type="attr" name="switchTextOn" id="0x0101036b" /> + <public type="attr" name="switchTextOff" id="0x0101036c" /> + <public type="attr" name="switchPreferenceStyle" id="0x0101036d" /> + <public type="attr" name="switchTextAppearance" id="0x0101036e" /> + <public type="attr" name="track" id="0x0101036f" /> + <public type="attr" name="switchMinWidth" id="0x01010370" /> + <public type="attr" name="switchPadding" id="0x01010371" /> + <public type="attr" name="thumbTextPadding" id="0x01010372" /> + <public type="attr" name="textSuggestionsWindowStyle" id="0x01010373" /> + <public type="attr" name="textEditSuggestionItemLayout" id="0x01010374" /> + <public type="attr" name="rowCount" id="0x01010375" /> + <public type="attr" name="rowOrderPreserved" id="0x01010376" /> + <public type="attr" name="columnCount" id="0x01010377" /> + <public type="attr" name="columnOrderPreserved" id="0x01010378" /> + <public type="attr" name="useDefaultMargins" id="0x01010379" /> + <public type="attr" name="alignmentMode" id="0x0101037a" /> + <public type="attr" name="layout_row" id="0x0101037b" /> + <public type="attr" name="layout_rowSpan" id="0x0101037c" /> + <public type="attr" name="layout_columnSpan" id="0x0101037d" /> + <public type="attr" name="actionModeSelectAllDrawable" id="0x0101037e" /> + <public type="attr" name="isAuxiliary" id="0x0101037f" /> + <public type="attr" name="accessibilityEventTypes" id="0x01010380" /> + <public type="attr" name="packageNames" id="0x01010381" /> + <public type="attr" name="accessibilityFeedbackType" id="0x01010382" /> + <public type="attr" name="notificationTimeout" id="0x01010383" /> + <public type="attr" name="accessibilityFlags" id="0x01010384" /> + <public type="attr" name="canRetrieveWindowContent" id="0x01010385" /> + <public type="attr" name="listPreferredItemHeightLarge" id="0x01010386" /> + <public type="attr" name="listPreferredItemHeightSmall" id="0x01010387" /> + <public type="attr" name="actionBarSplitStyle" id="0x01010388" /> + <public type="attr" name="actionProviderClass" id="0x01010389" /> + <public type="attr" name="backgroundStacked" id="0x0101038a" /> + <public type="attr" name="backgroundSplit" id="0x0101038b" /> + <public type="attr" name="textAllCaps" id="0x0101038c" /> + <public type="attr" name="colorPressedHighlight" id="0x0101038d" /> + <public type="attr" name="colorLongPressedHighlight" id="0x0101038e" /> + <public type="attr" name="colorFocusedHighlight" id="0x0101038f" /> + <public type="attr" name="colorActivatedHighlight" id="0x01010390" /> + <public type="attr" name="colorMultiSelectHighlight" id="0x01010391" /> + <public type="attr" name="drawableStart" id="0x01010392" /> + <public type="attr" name="drawableEnd" id="0x01010393" /> + <public type="attr" name="actionModeStyle" id="0x01010394" /> + <public type="attr" name="minResizeWidth" id="0x01010395" /> + <public type="attr" name="minResizeHeight" id="0x01010396" /> + <public type="attr" name="actionBarWidgetTheme" id="0x01010397" /> + <public type="attr" name="uiOptions" id="0x01010398" /> + <public type="attr" name="subtypeLocale" id="0x01010399" /> + <public type="attr" name="subtypeExtraValue" id="0x0101039a" /> + <public type="attr" name="actionBarDivider" id="0x0101039b" /> + <public type="attr" name="actionBarItemBackground" id="0x0101039c" /> + <public type="attr" name="actionModeSplitBackground" id="0x0101039d" /> + <public type="attr" name="textAppearanceListItem" id="0x0101039e" /> + <public type="attr" name="textAppearanceListItemSmall" id="0x0101039f" /> + <!-- @deprecated Removed. --> + <public type="attr" name="targetDescriptions" id="0x010103a0" /> + <!-- @deprecated Removed. --> + <public type="attr" name="directionDescriptions" id="0x010103a1" /> + <public type="attr" name="overridesImplicitlyEnabledSubtype" id="0x010103a2" /> + <public type="attr" name="listPreferredItemPaddingLeft" id="0x010103a3" /> + <public type="attr" name="listPreferredItemPaddingRight" id="0x010103a4" /> + <public type="attr" name="requiresFadingEdge" id="0x010103a5" /> + <public type="attr" name="publicKey" id="0x010103a6" /> + + <public type="style" name="TextAppearance.SuggestionHighlight" id="0x01030118" /> + <public type="style" name="Theme.Holo.Light.DarkActionBar" id="0x01030119" /> + <public type="style" name="Widget.Holo.Button.Borderless.Small" id="0x0103011a" /> + <public type="style" name="Widget.Holo.Light.Button.Borderless.Small" id="0x0103011b" /> + <public type="style" name="TextAppearance.Holo.Widget.ActionBar.Title.Inverse" id="0x0103011c" /> + <public type="style" name="TextAppearance.Holo.Widget.ActionBar.Subtitle.Inverse" id="0x0103011d" /> + <public type="style" name="TextAppearance.Holo.Widget.ActionMode.Title.Inverse" id="0x0103011e" /> + <public type="style" name="TextAppearance.Holo.Widget.ActionMode.Subtitle.Inverse" id="0x0103011f" /> + <public type="style" name="TextAppearance.Holo.Widget.ActionBar.Menu" id="0x01030120" /> + <public type="style" name="Widget.Holo.ActionBar.Solid" id="0x01030121" /> + <public type="style" name="Widget.Holo.Light.ActionBar.Solid" id="0x01030122" /> + <public type="style" name="Widget.Holo.Light.ActionBar.Solid.Inverse" id="0x01030123" /> + <public type="style" name="Widget.Holo.Light.ActionBar.TabBar.Inverse" id="0x01030124" /> + <public type="style" name="Widget.Holo.Light.ActionBar.TabView.Inverse" id="0x01030125" /> + <public type="style" name="Widget.Holo.Light.ActionBar.TabText.Inverse" id="0x01030126" /> + <public type="style" name="Widget.Holo.Light.ActionMode.Inverse" id="0x01030127" /> + <public type="style" name="Theme.DeviceDefault" id="0x01030128" /> + <public type="style" name="Theme.DeviceDefault.NoActionBar" id="0x01030129" /> + <public type="style" name="Theme.DeviceDefault.NoActionBar.Fullscreen" id="0x0103012a" /> + <public type="style" name="Theme.DeviceDefault.Light" id="0x0103012b" /> + <public type="style" name="Theme.DeviceDefault.Light.NoActionBar" id="0x0103012c" /> + <public type="style" name="Theme.DeviceDefault.Light.NoActionBar.Fullscreen" id="0x0103012d" /> + <public type="style" name="Theme.DeviceDefault.Dialog" id="0x0103012e" /> + <public type="style" name="Theme.DeviceDefault.Dialog.MinWidth" id="0x0103012f" /> + <public type="style" name="Theme.DeviceDefault.Dialog.NoActionBar" id="0x01030130" /> + <public type="style" name="Theme.DeviceDefault.Dialog.NoActionBar.MinWidth" id="0x01030131" /> + <public type="style" name="Theme.DeviceDefault.Light.Dialog" id="0x01030132" /> + <public type="style" name="Theme.DeviceDefault.Light.Dialog.MinWidth" id="0x01030133" /> + <public type="style" name="Theme.DeviceDefault.Light.Dialog.NoActionBar" id="0x01030134" /> + <public type="style" name="Theme.DeviceDefault.Light.Dialog.NoActionBar.MinWidth" id="0x01030135" /> + <public type="style" name="Theme.DeviceDefault.DialogWhenLarge" id="0x01030136" /> + <public type="style" name="Theme.DeviceDefault.DialogWhenLarge.NoActionBar" id="0x01030137" /> + <public type="style" name="Theme.DeviceDefault.Light.DialogWhenLarge" id="0x01030138" /> + <public type="style" name="Theme.DeviceDefault.Light.DialogWhenLarge.NoActionBar" id="0x01030139" /> + <public type="style" name="Theme.DeviceDefault.Panel" id="0x0103013a" /> + <public type="style" name="Theme.DeviceDefault.Light.Panel" id="0x0103013b" /> + <public type="style" name="Theme.DeviceDefault.Wallpaper" id="0x0103013c" /> + <public type="style" name="Theme.DeviceDefault.Wallpaper.NoTitleBar" id="0x0103013d" /> + <public type="style" name="Theme.DeviceDefault.InputMethod" id="0x0103013e" /> + <public type="style" name="Theme.DeviceDefault.Light.DarkActionBar" id="0x0103013f" /> + <public type="style" name="Widget.DeviceDefault" id="0x01030140" /> + <public type="style" name="Widget.DeviceDefault.Button" id="0x01030141" /> + <public type="style" name="Widget.DeviceDefault.Button.Small" id="0x01030142" /> + <public type="style" name="Widget.DeviceDefault.Button.Inset" id="0x01030143" /> + <public type="style" name="Widget.DeviceDefault.Button.Toggle" id="0x01030144" /> + <public type="style" name="Widget.DeviceDefault.Button.Borderless.Small" id="0x01030145" /> + <public type="style" name="Widget.DeviceDefault.TextView" id="0x01030146" /> + <public type="style" name="Widget.DeviceDefault.AutoCompleteTextView" id="0x01030147" /> + <public type="style" name="Widget.DeviceDefault.CompoundButton.CheckBox" id="0x01030148" /> + <public type="style" name="Widget.DeviceDefault.ListView.DropDown" id="0x01030149" /> + <public type="style" name="Widget.DeviceDefault.EditText" id="0x0103014a" /> + <public type="style" name="Widget.DeviceDefault.ExpandableListView" id="0x0103014b" /> + <public type="style" name="Widget.DeviceDefault.GridView" id="0x0103014c" /> + <public type="style" name="Widget.DeviceDefault.ImageButton" id="0x0103014d" /> + <public type="style" name="Widget.DeviceDefault.ListView" id="0x0103014e" /> + <public type="style" name="Widget.DeviceDefault.PopupWindow" id="0x0103014f" /> + <public type="style" name="Widget.DeviceDefault.ProgressBar" id="0x01030150" /> + <public type="style" name="Widget.DeviceDefault.ProgressBar.Horizontal" id="0x01030151" /> + <public type="style" name="Widget.DeviceDefault.ProgressBar.Small" id="0x01030152" /> + <public type="style" name="Widget.DeviceDefault.ProgressBar.Small.Title" id="0x01030153" /> + <public type="style" name="Widget.DeviceDefault.ProgressBar.Large" id="0x01030154" /> + <public type="style" name="Widget.DeviceDefault.SeekBar" id="0x01030155" /> + <public type="style" name="Widget.DeviceDefault.RatingBar" id="0x01030156" /> + <public type="style" name="Widget.DeviceDefault.RatingBar.Indicator" id="0x01030157" /> + <public type="style" name="Widget.DeviceDefault.RatingBar.Small" id="0x01030158" /> + <public type="style" name="Widget.DeviceDefault.CompoundButton.RadioButton" id="0x01030159" /> + <public type="style" name="Widget.DeviceDefault.ScrollView" id="0x0103015a" /> + <public type="style" name="Widget.DeviceDefault.HorizontalScrollView" id="0x0103015b" /> + <public type="style" name="Widget.DeviceDefault.Spinner" id="0x0103015c" /> + <public type="style" name="Widget.DeviceDefault.CompoundButton.Star" id="0x0103015d" /> + <public type="style" name="Widget.DeviceDefault.TabWidget" id="0x0103015e" /> + <public type="style" name="Widget.DeviceDefault.WebTextView" id="0x0103015f" /> + <public type="style" name="Widget.DeviceDefault.WebView" id="0x01030160" /> + <public type="style" name="Widget.DeviceDefault.DropDownItem" id="0x01030161" /> + <public type="style" name="Widget.DeviceDefault.DropDownItem.Spinner" id="0x01030162" /> + <public type="style" name="Widget.DeviceDefault.TextView.SpinnerItem" id="0x01030163" /> + <public type="style" name="Widget.DeviceDefault.ListPopupWindow" id="0x01030164" /> + <public type="style" name="Widget.DeviceDefault.PopupMenu" id="0x01030165" /> + <public type="style" name="Widget.DeviceDefault.ActionButton" id="0x01030166" /> + <public type="style" name="Widget.DeviceDefault.ActionButton.Overflow" id="0x01030167" /> + <public type="style" name="Widget.DeviceDefault.ActionButton.TextButton" id="0x01030168" /> + <public type="style" name="Widget.DeviceDefault.ActionMode" id="0x01030169" /> + <public type="style" name="Widget.DeviceDefault.ActionButton.CloseMode" id="0x0103016a" /> + <public type="style" name="Widget.DeviceDefault.ActionBar" id="0x0103016b" /> + <public type="style" name="Widget.DeviceDefault.Button.Borderless" id="0x0103016c" /> + <public type="style" name="Widget.DeviceDefault.Tab" id="0x0103016d" /> + <public type="style" name="Widget.DeviceDefault.CalendarView" id="0x0103016e" /> + <public type="style" name="Widget.DeviceDefault.DatePicker" id="0x0103016f" /> + <public type="style" name="Widget.DeviceDefault.ActionBar.TabView" id="0x01030170" /> + <public type="style" name="Widget.DeviceDefault.ActionBar.TabText" id="0x01030171" /> + <public type="style" name="Widget.DeviceDefault.ActionBar.TabBar" id="0x01030172" /> + <public type="style" name="Widget.DeviceDefault.ActionBar.Solid" id="0x01030173" /> + <public type="style" name="Widget.DeviceDefault.Light" id="0x01030174" /> + <public type="style" name="Widget.DeviceDefault.Light.Button" id="0x01030175" /> + <public type="style" name="Widget.DeviceDefault.Light.Button.Small" id="0x01030176" /> + <public type="style" name="Widget.DeviceDefault.Light.Button.Inset" id="0x01030177" /> + <public type="style" name="Widget.DeviceDefault.Light.Button.Toggle" id="0x01030178" /> + <public type="style" name="Widget.DeviceDefault.Light.Button.Borderless.Small" id="0x01030179" /> + <public type="style" name="Widget.DeviceDefault.Light.TextView" id="0x0103017a" /> + <public type="style" name="Widget.DeviceDefault.Light.AutoCompleteTextView" id="0x0103017b" /> + <public type="style" name="Widget.DeviceDefault.Light.CompoundButton.CheckBox" id="0x0103017c" /> + <public type="style" name="Widget.DeviceDefault.Light.ListView.DropDown" id="0x0103017d" /> + <public type="style" name="Widget.DeviceDefault.Light.EditText" id="0x0103017e" /> + <public type="style" name="Widget.DeviceDefault.Light.ExpandableListView" id="0x0103017f" /> + <public type="style" name="Widget.DeviceDefault.Light.GridView" id="0x01030180" /> + <public type="style" name="Widget.DeviceDefault.Light.ImageButton" id="0x01030181" /> + <public type="style" name="Widget.DeviceDefault.Light.ListView" id="0x01030182" /> + <public type="style" name="Widget.DeviceDefault.Light.PopupWindow" id="0x01030183" /> + <public type="style" name="Widget.DeviceDefault.Light.ProgressBar" id="0x01030184" /> + <public type="style" name="Widget.DeviceDefault.Light.ProgressBar.Horizontal" id="0x01030185" /> + <public type="style" name="Widget.DeviceDefault.Light.ProgressBar.Small" id="0x01030186" /> + <public type="style" name="Widget.DeviceDefault.Light.ProgressBar.Small.Title" id="0x01030187" /> + <public type="style" name="Widget.DeviceDefault.Light.ProgressBar.Large" id="0x01030188" /> + <public type="style" name="Widget.DeviceDefault.Light.ProgressBar.Inverse" id="0x01030189" /> + <public type="style" name="Widget.DeviceDefault.Light.ProgressBar.Small.Inverse" id="0x0103018a" /> + <public type="style" name="Widget.DeviceDefault.Light.ProgressBar.Large.Inverse" id="0x0103018b" /> + <public type="style" name="Widget.DeviceDefault.Light.SeekBar" id="0x0103018c" /> + <public type="style" name="Widget.DeviceDefault.Light.RatingBar" id="0x0103018d" /> + <public type="style" name="Widget.DeviceDefault.Light.RatingBar.Indicator" id="0x0103018e" /> + <public type="style" name="Widget.DeviceDefault.Light.RatingBar.Small" id="0x0103018f" /> + <public type="style" name="Widget.DeviceDefault.Light.CompoundButton.RadioButton" id="0x01030190" /> + <public type="style" name="Widget.DeviceDefault.Light.ScrollView" id="0x01030191" /> + <public type="style" name="Widget.DeviceDefault.Light.HorizontalScrollView" id="0x01030192" /> + <public type="style" name="Widget.DeviceDefault.Light.Spinner" id="0x01030193" /> + <public type="style" name="Widget.DeviceDefault.Light.CompoundButton.Star" id="0x01030194" /> + <public type="style" name="Widget.DeviceDefault.Light.TabWidget" id="0x01030195" /> + <public type="style" name="Widget.DeviceDefault.Light.WebTextView" id="0x01030196" /> + <public type="style" name="Widget.DeviceDefault.Light.WebView" id="0x01030197" /> + <public type="style" name="Widget.DeviceDefault.Light.DropDownItem" id="0x01030198" /> + <public type="style" name="Widget.DeviceDefault.Light.DropDownItem.Spinner" id="0x01030199" /> + <public type="style" name="Widget.DeviceDefault.Light.TextView.SpinnerItem" id="0x0103019a" /> + <public type="style" name="Widget.DeviceDefault.Light.ListPopupWindow" id="0x0103019b" /> + <public type="style" name="Widget.DeviceDefault.Light.PopupMenu" id="0x0103019c" /> + <public type="style" name="Widget.DeviceDefault.Light.Tab" id="0x0103019d" /> + <public type="style" name="Widget.DeviceDefault.Light.CalendarView" id="0x0103019e" /> + <public type="style" name="Widget.DeviceDefault.Light.ActionButton" id="0x0103019f" /> + <public type="style" name="Widget.DeviceDefault.Light.ActionButton.Overflow" id="0x010301a0" /> + <public type="style" name="Widget.DeviceDefault.Light.ActionMode" id="0x010301a1" /> + <public type="style" name="Widget.DeviceDefault.Light.ActionButton.CloseMode" id="0x010301a2" /> + <public type="style" name="Widget.DeviceDefault.Light.ActionBar" id="0x010301a3" /> + <public type="style" name="Widget.DeviceDefault.Light.ActionBar.TabView" id="0x010301a4" /> + <public type="style" name="Widget.DeviceDefault.Light.ActionBar.TabText" id="0x010301a5" /> + <public type="style" name="Widget.DeviceDefault.Light.ActionBar.TabBar" id="0x010301a6" /> + <public type="style" name="Widget.DeviceDefault.Light.ActionBar.Solid" id="0x010301a7" /> + <public type="style" name="Widget.DeviceDefault.Light.ActionBar.Solid.Inverse" id="0x010301a8" /> + <public type="style" name="Widget.DeviceDefault.Light.ActionBar.TabBar.Inverse" id="0x010301a9" /> + <public type="style" name="Widget.DeviceDefault.Light.ActionBar.TabView.Inverse" id="0x010301aa" /> + <public type="style" name="Widget.DeviceDefault.Light.ActionBar.TabText.Inverse" id="0x010301ab" /> + <public type="style" name="Widget.DeviceDefault.Light.ActionMode.Inverse" id="0x010301ac" /> + <public type="style" name="TextAppearance.DeviceDefault" id="0x010301ad" /> + <public type="style" name="TextAppearance.DeviceDefault.Inverse" id="0x010301ae" /> + <public type="style" name="TextAppearance.DeviceDefault.Large" id="0x010301af" /> + <public type="style" name="TextAppearance.DeviceDefault.Large.Inverse" id="0x010301b0" /> + <public type="style" name="TextAppearance.DeviceDefault.Medium" id="0x010301b1" /> + <public type="style" name="TextAppearance.DeviceDefault.Medium.Inverse" id="0x010301b2" /> + <public type="style" name="TextAppearance.DeviceDefault.Small" id="0x010301b3" /> + <public type="style" name="TextAppearance.DeviceDefault.Small.Inverse" id="0x010301b4" /> + <public type="style" name="TextAppearance.DeviceDefault.SearchResult.Title" id="0x010301b5" /> + <public type="style" name="TextAppearance.DeviceDefault.SearchResult.Subtitle" id="0x010301b6" /> + <public type="style" name="TextAppearance.DeviceDefault.WindowTitle" id="0x010301b7" /> + <public type="style" name="TextAppearance.DeviceDefault.DialogWindowTitle" id="0x010301b8" /> + <public type="style" name="TextAppearance.DeviceDefault.Widget" id="0x010301b9" /> + <public type="style" name="TextAppearance.DeviceDefault.Widget.Button" id="0x010301ba" /> + <public type="style" name="TextAppearance.DeviceDefault.Widget.IconMenu.Item" id="0x010301bb" /> + <public type="style" name="TextAppearance.DeviceDefault.Widget.TabWidget" id="0x010301bc" /> + <public type="style" name="TextAppearance.DeviceDefault.Widget.TextView" id="0x010301bd" /> + <public type="style" name="TextAppearance.DeviceDefault.Widget.TextView.PopupMenu" id="0x010301be" /> + <public type="style" name="TextAppearance.DeviceDefault.Widget.DropDownHint" id="0x010301bf" /> + <public type="style" name="TextAppearance.DeviceDefault.Widget.DropDownItem" id="0x010301c0" /> + <public type="style" name="TextAppearance.DeviceDefault.Widget.TextView.SpinnerItem" id="0x010301c1" /> + <public type="style" name="TextAppearance.DeviceDefault.Widget.EditText" id="0x010301c2" /> + <public type="style" name="TextAppearance.DeviceDefault.Widget.PopupMenu" id="0x010301c3" /> + <public type="style" name="TextAppearance.DeviceDefault.Widget.PopupMenu.Large" id="0x010301c4" /> + <public type="style" name="TextAppearance.DeviceDefault.Widget.PopupMenu.Small" id="0x010301c5" /> + <public type="style" name="TextAppearance.DeviceDefault.Widget.ActionBar.Title" id="0x010301c6" /> + <public type="style" name="TextAppearance.DeviceDefault.Widget.ActionBar.Subtitle" id="0x010301c7" /> + <public type="style" name="TextAppearance.DeviceDefault.Widget.ActionMode.Title" id="0x010301c8" /> + <public type="style" name="TextAppearance.DeviceDefault.Widget.ActionMode.Subtitle" id="0x010301c9" /> + <public type="style" name="TextAppearance.DeviceDefault.Widget.ActionBar.Title.Inverse" id="0x010301ca" /> + <public type="style" name="TextAppearance.DeviceDefault.Widget.ActionBar.Subtitle.Inverse" id="0x010301cb" /> + <public type="style" name="TextAppearance.DeviceDefault.Widget.ActionMode.Title.Inverse" id="0x010301cc" /> + <public type="style" name="TextAppearance.DeviceDefault.Widget.ActionMode.Subtitle.Inverse" id="0x010301cd" /> + <public type="style" name="TextAppearance.DeviceDefault.Widget.ActionBar.Menu" id="0x010301ce" /> + <public type="style" name="DeviceDefault.ButtonBar" id="0x010301cf" /> + <public type="style" name="DeviceDefault.ButtonBar.AlertDialog" id="0x010301d0" /> + <public type="style" name="DeviceDefault.SegmentedButton" id="0x010301d1" /> + <public type="style" name="DeviceDefault.Light.ButtonBar" id="0x010301d2" /> + <public type="style" name="DeviceDefault.Light.ButtonBar.AlertDialog" id="0x010301d3" /> + <public type="style" name="DeviceDefault.Light.SegmentedButton" id="0x010301d4" /> + + <public type="integer" name="status_bar_notification_info_maxnum" id="0x010e0003" /> + + <public type="string" name="status_bar_notification_info_overflow" id="0x01040017" /> + + <public type="color" name="holo_blue_light" id="0x01060012" /> + <public type="color" name="holo_blue_dark" id="0x01060013" /> + <public type="color" name="holo_green_light" id="0x01060014" /> + <public type="color" name="holo_green_dark" id="0x01060015" /> + <public type="color" name="holo_red_light" id="0x01060016" /> + <public type="color" name="holo_red_dark" id="0x01060017" /> + <public type="color" name="holo_orange_light" id="0x01060018" /> + <public type="color" name="holo_orange_dark" id="0x01060019" /> + <public type="color" name="holo_purple" id="0x0106001a" /> + <public type="color" name="holo_blue_bright" id="0x0106001b" /> + +<!-- =============================================================== + Resources added in version 16 of the platform (Jelly Bean) + =============================================================== --> + <eat-comment /> + <public type="attr" name="parentActivityName" id="0x010103a7" /> + <public type="attr" name="isolatedProcess" id="0x010103a9" /> + <public type="attr" name="importantForAccessibility" id="0x010103aa" /> + <public type="attr" name="keyboardLayout" id="0x010103ab" /> + <public type="attr" name="fontFamily" id="0x010103ac" /> + <public type="attr" name="mediaRouteButtonStyle" id="0x010103ad" /> + <public type="attr" name="mediaRouteTypes" id="0x010103ae" /> + + <public type="style" name="Widget.Holo.MediaRouteButton" id="0x010301d5" /> + <public type="style" name="Widget.Holo.Light.MediaRouteButton" id="0x010301d6" /> + <public type="style" name="Widget.DeviceDefault.MediaRouteButton" id="0x010301d7" /> + <public type="style" name="Widget.DeviceDefault.Light.MediaRouteButton" id="0x010301d8" /> + +<!-- =============================================================== + Resources added in version 17 of the platform (Jelly Bean MR1) + =============================================================== --> + <eat-comment /> + <public type="attr" name="supportsRtl" id="0x010103af" /> + <public type="attr" name="textDirection" id="0x010103b0" /> + <public type="attr" name="textAlignment" id="0x010103b1" /> + <public type="attr" name="layoutDirection" id="0x010103b2" /> + <public type="attr" name="paddingStart" id="0x010103b3" /> + <public type="attr" name="paddingEnd" id="0x010103b4" /> + <public type="attr" name="layout_marginStart" id="0x010103b5" /> + <public type="attr" name="layout_marginEnd" id="0x010103b6" /> + <public type="attr" name="layout_toStartOf" id="0x010103b7" /> + <public type="attr" name="layout_toEndOf" id="0x010103b8" /> + <public type="attr" name="layout_alignStart" id="0x010103b9" /> + <public type="attr" name="layout_alignEnd" id="0x010103ba" /> + <public type="attr" name="layout_alignParentStart" id="0x010103bb" /> + <public type="attr" name="layout_alignParentEnd" id="0x010103bc" /> + <public type="attr" name="listPreferredItemPaddingStart" id="0x010103bd" /> + <public type="attr" name="listPreferredItemPaddingEnd" id="0x010103be" /> + <public type="attr" name="singleUser" id="0x010103bf" /> + <public type="attr" name="presentationTheme" id="0x010103c0" /> + <public type="attr" name="subtypeId" id="0x010103c1" /> + <public type="attr" name="initialKeyguardLayout" id="0x010103c2" /> + <public type="attr" name="widgetCategory" id="0x010103c4" /> + <public type="attr" name="permissionGroupFlags" id="0x010103c5" /> + <public type="attr" name="labelFor" id="0x010103c6" /> + <public type="attr" name="permissionFlags" id="0x010103c7" /> + <public type="attr" name="checkedTextViewStyle" id="0x010103c8" /> + <public type="attr" name="showOnLockScreen" id="0x010103c9" /> + <public type="attr" name="format12Hour" id="0x010103ca" /> + <public type="attr" name="format24Hour" id="0x010103cb" /> + <public type="attr" name="timeZone" id="0x010103cc" /> + + <public type="style" name="Widget.Holo.CheckedTextView" id="0x010301d9" /> + <public type="style" name="Widget.Holo.Light.CheckedTextView" id="0x010301da" /> + <public type="style" name="Widget.DeviceDefault.CheckedTextView" id="0x010301db" /> + <public type="style" name="Widget.DeviceDefault.Light.CheckedTextView" id="0x010301dc" /> + +<!-- =============================================================== + Resources added in version 18 of the platform (Jelly Bean MR2) + =============================================================== --> + <eat-comment /> + + <public type="attr" name="mipMap" id="0x010103cd" /> + <public type="attr" name="mirrorForRtl" id="0x010103ce" /> + <public type="attr" name="windowOverscan" id="0x010103cf" /> + <public type="attr" name="requiredForAllUsers" id="0x010103d0" /> + <public type="attr" name="indicatorStart" id="0x010103d1" /> + <public type="attr" name="indicatorEnd" id="0x010103d2" /> + <public type="attr" name="childIndicatorStart" id="0x010103d3" /> + <public type="attr" name="childIndicatorEnd" id="0x010103d4" /> + <public type="attr" name="restrictedAccountType" id="0x010103d5" /> + <public type="attr" name="requiredAccountType" id="0x010103d6" /> + <public type="attr" name="canRequestTouchExplorationMode" id="0x010103d7" /> + <public type="attr" name="canRequestEnhancedWebAccessibility" id="0x010103d8" /> + <public type="attr" name="canRequestFilterKeyEvents" id="0x010103d9" /> + <public type="attr" name="layoutMode" id="0x010103da" /> + + <public type="style" name="Theme.Holo.NoActionBar.Overscan" id="0x010301dd" /> + <public type="style" name="Theme.Holo.Light.NoActionBar.Overscan" id="0x010301de" /> + <public type="style" name="Theme.DeviceDefault.NoActionBar.Overscan" id="0x010301df" /> + <public type="style" name="Theme.DeviceDefault.Light.NoActionBar.Overscan" id="0x010301e0" /> + +<!-- =============================================================== + Resources added in version 19 of the platform (KitKat) + =============================================================== --> + <eat-comment /> + + <public type="attr" name="keySet" id="0x010103db" /> + <public type="attr" name="targetId" id="0x010103dc" /> + <public type="attr" name="fromScene" id="0x010103dd" /> + <public type="attr" name="toScene" id="0x010103de" /> + <public type="attr" name="transition" id="0x010103df" /> + <public type="attr" name="transitionOrdering" id="0x010103e0" /> + <public type="attr" name="fadingMode" id="0x010103e1" /> + <public type="attr" name="startDelay" id="0x010103e2" /> + <public type="attr" name="ssp" id="0x010103e3" /> + <public type="attr" name="sspPrefix" id="0x010103e4" /> + <public type="attr" name="sspPattern" id="0x010103e5" /> + <public type="attr" name="addPrintersActivity" id="0x010103e6" /> + <public type="attr" name="vendor" id="0x010103e7" /> + <public type="attr" name="category" id="0x010103e8" /> + <public type="attr" name="isAsciiCapable" id="0x010103e9" /> + <public type="attr" name="autoMirrored" id="0x010103ea" /> + <public type="attr" name="supportsSwitchingToNextInputMethod" id="0x010103eb" /> + <public type="attr" name="requireDeviceUnlock" id="0x010103ec" /> + <public type="attr" name="apduServiceBanner" id="0x010103ed" /> + <public type="attr" name="accessibilityLiveRegion" id="0x010103ee" /> + <public type="attr" name="windowTranslucentStatus" id="0x010103ef" /> + <public type="attr" name="windowTranslucentNavigation" id="0x010103f0" /> + <public type="attr" name="advancedPrintOptionsActivity" id="0x10103f1"/> + + <public type="style" name="Theme.Holo.NoActionBar.TranslucentDecor" id="0x010301e1" /> + <public type="style" name="Theme.Holo.Light.NoActionBar.TranslucentDecor" id="0x010301e2" /> + <public type="style" name="Theme.DeviceDefault.NoActionBar.TranslucentDecor" id="0x010301e3" /> + <public type="style" name="Theme.DeviceDefault.Light.NoActionBar.TranslucentDecor" id="0x010301e4" /> + +<!-- =============================================================== + Resources added in version 20 of the platform + =============================================================== --> + <eat-comment /> + + <public type="attr" name="banner" id="0x10103f2" /> + <public type="attr" name="windowSwipeToDismiss" id="0x10103f3" /> + <public type="attr" name="isGame" id="0x10103f4" /> + <public type="attr" name="allowEmbedded" id="0x10103f5" /> + <public type="attr" name="setupActivity" id="0x10103f6"/> + +<!-- =============================================================== + Resources added in version 21 of the platform + =============================================================== --> + <eat-comment /> + + <public type="attr" name="fastScrollStyle" id="0x010103f7" /> + <public type="attr" name="windowContentTransitions" id="0x010103f8" /> + <public type="attr" name="windowContentTransitionManager" id="0x010103f9" /> + <public type="attr" name="translationZ" id="0x010103fa" /> + <public type="attr" name="tintMode" id="0x010103fb" /> + <public type="attr" name="controlX1" id="0x010103fc" /> + <public type="attr" name="controlY1" id="0x010103fd" /> + <public type="attr" name="controlX2" id="0x010103fe" /> + <public type="attr" name="controlY2" id="0x010103ff" /> + <public type="attr" name="transitionName" id="0x01010400" /> + <public type="attr" name="transitionGroup" id="0x01010401" /> + <public type="attr" name="viewportWidth" id="0x01010402" /> + <public type="attr" name="viewportHeight" id="0x01010403" /> + <public type="attr" name="fillColor" id="0x01010404" /> + <public type="attr" name="pathData" id="0x01010405" /> + <public type="attr" name="strokeColor" id="0x01010406" /> + <public type="attr" name="strokeWidth" id="0x01010407" /> + <public type="attr" name="trimPathStart" id="0x01010408" /> + <public type="attr" name="trimPathEnd" id="0x01010409" /> + <public type="attr" name="trimPathOffset" id="0x0101040a" /> + <public type="attr" name="strokeLineCap" id="0x0101040b" /> + <public type="attr" name="strokeLineJoin" id="0x0101040c" /> + <public type="attr" name="strokeMiterLimit" id="0x0101040d" /> + <public type="attr" name="colorControlNormal" id="0x01010429" /> + <public type="attr" name="colorControlActivated" id="0x0101042a" /> + <public type="attr" name="colorButtonNormal" id="0x0101042b" /> + <public type="attr" name="colorControlHighlight" id="0x0101042c" /> + <public type="attr" name="persistableMode" id="0x0101042d" /> + <public type="attr" name="titleTextAppearance" id="0x0101042e" /> + <public type="attr" name="subtitleTextAppearance" id="0x0101042f" /> + <public type="attr" name="slideEdge" id="0x01010430" /> + <public type="attr" name="actionBarTheme" id="0x01010431" /> + <public type="attr" name="textAppearanceListItemSecondary" id="0x01010432" /> + <public type="attr" name="colorPrimary" id="0x01010433" /> + <public type="attr" name="colorPrimaryDark" id="0x01010434" /> + <public type="attr" name="colorAccent" id="0x01010435" /> + <public type="attr" name="nestedScrollingEnabled" id="0x01010436" /> + <public type="attr" name="windowEnterTransition" id="0x01010437" /> + <public type="attr" name="windowExitTransition" id="0x01010438" /> + <public type="attr" name="windowSharedElementEnterTransition" id="0x01010439" /> + <public type="attr" name="windowSharedElementExitTransition" id="0x0101043a" /> + <public type="attr" name="windowAllowReturnTransitionOverlap" id="0x0101043b" /> + <public type="attr" name="windowAllowEnterTransitionOverlap" id="0x0101043c" /> + <public type="attr" name="sessionService" id="0x0101043d" /> + <public type="attr" name="stackViewStyle" id="0x0101043e" /> + <public type="attr" name="switchStyle" id="0x0101043f" /> + <public type="attr" name="elevation" id="0x01010440" /> + <public type="attr" name="excludeId" id="0x01010441" /> + <public type="attr" name="excludeClass" id="0x01010442" /> + <public type="attr" name="hideOnContentScroll" id="0x01010443" /> + <public type="attr" name="actionOverflowMenuStyle" id="0x01010444" /> + <public type="attr" name="documentLaunchMode" id="0x01010445" /> + <public type="attr" name="maxRecents" id="0x01010446" /> + <public type="attr" name="autoRemoveFromRecents" id="0x01010447" /> + <public type="attr" name="stateListAnimator" id="0x01010448" /> + <public type="attr" name="toId" id="0x01010449" /> + <public type="attr" name="fromId" id="0x0101044a" /> + <public type="attr" name="reversible" id="0x0101044b" /> + <public type="attr" name="splitTrack" id="0x0101044c" /> + <public type="attr" name="targetName" id="0x0101044d" /> + <public type="attr" name="excludeName" id="0x0101044e" /> + <public type="attr" name="matchOrder" id="0x0101044f" /> + <public type="attr" name="windowDrawsSystemBarBackgrounds" id="0x01010450" /> + <public type="attr" name="statusBarColor" id="0x01010451" /> + <public type="attr" name="navigationBarColor" id="0x01010452" /> + <public type="attr" name="contentInsetStart" id="0x01010453" /> + <public type="attr" name="contentInsetEnd" id="0x01010454" /> + <public type="attr" name="contentInsetLeft" id="0x01010455" /> + <public type="attr" name="contentInsetRight" id="0x01010456" /> + <public type="attr" name="paddingMode" id="0x01010457" /> + <public type="attr" name="layout_rowWeight" id="0x01010458" /> + <public type="attr" name="layout_columnWeight" id="0x01010459" /> + <public type="attr" name="translateX" id="0x0101045a" /> + <public type="attr" name="translateY" id="0x0101045b" /> + <public type="attr" name="selectableItemBackgroundBorderless" id="0x0101045c" /> + <public type="attr" name="elegantTextHeight" id="0x0101045d" /> + <public type="attr" name="searchKeyphraseId" id="0x0101045e" /> + <public type="attr" name="searchKeyphrase" id="0x0101045f" /> + <public type="attr" name="searchKeyphraseSupportedLocales" id="0x01010460" /> + <public type="attr" name="windowTransitionBackgroundFadeDuration" id="0x01010461" /> + <public type="attr" name="overlapAnchor" id="0x01010462" /> + <public type="attr" name="progressTint" id="0x01010463" /> + <public type="attr" name="progressTintMode" id="0x01010464" /> + <public type="attr" name="progressBackgroundTint" id="0x01010465" /> + <public type="attr" name="progressBackgroundTintMode" id="0x01010466" /> + <public type="attr" name="secondaryProgressTint" id="0x01010467" /> + <public type="attr" name="secondaryProgressTintMode" id="0x01010468" /> + <public type="attr" name="indeterminateTint" id="0x01010469" /> + <public type="attr" name="indeterminateTintMode" id="0x0101046a" /> + <public type="attr" name="backgroundTint" id="0x0101046b" /> + <public type="attr" name="backgroundTintMode" id="0x0101046c" /> + <public type="attr" name="foregroundTint" id="0x0101046d" /> + <public type="attr" name="foregroundTintMode" id="0x0101046e" /> + <public type="attr" name="buttonTint" id="0x0101046f" /> + <public type="attr" name="buttonTintMode" id="0x01010470" /> + <public type="attr" name="thumbTint" id="0x01010471" /> + <public type="attr" name="thumbTintMode" id="0x01010472" /> + <public type="attr" name="fullBackupOnly" id="0x01010473" /> + <public type="attr" name="propertyXName" id="0x01010474" /> + <public type="attr" name="propertyYName" id="0x01010475" /> + <public type="attr" name="relinquishTaskIdentity" id="0x01010476" /> + <public type="attr" name="tileModeX" id="0x01010477" /> + <public type="attr" name="tileModeY" id="0x01010478" /> + <public type="attr" name="actionModeShareDrawable" id="0x01010479" /> + <public type="attr" name="actionModeFindDrawable" id="0x0101047a" /> + <public type="attr" name="actionModeWebSearchDrawable" id="0x0101047b" /> + <public type="attr" name="transitionVisibilityMode" id="0x0101047c" /> + <public type="attr" name="minimumHorizontalAngle" id="0x0101047d" /> + <public type="attr" name="minimumVerticalAngle" id="0x0101047e" /> + <public type="attr" name="maximumAngle" id="0x0101047f" /> + <public type="attr" name="searchViewStyle" id="0x01010480" /> + <public type="attr" name="closeIcon" id="0x01010481" /> + <public type="attr" name="goIcon" id="0x01010482" /> + <public type="attr" name="searchIcon" id="0x01010483" /> + <public type="attr" name="voiceIcon" id="0x01010484" /> + <public type="attr" name="commitIcon" id="0x01010485" /> + <public type="attr" name="suggestionRowLayout" id="0x01010486" /> + <public type="attr" name="queryBackground" id="0x01010487" /> + <public type="attr" name="submitBackground" id="0x01010488" /> + <public type="attr" name="buttonBarPositiveButtonStyle" id="0x01010489" /> + <public type="attr" name="buttonBarNeutralButtonStyle" id="0x0101048a" /> + <public type="attr" name="buttonBarNegativeButtonStyle" id="0x0101048b" /> + <public type="attr" name="popupElevation" id="0x0101048c" /> + <public type="attr" name="actionBarPopupTheme" id="0x0101048d" /> + <public type="attr" name="multiArch" id="0x0101048e" /> + <public type="attr" name="touchscreenBlocksFocus" id="0x0101048f" /> + <public type="attr" name="windowElevation" id="0x01010490" /> + <public type="attr" name="launchTaskBehindTargetAnimation" id="0x01010491" /> + <public type="attr" name="launchTaskBehindSourceAnimation" id="0x01010492" /> + <public type="attr" name="restrictionType" id="0x01010493" /> + <public type="attr" name="dayOfWeekBackground" id="0x01010494" /> + <public type="attr" name="dayOfWeekTextAppearance" id="0x01010495" /> + <public type="attr" name="headerMonthTextAppearance" id="0x01010496" /> + <public type="attr" name="headerDayOfMonthTextAppearance" id="0x01010497" /> + <public type="attr" name="headerYearTextAppearance" id="0x01010498" /> + <public type="attr" name="yearListItemTextAppearance" id="0x01010499" /> + <public type="attr" name="yearListSelectorColor" id="0x0101049a" /> + <public type="attr" name="calendarTextColor" id="0x0101049b" /> + <public type="attr" name="recognitionService" id="0x0101049c" /> + <public type="attr" name="timePickerStyle" id="0x0101049d" /> + <public type="attr" name="timePickerDialogTheme" id="0x0101049e" /> + <public type="attr" name="headerTimeTextAppearance" id="0x0101049f" /> + <public type="attr" name="headerAmPmTextAppearance" id="0x010104a0" /> + <public type="attr" name="numbersTextColor" id="0x010104a1" /> + <public type="attr" name="numbersBackgroundColor" id="0x010104a2" /> + <public type="attr" name="numbersSelectorColor" id="0x010104a3" /> + <public type="attr" name="amPmTextColor" id="0x010104a4" /> + <public type="attr" name="amPmBackgroundColor" id="0x010104a5" /> + <public type="attr" name="searchKeyphraseRecognitionFlags" id="0x010104a6" /> + <public type="attr" name="checkMarkTint" id="0x010104a7" /> + <public type="attr" name="checkMarkTintMode" id="0x010104a8" /> + <public type="attr" name="popupTheme" id="0x010104a9" /> + <public type="attr" name="toolbarStyle" id="0x010104aa" /> + <public type="attr" name="windowClipToOutline" id="0x010104ab" /> + <public type="attr" name="datePickerDialogTheme" id="0x010104ac" /> + <public type="attr" name="showText" id="0x010104ad" /> + <public type="attr" name="windowReturnTransition" id="0x010104ae" /> + <public type="attr" name="windowReenterTransition" id="0x010104af" /> + <public type="attr" name="windowSharedElementReturnTransition" id="0x010104b0" /> + <public type="attr" name="windowSharedElementReenterTransition" id="0x010104b1" /> + <public type="attr" name="resumeWhilePausing" id="0x010104b2" /> + <public type="attr" name="datePickerMode" id="0x010104b3" /> + <public type="attr" name="timePickerMode" id="0x010104b4" /> + <public type="attr" name="inset" id="0x010104b5" /> + <public type="attr" name="letterSpacing" id="0x010104b6" /> + <public type="attr" name="fontFeatureSettings" id="0x010104b7" /> + <public type="attr" name="outlineProvider" id="0x010104b8" /> + <public type="attr" name="contentAgeHint" id="0x010104b9" /> + <public type="attr" name="country" id="0x010104ba" /> + <public type="attr" name="windowSharedElementsUseOverlay" id="0x010104bb" /> + <public type="attr" name="reparent" id="0x010104bc" /> + <public type="attr" name="reparentWithOverlay" id="0x010104bd" /> + <public type="attr" name="ambientShadowAlpha" id="0x010104be" /> + <public type="attr" name="spotShadowAlpha" id="0x010104bf" /> + <public type="attr" name="navigationIcon" id="0x010104c0" /> + <public type="attr" name="navigationContentDescription" id="0x010104c1" /> + <public type="attr" name="fragmentExitTransition" id="0x010104c2" /> + <public type="attr" name="fragmentEnterTransition" id="0x010104c3" /> + <public type="attr" name="fragmentSharedElementEnterTransition" id="0x010104c4" /> + <public type="attr" name="fragmentReturnTransition" id="0x010104c5" /> + <public type="attr" name="fragmentSharedElementReturnTransition" id="0x010104c6" /> + <public type="attr" name="fragmentReenterTransition" id="0x010104c7" /> + <public type="attr" name="fragmentAllowEnterTransitionOverlap" id="0x010104c8" /> + <public type="attr" name="fragmentAllowReturnTransitionOverlap" id="0x010104c9" /> + <public type="attr" name="patternPathData" id="0x010104ca" /> + <public type="attr" name="strokeAlpha" id="0x010104cb" /> + <public type="attr" name="fillAlpha" id="0x010104cc" /> + <public type="attr" name="windowActivityTransitions" id="0x010104cd" /> + <public type="attr" name="colorEdgeEffect" id="0x010104ce" /> + + <public type="id" name="mask" id="0x0102002e" /> + <public type="id" name="statusBarBackground" id="0x0102002f" /> + <public type="id" name="navigationBarBackground" id="0x01020030" /> + + <public type="style" name="Widget.FastScroll" id="0x010301e5" /> + <public type="style" name="Widget.StackView" id="0x010301e6" /> + <public type="style" name="Widget.Toolbar" id="0x010301e7" /> + <public type="style" name="Widget.Toolbar.Button.Navigation" id="0x010301e8" /> + + <public type="style" name="Widget.DeviceDefault.FastScroll" id="0x010301e9" /> + <public type="style" name="Widget.DeviceDefault.StackView" id="0x010301ea" /> + <public type="style" name="Widget.DeviceDefault.Light.FastScroll" id="0x010301eb" /> + <public type="style" name="Widget.DeviceDefault.Light.StackView" id="0x010301ec" /> + + <public type="style" name="TextAppearance.Material" id="0x010301ed" /> + <public type="style" name="TextAppearance.Material.Button" id="0x010301ee" /> + <public type="style" name="TextAppearance.Material.Body2" id="0x010301ef" /> + <public type="style" name="TextAppearance.Material.Body1" id="0x010301f0" /> + <public type="style" name="TextAppearance.Material.Caption" id="0x010301f1" /> + <public type="style" name="TextAppearance.Material.DialogWindowTitle" id="0x010301f2" /> + <public type="style" name="TextAppearance.Material.Display4" id="0x010301f3" /> + <public type="style" name="TextAppearance.Material.Display3" id="0x010301f4" /> + <public type="style" name="TextAppearance.Material.Display2" id="0x010301f5" /> + <public type="style" name="TextAppearance.Material.Display1" id="0x010301f6" /> + <public type="style" name="TextAppearance.Material.Headline" id="0x010301f7" /> + <public type="style" name="TextAppearance.Material.Inverse" id="0x010301f8" /> + <public type="style" name="TextAppearance.Material.Large" id="0x010301f9" /> + <public type="style" name="TextAppearance.Material.Large.Inverse" id="0x010301fa" /> + <public type="style" name="TextAppearance.Material.Medium" id="0x010301fb" /> + <public type="style" name="TextAppearance.Material.Medium.Inverse" id="0x010301fc" /> + <public type="style" name="TextAppearance.Material.Menu" id="0x010301fd" /> + <public type="style" name="TextAppearance.Material.Notification" id="0x010301fe" /> + <public type="style" name="TextAppearance.Material.Notification.Emphasis" id="0x010301ff" /> + <public type="style" name="TextAppearance.Material.Notification.Info" id="0x01030200" /> + <public type="style" name="TextAppearance.Material.Notification.Line2" id="0x01030201" /> + <public type="style" name="TextAppearance.Material.Notification.Time" id="0x01030202" /> + <public type="style" name="TextAppearance.Material.Notification.Title" id="0x01030203" /> + <public type="style" name="TextAppearance.Material.SearchResult.Subtitle" id="0x01030204" /> + <public type="style" name="TextAppearance.Material.SearchResult.Title" id="0x01030205" /> + <public type="style" name="TextAppearance.Material.Small" id="0x01030206" /> + <public type="style" name="TextAppearance.Material.Small.Inverse" id="0x01030207" /> + <public type="style" name="TextAppearance.Material.Subhead" id="0x01030208" /> + <public type="style" name="TextAppearance.Material.Title" id="0x01030209" /> + <public type="style" name="TextAppearance.Material.WindowTitle" id="0x0103020a" /> + + <public type="style" name="TextAppearance.Material.Widget" id="0x0103020b" /> + <public type="style" name="TextAppearance.Material.Widget.ActionBar.Menu" id="0x0103020c" /> + <public type="style" name="TextAppearance.Material.Widget.ActionBar.Subtitle" id="0x0103020d" /> + <public type="style" name="TextAppearance.Material.Widget.ActionBar.Subtitle.Inverse" id="0x0103020e" /> + <public type="style" name="TextAppearance.Material.Widget.ActionBar.Title" id="0x0103020f" /> + <public type="style" name="TextAppearance.Material.Widget.ActionBar.Title.Inverse" id="0x01030210" /> + <public type="style" name="TextAppearance.Material.Widget.ActionMode.Subtitle" id="0x01030211" /> + <public type="style" name="TextAppearance.Material.Widget.ActionMode.Subtitle.Inverse" id="0x01030212" /> + <public type="style" name="TextAppearance.Material.Widget.ActionMode.Title" id="0x01030213" /> + <public type="style" name="TextAppearance.Material.Widget.ActionMode.Title.Inverse" id="0x01030214" /> + <public type="style" name="TextAppearance.Material.Widget.Button" id="0x01030215" /> + <public type="style" name="TextAppearance.Material.Widget.DropDownHint" id="0x01030216" /> + <public type="style" name="TextAppearance.Material.Widget.DropDownItem" id="0x01030217" /> + <public type="style" name="TextAppearance.Material.Widget.EditText" id="0x01030218" /> + <public type="style" name="TextAppearance.Material.Widget.IconMenu.Item" id="0x01030219" /> + <public type="style" name="TextAppearance.Material.Widget.PopupMenu" id="0x0103021a" /> + <public type="style" name="TextAppearance.Material.Widget.PopupMenu.Large" id="0x0103021b" /> + <public type="style" name="TextAppearance.Material.Widget.PopupMenu.Small" id="0x0103021c" /> + <public type="style" name="TextAppearance.Material.Widget.TabWidget" id="0x0103021d" /> + <public type="style" name="TextAppearance.Material.Widget.TextView" id="0x0103021e" /> + <public type="style" name="TextAppearance.Material.Widget.TextView.PopupMenu" id="0x0103021f" /> + <public type="style" name="TextAppearance.Material.Widget.TextView.SpinnerItem" id="0x01030220" /> + <public type="style" name="TextAppearance.Material.Widget.Toolbar.Subtitle" id="0x01030221" /> + <public type="style" name="TextAppearance.Material.Widget.Toolbar.Title" id="0x01030222" /> + + <public type="style" name="Theme.DeviceDefault.Settings" id="0x01030223" /> + + <public type="style" name="Theme.Material" id="0x01030224" /> + <public type="style" name="Theme.Material.Dialog" id="0x01030225" /> + <public type="style" name="Theme.Material.Dialog.Alert" id="0x01030226" /> + <public type="style" name="Theme.Material.Dialog.MinWidth" id="0x01030227" /> + <public type="style" name="Theme.Material.Dialog.NoActionBar" id="0x01030228" /> + <public type="style" name="Theme.Material.Dialog.NoActionBar.MinWidth" id="0x01030229" /> + <public type="style" name="Theme.Material.Dialog.Presentation" id="0x0103022a" /> + <public type="style" name="Theme.Material.DialogWhenLarge" id="0x0103022b" /> + <public type="style" name="Theme.Material.DialogWhenLarge.NoActionBar" id="0x0103022c" /> + <public type="style" name="Theme.Material.InputMethod" id="0x0103022d" /> + <public type="style" name="Theme.Material.NoActionBar" id="0x0103022e" /> + <public type="style" name="Theme.Material.NoActionBar.Fullscreen" id="0x0103022f" /> + <public type="style" name="Theme.Material.NoActionBar.Overscan" id="0x01030230" /> + <public type="style" name="Theme.Material.NoActionBar.TranslucentDecor" id="0x01030231" /> + <public type="style" name="Theme.Material.Panel" id="0x01030232" /> + <public type="style" name="Theme.Material.Settings" id="0x01030233" /> + <public type="style" name="Theme.Material.Voice" id="0x01030234" /> + <public type="style" name="Theme.Material.Wallpaper" id="0x01030235" /> + <public type="style" name="Theme.Material.Wallpaper.NoTitleBar" id="0x01030236" /> + + <public type="style" name="Theme.Material.Light" id="0x01030237" /> + <public type="style" name="Theme.Material.Light.DarkActionBar" id="0x01030238" /> + <public type="style" name="Theme.Material.Light.Dialog" id="0x01030239" /> + <public type="style" name="Theme.Material.Light.Dialog.Alert" id="0x0103023a" /> + <public type="style" name="Theme.Material.Light.Dialog.MinWidth" id="0x0103023b" /> + <public type="style" name="Theme.Material.Light.Dialog.NoActionBar" id="0x0103023c" /> + <public type="style" name="Theme.Material.Light.Dialog.NoActionBar.MinWidth" id="0x0103023d" /> + <public type="style" name="Theme.Material.Light.Dialog.Presentation" id="0x0103023e" /> + <public type="style" name="Theme.Material.Light.DialogWhenLarge" id="0x0103023f" /> + <public type="style" name="Theme.Material.Light.DialogWhenLarge.NoActionBar" id="0x01030240" /> + <public type="style" name="Theme.Material.Light.NoActionBar" id="0x01030241" /> + <public type="style" name="Theme.Material.Light.NoActionBar.Fullscreen" id="0x01030242" /> + <public type="style" name="Theme.Material.Light.NoActionBar.Overscan" id="0x01030243" /> + <public type="style" name="Theme.Material.Light.NoActionBar.TranslucentDecor" id="0x01030244" /> + <public type="style" name="Theme.Material.Light.Panel" id="0x01030245" /> + <public type="style" name="Theme.Material.Light.Voice" id="0x01030246" /> + + <public type="style" name="ThemeOverlay" id="0x01030247" /> + <public type="style" name="ThemeOverlay.Material" id="0x01030248" /> + <public type="style" name="ThemeOverlay.Material.ActionBar" id="0x01030249" /> + <public type="style" name="ThemeOverlay.Material.Light" id="0x0103024a" /> + <public type="style" name="ThemeOverlay.Material.Dark" id="0x0103024b" /> + <public type="style" name="ThemeOverlay.Material.Dark.ActionBar" id="0x0103024c" /> + + <public type="style" name="Widget.Material" id="0x0103024d" /> + <public type="style" name="Widget.Material.ActionBar" id="0x0103024e" /> + <public type="style" name="Widget.Material.ActionBar.Solid" id="0x0103024f" /> + <public type="style" name="Widget.Material.ActionBar.TabBar" id="0x01030250" /> + <public type="style" name="Widget.Material.ActionBar.TabText" id="0x01030251" /> + <public type="style" name="Widget.Material.ActionBar.TabView" id="0x01030252" /> + <public type="style" name="Widget.Material.ActionButton" id="0x01030253" /> + <public type="style" name="Widget.Material.ActionButton.CloseMode" id="0x01030254" /> + <public type="style" name="Widget.Material.ActionButton.Overflow" id="0x01030255" /> + <public type="style" name="Widget.Material.ActionMode" id="0x01030256" /> + <public type="style" name="Widget.Material.AutoCompleteTextView" id="0x01030257" /> + <public type="style" name="Widget.Material.Button" id="0x01030258" /> + <public type="style" name="Widget.Material.Button.Borderless" id="0x01030259" /> + <public type="style" name="Widget.Material.Button.Borderless.Colored" id="0x0103025a" /> + <public type="style" name="Widget.Material.Button.Borderless.Small" id="0x0103025b" /> + <public type="style" name="Widget.Material.Button.Inset" id="0x0103025c" /> + <public type="style" name="Widget.Material.Button.Small" id="0x0103025d" /> + <public type="style" name="Widget.Material.Button.Toggle" id="0x0103025e" /> + <public type="style" name="Widget.Material.ButtonBar" id="0x0103025f" /> + <public type="style" name="Widget.Material.ButtonBar.AlertDialog" id="0x01030260" /> + <public type="style" name="Widget.Material.CalendarView" id="0x01030261" /> + <public type="style" name="Widget.Material.CheckedTextView" id="0x01030262" /> + <public type="style" name="Widget.Material.CompoundButton.CheckBox" id="0x01030263" /> + <public type="style" name="Widget.Material.CompoundButton.RadioButton" id="0x01030264" /> + <public type="style" name="Widget.Material.CompoundButton.Star" id="0x01030265" /> + <public type="style" name="Widget.Material.DatePicker" id="0x01030266" /> + <public type="style" name="Widget.Material.DropDownItem" id="0x01030267" /> + <public type="style" name="Widget.Material.DropDownItem.Spinner" id="0x01030268" /> + <public type="style" name="Widget.Material.EditText" id="0x01030269" /> + <public type="style" name="Widget.Material.ExpandableListView" id="0x0103026a" /> + <public type="style" name="Widget.Material.FastScroll" id="0x0103026b" /> + <public type="style" name="Widget.Material.GridView" id="0x0103026c" /> + <public type="style" name="Widget.Material.HorizontalScrollView" id="0x0103026d" /> + <public type="style" name="Widget.Material.ImageButton" id="0x0103026e" /> + <public type="style" name="Widget.Material.ListPopupWindow" id="0x0103026f" /> + <public type="style" name="Widget.Material.ListView" id="0x01030270" /> + <public type="style" name="Widget.Material.ListView.DropDown" id="0x01030271" /> + <public type="style" name="Widget.Material.MediaRouteButton" id="0x01030272" /> + <public type="style" name="Widget.Material.PopupMenu" id="0x01030273" /> + <public type="style" name="Widget.Material.PopupMenu.Overflow" id="0x01030274" /> + <public type="style" name="Widget.Material.PopupWindow" id="0x01030275" /> + <public type="style" name="Widget.Material.ProgressBar" id="0x01030276" /> + <public type="style" name="Widget.Material.ProgressBar.Horizontal" id="0x01030277" /> + <public type="style" name="Widget.Material.ProgressBar.Large" id="0x01030278" /> + <public type="style" name="Widget.Material.ProgressBar.Small" id="0x01030279" /> + <public type="style" name="Widget.Material.ProgressBar.Small.Title" id="0x0103027a" /> + <public type="style" name="Widget.Material.RatingBar" id="0x0103027b" /> + <public type="style" name="Widget.Material.RatingBar.Indicator" id="0x0103027c" /> + <public type="style" name="Widget.Material.RatingBar.Small" id="0x0103027d" /> + <public type="style" name="Widget.Material.ScrollView" id="0x0103027e" /> + <public type="style" name="Widget.Material.SearchView" id="0x0103027f" /> + <public type="style" name="Widget.Material.SeekBar" id="0x01030280" /> + <public type="style" name="Widget.Material.SegmentedButton" id="0x01030281" /> + <public type="style" name="Widget.Material.StackView" id="0x01030282" /> + <public type="style" name="Widget.Material.Spinner" id="0x01030283" /> + <public type="style" name="Widget.Material.Spinner.Underlined" id="0x01030284" /> + <public type="style" name="Widget.Material.Tab" id="0x01030285" /> + <public type="style" name="Widget.Material.TabWidget" id="0x01030286" /> + <public type="style" name="Widget.Material.TextView" id="0x01030287" /> + <public type="style" name="Widget.Material.TextView.SpinnerItem" id="0x01030288" /> + <public type="style" name="Widget.Material.TimePicker" id="0x01030289" /> + <public type="style" name="Widget.Material.Toolbar" id="0x0103028a" /> + <public type="style" name="Widget.Material.Toolbar.Button.Navigation" id="0x0103028b" /> + <public type="style" name="Widget.Material.WebTextView" id="0x0103028c" /> + <public type="style" name="Widget.Material.WebView" id="0x0103028d" /> + + <public type="style" name="Widget.Material.Light" id="0x0103028e" /> + <public type="style" name="Widget.Material.Light.ActionBar" id="0x0103028f" /> + <public type="style" name="Widget.Material.Light.ActionBar.Solid" id="0x01030290" /> + <public type="style" name="Widget.Material.Light.ActionBar.TabBar" id="0x01030291" /> + <public type="style" name="Widget.Material.Light.ActionBar.TabText" id="0x01030292" /> + <public type="style" name="Widget.Material.Light.ActionBar.TabView" id="0x01030293" /> + <public type="style" name="Widget.Material.Light.ActionButton" id="0x01030294" /> + <public type="style" name="Widget.Material.Light.ActionButton.CloseMode" id="0x01030295" /> + <public type="style" name="Widget.Material.Light.ActionButton.Overflow" id="0x01030296" /> + <public type="style" name="Widget.Material.Light.ActionMode" id="0x01030297" /> + <public type="style" name="Widget.Material.Light.AutoCompleteTextView" id="0x01030298" /> + <public type="style" name="Widget.Material.Light.Button" id="0x01030299" /> + <public type="style" name="Widget.Material.Light.Button.Borderless" id="0x0103029a" /> + <public type="style" name="Widget.Material.Light.Button.Borderless.Colored" id="0x0103029b" /> + <public type="style" name="Widget.Material.Light.Button.Borderless.Small" id="0x0103029c" /> + <public type="style" name="Widget.Material.Light.Button.Inset" id="0x0103029d" /> + <public type="style" name="Widget.Material.Light.Button.Small" id="0x0103029e" /> + <public type="style" name="Widget.Material.Light.Button.Toggle" id="0x0103029f" /> + <public type="style" name="Widget.Material.Light.ButtonBar" id="0x010302a0" /> + <public type="style" name="Widget.Material.Light.ButtonBar.AlertDialog" id="0x010302a1" /> + <public type="style" name="Widget.Material.Light.CalendarView" id="0x010302a2" /> + <public type="style" name="Widget.Material.Light.CheckedTextView" id="0x010302a3" /> + <public type="style" name="Widget.Material.Light.CompoundButton.CheckBox" id="0x010302a4" /> + <public type="style" name="Widget.Material.Light.CompoundButton.RadioButton" id="0x010302a5" /> + <public type="style" name="Widget.Material.Light.CompoundButton.Star" id="0x010302a6" /> + <public type="style" name="Widget.Material.Light.DatePicker" id="0x010302a7" /> + <public type="style" name="Widget.Material.Light.DropDownItem" id="0x010302a8" /> + <public type="style" name="Widget.Material.Light.DropDownItem.Spinner" id="0x010302a9" /> + <public type="style" name="Widget.Material.Light.EditText" id="0x010302aa" /> + <public type="style" name="Widget.Material.Light.ExpandableListView" id="0x010302ab" /> + <public type="style" name="Widget.Material.Light.FastScroll" id="0x010302ac" /> + <public type="style" name="Widget.Material.Light.GridView" id="0x010302ad" /> + <public type="style" name="Widget.Material.Light.HorizontalScrollView" id="0x010302ae" /> + <public type="style" name="Widget.Material.Light.ImageButton" id="0x010302af" /> + <public type="style" name="Widget.Material.Light.ListPopupWindow" id="0x010302b0" /> + <public type="style" name="Widget.Material.Light.ListView" id="0x010302b1" /> + <public type="style" name="Widget.Material.Light.ListView.DropDown" id="0x010302b2" /> + <public type="style" name="Widget.Material.Light.MediaRouteButton" id="0x010302b3" /> + <public type="style" name="Widget.Material.Light.PopupMenu" id="0x010302b4" /> + <public type="style" name="Widget.Material.Light.PopupMenu.Overflow" id="0x010302b5" /> + <public type="style" name="Widget.Material.Light.PopupWindow" id="0x010302b6" /> + <public type="style" name="Widget.Material.Light.ProgressBar" id="0x010302b7" /> + <public type="style" name="Widget.Material.Light.ProgressBar.Horizontal" id="0x010302b8" /> + <public type="style" name="Widget.Material.Light.ProgressBar.Inverse" id="0x010302b9" /> + <public type="style" name="Widget.Material.Light.ProgressBar.Large" id="0x010302ba" /> + <public type="style" name="Widget.Material.Light.ProgressBar.Large.Inverse" id="0x010302bb" /> + <public type="style" name="Widget.Material.Light.ProgressBar.Small" id="0x010302bc" /> + <public type="style" name="Widget.Material.Light.ProgressBar.Small.Inverse" id="0x010302bd" /> + <public type="style" name="Widget.Material.Light.ProgressBar.Small.Title" id="0x010302be" /> + <public type="style" name="Widget.Material.Light.RatingBar" id="0x010302bf" /> + <public type="style" name="Widget.Material.Light.RatingBar.Indicator" id="0x010302c0" /> + <public type="style" name="Widget.Material.Light.RatingBar.Small" id="0x010302c1" /> + <public type="style" name="Widget.Material.Light.ScrollView" id="0x010302c2" /> + <public type="style" name="Widget.Material.Light.SearchView" id="0x010302c3" /> + <public type="style" name="Widget.Material.Light.SeekBar" id="0x010302c4" /> + <public type="style" name="Widget.Material.Light.SegmentedButton" id="0x010302c5" /> + <public type="style" name="Widget.Material.Light.StackView" id="0x010302c6" /> + <public type="style" name="Widget.Material.Light.Spinner" id="0x010302c7" /> + <public type="style" name="Widget.Material.Light.Spinner.Underlined" id="0x010302c8" /> + <public type="style" name="Widget.Material.Light.Tab" id="0x010302c9" /> + <public type="style" name="Widget.Material.Light.TabWidget" id="0x010302ca" /> + <public type="style" name="Widget.Material.Light.TextView" id="0x010302cb" /> + <public type="style" name="Widget.Material.Light.TextView.SpinnerItem" id="0x010302cc" /> + <public type="style" name="Widget.Material.Light.TimePicker" id="0x010302cd" /> + <public type="style" name="Widget.Material.Light.WebTextView" id="0x010302ce" /> + <public type="style" name="Widget.Material.Light.WebView" id="0x010302cf" /> + + <!-- @hide This really shouldn't be public; clients using it should use @* to ref it. --> + <public type="style" name="Theme.Leanback.FormWizard" id="0x010302d0" /> + + <!-- @hide @SystemApi This shouldn't be public. --> + <public type="array" name="config_keySystemUuidMapping" id="0x01070005" /> + + <!-- An interpolator which accelerates fast but decelerates slowly. --> + <public type="interpolator" name="fast_out_slow_in" id="0x010c000d" /> + <!-- An interpolator which starts with a peak non-zero velocity and decelerates slowly. --> + <public type="interpolator" name="linear_out_slow_in" id="0x010c000e" /> + <!-- An interpolator which accelerates fast and keeps accelerating until the end. --> + <public type="interpolator" name="fast_out_linear_in" id="0x010c000f" /> + + <!-- Used for Activity Transitions, this transition indicates that no Transition + should be used. --> + <public type="transition" name="no_transition" id="0x010f0000" /> + <!-- A transition that moves and resizes a view --> + <public type="transition" name="move" id="0x010f0001" /> + <!-- A transition that fades views in and out. --> + <public type="transition" name="fade" id="0x010f0002" /> + <!-- A transition that moves views in or out of the scene to or from the edges when + a view visibility changes. --> + <public type="transition" name="explode" id="0x010f0003" /> + <!-- A transition that moves views in or out of the scene to or from the bottom edge when + a view visibility changes. --> + <public type="transition" name="slide_bottom" id="0x010f0004" /> + <!-- A transition that moves views in or out of the scene to or from the top edge when + a view visibility changes. --> + <public type="transition" name="slide_top" id="0x010f0005" /> + <!-- A transition that moves views in or out of the scene to or from the right edge when + a view visibility changes. --> + <public type="transition" name="slide_right" id="0x010f0006" /> + <!-- A transition that moves views in or out of the scene to or from the left edge when + a view visibility changes. --> + <public type="transition" name="slide_left" id="0x010f0007" /> + + <!-- WebView error page for when the load fails. @hide @SystemApi --> + <public type="raw" name="loaderror" id="0x01100000" /> + <!-- WebView error page for when domain lookup fails. @hide @SystemApi --> + <public type="raw" name="nodomain" id="0x01100001" /> + + <!-- =============================================================== + Resources added in version 22 of the platform + =============================================================== --> + <eat-comment /> + + <public type="attr" name="resizeClip" id="0x010104cf" /> + <public type="attr" name="collapseContentDescription" id="0x010104d0" /> + <public type="attr" name="accessibilityTraversalBefore" id="0x010104d1" /> + <public type="attr" name="accessibilityTraversalAfter" id="0x010104d2" /> + <public type="attr" name="dialogPreferredPadding" id="0x010104d3" /> + <public type="attr" name="searchHintIcon" id="0x010104d4" /> + <public type="attr" name="revisionCode" id="0x010104d5" /> + <public type="attr" name="drawableTint" id="0x010104d6" /> + <public type="attr" name="drawableTintMode" id="0x010104d7" /> + <public type="attr" name="fraction" id="0x010104d8" /> + + <public type="style" name="Theme.DeviceDefault.Dialog.Alert" id="0x010302d1" /> + <public type="style" name="Theme.DeviceDefault.Light.Dialog.Alert" id="0x010302d2" /> + + <!-- =============================================================== + Resources added in version M of the platform + =============================================================== --> + <eat-comment /> + + <public type="attr" name="trackTint" id="0x010104d9" /> + <public type="attr" name="trackTintMode" id="0x010104da" /> + <public type="attr" name="start" id="0x010104db" /> + <public type="attr" name="end" id="0x010104dc" /> + <public type="attr" name="breakStrategy" id="0x010104dd" /> + <public type="attr" name="hyphenationFrequency" id="0x010104de" /> + <public type="attr" name="allowUndo" id="0x010104df" /> + <public type="attr" name="windowLightStatusBar" id="0x010104e0" /> + <public type="attr" name="numbersInnerTextColor" id="0x010104e1" /> + <public type="attr" name="colorBackgroundFloating" id="0x010104e2" /> + <public type="attr" name="titleTextColor" id="0x010104e3" /> + <public type="attr" name="subtitleTextColor" id="0x010104e4" /> + <public type="attr" name="thumbPosition" id="0x010104e5" /> + <public type="attr" name="scrollIndicators" id="0x010104e6" /> + <public type="attr" name="contextClickable" id="0x010104e7" /> + <public type="attr" name="fingerprintAuthDrawable" id="0x010104e8" /> + <public type="attr" name="logoDescription" id="0x010104e9" /> + <public type="attr" name="extractNativeLibs" id="0x010104ea" /> + <public type="attr" name="fullBackupContent" id="0x010104eb" /> + <public type="attr" name="usesCleartextTraffic" id="0x010104ec" /> + <public type="attr" name="lockTaskMode" id="0x010104ed" /> + <public type="attr" name="autoVerify" id="0x010104ee" /> + <public type="attr" name="showForAllUsers" id="0x010104ef" /> + <public type="attr" name="supportsAssist" id="0x010104f0" /> + <public type="attr" name="supportsLaunchVoiceAssistFromKeyguard" id="0x010104f1" /> + + <public type="style" name="Widget.Material.Button.Colored" id="0x010302d3" /> + <public type="style" name="TextAppearance.Material.Widget.Button.Inverse" id="0x010302d4" /> + <public type="style" name="Theme.Material.Light.LightStatusBar" id="0x010302d5" /> + <public type="style" name="ThemeOverlay.Material.Dialog" id="0x010302d6" /> + <public type="style" name="ThemeOverlay.Material.Dialog.Alert" id="0x010302d7" /> + + <public type="id" name="pasteAsPlainText" id="0x01020031" /> + <public type="id" name="undo" id="0x01020032" /> + <public type="id" name="redo" id="0x01020033" /> + <public type="id" name="replaceText" id="0x01020034" /> + <public type="id" name="shareText" id="0x01020035" /> + <public type="id" name="accessibilityActionShowOnScreen" id="0x01020036" /> + <public type="id" name="accessibilityActionScrollToPosition" id="0x01020037" /> + <public type="id" name="accessibilityActionScrollUp" id="0x01020038" /> + <public type="id" name="accessibilityActionScrollLeft" id="0x01020039" /> + <public type="id" name="accessibilityActionScrollDown" id="0x0102003a" /> + <public type="id" name="accessibilityActionScrollRight" id="0x0102003b" /> + <public type="id" name="accessibilityActionContextClick" id="0x0102003c" /> + + <public type="string" name="fingerprint_icon_content_description" id="0x01040018" /> + + <!-- =============================================================== + Resources added in version N of the platform + =============================================================== --> + <eat-comment /> + + <public type="attr" name="listMenuViewStyle" id="0x010104f2" /> + <public type="attr" name="subMenuArrow" id="0x010104f3" /> + <public type="attr" name="defaultWidth" id="0x010104f4" /> + <public type="attr" name="defaultHeight" id="0x010104f5" /> + <public type="attr" name="resizeableActivity" id="0x010104f6" /> + <public type="attr" name="supportsPictureInPicture" id="0x010104f7" /> + <public type="attr" name="titleMargin" id="0x010104f8" /> + <public type="attr" name="titleMarginStart" id="0x010104f9" /> + <public type="attr" name="titleMarginEnd" id="0x010104fa" /> + <public type="attr" name="titleMarginTop" id="0x010104fb" /> + <public type="attr" name="titleMarginBottom" id="0x010104fc" /> + <public type="attr" name="maxButtonHeight" id="0x010104fd" /> + <public type="attr" name="buttonGravity" id="0x010104fe" /> + <public type="attr" name="collapseIcon" id="0x010104ff" /> + <public type="attr" name="level" id="0x01010500" /> + <public type="attr" name="contextPopupMenuStyle" id="0x01010501" /> + <public type="attr" name="textAppearancePopupMenuHeader" id="0x01010502" /> + <public type="attr" name="windowBackgroundFallback" id="0x01010503" /> + <public type="attr" name="defaultToDeviceProtectedStorage" id="0x01010504" /> + <public type="attr" name="directBootAware" id="0x01010505" /> + <public type="attr" name="preferenceFragmentStyle" id="0x01010506" /> + <public type="attr" name="canControlMagnification" id="0x01010507" /> + <public type="attr" name="languageTag" id="0x01010508" /> + <public type="attr" name="pointerIcon" id="0x01010509" /> + <public type="attr" name="tickMark" id="0x0101050a" /> + <public type="attr" name="tickMarkTint" id="0x0101050b" /> + <public type="attr" name="tickMarkTintMode" id="0x0101050c" /> + <public type="attr" name="canPerformGestures" id="0x0101050d" /> + <public type="attr" name="externalService" id="0x0101050e" /> + <public type="attr" name="supportsLocalInteraction" id="0x0101050f" /> + <public type="attr" name="startX" id="0x01010510" /> + <public type="attr" name="startY" id="0x01010511" /> + <public type="attr" name="endX" id="0x01010512" /> + <public type="attr" name="endY" id="0x01010513" /> + <public type="attr" name="offset" id="0x01010514" /> + <public type="attr" name="use32bitAbi" id="0x01010515" /> + <public type="attr" name="bitmap" id="0x01010516" /> + <public type="attr" name="hotSpotX" id="0x01010517" /> + <public type="attr" name="hotSpotY" id="0x01010518" /> + <public type="attr" name="version" id="0x01010519" /> + <public type="attr" name="backupInForeground" id="0x0101051a" /> + <public type="attr" name="countDown" id="0x0101051b" /> + <public type="attr" name="canRecord" id="0x0101051c" /> + <public type="attr" name="tunerCount" id="0x0101051d" /> + <public type="attr" name="fillType" id="0x0101051e" /> + <public type="attr" name="popupEnterTransition" id="0x0101051f" /> + <public type="attr" name="popupExitTransition" id="0x01010520" /> + <public type="attr" name="forceHasOverlappingRendering" id="0x01010521" /> + <public type="attr" name="contentInsetStartWithNavigation" id="0x01010522" /> + <public type="attr" name="contentInsetEndWithActions" id="0x01010523" /> + <public type="attr" name="numberPickerStyle" id="0x01010524" /> + <public type="attr" name="enableVrMode" id="0x01010525" /> + <public type="attr" name="hash" id="0x01010526" /> + <public type="attr" name="networkSecurityConfig" id="0x01010527" /> + + <public type="style" name="Theme.Material.Light.DialogWhenLarge.DarkActionBar" id="0x010302d8" /> + <public type="style" name="Widget.Material.SeekBar.Discrete" id="0x010302d9" /> + <public type="style" name="Widget.Material.CompoundButton.Switch" id="0x010302da" /> + <public type="style" name="Widget.Material.Light.CompoundButton.Switch" id="0x010302db" /> + <public type="style" name="Widget.Material.NumberPicker" id="0x010302dc" /> + <public type="style" name="Widget.Material.Light.NumberPicker" id="0x010302dd" /> + <public type="style" name="TextAppearance.Material.Widget.Button.Colored" id="0x010302de" /> + <public type="style" name="TextAppearance.Material.Widget.Button.Borderless.Colored" id="0x010302df" /> + + <public type="id" name="accessibilityActionSetProgress" id="0x0102003d" /> + <public type="id" name="icon_frame" id="0x0102003e" /> + <public type="id" name="list_container" id="0x0102003f" /> + <public type="id" name="switch_widget" id="0x01020040" /> + <!-- =============================================================== + Resources added in version N MR1 of the platform + =============================================================== --> + <eat-comment /> + <public type="attr" name="shortcutId" id="0x01010528" /> + <public type="attr" name="shortcutShortLabel" id="0x01010529" /> + <public type="attr" name="shortcutLongLabel" id="0x0101052a" /> + <public type="attr" name="shortcutDisabledMessage" id="0x0101052b" /> + <public type="attr" name="roundIcon" id="0x0101052c" /> + <public type="attr" name="contextUri" id="0x0101052d" /> + <public type="attr" name="contextDescription" id="0x0101052e" /> + <public type="attr" name="showMetadataInPreview" id="0x0101052f" /> + <public type="attr" name="colorSecondary" id="0x01010530" /> + + <!-- =============================================================== + Resources added in version O of the platform + + NOTE: add <public> elements within a <public-group> like so: + + <public-group type="attr" first-id="0x01010531"> + <public name="exampleAttr1" /> + <public name="exampleAttr2" /> + </public-group> + + To add a new public-group block, choose an id value that is 1 greater + than the last of that item above. For example, the last "attr" id + value above is 0x01010530, so the public-group of attrs below has + the id value of 0x01010531. + =============================================================== --> + <eat-comment /> + + <public type="attr" name="visibleToInstantApps" id="0x01010531" /> + <public type="attr" name="font" id="0x01010532" /> + <public type="attr" name="fontWeight" id="0x01010533" /> + <public type="attr" name="tooltipText" id="0x01010534" /> + <public type="attr" name="autoSizeTextType" id="0x01010535" /> + <public type="attr" name="autoSizeStepGranularity" id="0x01010536" /> + <public type="attr" name="autoSizePresetSizes" id="0x01010537" /> + <public type="attr" name="autoSizeMinTextSize" id="0x01010538" /> + <public type="attr" name="min" id="0x01010539" /> + <public type="attr" name="rotationAnimation" id="0x0101053a" /> + <public type="attr" name="layout_marginHorizontal" id="0x0101053b" /> + <public type="attr" name="layout_marginVertical" id="0x0101053c" /> + <public type="attr" name="paddingHorizontal" id="0x0101053d" /> + <public type="attr" name="paddingVertical" id="0x0101053e" /> + <public type="attr" name="fontStyle" id="0x0101053f" /> + <public type="attr" name="keyboardNavigationCluster" id="0x01010540" /> + <public type="attr" name="targetProcesses" id="0x01010541" /> + <public type="attr" name="nextClusterForward" id="0x01010542" /> + <public type="attr" name="colorError" id="0x01010543" /> + <public type="attr" name="focusedByDefault" id="0x01010544" /> + <public type="attr" name="appCategory" id="0x01010545" /> + <public type="attr" name="autoSizeMaxTextSize" id="0x01010546" /> + <public type="attr" name="recreateOnConfigChanges" id="0x01010547" /> + <public type="attr" name="certDigest" id="0x01010548" /> + <public type="attr" name="splitName" id="0x01010549" /> + <public type="attr" name="colorMode" id="0x0101054a" /> + <public type="attr" name="isolatedSplits" id="0x0101054b" /> + <public type="attr" name="targetSandboxVersion" id="0x0101054c" /> + <public type="attr" name="canRequestFingerprintGestures" id="0x0101054d" /> + <public type="attr" name="alphabeticModifiers" id="0x0101054e" /> + <public type="attr" name="numericModifiers" id="0x0101054f" /> + <public type="attr" name="fontProviderAuthority" id="0x01010550" /> + <public type="attr" name="fontProviderQuery" id="0x01010551" /> + <public type="attr" name="primaryContentAlpha" id="0x01010552" /> + <public type="attr" name="secondaryContentAlpha" id="0x01010553" /> + <public type="attr" name="requiredFeature" id="0x01010554" /> + <public type="attr" name="requiredNotFeature" id="0x01010555" /> + <public type="attr" name="autofillHints" id="0x01010556" /> + <public type="attr" name="fontProviderPackage" id="0x01010557" /> + <public type="attr" name="importantForAutofill" id="0x01010558" /> + <public type="attr" name="recycleEnabled" id="0x01010559"/> + <public type="attr" name="isStatic" id="0x0101055a" /> + <public type="attr" name="isFeatureSplit" id="0x0101055b" /> + <public type="attr" name="singleLineTitle" id="0x0101055c" /> + <public type="attr" name="fontProviderCerts" id="0x0101055d" /> + <public type="attr" name="iconTint" id="0x0101055e" /> + <public type="attr" name="iconTintMode" id="0x0101055f" /> + <public type="attr" name="maxAspectRatio" id="0x01010560"/> + <public type="attr" name="iconSpaceReserved" id="0x01010561"/> + <public type="attr" name="defaultFocusHighlightEnabled" id="0x01010562" /> + <public type="attr" name="persistentWhenFeatureAvailable" id="0x01010563"/> + <public type="attr" name="windowSplashscreenContent" id="0x01010564" /> + <!-- @hide @SystemApi --> + <public type="attr" name="requiredSystemPropertyName" id="0x01010565" /> + <!-- @hide @SystemApi --> + <public type="attr" name="requiredSystemPropertyValue" id="0x01010566" /> + <public type="attr" name="justificationMode" id="0x01010567" /> + <public type="attr" name="autofilledHighlight" id="0x01010568" /> + + <public type="id" name="textAssist" id="0x01020041" /> + <public type="id" name="accessibilityActionMoveWindow" id="0x01020042" /> + <public type="id" name="autofill" id="0x01020043" /> + + <public type="string" name="paste_as_plain_text" id="0x01040019" /> + + <!-- =============================================================== + Resources added in version O MR1 of the platform + + NOTE: add <public> elements within a <public-group> like so: + + <public-group type="attr" first-id="0x01010531"> + <public name="exampleAttr1" /> + <public name="exampleAttr2" /> + </public-group> + + To add a new public-group block, choose an id value that is 1 greater + than the last of that item above. For example, the last "attr" id + value above is 0x01010530, so the public-group of attrs below has + the id value of 0x01010531. + =============================================================== --> + <eat-comment /> + + <public type="attr" name="showWhenLocked" id="0x01010569" /> + <public type="attr" name="turnScreenOn" id="0x0101056a" /> + <public type="attr" name="classLoader" id="0x0101056b" /> + <public type="attr" name="windowLightNavigationBar" id="0x0101056c" /> + <public type="attr" name="navigationBarDividerColor" id="0x0101056d" /> + + <public type="string" name="autofill" id="0x0104001a"/> + + <!-- =============================================================== + DO NOT ADD UN-GROUPED ITEMS HERE + + Any new items (attrs, styles, ids, etc.) *must* be added in a + public-group block, as the preceding comment explains. + Items added outside of a group may have their value recalculated + every time something new is added to this file. + =============================================================== --> +</resources> diff --git a/pyaxmlparser/stringblock.py b/pyaxmlparser/stringblock.py new file mode 100644 index 0000000..3a008f4 --- /dev/null +++ b/pyaxmlparser/stringblock.py @@ -0,0 +1,272 @@ +# This file is part of Androguard. +# +# Copyright (C) 2012, Anthony Desnos <desnos at t0t0.fr> +# All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS-IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging +from struct import unpack + +import pyaxmlparser.constants as const + + +log = logging.getLogger("pyaxmlparser.stringblock") + + +class StringBlock(object): + """ + StringBlock is a CHUNK inside an AXML File + It contains all strings, which are used by referecing to ID's + + See http://androidxref.com/9.0.0_r3/xref/frameworks/base/libs/androidfw/include/androidfw/ResourceTypes.h#436 + """ + def __init__(self, buff, header): + """ + :param buff: buffer which holds the string block + :param header: a instance of :class:`~ARSCHeader` + """ + self._cache = {} + self.header = header + # We already read the header (which was chunk_type and chunk_size + # Now, we read the string_count: + self.stringCount = unpack('<I', buff.read(4))[0] + # style_count + self.styleCount = unpack('<I', buff.read(4))[0] + + # flags + self.flags = unpack('<I', buff.read(4))[0] + self.m_isUTF8 = ((self.flags & const.UTF8_FLAG) != 0) + + # string_pool_offset + # The string offset is counted from the beginning of the string section + self.stringsOffset = unpack('<I', buff.read(4))[0] + # style_pool_offset + # The styles offset is counted as well from the beginning of the string section + self.stylesOffset = unpack('<I', buff.read(4))[0] + + # Check if they supplied a stylesOffset even if the count is 0: + if self.styleCount == 0 and self.stylesOffset > 0: + log.info("Styles Offset given, but styleCount is zero. " + "This is not a problem but could indicate packers.") + + self.m_stringOffsets = [] + self.m_styleOffsets = [] + self.m_charbuff = "" + self.m_styles = [] + + # Next, there is a list of string following. + # This is only a list of offsets (4 byte each) + for i in range(self.stringCount): + self.m_stringOffsets.append(unpack('<I', buff.read(4))[0]) + + # And a list of styles + # again, a list of offsets + for i in range(self.styleCount): + self.m_styleOffsets.append(unpack('<I', buff.read(4))[0]) + + # FIXME it is probably better to parse n strings and not calculate the size + size = self.header.size - self.stringsOffset + + # if there are styles as well, we do not want to read them too. + # Only read them, if no + if self.stylesOffset != 0 and self.styleCount != 0: + size = self.stylesOffset - self.stringsOffset + + if (size % 4) != 0: + log.warning("Size of strings is not aligned by four bytes.") + + self.m_charbuff = buff.read(size) + + if self.stylesOffset != 0 and self.styleCount != 0: + size = self.header.size - self.stylesOffset + + if (size % 4) != 0: + log.warning("Size of styles is not aligned by four bytes.") + + for i in range(0, size // 4): + self.m_styles.append(unpack('<I', buff.read(4))[0]) + + def __getitem__(self, idx): + """ + Returns the string at the index in the string table + """ + return self.getString(idx) + + def __len__(self): + """ + Get the number of strings stored in this table + """ + return self.stringCount + + def __iter__(self): + """ + Iterable over all strings + """ + for i in range(self.stringCount): + yield self.getString(i) + + def getString(self, idx): + """ + Return the string at the index in the string table + + :param idx: index in the string table + :return: str + """ + if idx in self._cache: + return self._cache[idx] + + if idx < 0 or not self.m_stringOffsets or idx > self.stringCount: + return "" + + offset = self.m_stringOffsets[idx] + + if self.m_isUTF8: + self._cache[idx] = self._decode8(offset) + else: + self._cache[idx] = self._decode16(offset) + + return self._cache[idx] + + def getStyle(self, idx): + """ + Return the style associated with the index + + :param idx: index of the style + :return: + """ + return self.m_styles[idx] + + def _decode8(self, offset): + """ + Decode an UTF-8 String at the given offset + + :param offset: offset of the string inside the data + :return: str + """ + # UTF-8 Strings contain two lengths, as they might differ: + # 1) the UTF-16 length + str_len, skip = self._decode_length(offset, 1) + offset += skip + + # 2) the utf-8 string length + encoded_bytes, skip = self._decode_length(offset, 1) + offset += skip + + data = self.m_charbuff[offset: offset + encoded_bytes] + + assert self.m_charbuff[offset + encoded_bytes] == 0, \ + "UTF-8 String is not null terminated! At offset={}".format(offset) + + return self._decode_bytes(data, 'utf-8', str_len) + + def _decode16(self, offset): + """ + Decode an UTF-16 String at the given offset + + :param offset: offset of the string inside the data + :return: str + """ + str_len, skip = self._decode_length(offset, 2) + offset += skip + + # The len is the string len in utf-16 units + encoded_bytes = str_len * 2 + + data = self.m_charbuff[offset: offset + encoded_bytes] + + assert self.m_charbuff[offset + encoded_bytes:offset + encoded_bytes + 2] == b"\x00\x00", \ + "UTF-16 String is not null terminated! At offset={}".format(offset) + + return self._decode_bytes(data, 'utf-16', str_len) + + @staticmethod + def _decode_bytes(data, encoding, str_len): + """ + Generic decoding with length check. + The string is decoded from bytes with the given encoding, then the length + of the string is checked. + The string is decoded using the "replace" method. + + :param data: bytes + :param encoding: encoding name ("utf-8" or "utf-16") + :param str_len: length of the decoded string + :return: str + """ + string = data.decode(encoding, 'replace') + if len(string) != str_len: + log.warning("invalid decoded string length") + return string + + def _decode_length(self, offset, sizeof_char): + """ + Generic Length Decoding at offset of string + + The method works for both 8 and 16 bit Strings. + Length checks are enforced: + * 8 bit strings: maximum of 0x7FFF bytes (See + http://androidxref.com/9.0.0_r3/xref/frameworks/base/libs/androidfw/ResourceTypes.cpp#692) + * 16 bit strings: maximum of 0x7FFFFFF bytes (See + http://androidxref.com/9.0.0_r3/xref/frameworks/base/libs/androidfw/ResourceTypes.cpp#670) + + :param offset: offset into the string data section of the beginning of + the string + :param sizeof_char: number of bytes per char (1 = 8bit, 2 = 16bit) + :returns: tuple of (length, read bytes) + """ + sizeof_2chars = sizeof_char << 1 + fmt = "<2{}".format('B' if sizeof_char == 1 else 'H') + highbit = 0x80 << (8 * (sizeof_char - 1)) + + length1, length2 = unpack(fmt, self.m_charbuff[offset:(offset + sizeof_2chars)]) + + if (length1 & highbit) != 0: + length = ((length1 & ~highbit) << (8 * sizeof_char)) | length2 + size = sizeof_2chars + else: + length = length1 + size = sizeof_char + + if sizeof_char == 1: + assert length <= 0x7FFF, "length of UTF-8 string is too large! At offset={}".format(offset) + else: + assert length <= 0x7FFFFFFF, "length of UTF-16 string is too large! At offset={}".format(offset) + + return length, size + + def show(self): + """ + Print some information on stdout about the string table + """ + print("StringBlock(stringsCount=0x%x, " + "stringsOffset=0x%x, " + "stylesCount=0x%x, " + "stylesOffset=0x%x, " + "flags=0x%x" + ")" % (self.stringCount, + self.stringsOffset, + self.styleCount, + self.stylesOffset, + self.flags)) + + if self.stringCount > 0: + print() + print("String Table: ") + for i, s in enumerate(self): + print("{:08d} {}".format(i, repr(s))) + + if self.styleCount > 0: + print() + print("Styles Table: ") + for i in range(self.styleCount): + print("{:08d} {}".format(i, repr(self.getStyle(i)))) diff --git a/pyaxmlparser/utils.py b/pyaxmlparser/utils.py new file mode 100644 index 0000000..5e9d81a --- /dev/null +++ b/pyaxmlparser/utils.py @@ -0,0 +1,153 @@ +import io +import os.path +from xml.dom.pulldom import SAX2DOM +from zipfile import ZipFile +import pyaxmlparser.constants as const +from struct import unpack, pack + +import lxml.sax +import asn1crypto + + +NS_ANDROID_URI = 'http://schemas.android.com/apk/res/android' +NS_ANDROID = '{http://schemas.android.com/apk/res/android}' +RADIX_MULTS = [0.00390625, 3.051758E-005, 1.192093E-007, 4.656613E-010] + + +def parse_lxml_dom(tree): + handler = SAX2DOM() + lxml.sax.saxify(tree, handler) + return handler.document + + +def _range(a, b, step=None): + if step is None: + return range(int(a), int(b)) + return range(int(a), int(b), step) + + +def get_zip_file(resource): + if isinstance(resource, bytes): + return ZipFile(io.BytesIO(resource)) + if os.path.isfile(resource): + return ZipFile(resource) + raise TypeError('Resource should be file or bytes stream') + + +def is_str(item, string=False): + if string: + return str(item) + return item + + +def complexToFloat(xcomplex): + return float(xcomplex & 0xFFFFFF00) * RADIX_MULTS[(xcomplex >> 4) & 3] + + +def long2int(input_l): + if input_l > 0x7fffffff: + input_l = (0x7fffffff & input_l) - 0x80000000 + return input_l + + +def getPackage(i): + if i >> 24 == 1: + return "android:" + return "" + + +def format_value(_type, _data, lookup_string=lambda ix: "<string>"): + if _type == const.TYPE_STRING: + return lookup_string(_data) + + elif _type == const.TYPE_ATTRIBUTE: + return "?%s%08X" % (getPackage(_data), _data) + + elif _type == const.TYPE_REFERENCE: + return "@%s%08X" % (getPackage(_data), _data) + + elif _type == const.TYPE_FLOAT: + return "%f" % unpack("=f", pack("=L", _data))[0] + + elif _type == const.TYPE_INT_HEX: + return "0x%08X" % _data + + elif _type == const.TYPE_INT_BOOLEAN: + if _data == 0: + return "false" + return "true" + + elif _type == const.TYPE_DIMENSION: + return "%f%s" % ( + complexToFloat(_data), + const.DIMENSION_UNITS[_data & const.COMPLEX_UNIT_MASK] + ) + + elif _type == const.TYPE_FRACTION: + return "%f%s" % ( + complexToFloat(_data) * 100, + const.FRACTION_UNITS[_data & const.COMPLEX_UNIT_MASK] + ) + + elif const.TYPE_FIRST_COLOR_INT <= _type <= const.TYPE_LAST_COLOR_INT: + return "#%08X" % _data + + elif const.TYPE_FIRST_INT <= _type <= const.TYPE_LAST_INT: + return "%d" % long2int(_data) + + return "<0x%X, type 0x%02X>" % (_data, _type) + + +def read(filename, binary=True): + """ + Open and read a file + :param filename: filename to open and read + :param binary: True if the file should be read as binary + :return: bytes if binary is True, str otherwise + """ + with open(filename, 'rb' if binary else 'r') as f: + return f.read() + + +def get_certificate_name_string(name, short=False, delimiter=', '): + """ + Format the Name type of a X509 Certificate in a human readable form. + :param name: Name object to return the DN from + :param short: Use short form (default: False) + :param delimiter: Delimiter string or character between two parts (default: ', ') + :type name: dict or :class:`asn1crypto.x509.Name` + :type short: boolean + :type delimiter: str + :rtype: str + """ + if isinstance(name, asn1crypto.x509.Name): + name = name.native + + # For the shortform, we have a lookup table + # See RFC4514 for more details + _ = { + 'business_category': ("businessCategory", "businessCategory"), + 'serial_number': ("serialNumber", "serialNumber"), + 'country_name': ("C", "countryName"), + 'postal_code': ("postalCode", "postalCode"), + 'state_or_province_name': ("ST", "stateOrProvinceName"), + 'locality_name': ("L", "localityName"), + 'street_address': ("street", "streetAddress"), + 'organization_name': ("O", "organizationName"), + 'organizational_unit_name': ("OU", "organizationalUnitName"), + 'title': ("title", "title"), + 'common_name': ("CN", "commonName"), + 'initials': ("initials", "initials"), + 'generation_qualifier': ("generationQualifier", "generationQualifier"), + 'surname': ("SN", "surname"), + 'given_name': ("GN", "givenName"), + 'name': ("name", "name"), + 'pseudonym': ("pseudonym", "pseudonym"), + 'dn_qualifier': ("dnQualifier", "dnQualifier"), + 'telephone_number': ("telephoneNumber", "telephoneNumber"), + 'email_address': ("E", "emailAddress"), + 'domain_component': ("DC", "domainComponent"), + 'name_distinguisher': ("nameDistinguisher", "nameDistinguisher"), + 'organization_identifier': ("organizationIdentifier", "organizationIdentifier"), + } + return delimiter.join(["{}={}".format(_.get(attr, (attr, attr))[0 if short else 1], name[attr]) for attr in name]) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..c12c78e --- /dev/null +++ b/requirements.txt @@ -0,0 +1,8 @@ +lxml==4.6.2 +click>=6.7 +asn1crypto>=0.24.0 + +# testing +pytest==3.0.6 +flake8==3.3.0 +coverage==4.4.1 diff --git a/scripts/deploy.sh b/scripts/deploy.sh new file mode 100755 index 0000000..51b5448 --- /dev/null +++ b/scripts/deploy.sh @@ -0,0 +1,18 @@ +#! /bin/bash +# +# deploy.sh +# Copyright (C) 2015 Subho Halder <sunny@appknox.com> +# +# Distributed under terms of the MIT license. +# + + +rm -rf dist/ +bumpversion patch +export CURRENT_BRANCH +CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD) +git push --tags +git push origin "$CURRENT_BRANCH:$CURRENT_BRANCH" +python setup.py sdist +python setup.py bdist_wheel +twine upload dist/* diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..d2a0fd2 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,17 @@ +[bumpversion] +current_version = 0.3.26 +commit = True +tag = True + +[flake8] +max-line-length = 120 +exclude = .tox,.git,*/migrations/*,*/static/*,docs,venv + +[tool:pytest] +norecursedirs = .tox .git */migrations/* */static/* docs venv + +[importmagic] +multiline = 'backslash' +max_columns = 119 + +[bumpversion:file:setup.py] diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..a745117 --- /dev/null +++ b/setup.py @@ -0,0 +1,50 @@ +from setuptools import find_packages, setup + +__VERSION__ = '0.3.26' + +with open("README.rst", "r") as fh: + long_description = fh.read() + +setup( + name='pyaxmlparser', + version=__VERSION__, + url='https://github.com/appknox/pyaxmlparser', + + author='Subho Halder', + author_email='sunny@appknox.com', + license='Apache License 2.0', + + data_files=[('man/man1', ['apkinfo.1'])], + packages=find_packages(exclude=['tests', 'examples']), + include_package_data=True, + zip_safe=False, + platforms='any', + install_requires=['lxml', 'click>=6.7', 'asn1crypto>=0.24.0'], + entry_points=''' + [console_scripts] + apkinfo = pyaxmlparser.cli:main + ''', + py_modules=['pyaxmlparser'], + description="Python3 Parser for Android XML file and get Application Name without using Androguard", + long_description=long_description, + long_description_content_type="text/markdown", + keywords='appknox axmlparser arscparser android', + classifiers=[ + 'Development Status :: 4 - Beta', + + 'Intended Audience :: Developers', + + 'License :: OSI Approved :: Apache Software License', + + 'Operating System :: POSIX', + 'Operating System :: MacOS', + 'Operating System :: Unix', + + 'Programming Language :: Python', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.5', + + 'Topic :: Software Development :: Build Tools', + 'Topic :: Software Development :: Libraries :: Python Modules', + ] +) diff --git a/tests/test_apk/AndroidManifest.xml b/tests/test_apk/AndroidManifest.xml Binary files differnew file mode 100644 index 0000000..f271add --- /dev/null +++ b/tests/test_apk/AndroidManifest.xml diff --git a/tests/test_apk/resources.arsc b/tests/test_apk/resources.arsc Binary files differnew file mode 100644 index 0000000..a530450 --- /dev/null +++ b/tests/test_apk/resources.arsc diff --git a/tests/test_parser.py b/tests/test_parser.py new file mode 100644 index 0000000..4b471e8 --- /dev/null +++ b/tests/test_parser.py @@ -0,0 +1,27 @@ +import os.path +import sys + +from pyaxmlparser.arscparser import ARSCParser +from pyaxmlparser.axmlprinter import AXMLPrinter +from pyaxmlparser.utils import NS_ANDROID + + +PATH_INSTALL = "./" +sys.path.append(PATH_INSTALL) +test_apk = 'tests/test_apk/' + + +def test_app_name_extraction(): + axml_file = os.path.join(test_apk, 'AndroidManifest.xml') + axml = AXMLPrinter(open(axml_file, 'rb').read()).get_xml_obj() + app_name_hex = axml.findall(".//application")[0].get(NS_ANDROID + "label") + appnamehex = '0x' + app_name_hex[1:] + + rsc_file = os.path.join(test_apk, 'resources.arsc') + rsc = ARSCParser(open(rsc_file, 'rb').read()) + + app_name = rsc.get_string( + rsc.get_packages_names()[0], + rsc.get_id(rsc.get_packages_names()[0], int(appnamehex, 0))[1] + ) + assert app_name == ['app_name', 'Evie'] |