| Index: build/android/gyp/process_resources.py
|
| diff --git a/build/android/gyp/process_resources.py b/build/android/gyp/process_resources.py
|
| index 2d4638f8d81f77dca0dacb705e4ca9fbdc5959cf..0f68866647b26d6bf1877f0c3486bcb829f034f6 100755
|
| --- a/build/android/gyp/process_resources.py
|
| +++ b/build/android/gyp/process_resources.py
|
| @@ -74,7 +74,11 @@ def _ParseArgs(args):
|
| parser.add_option('--srcjar-out',
|
| help='Path to srcjar to contain generated R.java.')
|
| parser.add_option('--r-text-out',
|
| - help='Path to store the R.txt file generated by appt.')
|
| + help='Path to store the generated R.txt file.')
|
| + parser.add_option('--r-text-in',
|
| + help='Path to pre-existing R.txt for these resources. '
|
| + 'Resource names from it will be used to generate R.java '
|
| + 'instead of aapt-generated R.txt.')
|
|
|
| parser.add_option('--proguard-file',
|
| help='Path to proguard.txt generated file')
|
| @@ -169,8 +173,24 @@ def CreateRJavaFiles(srcjar_dir, main_r_txt_file, packages, r_txt_files,
|
| # figure out which entries belong to them, but use the values from the
|
| # main R.txt file.
|
| for entry in _ParseTextSymbolsFile(r_txt_file):
|
| - entry = all_resources[(entry.resource_type, entry.name)]
|
| - resources_by_type[entry.resource_type].append(entry)
|
| + entry = all_resources.get((entry.resource_type, entry.name))
|
| + # For most cases missing entry here is an error. It means that some
|
| + # library claims to have or depend on a resource that isn't included into
|
| + # the APK. There is one notable exception: Google Play Services (GMS).
|
| + # GMS is shipped as a bunch of AARs. One of them - basement - contains
|
| + # R.txt with ids of all resources, but most of the resources are in the
|
| + # other AARs. However, all other AARs reference their resources via
|
| + # basement's R.java so the latter must contain all ids that are in its
|
| + # R.txt. Most targets depend on only a subset of GMS AARs so some
|
| + # resources are missing, which is okay because the code that references
|
| + # them is missing too. We can't get an id for a resource that isn't here
|
| + # so the only solution is to skip the resource entry entirely.
|
| + #
|
| + # We can verify that all entries referenced in the code were generated
|
| + # correctly by running Proguard on the APK: it will report missing
|
| + # fields.
|
| + if entry:
|
| + 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(srcjar_dir, *package.split('.'))
|
| @@ -432,6 +452,12 @@ def _OnStaleMd5(options):
|
| build_utils.Touch(r_txt_path)
|
|
|
| if not options.include_all_resources:
|
| + # --include-all-resources can only be specified for generating final R
|
| + # classes for APK. It makes no sense for APK to have pre-generated R.txt
|
| + # though, because aapt-generated already lists all available resources.
|
| + if options.r_text_in:
|
| + r_txt_path = options.r_text_in
|
| +
|
| packages = list(options.extra_res_packages)
|
| r_txt_files = list(options.extra_r_text_files)
|
|
|
|
|