Merge "Add style parents dump command."

This commit is contained in:
Aurimas Liutikas
2018-10-09 22:46:37 +00:00
committed by Android (Google) Code Review
2 changed files with 59 additions and 10 deletions

View File

@@ -251,19 +251,12 @@ int DumpConfigsCommand::Dump(LoadedApk* apk) {
}
int DumpPackageNameCommand::Dump(LoadedApk* apk) {
xml::Element* manifest_el = apk->GetManifest()->root.get();
if (!manifest_el) {
GetDiagnostics()->Error(DiagMessage() << "No AndroidManifest");
Maybe<std::string> package_name = GetPackageName(apk);
if (!package_name) {
return 1;
}
xml::Attribute* attr = manifest_el->FindAttribute({}, "package");
if (!attr) {
GetDiagnostics()->Error(DiagMessage() << "No package name");
return 1;
}
GetPrinter()->Println(StringPrintf("%s", attr->value.c_str()));
GetPrinter()->Println(package_name.value());
return 0;
}
@@ -283,6 +276,31 @@ int DumpStringsCommand::Dump(LoadedApk* apk) {
return 0;
}
int DumpStyleParentCommand::Dump(LoadedApk* apk) {
Maybe<std::string> package_name = GetPackageName(apk);
if (!package_name) {
return 1;
}
const auto target_style = ResourceName(package_name.value(), ResourceType::kStyle, style_);
const auto table = apk->GetResourceTable();
if (!table) {
GetDiagnostics()->Error(DiagMessage() << "Failed to retrieve resource table");
return 1;
}
Maybe<ResourceTable::SearchResult> target = table->FindResource(target_style);
if (!target) {
GetDiagnostics()->Error(
DiagMessage() << "Target style \"" << target_style.entry << "\" does not exist");
return 1;
}
Debug::PrintStyleGraph(table, target_style);
return 0;
}
int DumpTableCommand::Dump(LoadedApk* apk) {
if (apk->GetApkFormat() == ApkFormat::kProto) {
GetPrinter()->Println("Proto APK");

View File

@@ -42,6 +42,21 @@ class DumpApkCommand : public Command {
return diag_;
}
Maybe<std::string> GetPackageName(LoadedApk* apk) {
xml::Element* manifest_el = apk->GetManifest()->root.get();
if (!manifest_el) {
GetDiagnostics()->Error(DiagMessage() << "No AndroidManifest.");
return Maybe<std::string>();
}
xml::Attribute* attr = manifest_el->FindAttribute({}, "package");
if (!attr) {
GetDiagnostics()->Error(DiagMessage() << "No package name.");
return Maybe<std::string>();
}
return attr->value;
}
/** Perform the dump operation on the apk. */
virtual int Dump(LoadedApk* apk) = 0;
@@ -164,6 +179,21 @@ class DumpStringsCommand : public DumpApkCommand {
int Dump(LoadedApk* apk) override;
};
/** Prints the graph of parents of a style in an APK. */
class DumpStyleParentCommand : public DumpApkCommand {
public:
explicit DumpStyleParentCommand(text::Printer* printer, IDiagnostics* diag)
: DumpApkCommand("styleparents", printer, diag) {
SetDescription("Print the parents of a style in an APK.");
AddRequiredFlag("--style", "The name of the style to print", &style_);
}
int Dump(LoadedApk* apk) override;
private:
std::string style_;
};
class DumpTableCommand : public DumpApkCommand {
public:
explicit DumpTableCommand(text::Printer* printer, IDiagnostics* diag)
@@ -220,6 +250,7 @@ class DumpCommand : public Command {
AddOptionalSubcommand(util::make_unique<DumpPackageNameCommand>(printer, diag_));
AddOptionalSubcommand(util::make_unique<DumpPermissionsCommand>(printer, diag_));
AddOptionalSubcommand(util::make_unique<DumpStringsCommand>(printer, diag_));
AddOptionalSubcommand(util::make_unique<DumpStyleParentCommand>(printer, diag_));
AddOptionalSubcommand(util::make_unique<DumpTableCommand>(printer, diag_));
AddOptionalSubcommand(util::make_unique<DumpXmlStringsCommand>(printer, diag_));
AddOptionalSubcommand(util::make_unique<DumpXmlTreeCommand>(printer, diag_));