diff options
author | Adam Lesinski <adamlesinski@google.com> | 2017-04-27 15:01:10 -0700 |
---|---|---|
committer | Adam Lesinski <adamlesinski@google.com> | 2017-04-28 12:47:48 -0700 |
commit | 1e4b0e54a3db31bdbcb9385bf22bab4b96096d1f (patch) | |
tree | 3c87c9080c067aacf8235a07214d3edc35bd86ed /tools/aapt2/java/JavaClassGenerator.cpp | |
parent | 0ddca92018da69e7224b63cdedbf1944c63ddc34 (diff) |
AAPT2: Workaround for findViewById with package ID > 0x7f
The entire View code base checks IDs against View.NO_ID except
findViewById(), which checks to see if the ID is negative.
Any package ID > 0x7f is interpreted as a negative number in Java
(no unsigned ints), so this check prevents the use of IDs > 0x7f.
findViewById is final, so support library workarounds are not possible.
Instead, IDs (@id/foo) are just sentinels, their values don't matter.
If building for pre-O devices, rewrite any references to these IDs of
the for 0xPPTTEEEE, where PP > 7f, to 0x7fPPEEEE.
The symbol table will check for potential collisions against the base
APK, so this should be safe.
Bug: 37498913
Test: manual
Change-Id: Ife3bbd29db287757ef8a2ffd83053d97f1db2613
Diffstat (limited to 'tools/aapt2/java/JavaClassGenerator.cpp')
-rw-r--r-- | tools/aapt2/java/JavaClassGenerator.cpp | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/tools/aapt2/java/JavaClassGenerator.cpp b/tools/aapt2/java/JavaClassGenerator.cpp index a8226c0a9082..2a23aa9e5372 100644 --- a/tools/aapt2/java/JavaClassGenerator.cpp +++ b/tools/aapt2/java/JavaClassGenerator.cpp @@ -31,6 +31,7 @@ #include "Resource.h" #include "ResourceTable.h" #include "ResourceValues.h" +#include "SdkConstants.h" #include "ValueVisitor.h" #include "java/AnnotationProcessor.h" #include "java/ClassDefinition.h" @@ -430,9 +431,15 @@ void JavaClassGenerator::ProcessResource(const ResourceNameRef& name, const Reso const ResourceEntry& entry, ClassDefinition* out_class_def, MethodDefinition* out_rewrite_method, std::ostream* out_r_txt) { + ResourceId real_id = id; + if (context_->GetMinSdkVersion() < SDK_O && name.type == ResourceType::kId && + id.package_id() > kAppPackageId) { + real_id = ResourceId(kAppPackageId, id.package_id(), id.entry_id()); + } + const std::string field_name = TransformToFieldName(name.entry); std::unique_ptr<ResourceMember> resource_member = - util::make_unique<ResourceMember>(field_name, id); + util::make_unique<ResourceMember>(field_name, real_id); // Build the comments and annotations for this entry. AnnotationProcessor* processor = resource_member->GetCommentBuilder(); @@ -458,7 +465,7 @@ void JavaClassGenerator::ProcessResource(const ResourceNameRef& name, const Reso out_class_def->AddMember(std::move(resource_member)); if (out_r_txt != nullptr) { - *out_r_txt << "int " << name.type << " " << field_name << " " << id << "\n"; + *out_r_txt << "int " << name.type << " " << field_name << " " << real_id << "\n"; } if (out_rewrite_method != nullptr) { |