aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/tools/android/java/com/google/devtools
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2016-08-01 15:48:01 +0000
committerGravatar Yun Peng <pcloudy@google.com>2016-08-02 07:32:55 +0000
commit7eaa816646c2faa488b26c709ab173512b91cf37 (patch)
tree0241054811f9a0207edc4f6dea755ccba8f62811 /src/tools/android/java/com/google/devtools
parent32994caee8e2d06dad9006c8a6e0931e03818403 (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.java20
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;