Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(165)

Unified Diff: build/android/gyp/process_resources.py

Issue 1338393003: GN: Fix ChromePublic crash on launch from misconfigured resource overrides (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: line length Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | build/config/android/rules.gni » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: build/android/gyp/process_resources.py
diff --git a/build/android/gyp/process_resources.py b/build/android/gyp/process_resources.py
index e05e0fdff7255f5a9466909433d419f4c16d8fd8..29b183d9af352b4d9064a881a74e0966a28765a5 100755
--- a/build/android/gyp/process_resources.py
+++ b/build/android/gyp/process_resources.py
@@ -11,6 +11,7 @@ This will crunch images and generate v14 compatible resources
"""
import codecs
+import collections
import optparse
import os
import re
@@ -27,6 +28,11 @@ sys.path.insert(1,
from jinja2 import Template # pylint: disable=F0401
+# Represents a line from a R.txt file.
+TextSymbolsEntry = collections.namedtuple('RTextEntry',
+ ('java_type', 'resource_type', 'name', 'value'))
+
+
def ParseArgs(args):
"""Parses command line options.
@@ -135,42 +141,61 @@ def CreateExtraRJavaFiles(
if len(extra_packages) != len(extra_r_text_files):
raise Exception('Need one R.txt file per extra package')
- all_resources = {}
r_txt_file = os.path.join(r_dir, 'R.txt')
if not os.path.exists(r_txt_file):
return
- with open(r_txt_file) as f:
- for line in f:
- m = re.match(r'(int(?:\[\])?) (\w+) (\w+) (.+)$', line)
- if not m:
- raise Exception('Unexpected line in R.txt: %s' % line)
- java_type, resource_type, name, value = m.groups()
- all_resources[(resource_type, name)] = (java_type, value)
+ # Map of (resource_type, name) -> Entry.
+ # Contains the correct values for resources.
+ all_resources = {}
+ for entry in _ParseTextSymbolsFile(r_txt_file):
+ all_resources[(entry.resource_type, entry.name)] = entry
+
+ # Map of package_name->resource_type->entry
+ resources_by_package = (
+ collections.defaultdict(lambda: collections.defaultdict(list)))
+ # Build the R.java files using each package's R.txt file, but replacing
+ # each entry's placeholder value with correct values from all_resources.
for package, r_text_file in zip(extra_packages, extra_r_text_files):
- if os.path.exists(r_text_file):
- package_r_java_dir = os.path.join(r_dir, *package.split('.'))
- build_utils.MakeDirectory(package_r_java_dir)
- package_r_java_path = os.path.join(package_r_java_dir, 'R.java')
- CreateExtraRJavaFile(
- package, package_r_java_path, r_text_file, all_resources,
- shared_resources)
-
-
-def CreateExtraRJavaFile(
- package, r_java_path, r_text_file, all_resources, shared_resources):
- resources = {}
- with open(r_text_file) as f:
+ if not os.path.exists(r_text_file):
+ continue
+ if package in resources_by_package:
+ raise Exception(('Package name "%s" appeared twice. All '
+ 'android_resources() targets must use unique package '
+ 'names, or no package name at all.') % package)
+ resources_by_type = resources_by_package[package]
+ # The sub-R.txt files have the wrong values at this point. Read them to
+ # figure out which entries belong to them, but use the values from the
+ # main R.txt file.
+ for entry in _ParseTextSymbolsFile(r_text_file):
+ entry = all_resources[(entry.resource_type, entry.name)]
+ resources_by_type[entry.resource_type].append(entry)
+
+ for package, resources_by_type in resources_by_package.iteritems():
+ package_r_java_dir = os.path.join(r_dir, *package.split('.'))
+ build_utils.MakeDirectory(package_r_java_dir)
+ package_r_java_path = os.path.join(package_r_java_dir, 'R.java')
+ java_file_contents = _CreateExtraRJavaFile(
+ package, resources_by_type, shared_resources)
+ with open(package_r_java_path, 'w') as f:
+ f.write(java_file_contents)
+
+
+def _ParseTextSymbolsFile(path):
+ """Given an R.txt file, returns a list of TextSymbolsEntry."""
+ ret = []
+ with open(path) as f:
for line in f:
- m = re.match(r'int(?:\[\])? (\w+) (\w+) ', line)
+ m = re.match(r'(int(?:\[\])?) (\w+) (\w+) (.+)$', line)
if not m:
raise Exception('Unexpected line in R.txt: %s' % line)
- resource_type, name = m.groups()
- java_type, value = all_resources[(resource_type, name)]
- if resource_type not in resources:
- resources[resource_type] = []
- resources[resource_type].append((name, java_type, value))
+ java_type, resource_type, name, value = m.groups()
+ ret.append(TextSymbolsEntry(java_type, resource_type, name, value))
+ return ret
+
+def _CreateExtraRJavaFile(package, resources_by_type, shared_resources):
+ """Generates the contents of a R.java file."""
template = Template("""/* AUTO-GENERATED FILE. DO NOT MODIFY. */
package {{ package }};
@@ -178,11 +203,11 @@ package {{ package }};
public final class R {
{% for resource_type in resources %}
public static final class {{ resource_type }} {
- {% for name, java_type, value in resources[resource_type] %}
+ {% for e in resources[resource_type] %}
{% if shared_resources %}
- public static {{ java_type }} {{ name }} = {{ value }};
+ public static {{ e.java_type }} {{ e.name }} = {{ e.value }};
{% else %}
- public static final {{ java_type }} {{ name }} = {{ value }};
+ public static final {{ e.java_type }} {{ e.name }} = {{ e.value }};
{% endif %}
{% endfor %}
}
@@ -190,16 +215,16 @@ public final class R {
{% if shared_resources %}
public static void onResourcesLoaded(int packageId) {
{% for resource_type in resources %}
- {% for name, java_type, value in resources[resource_type] %}
- {% if java_type == 'int[]' %}
- for(int i = 0; i < {{ resource_type }}.{{ name }}.length; ++i) {
- {{ resource_type }}.{{ name }}[i] =
- ({{ resource_type }}.{{ name }}[i] & 0x00ffffff)
+ {% for e in resources[resource_type] %}
+ {% if e.java_type == 'int[]' %}
+ for(int i = 0; i < {{ e.resource_type }}.{{ e.name }}.length; ++i) {
+ {{ e.resource_type }}.{{ e.name }}[i] =
+ ({{ e.resource_type }}.{{ e.name }}[i] & 0x00ffffff)
| (packageId << 24);
}
{% else %}
- {{ resource_type }}.{{ name }} =
- ({{ resource_type }}.{{ name }} & 0x00ffffff)
+ {{ e.resource_type }}.{{ e.name }} =
+ ({{ e.resource_type }}.{{ e.name }} & 0x00ffffff)
| (packageId << 24);
{% endif %}
{% endfor %}
@@ -209,10 +234,8 @@ public final class R {
}
""", trim_blocks=True, lstrip_blocks=True)
- output = template.render(package=package, resources=resources,
- shared_resources=shared_resources)
- with open(r_java_path, 'w') as f:
- f.write(output)
+ return template.render(package=package, resources=resources_by_type,
+ shared_resources=shared_resources)
def CrunchDirectory(aapt, input_dir, output_dir):
« no previous file with comments | « no previous file | build/config/android/rules.gni » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698