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
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user