hiddenapi: Support 'core-platform-api' flag
Add support for parsing @CorePlatformApi stubs and encoding it in
hiddenapi dex flags of the corresponding fields/methods.
(1) The CL refactors hiddenapi::ApiList class to store a second value:
a bit vector of "domain API" flags. These are intended for encoding
membership in a set of API stubs only available to certain callers,
e.g. @CorePlatformApi when platform code calls core platform or
@TestApi for CTS tests.
(2) Parse @CorePlatformApi stubs and set domain flags for its members.
(3) Parse the flags at runtime and set kAccCorePlatformApi access flag
on the corresponding ArtField/ArtMethod objects.
Bug: 119068555
Test: m appcompat
Test: dexlayout -b <core-oj jar> | grep 'CORE-PLATFORM-API'
Change-Id: Idbfa6d3af7459258a5a0b6da7c03c037a577eb75
diff --git a/runtime/hidden_api.cc b/runtime/hidden_api.cc
index 2d3493d..adcf6b3 100644
--- a/runtime/hidden_api.cc
+++ b/runtime/hidden_api.cc
@@ -267,9 +267,6 @@
}
}
-static constexpr uint32_t kNoDexFlags = 0u;
-static constexpr uint32_t kInvalidDexFlags = static_cast<uint32_t>(-1);
-
static ALWAYS_INLINE uint32_t GetMemberDexIndex(ArtField* field) {
return field->GetDexFieldIndex();
}
@@ -302,12 +299,10 @@
ClassAccessor::Field, ClassAccessor::Method>::type;
ObjPtr<mirror::Class> declaring_class = member->GetDeclaringClass();
- if (declaring_class.IsNull()) {
- return kNoDexFlags;
- }
+ DCHECK(!declaring_class.IsNull()) << "Attempting to access a runtime method";
- uint32_t flags = kInvalidDexFlags;
- DCHECK(!AreValidDexFlags(flags));
+ ApiList flags;
+ DCHECK(!flags.IsValid());
// Check if the declaring class has ClassExt allocated. If it does, check if
// the pre-JVMTI redefine dex file has been set to determine if the declaring
@@ -318,17 +313,15 @@
// Class is not redefined. Find the class def, iterate over its members and
// find the entry corresponding to this `member`.
const dex::ClassDef* class_def = declaring_class->GetClassDef();
- if (class_def == nullptr) {
- flags = kNoDexFlags;
- } else {
- uint32_t member_index = GetMemberDexIndex(member);
- auto fn_visit = [&](const AccessorType& dex_member) {
- if (dex_member.GetIndex() == member_index) {
- flags = dex_member.GetHiddenapiFlags();
- }
- };
- VisitMembers(declaring_class->GetDexFile(), *class_def, fn_visit);
- }
+ DCHECK(class_def != nullptr) << "Class def should always be set for initialized classes";
+
+ uint32_t member_index = GetMemberDexIndex(member);
+ auto fn_visit = [&](const AccessorType& dex_member) {
+ if (dex_member.GetIndex() == member_index) {
+ flags = ApiList(dex_member.GetHiddenapiFlags());
+ }
+ };
+ VisitMembers(declaring_class->GetDexFile(), *class_def, fn_visit);
} else {
// Class was redefined using JVMTI. We have a pointer to the original dex file
// and the class def index of this class in that dex file, but the field/method
@@ -344,16 +337,15 @@
MemberSignature cur_signature(dex_member);
if (member_signature.MemberNameAndTypeMatch(cur_signature)) {
DCHECK(member_signature.Equals(cur_signature));
- flags = dex_member.GetHiddenapiFlags();
+ flags = ApiList(dex_member.GetHiddenapiFlags());
}
};
VisitMembers(*original_dex, original_class_def, fn_visit);
}
- CHECK_NE(flags, kInvalidDexFlags) << "Could not find hiddenapi flags for "
+ CHECK(flags.IsValid()) << "Could not find hiddenapi flags for "
<< Dumpable<MemberSignature>(MemberSignature(member));
- DCHECK(AreValidDexFlags(flags));
- return flags;
+ return flags.GetDexFlags();
}
template<typename T>