From 16fb3f9e425bc511ec5f8952d3130c633dee8ddc Mon Sep 17 00:00:00 2001 From: Jon Spivack Date: Fri, 26 Jul 2019 13:14:42 -0700 Subject: [PATCH] Allow AIDL interfaces in service parsing Bug: 138756857 Test: Manual (using mediaextractor as a test service) Change-Id: Ice2c695fca7062d6a115df13a6ac1d6fe82a3a98 --- init/interface_utils.cpp | 6 ++++++ init/service_parser.cpp | 22 +++++++++++++--------- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/init/interface_utils.cpp b/init/interface_utils.cpp index a54860fa4..ddbacd763 100644 --- a/init/interface_utils.cpp +++ b/init/interface_utils.cpp @@ -77,6 +77,12 @@ Result CheckInterfaceInheritanceHierarchy(const std::set& ins const InterfaceInheritanceHierarchyMap& hierarchy) { std::set interface_fqnames; for (const std::string& instance : instances) { + // There is insufficient build-time information on AIDL interfaces to check them here + // TODO(b/139307527): Rework how services store interfaces to avoid excess string parsing + if (base::Split(instance, "/")[0] == "aidl") { + continue; + } + FqInstance fqinstance; if (!fqinstance.setTo(instance)) { return Error() << "Unable to parse interface instance '" << instance << "'"; diff --git a/init/service_parser.cpp b/init/service_parser.cpp index dd552fb9f..543be2329 100644 --- a/init/service_parser.cpp +++ b/init/service_parser.cpp @@ -145,17 +145,21 @@ Result ServiceParser::ParseInterface(std::vector&& args) { const std::string& interface_name = args[1]; const std::string& instance_name = args[2]; - FQName fq_name; - if (!FQName::parse(interface_name, &fq_name)) { - return Error() << "Invalid fully-qualified name for interface '" << interface_name << "'"; - } + // AIDL services don't use fully qualified names and instead just use "interface aidl " + if (interface_name != "aidl") { + FQName fq_name; + if (!FQName::parse(interface_name, &fq_name)) { + return Error() << "Invalid fully-qualified name for interface '" << interface_name + << "'"; + } - if (!fq_name.isFullyQualified()) { - return Error() << "Interface name not fully-qualified '" << interface_name << "'"; - } + if (!fq_name.isFullyQualified()) { + return Error() << "Interface name not fully-qualified '" << interface_name << "'"; + } - if (fq_name.isValidValueName()) { - return Error() << "Interface name must not be a value name '" << interface_name << "'"; + if (fq_name.isValidValueName()) { + return Error() << "Interface name must not be a value name '" << interface_name << "'"; + } } const std::string fullname = interface_name + "/" + instance_name;