AAPT2: partial files contain only local resources

When writing a partial R file for the compiled file, only include
resources defined locally - meaning those without a package. Do not
write resources from other packages (e.g. "android").

Test: manual
Bug: 73927419
Change-Id: I84241352e643ca1f22a581e6847372e2a4278824
This commit is contained in:
Izabela Orlowska
2018-07-24 11:54:32 +01:00
parent a6f3ba1dc5
commit f67d486e58

View File

@@ -288,44 +288,48 @@ static bool CompileTable(IAaptContext* context, const CompileOptions& options,
Printer r_txt_printer(&fout_text);
for (const auto& package : table.packages) {
for (const auto& type : package->types) {
for (const auto& entry : type->entries) {
// Check access modifiers.
switch(entry->visibility.level) {
case Visibility::Level::kUndefined :
r_txt_printer.Print("default ");
break;
case Visibility::Level::kPublic :
r_txt_printer.Print("public ");
break;
case Visibility::Level::kPrivate :
r_txt_printer.Print("private ");
}
// Only print resources defined locally, e.g. don't write android attributes.
if (package->name.empty()) {
for (const auto& type : package->types) {
for (const auto& entry : type->entries) {
// Check access modifiers.
switch (entry->visibility.level) {
case Visibility::Level::kUndefined :
r_txt_printer.Print("default ");
break;
case Visibility::Level::kPublic :
r_txt_printer.Print("public ");
break;
case Visibility::Level::kPrivate :
r_txt_printer.Print("private ");
}
if (type->type != ResourceType::kStyleable) {
r_txt_printer.Print("int ");
r_txt_printer.Print(to_string(type->type));
r_txt_printer.Print(" ");
r_txt_printer.Println(entry->name);
} else {
r_txt_printer.Print("int[] styleable ");
r_txt_printer.Println(entry->name);
if (type->type != ResourceType::kStyleable) {
r_txt_printer.Print("int ");
r_txt_printer.Print(to_string(type->type));
r_txt_printer.Print(" ");
r_txt_printer.Println(entry->name);
} else {
r_txt_printer.Print("int[] styleable ");
r_txt_printer.Println(entry->name);
if (!entry->values.empty()) {
auto styleable = static_cast<const Styleable*>(entry->values.front()->value.get());
for (const auto& attr : styleable->entries) {
// The visibility of the children under the styleable does not matter as they are
// nested under their parent and use its visibility.
r_txt_printer.Print("default int styleable ");
r_txt_printer.Print(entry->name);
// If the package name is present, also include it in the mangled name (e.g.
// "android")
if (!attr.name.value().package.empty()) {
if (!entry->values.empty()) {
auto styleable =
static_cast<const Styleable*>(entry->values.front()->value.get());
for (const auto& attr : styleable->entries) {
// The visibility of the children under the styleable does not matter as they are
// nested under their parent and use its visibility.
r_txt_printer.Print("default int styleable ");
r_txt_printer.Print(entry->name);
// If the package name is present, also include it in the mangled name (e.g.
// "android")
if (!attr.name.value().package.empty()) {
r_txt_printer.Print("_");
r_txt_printer.Print(MakePackageSafeName(attr.name.value().package));
}
r_txt_printer.Print("_");
r_txt_printer.Print(MakePackageSafeName(attr.name.value().package));
r_txt_printer.Println(attr.name.value().entry);
}
r_txt_printer.Print("_");
r_txt_printer.Println(attr.name.value().entry);
}
}
}