diff options
author | Googler <noreply@google.com> | 2016-08-01 15:48:01 +0000 |
---|---|---|
committer | Yun Peng <pcloudy@google.com> | 2016-08-02 07:32:55 +0000 |
commit | 7eaa816646c2faa488b26c709ab173512b91cf37 (patch) | |
tree | 0241054811f9a0207edc4f6dea755ccba8f62811 /src/tools/android/java/com/google/devtools | |
parent | 32994caee8e2d06dad9006c8a6e0931e03818403 (diff) |
Tolerate missing field value in binary's R.txt
The binary's R.txt might not be superset of
symbols in the various library R.txt files.
The R.java writer had tolerated this, as did an
older version of the RClassGen (lost in refactoring).
Bring back the null check.
This can happen if the binary has res overrides that
*remove* symbols. E.g., if noop/res/layout/stats.xml
overrides dev/.../stats.xml, and the noop version
removes elements not needed for production.
Test mocks can do something similar.
--
MOS_MIGRATED_REVID=128989080
Diffstat (limited to 'src/tools/android/java/com/google/devtools')
-rw-r--r-- | src/tools/android/java/com/google/devtools/build/android/resources/RClassGenerator.java | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/src/tools/android/java/com/google/devtools/build/android/resources/RClassGenerator.java b/src/tools/android/java/com/google/devtools/build/android/resources/RClassGenerator.java index 2ae68f11ea..d1ad740027 100644 --- a/src/tools/android/java/com/google/devtools/build/android/resources/RClassGenerator.java +++ b/src/tools/android/java/com/google/devtools/build/android/resources/RClassGenerator.java @@ -32,6 +32,7 @@ import java.util.EnumMap; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.logging.Logger; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; @@ -46,6 +47,7 @@ import org.objectweb.asm.commons.InstructionAdapter; */ public class RClassGenerator { + private static final Logger logger = Logger.getLogger(RClassGenerator.class.getName()); private static final int JAVA_VERSION = Opcodes.V1_7; private static final String SUPER_CLASS = "java/lang/Object"; private final Path outFolder; @@ -149,13 +151,19 @@ public class RClassGenerator { for (String symbolName : symbolList) { // get the matching SymbolEntry from the values Table. SymbolEntry value = values.get(typeName, symbolName); - Preconditions.checkNotNull(value); - if (value.getType().equals("int")) { - initializers.add(IntFieldInitializer.of(value.getName(), value.getValue())); + if (value != null) { + if (value.getType().equals("int")) { + initializers.add(IntFieldInitializer.of(value.getName(), value.getValue())); + } else { + Preconditions.checkArgument(value.getType().equals("int[]")); + initializers + .add(IntArrayFieldInitializer.of(value.getName(), value.getValue())); + } } else { - Preconditions.checkArgument(value.getType().equals("int[]")); - initializers - .add(IntArrayFieldInitializer.of(value.getName(), value.getValue())); + // Value may be missing if resource overriding eliminates resources at the binary + // level, which were originally present at the library level. + logger.fine(String.format("Skipping R.%s.%s -- value not known in binary's R.txt", + typeName, symbolName)); } } return initializers; |