in source/ClassProperties.cpp [38:95]
bool is_class_exported_via_uri(const DexClass* clazz) {
if (!clazz->get_anno_set()) {
return false;
}
auto dfa_annotation = marianatrench::constants::get_dfa_annotation();
auto private_schemes = marianatrench::constants::get_private_uri_schemes();
for (const auto& annotation : clazz->get_anno_set()->get_annotations()) {
if (!annotation->type() ||
annotation->type()->str() != dfa_annotation.type) {
continue;
}
for (const DexAnnotationElement& element : annotation->anno_elems()) {
if (element.string->str() != "value") {
continue;
}
auto* patterns =
dynamic_cast<DexEncodedValueArray*>(element.encoded_value.get());
mt_assert(patterns != nullptr);
for (auto& encoded_pattern : *patterns->evalues()) {
auto* pattern =
dynamic_cast<DexEncodedValueAnnotation*>(encoded_pattern.get());
mt_assert(pattern != nullptr);
if (!pattern->type() ||
pattern->type()->str() != dfa_annotation.pattern_type) {
continue;
}
std::string pattern_value = pattern->show();
// We only care about patterns that specify a scheme or a pattern
if (pattern_value.find("scheme") == std::string::npos &&
pattern_value.find("pattern") == std::string::npos) {
continue;
}
if (!std::any_of(
private_schemes.begin(),
private_schemes.end(),
[&](std::string scheme) {
return pattern_value.find(scheme) != std::string::npos;
})) {
LOG(2,
"Class {} has DFA annotations with a public URI scheme.",
clazz->get_name()->str());
return true;
}
}
}
}
return false;
}