summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndres Salomon <dilinger@debian.org>2021-10-03 23:33:14 +0200
committerAndres Salomon <dilinger@debian.org>2021-10-03 23:33:14 +0200
commitf9a74f80e3f6d4bcaa88e6a9db9e790e7e608dd7 (patch)
tree40cbd877832c6a438debbb0a99ba10979e6532f1
Import pyaxmlparser_0.3.26.orig.tar.gz
[dgit import orig pyaxmlparser_0.3.26.orig.tar.gz]
-rw-r--r--.editorconfig19
-rw-r--r--.gitignore90
-rw-r--r--LICENSE201
-rw-r--r--MANIFEST.in4
-rw-r--r--README.rst44
-rw-r--r--apkinfo.123
-rw-r--r--circle.yml16
-rw-r--r--examples/get_app_name.py22
-rw-r--r--pyaxmlparser/__init__.py3
-rw-r--r--pyaxmlparser/arscparser.py784
-rw-r--r--pyaxmlparser/arscutil.py642
-rw-r--r--pyaxmlparser/axmlparser.py576
-rw-r--r--pyaxmlparser/axmlprinter.py249
-rw-r--r--pyaxmlparser/bytecode.py363
-rw-r--r--pyaxmlparser/cli.py22
-rw-r--r--pyaxmlparser/constants.py184
-rw-r--r--pyaxmlparser/core.py2208
-rw-r--r--pyaxmlparser/resources/__init__.py0
-rw-r--r--pyaxmlparser/resources/public.json2510
-rw-r--r--pyaxmlparser/resources/public.py63
-rw-r--r--pyaxmlparser/resources/public.xml2861
-rw-r--r--pyaxmlparser/stringblock.py272
-rw-r--r--pyaxmlparser/utils.py153
-rw-r--r--requirements.txt8
-rwxr-xr-xscripts/deploy.sh18
-rw-r--r--setup.cfg17
-rw-r--r--setup.py50
-rw-r--r--tests/test_apk/AndroidManifest.xmlbin0 -> 29756 bytes
-rw-r--r--tests/test_apk/resources.arscbin0 -> 895280 bytes
-rw-r--r--tests/test_parser.py27
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
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..261eeb9
--- /dev/null
+++ b/LICENSE
@@ -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
new file mode 100644
index 0000000..f271add
--- /dev/null
+++ b/tests/test_apk/AndroidManifest.xml
Binary files differ
diff --git a/tests/test_apk/resources.arsc b/tests/test_apk/resources.arsc
new file mode 100644
index 0000000..a530450
--- /dev/null
+++ b/tests/test_apk/resources.arsc
Binary files differ
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']