summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2024-04-30 23:00:28 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2024-04-30 23:00:28 +0000
commit9c8e0eac59e55eb7ec0b1cff2d3507f23c54eaea (patch)
treea5cfd270a529a6d55fe2549c8d60b7dcdae24a0e
parent02d260d6eb050a09efec8ca3c887257aefc22948 (diff)
parent89e4ca0ccf8424c8f4ac170504c55f5ee767b95c (diff)
downloadart-9c8e0eac59e55eb7ec0b1cff2d3507f23c54eaea.tar.gz
Snap for 11785460 from 89e4ca0ccf8424c8f4ac170504c55f5ee767b95c to sdk-release
Change-Id: I07d4a007ed94e25b638652437c2871661b931b11
-rw-r--r--artd/README.md9
-rw-r--r--artd/artd.cc103
-rw-r--r--artd/artd_test.cc228
-rw-r--r--artd/binder/com/android/server/art/ArtifactsPath.aidl5
-rw-r--r--artd/binder/com/android/server/art/IArtd.aidl16
-rw-r--r--artd/binder/com/android/server/art/ProfilePath.aidl12
-rw-r--r--artd/file_utils.cc53
-rw-r--r--artd/file_utils.h20
-rw-r--r--artd/file_utils_test.cc57
-rw-r--r--artd/path_utils.cc79
-rw-r--r--artd/path_utils.h57
-rw-r--r--artd/path_utils_test.cc130
-rw-r--r--build/README.md23
-rw-r--r--build/boot/boot-image-profile.txt907
-rw-r--r--build/boot/preloaded-classes357
-rw-r--r--compiler/optimizing/code_generator.h6
-rw-r--r--compiler/optimizing/code_generator_arm64.cc70
-rw-r--r--compiler/optimizing/code_generator_arm_vixl.cc71
-rw-r--r--compiler/optimizing/code_generator_x86.cc95
-rw-r--r--compiler/optimizing/code_generator_x86_64.cc101
-rw-r--r--libartservice/service/java/com/android/server/art/AidlUtils.java63
-rw-r--r--libartservice/service/java/com/android/server/art/ArtFileManager.java14
-rw-r--r--libartservice/service/java/com/android/server/art/ArtManagerLocal.java19
-rw-r--r--libartservice/service/java/com/android/server/art/ArtShellCommand.java38
-rw-r--r--libartservice/service/java/com/android/server/art/BackgroundDexoptJobStatsReporter.java4
-rw-r--r--libartservice/service/java/com/android/server/art/DexUseManagerLocal.java19
-rw-r--r--libartservice/service/java/com/android/server/art/Dexopter.java34
-rw-r--r--libartservice/service/java/com/android/server/art/PreRebootDexoptJob.java8
-rw-r--r--libartservice/service/java/com/android/server/art/PrimaryDexUtils.java10
-rw-r--r--libartservice/service/java/com/android/server/art/PrimaryDexopter.java8
-rw-r--r--libartservice/service/java/com/android/server/art/ReasonMapping.java9
-rw-r--r--libartservice/service/java/com/android/server/art/SecondaryDexopter.java7
-rw-r--r--libartservice/service/java/com/android/server/art/Utils.java33
-rw-r--r--libartservice/service/java/com/android/server/art/prereboot/PreRebootDriver.java167
-rw-r--r--libartservice/service/java/com/android/server/art/prereboot/PreRebootGlobalInjector.java99
-rw-r--r--libartservice/service/java/com/android/server/art/prereboot/PreRebootManager.java63
-rw-r--r--libartservice/service/java/com/android/server/art/prereboot/PreRebootManagerInterface.java46
-rw-r--r--libartservice/service/javatests/com/android/server/art/ArtManagerLocalTest.java125
-rw-r--r--libartservice/service/javatests/com/android/server/art/DexUseManagerTest.java78
-rw-r--r--libartservice/service/javatests/com/android/server/art/PrimaryDexopterParameterizedTest.java52
-rw-r--r--libartservice/service/javatests/com/android/server/art/PrimaryDexopterTest.java67
-rw-r--r--libartservice/service/javatests/com/android/server/art/PrimaryDexopterTestBase.java1
-rw-r--r--libartservice/service/javatests/com/android/server/art/SecondaryDexopterTest.java20
-rw-r--r--libartservice/service/javatests/com/android/server/art/UtilsTest.java9
-rw-r--r--libartservice/service/proguard.flags3
-rw-r--r--oatdump/oatdump.cc19
-rw-r--r--openjdkjvmti/ti_redefine.cc3
-rw-r--r--runtime/art_method.cc26
-rw-r--r--runtime/art_method.h8
-rw-r--r--runtime/class_linker.cc13
-rw-r--r--runtime/gc/space/image_space.cc49
-rw-r--r--runtime/interpreter/mterp/nterp.cc5
-rw-r--r--runtime/jit/jit_code_cache.cc339
-rw-r--r--runtime/jit/jit_code_cache.h50
-rw-r--r--runtime/jit/jit_options.cc2
-rw-r--r--runtime/oat/oat_file.cc95
-rw-r--r--runtime/oat/oat_file.h26
-rw-r--r--runtime/runtime_image.cc4
-rw-r--r--runtime/trace.cc63
-rw-r--r--runtime/trace.h5
-rw-r--r--test/141-class-unload/src-ex/AbstractClass.java18
-rw-r--r--test/141-class-unload/src-ex/ConflictImpl2.java18
-rw-r--r--test/141-class-unload/src/Main.java51
-rw-r--r--test/667-jit-jni-stub/jit_jni_stub_test.cc8
-rw-r--r--test/667-jit-jni-stub/src/Main.java7
-rw-r--r--test/knownfailures.json6
66 files changed, 2913 insertions, 1297 deletions
diff --git a/artd/README.md b/artd/README.md
index a2dfc099e9..3a073c7b08 100644
--- a/artd/README.md
+++ b/artd/README.md
@@ -14,3 +14,12 @@ doesn't include options passed to dex2oat and other processes.
- `dalvik.vm.artd-verbose`: Log verbosity of the artd process. The syntax is the
same as the runtime's `-verbose` flag.
+
+### The `--pre-reboot` flag
+
+artd can be run in Pre-reboot mode through the `--pre-reboot` flag. The
+Pre-reboot mode is for generating outputs for Pre-reboot Dexopt. The flag does
+not change the actual behavior, but only affects the service name, the log tag,
+a few return checks, etc. Note that how artd addresses input files and output
+files is solely determined by AIDL arguments and is **not** affected by the
+`--pre-reboot` flag.
diff --git a/artd/artd.cc b/artd/artd.cc
index 04223d2eb4..6154c8207b 100644
--- a/artd/artd.cc
+++ b/artd/artd.cc
@@ -252,7 +252,8 @@ Result<void> PrepareArtifactsDirs(const OutputArtifacts& output_artifacts,
return {};
}
- std::filesystem::path oat_path(OR_RETURN(BuildOatPath(output_artifacts.artifactsPath)));
+ std::filesystem::path oat_path(
+ OR_RETURN(BuildArtifactsPath(output_artifacts.artifactsPath)).oat_path);
std::filesystem::path isa_dir = oat_path.parent_path();
std::filesystem::path oat_dir = isa_dir.parent_path();
DCHECK_EQ(oat_dir.filename(), "oat");
@@ -481,11 +482,33 @@ std::ostream& operator<<(std::ostream& os, const FdLogger& fd_logger) {
} // namespace
+#define RETURN_FATAL_IF_PRE_REBOOT(options) \
+ if (options.is_pre_reboot) { \
+ return Fatal("This method is not supported in Pre-reboot Dexopt mode"); \
+ }
+
#define RETURN_FATAL_IF_NOT_PRE_REBOOT(options) \
if (!options.is_pre_reboot) { \
return Fatal("This method is only supported in Pre-reboot Dexopt mode"); \
}
+#define RETURN_FATAL_IF_ARG_IS_PRE_REBOOT_IMPL(expected, arg, log_name) \
+ { \
+ auto&& __return_fatal_tmp = PreRebootFlag(arg); \
+ if (expected != __return_fatal_tmp) { \
+ return Fatal(ART_FORMAT("Expected flag 'isPreReboot' in argument '{}' to be {}, got {}", \
+ log_name, \
+ expected, \
+ __return_fatal_tmp)); \
+ } \
+ }
+
+#define RETURN_FATAL_IF_PRE_REBOOT_MISMATCH(options, arg, log_name) \
+ RETURN_FATAL_IF_ARG_IS_PRE_REBOOT_IMPL(options.is_pre_reboot, arg, log_name)
+
+#define RETURN_FATAL_IF_ARG_IS_PRE_REBOOT(arg, log_name) \
+ RETURN_FATAL_IF_ARG_IS_PRE_REBOOT_IMPL(false, arg, log_name)
+
Result<void> Restorecon(
const std::string& path,
const std::optional<OutputArtifacts::PermissionSettings::SeContext>& se_context,
@@ -514,12 +537,15 @@ ScopedAStatus Artd::isAlive(bool* _aidl_return) {
}
ScopedAStatus Artd::deleteArtifacts(const ArtifactsPath& in_artifactsPath, int64_t* _aidl_return) {
- std::string oat_path = OR_RETURN_FATAL(BuildOatPath(in_artifactsPath));
+ RETURN_FATAL_IF_PRE_REBOOT(options_);
+ RETURN_FATAL_IF_ARG_IS_PRE_REBOOT(in_artifactsPath, "artifactsPath");
+
+ RawArtifactsPath path = OR_RETURN_FATAL(BuildArtifactsPath(in_artifactsPath));
*_aidl_return = 0;
- *_aidl_return += GetSizeAndDeleteFile(oat_path);
- *_aidl_return += GetSizeAndDeleteFile(OatPathToVdexPath(oat_path));
- *_aidl_return += GetSizeAndDeleteFile(OatPathToArtPath(oat_path));
+ *_aidl_return += GetSizeAndDeleteFile(path.oat_path);
+ *_aidl_return += GetSizeAndDeleteFile(path.vdex_path);
+ *_aidl_return += GetSizeAndDeleteFile(path.art_path);
return ScopedAStatus::ok();
}
@@ -528,6 +554,8 @@ ScopedAStatus Artd::getDexoptStatus(const std::string& in_dexFile,
const std::string& in_instructionSet,
const std::optional<std::string>& in_classLoaderContext,
GetDexoptStatusResult* _aidl_return) {
+ RETURN_FATAL_IF_PRE_REBOOT(options_);
+
Result<OatFileAssistantContext*> ofa_context = GetOatFileAssistantContext();
if (!ofa_context.ok()) {
return NonFatal("Failed to get runtime options: " + ofa_context.error().message());
@@ -569,6 +597,8 @@ ScopedAStatus Artd::getDexoptStatus(const std::string& in_dexFile,
ndk::ScopedAStatus Artd::isProfileUsable(const ProfilePath& in_profile,
const std::string& in_dexFile,
bool* _aidl_return) {
+ RETURN_FATAL_IF_ARG_IS_PRE_REBOOT(in_profile, "profile");
+
std::string profile_path = OR_RETURN_FATAL(BuildProfileOrDmPath(in_profile));
OR_RETURN_FATAL(ValidateDexPath(in_dexFile));
@@ -621,6 +651,7 @@ ndk::ScopedAStatus Artd::CopyAndRewriteProfileImpl(File src,
OutputProfile* dst_aidl,
const std::string& dex_path,
CopyAndRewriteProfileResult* aidl_return) {
+ RETURN_FATAL_IF_PRE_REBOOT_MISMATCH(options_, *dst_aidl, "dst");
std::string dst_path = OR_RETURN_FATAL(BuildFinalProfilePath(dst_aidl->profilePath));
OR_RETURN_FATAL(ValidateDexPath(dex_path));
@@ -678,6 +709,8 @@ ndk::ScopedAStatus Artd::copyAndRewriteProfile(const ProfilePath& in_src,
OutputProfile* in_dst,
const std::string& in_dexFile,
CopyAndRewriteProfileResult* _aidl_return) {
+ RETURN_FATAL_IF_ARG_IS_PRE_REBOOT(in_src, "src");
+
std::string src_path = OR_RETURN_FATAL(BuildProfileOrDmPath(in_src));
Result<std::unique_ptr<File>> src = OpenFileForReading(src_path);
@@ -712,6 +745,7 @@ ndk::ScopedAStatus Artd::copyAndRewriteEmbeddedProfile(OutputProfile* in_dst,
}
ndk::ScopedAStatus Artd::commitTmpProfile(const TmpProfilePath& in_profile) {
+ RETURN_FATAL_IF_PRE_REBOOT_MISMATCH(options_, in_profile, "profile");
std::string tmp_profile_path = OR_RETURN_FATAL(BuildTmpProfilePath(in_profile));
std::string ref_profile_path = OR_RETURN_FATAL(BuildFinalProfilePath(in_profile));
@@ -726,6 +760,8 @@ ndk::ScopedAStatus Artd::commitTmpProfile(const TmpProfilePath& in_profile) {
}
ndk::ScopedAStatus Artd::deleteProfile(const ProfilePath& in_profile) {
+ RETURN_FATAL_IF_ARG_IS_PRE_REBOOT(in_profile, "profile");
+
std::string profile_path = OR_RETURN_FATAL(BuildProfileOrDmPath(in_profile));
std::error_code ec;
@@ -739,6 +775,7 @@ ndk::ScopedAStatus Artd::deleteProfile(const ProfilePath& in_profile) {
ndk::ScopedAStatus Artd::getProfileVisibility(const ProfilePath& in_profile,
FileVisibility* _aidl_return) {
+ RETURN_FATAL_IF_ARG_IS_PRE_REBOOT(in_profile, "profile");
std::string profile_path = OR_RETURN_FATAL(BuildProfileOrDmPath(in_profile));
*_aidl_return = OR_RETURN_NON_FATAL(GetFileVisibility(profile_path));
return ScopedAStatus::ok();
@@ -746,7 +783,8 @@ ndk::ScopedAStatus Artd::getProfileVisibility(const ProfilePath& in_profile,
ndk::ScopedAStatus Artd::getArtifactsVisibility(const ArtifactsPath& in_artifactsPath,
FileVisibility* _aidl_return) {
- std::string oat_path = OR_RETURN_FATAL(BuildOatPath(in_artifactsPath));
+ RETURN_FATAL_IF_ARG_IS_PRE_REBOOT(in_artifactsPath, "artifactsPath");
+ std::string oat_path = OR_RETURN_FATAL(BuildArtifactsPath(in_artifactsPath)).oat_path;
*_aidl_return = OR_RETURN_NON_FATAL(GetFileVisibility(oat_path));
return ScopedAStatus::ok();
}
@@ -773,12 +811,15 @@ ndk::ScopedAStatus Artd::mergeProfiles(const std::vector<ProfilePath>& in_profil
bool* _aidl_return) {
std::vector<std::string> profile_paths;
for (const ProfilePath& profile : in_profiles) {
+ RETURN_FATAL_IF_ARG_IS_PRE_REBOOT(profile, "profiles");
std::string profile_path = OR_RETURN_FATAL(BuildProfileOrDmPath(profile));
if (profile.getTag() == ProfilePath::dexMetadataPath) {
return Fatal(ART_FORMAT("Does not support DM file, got '{}'", profile_path));
}
profile_paths.push_back(std::move(profile_path));
}
+
+ RETURN_FATAL_IF_PRE_REBOOT_MISMATCH(options_, *in_outputProfile, "outputProfile");
std::string output_profile_path =
OR_RETURN_FATAL(BuildFinalProfilePath(in_outputProfile->profilePath));
for (const std::string& dex_file : in_dexFiles) {
@@ -826,6 +867,7 @@ ndk::ScopedAStatus Artd::mergeProfiles(const std::vector<ProfilePath>& in_profil
return Fatal(
"Reference profile must not be set when 'dumpOnly' or 'dumpClassesAndMethods' is set");
}
+ // `in_referenceProfile` can be either a Pre-reboot profile or an ordinary one.
std::string reference_profile_path =
OR_RETURN_FATAL(BuildProfileOrDmPath(*in_referenceProfile));
if (in_referenceProfile->getTag() == ProfilePath::dexMetadataPath) {
@@ -950,10 +992,11 @@ ndk::ScopedAStatus Artd::dexopt(
ArtdDexoptResult* _aidl_return) {
_aidl_return->cancelled = false;
- std::string oat_path = OR_RETURN_FATAL(BuildOatPath(in_outputArtifacts.artifactsPath));
- std::string vdex_path = OatPathToVdexPath(oat_path);
- std::string art_path = OatPathToArtPath(oat_path);
+ RETURN_FATAL_IF_PRE_REBOOT_MISMATCH(options_, in_outputArtifacts, "outputArtifacts");
+ RawArtifactsPath artifacts_path =
+ OR_RETURN_FATAL(BuildArtifactsPath(in_outputArtifacts.artifactsPath));
OR_RETURN_FATAL(ValidateDexPath(in_dexFile));
+ // `in_profile` can be either a Pre-reboot profile or an ordinary one.
std::optional<std::string> profile_path =
in_profile.has_value() ?
std::make_optional(OR_RETURN_FATAL(BuildProfileOrDmPath(in_profile.value()))) :
@@ -1018,12 +1061,13 @@ ndk::ScopedAStatus Artd::dexopt(
}
}
- std::unique_ptr<NewFile> oat_file = OR_RETURN_NON_FATAL(NewFile::Create(oat_path, fs_permission));
- args.Add("--oat-fd=%d", oat_file->Fd()).Add("--oat-location=%s", oat_path);
+ std::unique_ptr<NewFile> oat_file =
+ OR_RETURN_NON_FATAL(NewFile::Create(artifacts_path.oat_path, fs_permission));
+ args.Add("--oat-fd=%d", oat_file->Fd()).Add("--oat-location=%s", artifacts_path.oat_path);
fd_logger.Add(*oat_file);
std::unique_ptr<NewFile> vdex_file =
- OR_RETURN_NON_FATAL(NewFile::Create(vdex_path, fs_permission));
+ OR_RETURN_NON_FATAL(NewFile::Create(artifacts_path.vdex_path, fs_permission));
args.Add("--output-vdex-fd=%d", vdex_file->Fd());
fd_logger.Add(*vdex_file);
@@ -1032,18 +1076,18 @@ ndk::ScopedAStatus Artd::dexopt(
std::unique_ptr<NewFile> art_file = nullptr;
if (in_dexoptOptions.generateAppImage) {
- art_file = OR_RETURN_NON_FATAL(NewFile::Create(art_path, fs_permission));
+ art_file = OR_RETURN_NON_FATAL(NewFile::Create(artifacts_path.art_path, fs_permission));
args.Add("--app-image-fd=%d", art_file->Fd());
args.AddIfNonEmpty("--image-format=%s", props_->GetOrEmpty("dalvik.vm.appimageformat"));
fd_logger.Add(*art_file);
files_to_commit.push_back(art_file.get());
} else {
- files_to_delete.push_back(art_path);
+ files_to_delete.push_back(artifacts_path.art_path);
}
std::unique_ptr<NewFile> swap_file = nullptr;
if (ShouldCreateSwapFileForDexopt()) {
- std::string swap_file_path = ART_FORMAT("{}.swap", oat_path);
+ std::string swap_file_path = ART_FORMAT("{}.swap", artifacts_path.oat_path);
swap_file =
OR_RETURN_NON_FATAL(NewFile::Create(swap_file_path, FsPermission{.uid = -1, .gid = -1}));
args.Add("--swap-fd=%d", swap_file->Fd());
@@ -1070,6 +1114,7 @@ ndk::ScopedAStatus Artd::dexopt(
std::unique_ptr<File> input_vdex_file = nullptr;
if (in_inputVdex.has_value()) {
+ RETURN_FATAL_IF_ARG_IS_PRE_REBOOT(in_inputVdex.value(), "inputVdex");
std::string input_vdex_path = OR_RETURN_FATAL(BuildVdexPath(in_inputVdex.value()));
input_vdex_file = OR_RETURN_NON_FATAL(OpenFileForReading(input_vdex_path));
args.Add("--input-vdex-fd=%d", input_vdex_file->Fd());
@@ -1204,17 +1249,21 @@ ScopedAStatus Artd::cleanup(const std::vector<ProfilePath>& in_profilesToKeep,
const std::vector<VdexPath>& in_vdexFilesToKeep,
const std::vector<RuntimeArtifactsPath>& in_runtimeArtifactsToKeep,
int64_t* _aidl_return) {
+ RETURN_FATAL_IF_PRE_REBOOT(options_);
std::unordered_set<std::string> files_to_keep;
for (const ProfilePath& profile : in_profilesToKeep) {
+ RETURN_FATAL_IF_ARG_IS_PRE_REBOOT(profile, "profilesToKeep");
files_to_keep.insert(OR_RETURN_FATAL(BuildProfileOrDmPath(profile)));
}
for (const ArtifactsPath& artifacts : in_artifactsToKeep) {
- std::string oat_path = OR_RETURN_FATAL(BuildOatPath(artifacts));
- files_to_keep.insert(OatPathToVdexPath(oat_path));
- files_to_keep.insert(OatPathToArtPath(oat_path));
- files_to_keep.insert(std::move(oat_path));
+ RETURN_FATAL_IF_ARG_IS_PRE_REBOOT(artifacts, "artifactsToKeep");
+ RawArtifactsPath path = OR_RETURN_FATAL(BuildArtifactsPath(artifacts));
+ files_to_keep.insert(std::move(path.oat_path));
+ files_to_keep.insert(std::move(path.vdex_path));
+ files_to_keep.insert(std::move(path.art_path));
}
for (const VdexPath& vdex : in_vdexFilesToKeep) {
+ RETURN_FATAL_IF_ARG_IS_PRE_REBOOT(vdex, "vdexFilesToKeep");
files_to_keep.insert(OR_RETURN_FATAL(BuildVdexPath(vdex)));
}
std::string android_data = OR_RETURN_NON_FATAL(GetAndroidDataOrError());
@@ -1268,6 +1317,7 @@ ScopedAStatus Artd::isInDalvikCache(const std::string& in_dexFile, bool* _aidl_r
ScopedAStatus Artd::deleteRuntimeArtifacts(const RuntimeArtifactsPath& in_runtimeArtifactsPath,
int64_t* _aidl_return) {
+ RETURN_FATAL_IF_PRE_REBOOT(options_);
OR_RETURN_FATAL(ValidateRuntimeArtifactsPath(in_runtimeArtifactsPath));
*_aidl_return = 0;
std::string android_data = OR_LOG_AND_RETURN_OK(GetAndroidDataOrError());
@@ -1280,15 +1330,19 @@ ScopedAStatus Artd::deleteRuntimeArtifacts(const RuntimeArtifactsPath& in_runtim
}
ScopedAStatus Artd::getArtifactsSize(const ArtifactsPath& in_artifactsPath, int64_t* _aidl_return) {
- std::string oat_path = OR_RETURN_FATAL(BuildOatPath(in_artifactsPath));
+ RETURN_FATAL_IF_PRE_REBOOT(options_);
+ RETURN_FATAL_IF_ARG_IS_PRE_REBOOT(in_artifactsPath, "artifactsPath");
+ RawArtifactsPath path = OR_RETURN_FATAL(BuildArtifactsPath(in_artifactsPath));
*_aidl_return = 0;
- *_aidl_return += GetSize(oat_path).value_or(0);
- *_aidl_return += GetSize(OatPathToVdexPath(oat_path)).value_or(0);
- *_aidl_return += GetSize(OatPathToArtPath(oat_path)).value_or(0);
+ *_aidl_return += GetSize(path.oat_path).value_or(0);
+ *_aidl_return += GetSize(path.vdex_path).value_or(0);
+ *_aidl_return += GetSize(path.art_path).value_or(0);
return ScopedAStatus::ok();
}
ScopedAStatus Artd::getVdexFileSize(const VdexPath& in_vdexPath, int64_t* _aidl_return) {
+ RETURN_FATAL_IF_PRE_REBOOT(options_);
+ RETURN_FATAL_IF_ARG_IS_PRE_REBOOT(in_vdexPath, "vdexPath");
std::string vdex_path = OR_RETURN_FATAL(BuildVdexPath(in_vdexPath));
*_aidl_return = GetSize(vdex_path).value_or(0);
return ScopedAStatus::ok();
@@ -1296,6 +1350,7 @@ ScopedAStatus Artd::getVdexFileSize(const VdexPath& in_vdexPath, int64_t* _aidl_
ScopedAStatus Artd::getRuntimeArtifactsSize(const RuntimeArtifactsPath& in_runtimeArtifactsPath,
int64_t* _aidl_return) {
+ RETURN_FATAL_IF_PRE_REBOOT(options_);
OR_RETURN_FATAL(ValidateRuntimeArtifactsPath(in_runtimeArtifactsPath));
*_aidl_return = 0;
std::string android_data = OR_LOG_AND_RETURN_OK(GetAndroidDataOrError());
@@ -1308,6 +1363,8 @@ ScopedAStatus Artd::getRuntimeArtifactsSize(const RuntimeArtifactsPath& in_runti
}
ScopedAStatus Artd::getProfileSize(const ProfilePath& in_profile, int64_t* _aidl_return) {
+ RETURN_FATAL_IF_PRE_REBOOT(options_);
+ RETURN_FATAL_IF_ARG_IS_PRE_REBOOT(in_profile, "profile");
std::string profile_path = OR_RETURN_FATAL(BuildProfileOrDmPath(in_profile));
*_aidl_return = GetSize(profile_path).value_or(0);
return ScopedAStatus::ok();
diff --git a/artd/artd_test.cc b/artd/artd_test.cc
index 7c3f1bc803..fccf091464 100644
--- a/artd/artd_test.cc
+++ b/artd/artd_test.cc
@@ -129,6 +129,7 @@ using ::testing::WithArg;
using PrimaryCurProfilePath = ProfilePath::PrimaryCurProfilePath;
using PrimaryRefProfilePath = ProfilePath::PrimaryRefProfilePath;
using TmpProfilePath = ProfilePath::TmpProfilePath;
+using WritableProfilePath = ProfilePath::WritableProfilePath;
using std::literals::operator""s; // NOLINT
@@ -392,7 +393,8 @@ class ArtdTest : public CommonArtTest {
compiler_filter_ = "speed";
tmp_profile_path_ =
TmpProfilePath{.finalPath = PrimaryRefProfilePath{.packageName = "com.android.foo",
- .profileName = "primary"},
+ .profileName = "primary",
+ .isPreReboot = false},
.id = "12345"};
profile_path_ = tmp_profile_path_;
vdex_path_ = artifacts_path_;
@@ -447,7 +449,7 @@ class ArtdTest : public CommonArtTest {
std::pair<std::conditional_t<kExpectOk, CopyAndRewriteProfileResult, ndk::ScopedAStatus>,
OutputProfile>>;
- // Runs `copyAndRewriteProfile` with `tmp_profile_path_` and `dex_file_`.
+ // Runs `copyAndRewriteProfile` with `profile_path_` and `dex_file_`.
template <bool kExpectOk = true>
RunCopyAndRewriteProfileResult<kExpectOk> RunCopyAndRewriteProfile() {
OutputProfile dst{.profilePath = tmp_profile_path_,
@@ -457,7 +459,7 @@ class ArtdTest : public CommonArtTest {
CopyAndRewriteProfileResult result;
ndk::ScopedAStatus status =
- artd_->copyAndRewriteProfile(tmp_profile_path_, &dst, dex_file_, &result);
+ artd_->copyAndRewriteProfile(profile_path_.value(), &dst, dex_file_, &result);
if constexpr (kExpectOk) {
if (!status.isOk()) {
return Error() << status.getMessage();
@@ -568,10 +570,10 @@ class ArtdTest : public CommonArtTest {
}
// Files to be replaced.
- std::string oat_path = OR_FATAL(BuildOatPath(artifacts_path_));
- CreateFile(oat_path, "old_oat");
- CreateFile(OatPathToVdexPath(oat_path), "old_vdex");
- CreateFile(OatPathToArtPath(oat_path), "old_art");
+ RawArtifactsPath artifacts_path = OR_FATAL(BuildArtifactsPath(artifacts_path_));
+ CreateFile(artifacts_path.oat_path, "old_oat");
+ CreateFile(artifacts_path.vdex_path, "old_vdex");
+ CreateFile(artifacts_path.art_path, "old_art");
}
};
@@ -1389,7 +1391,7 @@ TEST_F(ArtdTest, isProfileUsableFailed) {
}
TEST_F(ArtdTest, copyAndRewriteProfileSuccess) {
- std::string src_file = OR_FATAL(BuildTmpProfilePath(tmp_profile_path_));
+ std::string src_file = OR_FATAL(BuildProfileOrDmPath(profile_path_.value()));
CreateFile(src_file, "valid_profile");
CreateFile(dex_file_);
@@ -1421,7 +1423,7 @@ TEST_F(ArtdTest, copyAndRewriteProfileSuccess) {
// The input is a plain profile file in the wrong format.
TEST_F(ArtdTest, copyAndRewriteProfileBadProfileWrongFormat) {
- std::string src_file = OR_FATAL(BuildTmpProfilePath(tmp_profile_path_));
+ std::string src_file = OR_FATAL(BuildProfileOrDmPath(profile_path_.value()));
CreateFile(src_file, "wrong_format");
CreateFile(dex_file_);
@@ -1440,7 +1442,7 @@ TEST_F(ArtdTest, copyAndRewriteProfileBadProfileWrongFormat) {
// The input is a plain profile file that doesn't match the APK.
TEST_F(ArtdTest, copyAndRewriteProfileBadProfileNoMatch) {
- std::string src_file = OR_FATAL(BuildTmpProfilePath(tmp_profile_path_));
+ std::string src_file = OR_FATAL(BuildProfileOrDmPath(profile_path_.value()));
CreateFile(src_file, "no_match");
CreateFile(dex_file_);
@@ -1458,7 +1460,7 @@ TEST_F(ArtdTest, copyAndRewriteProfileBadProfileNoMatch) {
// The input is a plain profile file that is empty.
TEST_F(ArtdTest, copyAndRewriteProfileNoProfileEmpty) {
- std::string src_file = OR_FATAL(BuildTmpProfilePath(tmp_profile_path_));
+ std::string src_file = OR_FATAL(BuildProfileOrDmPath(profile_path_.value()));
CreateFile(src_file, "");
CreateFile(dex_file_);
@@ -1486,7 +1488,7 @@ TEST_F(ArtdTest, copyAndRewriteProfileNoProfileNoFile) {
// The input is a dm file with a profile entry in the wrong format.
TEST_F(ArtdTest, copyAndRewriteProfileNoProfileDmWrongFormat) {
- std::string src_file = OR_FATAL(BuildTmpProfilePath(tmp_profile_path_));
+ std::string src_file = OR_FATAL(BuildProfileOrDmPath(profile_path_.value()));
CreateZipWithSingleEntry(src_file, "primary.prof", "wrong_format");
CreateFile(dex_file_);
@@ -1505,7 +1507,7 @@ TEST_F(ArtdTest, copyAndRewriteProfileNoProfileDmWrongFormat) {
// The input is a dm file with a profile entry that doesn't match the APK.
TEST_F(ArtdTest, copyAndRewriteProfileNoProfileDmNoMatch) {
- std::string src_file = OR_FATAL(BuildTmpProfilePath(tmp_profile_path_));
+ std::string src_file = OR_FATAL(BuildProfileOrDmPath(profile_path_.value()));
CreateZipWithSingleEntry(src_file, "primary.prof", "no_match");
CreateFile(dex_file_);
@@ -1523,7 +1525,7 @@ TEST_F(ArtdTest, copyAndRewriteProfileNoProfileDmNoMatch) {
// The input is a dm file with a profile entry that is empty.
TEST_F(ArtdTest, copyAndRewriteProfileNoProfileDmEmpty) {
- std::string src_file = OR_FATAL(BuildTmpProfilePath(tmp_profile_path_));
+ std::string src_file = OR_FATAL(BuildProfileOrDmPath(profile_path_.value()));
CreateZipWithSingleEntry(src_file, "primary.prof");
CreateFile(dex_file_);
@@ -1540,7 +1542,7 @@ TEST_F(ArtdTest, copyAndRewriteProfileNoProfileDmEmpty) {
// The input is a dm file without a profile entry.
TEST_F(ArtdTest, copyAndRewriteProfileNoProfileDmNoEntry) {
- std::string src_file = OR_FATAL(BuildTmpProfilePath(tmp_profile_path_));
+ std::string src_file = OR_FATAL(BuildProfileOrDmPath(profile_path_.value()));
CreateZipWithSingleEntry(src_file, "primary.vdex");
CreateFile(dex_file_);
@@ -1556,7 +1558,7 @@ TEST_F(ArtdTest, copyAndRewriteProfileNoProfileDmNoEntry) {
}
TEST_F(ArtdTest, copyAndRewriteProfileException) {
- std::string src_file = OR_FATAL(BuildTmpProfilePath(tmp_profile_path_));
+ std::string src_file = OR_FATAL(BuildProfileOrDmPath(profile_path_.value()));
CreateFile(src_file, "valid_profile");
CreateFile(dex_file_);
@@ -1780,13 +1782,15 @@ TEST_F(ArtdGetVisibilityTest, getProfileVisibilityPermissionDenied) {
}
TEST_F(ArtdGetVisibilityTest, getArtifactsVisibilityOtherReadable) {
- TestGetVisibilityOtherReadable(
- &Artd::getArtifactsVisibility, artifacts_path_, OR_FATAL(BuildOatPath(artifacts_path_)));
+ TestGetVisibilityOtherReadable(&Artd::getArtifactsVisibility,
+ artifacts_path_,
+ OR_FATAL(BuildArtifactsPath(artifacts_path_)).oat_path);
}
TEST_F(ArtdGetVisibilityTest, getArtifactsVisibilityNotOtherReadable) {
- TestGetVisibilityNotOtherReadable(
- &Artd::getArtifactsVisibility, artifacts_path_, OR_FATAL(BuildOatPath(artifacts_path_)));
+ TestGetVisibilityNotOtherReadable(&Artd::getArtifactsVisibility,
+ artifacts_path_,
+ OR_FATAL(BuildArtifactsPath(artifacts_path_)).oat_path);
}
TEST_F(ArtdGetVisibilityTest, getArtifactsVisibilityNotFound) {
@@ -1794,8 +1798,9 @@ TEST_F(ArtdGetVisibilityTest, getArtifactsVisibilityNotFound) {
}
TEST_F(ArtdGetVisibilityTest, getArtifactsVisibilityPermissionDenied) {
- TestGetVisibilityPermissionDenied(
- &Artd::getArtifactsVisibility, artifacts_path_, OR_FATAL(BuildOatPath(artifacts_path_)));
+ TestGetVisibilityPermissionDenied(&Artd::getArtifactsVisibility,
+ artifacts_path_,
+ OR_FATAL(BuildArtifactsPath(artifacts_path_)).oat_path);
}
TEST_F(ArtdGetVisibilityTest, getDexFileVisibilityOtherReadable) {
@@ -1837,8 +1842,7 @@ TEST_F(ArtdGetVisibilityTest, getDmFileVisibilityPermissionDenied) {
}
TEST_F(ArtdTest, mergeProfiles) {
- const TmpProfilePath& reference_profile_path = tmp_profile_path_;
- std::string reference_profile_file = OR_FATAL(BuildTmpProfilePath(reference_profile_path));
+ std::string reference_profile_file = OR_FATAL(BuildProfileOrDmPath(profile_path_.value()));
CreateFile(reference_profile_file, "abc");
// Doesn't exist.
@@ -1851,7 +1855,7 @@ TEST_F(ArtdTest, mergeProfiles) {
std::string profile_1_file = OR_FATAL(BuildPrimaryCurProfilePath(profile_1_path));
CreateFile(profile_1_file, "def");
- OutputProfile output_profile{.profilePath = reference_profile_path,
+ OutputProfile output_profile{.profilePath = tmp_profile_path_,
.fsPermission = FsPermission{.uid = -1, .gid = -1}};
output_profile.profilePath.id = "";
output_profile.profilePath.tmpPath = "";
@@ -1884,7 +1888,7 @@ TEST_F(ArtdTest, mergeProfiles) {
bool result;
EXPECT_TRUE(artd_
->mergeProfiles({profile_0_path, profile_1_path},
- reference_profile_path,
+ profile_path_,
&output_profile,
{dex_file_1, dex_file_2},
/*in_options=*/{},
@@ -1939,10 +1943,6 @@ TEST_F(ArtdTest, mergeProfilesEmptyReferenceProfile) {
}
TEST_F(ArtdTest, mergeProfilesProfilesDontExist) {
- const TmpProfilePath& reference_profile_path = tmp_profile_path_;
- std::string reference_profile_file = OR_FATAL(BuildTmpProfilePath(reference_profile_path));
- CreateFile(reference_profile_file, "abc");
-
// Doesn't exist.
PrimaryCurProfilePath profile_0_path{
.userId = 0, .packageName = "com.android.foo", .profileName = "primary"};
@@ -1953,7 +1953,7 @@ TEST_F(ArtdTest, mergeProfilesProfilesDontExist) {
.userId = 1, .packageName = "com.android.foo", .profileName = "primary"};
std::string profile_1_file = OR_FATAL(BuildPrimaryCurProfilePath(profile_1_path));
- OutputProfile output_profile{.profilePath = reference_profile_path,
+ OutputProfile output_profile{.profilePath = tmp_profile_path_,
.fsPermission = FsPermission{.uid = -1, .gid = -1}};
output_profile.profilePath.id = "";
output_profile.profilePath.tmpPath = "";
@@ -1965,7 +1965,7 @@ TEST_F(ArtdTest, mergeProfilesProfilesDontExist) {
bool result;
EXPECT_TRUE(artd_
->mergeProfiles({profile_0_path},
- std::nullopt,
+ /*in_referenceProfile=*/std::nullopt,
&output_profile,
{dex_file_},
/*in_options=*/{},
@@ -2479,6 +2479,9 @@ class ArtdPreRebootTest : public ArtdTest {
)";
ASSERT_TRUE(WriteStringToFile(ART_FORMAT(kInitEnvironRcTmpl, art_root_, android_data_),
init_environ_rc_path_));
+
+ tmp_profile_path_.finalPath.get<WritableProfilePath::forPrimary>().isPreReboot = true;
+ output_artifacts_.artifactsPath.isPreReboot = true;
}
std::string pre_reboot_tmp_dir_;
@@ -2599,6 +2602,167 @@ TEST_F(ArtdPreRebootTest, preRebootInitNoRetry) {
"preRebootInit must not be concurrently called or retried after failure");
}
+TEST_F(ArtdPreRebootTest, dexopt) {
+ std::string profile_file = OR_FATAL(BuildProfileOrDmPath(profile_path_.value()));
+
+ dexopt_options_.generateAppImage = true;
+
+ EXPECT_CALL(
+ *mock_exec_utils_,
+ DoExecAndReturnCode(
+ WhenSplitBy("--", _, Contains(Flag("--profile-file-fd=", FdOf(profile_file)))), _, _))
+ .WillOnce(DoAll(WithArg<0>(WriteToFdFlag("--oat-fd=", "oat")),
+ WithArg<0>(WriteToFdFlag("--output-vdex-fd=", "vdex")),
+ WithArg<0>(WriteToFdFlag("--app-image-fd=", "art")),
+ Return(0)));
+ RunDexopt();
+
+ CheckContent(scratch_path_ + "/a/oat/arm64/b.odex.staged", "oat");
+ CheckContent(scratch_path_ + "/a/oat/arm64/b.vdex.staged", "vdex");
+ CheckContent(scratch_path_ + "/a/oat/arm64/b.art.staged", "art");
+}
+
+TEST_F(ArtdPreRebootTest, dexoptPreRebootProfile) {
+ profile_path_->get<ProfilePath::tmpProfilePath>()
+ .finalPath.get<WritableProfilePath::forPrimary>()
+ .isPreReboot = true;
+ std::string profile_file = OR_FATAL(BuildProfileOrDmPath(profile_path_.value()));
+
+ dexopt_options_.generateAppImage = true;
+
+ EXPECT_CALL(
+ *mock_exec_utils_,
+ DoExecAndReturnCode(
+ WhenSplitBy("--", _, Contains(Flag("--profile-file-fd=", FdOf(profile_file)))), _, _))
+ .WillOnce(DoAll(WithArg<0>(WriteToFdFlag("--oat-fd=", "oat")),
+ WithArg<0>(WriteToFdFlag("--output-vdex-fd=", "vdex")),
+ WithArg<0>(WriteToFdFlag("--app-image-fd=", "art")),
+ Return(0)));
+ RunDexopt();
+
+ CheckContent(scratch_path_ + "/a/oat/arm64/b.odex.staged", "oat");
+ CheckContent(scratch_path_ + "/a/oat/arm64/b.vdex.staged", "vdex");
+ CheckContent(scratch_path_ + "/a/oat/arm64/b.art.staged", "art");
+}
+
+TEST_F(ArtdPreRebootTest, copyAndRewriteProfile) {
+ std::string src_file = OR_FATAL(BuildProfileOrDmPath(profile_path_.value()));
+ CreateFile(src_file, "valid_profile");
+
+ CreateFile(dex_file_);
+
+ EXPECT_CALL(*mock_exec_utils_, DoExecAndReturnCode)
+ .WillOnce(DoAll(WithArg<0>(WriteToFdFlag("--reference-profile-file-fd=", "def")),
+ Return(ProfmanResult::kCopyAndUpdateSuccess)));
+
+ auto [result, dst] = OR_FAIL(RunCopyAndRewriteProfile());
+
+ EXPECT_EQ(result.status, CopyAndRewriteProfileResult::Status::SUCCESS);
+ EXPECT_THAT(dst.profilePath.tmpPath, ContainsRegex(R"re(/primary\.prof\.staged\.\w+\.tmp$)re"));
+ CheckContent(dst.profilePath.tmpPath, "def");
+}
+
+TEST_F(ArtdPreRebootTest, copyAndRewriteEmbeddedProfile) {
+ CreateZipWithSingleEntry(dex_file_, "assets/art-profile/baseline.prof", "valid_profile");
+
+ EXPECT_CALL(*mock_exec_utils_, DoExecAndReturnCode)
+ .WillOnce(DoAll(WithArg<0>(WriteToFdFlag("--reference-profile-file-fd=", "def")),
+ Return(ProfmanResult::kCopyAndUpdateSuccess)));
+
+ auto [result, dst] = OR_FAIL(RunCopyAndRewriteEmbeddedProfile());
+
+ EXPECT_EQ(result.status, CopyAndRewriteProfileResult::Status::SUCCESS);
+ EXPECT_THAT(dst.profilePath.tmpPath, ContainsRegex(R"re(/primary\.prof\.staged\.\w+\.tmp$)re"));
+ CheckContent(dst.profilePath.tmpPath, "def");
+}
+
+TEST_F(ArtdPreRebootTest, mergeProfiles) {
+ std::string reference_profile_file = OR_FATAL(BuildProfileOrDmPath(profile_path_.value()));
+ CreateFile(reference_profile_file, "abc");
+
+ PrimaryCurProfilePath profile_1_path{
+ .userId = 1, .packageName = "com.android.foo", .profileName = "primary"};
+ std::string profile_1_file = OR_FATAL(BuildPrimaryCurProfilePath(profile_1_path));
+ CreateFile(profile_1_file, "def");
+
+ OutputProfile output_profile{.profilePath = tmp_profile_path_,
+ .fsPermission = FsPermission{.uid = -1, .gid = -1}};
+ output_profile.profilePath.id = "";
+ output_profile.profilePath.tmpPath = "";
+
+ std::string dex_file_1 = scratch_path_ + "/a/b.apk";
+ CreateFile(dex_file_1);
+
+ EXPECT_CALL(
+ *mock_exec_utils_,
+ DoExecAndReturnCode(
+ WhenSplitBy("--",
+ _,
+ AllOf(Contains(Flag("--reference-profile-file-fd=", FdHasContent("abc"))),
+ Contains(Flag("--profile-file-fd=", FdHasContent("def"))))),
+ _,
+ _))
+ .WillOnce(DoAll(WithArg<0>(ClearAndWriteToFdFlag("--reference-profile-file-fd=", "merged")),
+ Return(ProfmanResult::kCompile)));
+
+ bool result;
+ ASSERT_STATUS_OK(artd_->mergeProfiles({profile_1_path},
+ profile_path_,
+ &output_profile,
+ {dex_file_1},
+ /*in_options=*/{},
+ &result));
+ EXPECT_TRUE(result);
+ EXPECT_THAT(output_profile.profilePath.tmpPath,
+ ContainsRegex(R"re(/primary\.prof\.staged\.\w+\.tmp$)re"));
+ CheckContent(output_profile.profilePath.tmpPath, "merged");
+}
+
+TEST_F(ArtdPreRebootTest, mergeProfilesPreRebootReference) {
+ profile_path_->get<ProfilePath::tmpProfilePath>()
+ .finalPath.get<WritableProfilePath::forPrimary>()
+ .isPreReboot = true;
+ std::string reference_profile_file = OR_FATAL(BuildProfileOrDmPath(profile_path_.value()));
+ CreateFile(reference_profile_file, "abc");
+
+ PrimaryCurProfilePath profile_1_path{
+ .userId = 1, .packageName = "com.android.foo", .profileName = "primary"};
+ std::string profile_1_file = OR_FATAL(BuildPrimaryCurProfilePath(profile_1_path));
+ CreateFile(profile_1_file, "def");
+
+ OutputProfile output_profile{.profilePath = tmp_profile_path_,
+ .fsPermission = FsPermission{.uid = -1, .gid = -1}};
+ output_profile.profilePath.id = "";
+ output_profile.profilePath.tmpPath = "";
+
+ std::string dex_file_1 = scratch_path_ + "/a/b.apk";
+ CreateFile(dex_file_1);
+
+ EXPECT_CALL(
+ *mock_exec_utils_,
+ DoExecAndReturnCode(
+ WhenSplitBy("--",
+ _,
+ AllOf(Contains(Flag("--reference-profile-file-fd=", FdHasContent("abc"))),
+ Contains(Flag("--profile-file-fd=", FdHasContent("def"))))),
+ _,
+ _))
+ .WillOnce(DoAll(WithArg<0>(ClearAndWriteToFdFlag("--reference-profile-file-fd=", "merged")),
+ Return(ProfmanResult::kCompile)));
+
+ bool result;
+ ASSERT_STATUS_OK(artd_->mergeProfiles({profile_1_path},
+ profile_path_,
+ &output_profile,
+ {dex_file_1},
+ /*in_options=*/{},
+ &result));
+ EXPECT_TRUE(result);
+ EXPECT_THAT(output_profile.profilePath.tmpPath,
+ ContainsRegex(R"re(/primary\.prof\.staged\.\w+\.tmp$)re"));
+ CheckContent(output_profile.profilePath.tmpPath, "merged");
+}
+
} // namespace
} // namespace artd
} // namespace art
diff --git a/artd/binder/com/android/server/art/ArtifactsPath.aidl b/artd/binder/com/android/server/art/ArtifactsPath.aidl
index 3122f0f6b9..e1b1906263 100644
--- a/artd/binder/com/android/server/art/ArtifactsPath.aidl
+++ b/artd/binder/com/android/server/art/ArtifactsPath.aidl
@@ -28,4 +28,9 @@ parcelable ArtifactsPath {
@utf8InCpp String isa;
/** Whether the dexopt artifacts are in the dalvik-cache folder. */
boolean isInDalvikCache;
+ /**
+ * Whether the dexopt artifacts are for Pre-reboot Dexopt. For now, this is always `false` for
+ * inputs because we never take Pre-reboot artifacts as inputs.
+ */
+ boolean isPreReboot;
}
diff --git a/artd/binder/com/android/server/art/IArtd.aidl b/artd/binder/com/android/server/art/IArtd.aidl
index 4273d85515..7f0bc5690c 100644
--- a/artd/binder/com/android/server/art/IArtd.aidl
+++ b/artd/binder/com/android/server/art/IArtd.aidl
@@ -27,6 +27,8 @@ interface IArtd {
* Note that this method doesn't delete runtime artifacts. To delete them, call
* `deleteRuntimeArtifacts`.
*
+ * Not supported in Pre-reboot Dexopt mode.
+ *
* Throws fatal errors. Logs and ignores non-fatal errors.
*/
long deleteArtifacts(in com.android.server.art.ArtifactsPath artifactsPath);
@@ -34,6 +36,8 @@ interface IArtd {
/**
* Returns the dexopt status of a dex file.
*
+ * Not supported in Pre-reboot Dexopt mode.
+ *
* Throws fatal and non-fatal errors.
*/
com.android.server.art.GetDexoptStatusResult getDexoptStatus(
@@ -177,6 +181,8 @@ interface IArtd {
* kept. For each entry in `vdexFilesToKeep`, only the VDEX file will be kept. Note that VDEX
* files included in `artifactsToKeep` don't have to be listed in `vdexFilesToKeep`.
*
+ * Not supported in Pre-reboot Dexopt mode.
+ *
* Throws fatal errors. Logs and ignores non-fatal errors.
*/
long cleanup(in List<com.android.server.art.ProfilePath> profilesToKeep,
@@ -195,6 +201,8 @@ interface IArtd {
/**
* Deletes runtime artifacts and returns the released space, in bytes.
*
+ * Not supported in Pre-reboot Dexopt mode.
+ *
* Throws fatal errors. Logs and ignores non-fatal errors.
*/
long deleteRuntimeArtifacts(
@@ -204,6 +212,8 @@ interface IArtd {
* Returns the size of the dexopt artifacts, in bytes, or 0 if they don't exist or a non-fatal
* error occurred.
*
+ * Not supported in Pre-reboot Dexopt mode.
+ *
* Throws fatal errors. Logs and ignores non-fatal errors.
*/
long getArtifactsSize(in com.android.server.art.ArtifactsPath artifactsPath);
@@ -212,6 +222,8 @@ interface IArtd {
* Returns the size of the vdex file, in bytes, or 0 if it doesn't exist or a non-fatal error
* occurred.
*
+ * Not supported in Pre-reboot Dexopt mode.
+ *
* Throws fatal errors. Logs and ignores non-fatal errors.
*/
long getVdexFileSize(in com.android.server.art.VdexPath vdexPath);
@@ -220,6 +232,8 @@ interface IArtd {
* Returns the size of the runtime artifacts, in bytes, or 0 if they don't exist or a non-fatal
* error occurred.
*
+ * Not supported in Pre-reboot Dexopt mode.
+ *
* Throws fatal errors. Logs and ignores non-fatal errors.
*/
long getRuntimeArtifactsSize(
@@ -231,6 +245,8 @@ interface IArtd {
*
* Operates on the whole DM file if given one.
*
+ * Not supported in Pre-reboot Dexopt mode.
+ *
* Throws fatal errors. Logs and ignores non-fatal errors.
*/
long getProfileSize(in com.android.server.art.ProfilePath profile);
diff --git a/artd/binder/com/android/server/art/ProfilePath.aidl b/artd/binder/com/android/server/art/ProfilePath.aidl
index 43df531d89..d0bbcf2be0 100644
--- a/artd/binder/com/android/server/art/ProfilePath.aidl
+++ b/artd/binder/com/android/server/art/ProfilePath.aidl
@@ -38,6 +38,12 @@ union ProfilePath {
@utf8InCpp String packageName;
/** The stem of the profile file */
@utf8InCpp String profileName;
+ /**
+ * Whether the profile is for Pre-reboot Dexopt. For now, this is `false` for inputs, unless
+ * the data structure refers to a temporary profile, as an argument of `mergeProfiles` or
+ * `dexopt`, in the Pre-reboot Dexopt mode.
+ */
+ boolean isPreReboot;
}
/**
@@ -70,6 +76,12 @@ union ProfilePath {
* `{/data,/mnt/expand/<volume-uuid>}/{user,user_de}/<user-id>/<package-name>/...`.
*/
@utf8InCpp String dexPath;
+ /**
+ * Whether the profile is for Pre-reboot Dexopt. For now, this is `false` for inputs, unless
+ * the data structure refers to a temporary profile, as an argument of `mergeProfiles` or
+ * `dexopt`, in the Pre-reboot Dexopt mode.
+ */
+ boolean isPreReboot;
}
/** Represents a current profile of a secondary dex file. */
diff --git a/artd/file_utils.cc b/artd/file_utils.cc
index f3558534ba..1415efbdb3 100644
--- a/artd/file_utils.cc
+++ b/artd/file_utils.cc
@@ -26,6 +26,7 @@
#include <string>
#include <string_view>
#include <system_error>
+#include <unordered_set>
#include <utility>
#include "aidl/com/android/server/art/FsPermission.h"
@@ -46,7 +47,7 @@ using ::aidl::com::android::server::art::FsPermission;
using ::android::base::make_scope_guard;
using ::android::base::Result;
-void UnlinkIfExists(const std::string& path) {
+void UnlinkIfExists(std::string_view path) {
std::error_code ec;
std::filesystem::remove(path, ec);
if (ec) {
@@ -85,7 +86,6 @@ Result<void> NewFile::CommitOrAbandon() {
"Failed to move new file '{}' to path '{}': {}", temp_path_, final_path_, ec.message());
}
cleanup.Disable();
- committed_ = true;
return {};
}
@@ -122,15 +122,35 @@ void NewFile::Unlink() {
Result<void> NewFile::CommitAllOrAbandon(const std::vector<NewFile*>& files_to_commit,
const std::vector<std::string_view>& files_to_remove) {
+ std::vector<std::pair<std::string_view, std::string_view>> files_to_move;
+
+ auto cleanup = make_scope_guard([&]() {
+ for (NewFile* file : files_to_commit) {
+ file->Unlink();
+ }
+ });
+ for (NewFile* file : files_to_commit) {
+ OR_RETURN(file->Keep());
+ files_to_move.emplace_back(file->TempPath(), file->FinalPath());
+ }
+ cleanup.Disable();
+
+ return MoveAllOrAbandon(files_to_move, files_to_remove);
+}
+
+Result<void> MoveAllOrAbandon(
+ const std::vector<std::pair<std::string_view, std::string_view>>& files_to_move,
+ const std::vector<std::string_view>& files_to_remove) {
std::vector<std::pair<std::string_view, std::string>> moved_files;
+ std::unordered_set<std::string_view> committed_files;
auto cleanup = make_scope_guard([&]() {
- // Clean up new files.
- for (NewFile* new_file : files_to_commit) {
- if (new_file->committed_) {
- UnlinkIfExists(new_file->FinalPath());
+ // Clean up `files_to_move`.
+ for (const auto& [src_path, dst_path] : files_to_move) {
+ if (committed_files.find(dst_path) != committed_files.end()) {
+ UnlinkIfExists(dst_path);
} else {
- new_file->Cleanup();
+ UnlinkIfExists(src_path);
}
}
@@ -151,9 +171,9 @@ Result<void> NewFile::CommitAllOrAbandon(const std::vector<NewFile*>& files_to_c
// Move old files to temporary locations.
std::vector<std::string_view> all_files_to_remove;
- all_files_to_remove.reserve(files_to_commit.size() + files_to_remove.size());
- for (NewFile* file : files_to_commit) {
- all_files_to_remove.push_back(file->FinalPath());
+ all_files_to_remove.reserve(files_to_move.size() + files_to_remove.size());
+ for (const auto& [src_path, dst_path] : files_to_move) {
+ all_files_to_remove.push_back(dst_path);
}
all_files_to_remove.insert(
all_files_to_remove.end(), files_to_remove.begin(), files_to_remove.end());
@@ -168,7 +188,7 @@ Result<void> NewFile::CommitAllOrAbandon(const std::vector<NewFile*>& files_to_c
return ErrnoErrorf("Old file '{}' is a directory", original_path);
}
if (std::filesystem::exists(status)) {
- std::string temp_path = BuildTempPath(original_path, "XXXXXX");
+ std::string temp_path = NewFile::BuildTempPath(original_path, "XXXXXX");
int fd = mkstemps(temp_path.data(), /*suffixlen=*/4);
if (fd < 0) {
return ErrnoErrorf("Failed to create temporary path for old file '{}'", original_path);
@@ -188,9 +208,14 @@ Result<void> NewFile::CommitAllOrAbandon(const std::vector<NewFile*>& files_to_c
}
}
- // Commit new files.
- for (NewFile* file : files_to_commit) {
- OR_RETURN(file->CommitOrAbandon());
+ // Move `files_to_move`.
+ for (const auto& [src_path, dst_path] : files_to_move) {
+ std::error_code ec;
+ std::filesystem::rename(src_path, dst_path, ec);
+ if (ec) {
+ return Errorf("Failed to move file from '{}' to '{}': {}", src_path, dst_path, ec.message());
+ }
+ committed_files.insert(dst_path);
}
cleanup.Disable();
diff --git a/artd/file_utils.h b/artd/file_utils.h
index b5fd170676..a97f52c42a 100644
--- a/artd/file_utils.h
+++ b/artd/file_utils.h
@@ -113,7 +113,6 @@ class NewFile {
std::string temp_path_;
std::string temp_id_;
aidl::com::android::server::art::FsPermission fs_permission_;
- bool committed_ = false;
};
// Opens a file for reading.
@@ -129,6 +128,25 @@ mode_t DirFsPermissionToMode(const aidl::com::android::server::art::FsPermission
android::base::Result<void> Chown(
const std::string& path, const aidl::com::android::server::art::FsPermission& fs_permission);
+// Moves every file in `files_to_move` from a given location to another, replacing the existing file
+// at the destination if it exists, and removes files in `files_to_remove` in addition. Or abandons
+// all files in `files_to_move` and restores old files at best effort if any error occurs.
+//
+// This function does not accept duplicate paths. Passing duplicate paths to this function leads to
+// undefined behavior.
+//
+// Note: This function is NOT thread-safe. It is intended to be used in single-threaded code or in
+// cases where some race condition is acceptable.
+//
+// Usage:
+//
+// Move file at `path_1` to `path_2`, move file at `path_3` to `file_4`, and remove the file at
+// "path_5":
+// MoveAllOrAbandon({{"path_1", "path_2"}, {"path_3", "path_4}}, {"path_5"});
+android::base::Result<void> MoveAllOrAbandon(
+ const std::vector<std::pair<std::string_view, std::string_view>>& files_to_move,
+ const std::vector<std::string_view>& files_to_remove = {});
+
} // namespace artd
} // namespace art
diff --git a/artd/file_utils_test.cc b/artd/file_utils_test.cc
index 8f79d5dce9..62a7e39fe9 100644
--- a/artd/file_utils_test.cc
+++ b/artd/file_utils_test.cc
@@ -57,19 +57,19 @@ void CheckContent(const std::string& path, const std::string& expected_content)
EXPECT_EQ(actual_content, expected_content);
}
-// A file that will always fail on `Commit`.
-class UncommittableFile : public NewFile {
+// A file that will always fail on `Keep`.
+class UnkeepableFile : public NewFile {
public:
- static Result<std::unique_ptr<UncommittableFile>> Create(const std::string& path,
- const FsPermission& fs_permission) {
+ static Result<std::unique_ptr<UnkeepableFile>> Create(const std::string& path,
+ const FsPermission& fs_permission) {
std::unique_ptr<NewFile> new_file = OR_RETURN(NewFile::Create(path, fs_permission));
- return std::unique_ptr<UncommittableFile>(new UncommittableFile(std::move(*new_file)));
+ return std::unique_ptr<UnkeepableFile>(new UnkeepableFile(std::move(*new_file)));
}
- Result<void> Keep() override { return Error() << "Uncommittable file"; }
+ Result<void> Keep() override { return Error() << "Unkeepable file"; }
private:
- explicit UncommittableFile(NewFile&& other) : NewFile(std::move(other)) {}
+ explicit UnkeepableFile(NewFile&& other) : NewFile(std::move(other)) {}
};
class FileUtilsTest : public CommonArtTest {
@@ -247,7 +247,7 @@ TEST_F(FileUtilsTest, NewFileCommitAllReplacesMoreOldFiles) {
EXPECT_FALSE(std::filesystem::exists(new_file_2->TempPath()));
}
-TEST_F(FileUtilsTest, NewFileCommitAllFailedToCommit) {
+TEST_F(FileUtilsTest, NewFileCommitAllFailedToKeep) {
std::string file_1_path = scratch_dir_->GetPath() + "/file_1";
std::string file_2_path = scratch_dir_->GetPath() + "/file_2";
std::string file_3_path = scratch_dir_->GetPath() + "/file_3";
@@ -257,15 +257,15 @@ TEST_F(FileUtilsTest, NewFileCommitAllFailedToCommit) {
ASSERT_TRUE(WriteStringToFile("old_file_3", file_3_path)); // Extra file.
std::unique_ptr<NewFile> new_file_1 = OR_FATAL(NewFile::Create(file_1_path, fs_permission_));
- // Uncommittable file.
+ // Unkeepable file.
std::unique_ptr<NewFile> new_file_2 =
- OR_FATAL(UncommittableFile::Create(file_2_path, fs_permission_));
+ OR_FATAL(UnkeepableFile::Create(file_2_path, fs_permission_));
ASSERT_TRUE(WriteStringToFd("new_file_1", new_file_1->Fd()));
ASSERT_TRUE(WriteStringToFd("new_file_2", new_file_2->Fd()));
EXPECT_THAT(NewFile::CommitAllOrAbandon({new_file_1.get(), new_file_2.get()}, {file_3_path}),
- HasError(WithMessage("Uncommittable file")));
+ HasError(WithMessage("Unkeepable file")));
// Old files are fine.
CheckContent(file_1_path, "old_file_1");
@@ -277,6 +277,41 @@ TEST_F(FileUtilsTest, NewFileCommitAllFailedToCommit) {
EXPECT_FALSE(std::filesystem::exists(new_file_2->TempPath()));
}
+TEST_F(FileUtilsTest, NewFileCommitAllFailedToCommit) {
+ std::string dir_1_path = scratch_dir_->GetPath() + "/dir_1";
+ std::string dir_2_path = scratch_dir_->GetPath() + "/dir_2";
+
+ ASSERT_TRUE(std::filesystem::create_directory(dir_1_path));
+ ASSERT_TRUE(std::filesystem::create_directory(dir_2_path));
+
+ std::string file_1_path = dir_1_path + "/file_1";
+ std::string file_2_path = dir_2_path + "/file_2";
+
+ std::unique_ptr<NewFile> new_file_1 = OR_FATAL(NewFile::Create(file_1_path, fs_permission_));
+ std::unique_ptr<NewFile> new_file_2 = OR_FATAL(NewFile::Create(file_2_path, fs_permission_));
+
+ ASSERT_TRUE(WriteStringToFd("new_file_1", new_file_1->Fd()));
+ ASSERT_TRUE(WriteStringToFd("new_file_2", new_file_2->Fd()));
+
+ {
+ // Make `new_file_2` fail to commit.
+ auto scoped_inaccessible = ScopedInaccessible(dir_2_path);
+ std::filesystem::permissions(
+ dir_2_path, std::filesystem::perms::owner_exec, std::filesystem::perm_options::add);
+ auto scoped_unroot = ScopedUnroot();
+
+ EXPECT_THAT(NewFile::CommitAllOrAbandon({new_file_1.get(), new_file_2.get()}),
+ HasError(WithMessage(ContainsRegex("Failed to move file .*file_2.*"))));
+ }
+
+ // Files are abandoned at best effort. File 1 is abandoned, but file 2 cannot be abandoned due to
+ // permission denied.
+ EXPECT_FALSE(std::filesystem::exists(new_file_1->TempPath()));
+ EXPECT_FALSE(std::filesystem::exists(new_file_1->FinalPath()));
+ EXPECT_TRUE(std::filesystem::exists(new_file_2->TempPath()));
+ EXPECT_FALSE(std::filesystem::exists(new_file_2->FinalPath()));
+}
+
TEST_F(FileUtilsTest, NewFileCommitAllFailedToMoveOldFile) {
std::string file_1_path = scratch_dir_->GetPath() + "/file_1";
std::string file_2_path = scratch_dir_->GetPath() + "/file_2";
diff --git a/artd/path_utils.cc b/artd/path_utils.cc
index 1be75b9358..d3eb6d4dfe 100644
--- a/artd/path_utils.cc
+++ b/artd/path_utils.cc
@@ -39,6 +39,8 @@ namespace {
using ::aidl::com::android::server::art::ArtifactsPath;
using ::aidl::com::android::server::art::DexMetadataPath;
+using ::aidl::com::android::server::art::OutputArtifacts;
+using ::aidl::com::android::server::art::OutputProfile;
using ::aidl::com::android::server::art::ProfilePath;
using ::aidl::com::android::server::art::RuntimeArtifactsPath;
using ::aidl::com::android::server::art::VdexPath;
@@ -56,6 +58,8 @@ using SecondaryRefProfilePath = ProfilePath::SecondaryRefProfilePath;
using TmpProfilePath = ProfilePath::TmpProfilePath;
using WritableProfilePath = ProfilePath::WritableProfilePath;
+constexpr const char* kPreRebootSuffix = ".staged";
+
// Only to be changed for testing.
std::string_view gListRootDir = "/";
@@ -153,7 +157,7 @@ Result<std::string> BuildArtBinPath(const std::string& binary_name) {
return ART_FORMAT("{}/bin/{}", OR_RETURN(GetArtRootOrError()), binary_name);
}
-Result<std::string> BuildOatPath(const ArtifactsPath& artifacts_path) {
+Result<RawArtifactsPath> BuildArtifactsPath(const ArtifactsPath& artifacts_path) {
OR_RETURN(ValidateDexPath(artifacts_path.dexPath));
InstructionSet isa = GetInstructionSetFromString(artifacts_path.isa.c_str());
@@ -162,31 +166,44 @@ Result<std::string> BuildOatPath(const ArtifactsPath& artifacts_path) {
}
std::string error_msg;
- std::string path;
+ RawArtifactsPath path;
if (artifacts_path.isInDalvikCache) {
// Apps' OAT files are never in ART APEX data.
- if (!OatFileAssistant::DexLocationToOatFilename(
- artifacts_path.dexPath, isa, /*deny_art_apex_data_files=*/true, &path, &error_msg)) {
+ if (!OatFileAssistant::DexLocationToOatFilename(artifacts_path.dexPath,
+ isa,
+ /*deny_art_apex_data_files=*/true,
+ &path.oat_path,
+ &error_msg)) {
return Error() << error_msg;
}
- return path;
} else {
if (!OatFileAssistant::DexLocationToOdexFilename(
- artifacts_path.dexPath, isa, &path, &error_msg)) {
+ artifacts_path.dexPath, isa, &path.oat_path, &error_msg)) {
return Error() << error_msg;
}
- return path;
}
+
+ path.vdex_path = ReplaceFileExtension(path.oat_path, "vdex");
+ path.art_path = ReplaceFileExtension(path.oat_path, "art");
+
+ if (artifacts_path.isPreReboot) {
+ path.oat_path += kPreRebootSuffix;
+ path.vdex_path += kPreRebootSuffix;
+ path.art_path += kPreRebootSuffix;
+ }
+
+ return path;
}
Result<std::string> BuildPrimaryRefProfilePath(
const PrimaryRefProfilePath& primary_ref_profile_path) {
OR_RETURN(ValidatePathElement(primary_ref_profile_path.packageName, "packageName"));
OR_RETURN(ValidatePathElementSubstring(primary_ref_profile_path.profileName, "profileName"));
- return ART_FORMAT("{}/misc/profiles/ref/{}/{}.prof",
+ return ART_FORMAT("{}/misc/profiles/ref/{}/{}.prof{}",
OR_RETURN(GetAndroidDataOrError()),
primary_ref_profile_path.packageName,
- primary_ref_profile_path.profileName);
+ primary_ref_profile_path.profileName,
+ primary_ref_profile_path.isPreReboot ? kPreRebootSuffix : "");
}
Result<std::string> BuildPrebuiltProfilePath(const PrebuiltProfilePath& prebuilt_profile_path) {
@@ -209,8 +226,10 @@ Result<std::string> BuildSecondaryRefProfilePath(
const SecondaryRefProfilePath& secondary_ref_profile_path) {
OR_RETURN(ValidateDexPath(secondary_ref_profile_path.dexPath));
std::filesystem::path dex_path(secondary_ref_profile_path.dexPath);
- return ART_FORMAT(
- "{}/oat/{}.prof", dex_path.parent_path().string(), dex_path.filename().string());
+ return ART_FORMAT("{}/oat/{}.prof{}",
+ dex_path.parent_path().string(),
+ dex_path.filename().string(),
+ secondary_ref_profile_path.isPreReboot ? kPreRebootSuffix : "");
}
Result<std::string> BuildSecondaryCurProfilePath(
@@ -271,7 +290,43 @@ Result<std::string> BuildProfileOrDmPath(const ProfilePath& profile_path) {
Result<std::string> BuildVdexPath(const VdexPath& vdex_path) {
DCHECK(vdex_path.getTag() == VdexPath::artifactsPath);
- return OatPathToVdexPath(OR_RETURN(BuildOatPath(vdex_path.get<VdexPath::artifactsPath>())));
+ return OR_RETURN(BuildArtifactsPath(vdex_path.get<VdexPath::artifactsPath>())).vdex_path;
+}
+
+bool PreRebootFlag(const ProfilePath& profile_path) {
+ switch (profile_path.getTag()) {
+ case ProfilePath::primaryRefProfilePath:
+ return profile_path.get<ProfilePath::primaryRefProfilePath>().isPreReboot;
+ case ProfilePath::secondaryRefProfilePath:
+ return profile_path.get<ProfilePath::secondaryRefProfilePath>().isPreReboot;
+ case ProfilePath::tmpProfilePath:
+ return PreRebootFlag(profile_path.get<ProfilePath::tmpProfilePath>());
+ case ProfilePath::prebuiltProfilePath:
+ case ProfilePath::primaryCurProfilePath:
+ case ProfilePath::secondaryCurProfilePath:
+ case ProfilePath::dexMetadataPath:
+ return false;
+ // No default. All cases should be explicitly handled, or the compilation will fail.
+ }
+ // This should never happen. Just in case we get a non-enumerator value.
+ LOG(FATAL) << ART_FORMAT("Unexpected profile path type {}",
+ fmt::underlying(profile_path.getTag()));
+}
+
+bool PreRebootFlag(const TmpProfilePath& tmp_profile_path) {
+ return PreRebootFlag(tmp_profile_path.finalPath);
+}
+
+bool PreRebootFlag(const OutputProfile& profile) { return PreRebootFlag(profile.profilePath); }
+
+bool PreRebootFlag(const ArtifactsPath& artifacts_path) { return artifacts_path.isPreReboot; }
+
+bool PreRebootFlag(const OutputArtifacts& artifacts) {
+ return PreRebootFlag(artifacts.artifactsPath);
+}
+
+bool PreRebootFlag(const VdexPath& vdex_path) {
+ return PreRebootFlag(vdex_path.get<VdexPath::artifactsPath>());
}
void TestOnlySetListRootDir(std::string_view root_dir) { gListRootDir = root_dir; }
diff --git a/artd/path_utils.h b/artd/path_utils.h
index 9cbec2351a..a4a6e4f2a7 100644
--- a/artd/path_utils.h
+++ b/artd/path_utils.h
@@ -18,16 +18,23 @@
#define ART_ARTD_PATH_UTILS_H_
#include <string>
+#include <type_traits>
#include <vector>
#include "aidl/com/android/server/art/BnArtd.h"
+#include "android-base/logging.h"
#include "android-base/result.h"
-#include "base/file_utils.h"
-#include "fstab/fstab.h"
+#include "base/macros.h"
namespace art {
namespace artd {
+struct RawArtifactsPath {
+ std::string oat_path;
+ std::string vdex_path;
+ std::string art_path;
+};
+
android::base::Result<std::string> GetAndroidDataOrError();
android::base::Result<std::string> GetAndroidExpandOrError();
@@ -48,20 +55,10 @@ android::base::Result<void> ValidateRuntimeArtifactsPath(
android::base::Result<std::string> BuildArtBinPath(const std::string& binary_name);
-// Returns the absolute path to the OAT file built from the `ArtifactsPath`.
-android::base::Result<std::string> BuildOatPath(
+// Returns the absolute paths to files built from the `ArtifactsPath`.
+android::base::Result<RawArtifactsPath> BuildArtifactsPath(
const aidl::com::android::server::art::ArtifactsPath& artifacts_path);
-// Returns the path to the VDEX file that corresponds to the OAT file.
-inline std::string OatPathToVdexPath(const std::string& oat_path) {
- return ReplaceFileExtension(oat_path, "vdex");
-}
-
-// Returns the path to the ART file that corresponds to the OAT file.
-inline std::string OatPathToArtPath(const std::string& oat_path) {
- return ReplaceFileExtension(oat_path, "art");
-}
-
android::base::Result<std::string> BuildPrimaryRefProfilePath(
const aidl::com::android::server::art::ProfilePath::PrimaryRefProfilePath&
primary_ref_profile_path);
@@ -96,6 +93,38 @@ android::base::Result<std::string> BuildProfileOrDmPath(
android::base::Result<std::string> BuildVdexPath(
const aidl::com::android::server::art::VdexPath& vdex_path);
+// Takes an argument of type `WritableProfilePath`. Returns the pre-reboot flag by value if the
+// argument is const, or by reference otherwise.
+template <typename T,
+ typename = std::enable_if_t<
+ std::is_same_v<std::remove_cv_t<T>,
+ aidl::com::android::server::art::ProfilePath::WritableProfilePath>>>
+std::conditional_t<std::is_const_v<T>, bool, bool&> PreRebootFlag(T& profile_path) {
+ switch (profile_path.getTag()) {
+ case T::forPrimary:
+ return profile_path.template get<T::forPrimary>().isPreReboot;
+ case T::forSecondary:
+ return profile_path.template get<T::forSecondary>().isPreReboot;
+ // No default. All cases should be explicitly handled, or the compilation will fail.
+ }
+ // This should never happen. Just in case we get a non-enumerator value.
+ LOG(FATAL) << ART_FORMAT("Unexpected writable profile path type {}",
+ fmt::underlying(profile_path.getTag()));
+}
+
+template bool PreRebootFlag(
+ const aidl::com::android::server::art::ProfilePath::WritableProfilePath& profile_path);
+template bool& PreRebootFlag(
+ aidl::com::android::server::art::ProfilePath::WritableProfilePath& profile_path);
+
+bool PreRebootFlag(const aidl::com::android::server::art::ProfilePath& profile_path);
+bool PreRebootFlag(
+ const aidl::com::android::server::art::ProfilePath::TmpProfilePath& tmp_profile_path);
+bool PreRebootFlag(const aidl::com::android::server::art::OutputProfile& profile);
+bool PreRebootFlag(const aidl::com::android::server::art::ArtifactsPath& artifacts_path);
+bool PreRebootFlag(const aidl::com::android::server::art::OutputArtifacts& artifacts);
+bool PreRebootFlag(const aidl::com::android::server::art::VdexPath& vdex_path);
+
// Sets the root dir for `ListManagedFiles` and `ListRuntimeImageFiles`.
// The passed string must be alive until the test ends.
// For testing use only.
diff --git a/artd/path_utils_test.cc b/artd/path_utils_test.cc
index 5851245eac..116177a7a7 100644
--- a/artd/path_utils_test.cc
+++ b/artd/path_utils_test.cc
@@ -19,6 +19,7 @@
#include "aidl/com/android/server/art/BnArtd.h"
#include "android-base/result-gmock.h"
#include "base/common_art_test.h"
+#include "gmock/gmock.h"
#include "gtest/gtest.h"
namespace art {
@@ -31,6 +32,8 @@ using ::aidl::com::android::server::art::ProfilePath;
using ::android::base::testing::HasError;
using ::android::base::testing::HasValue;
using ::android::base::testing::WithMessage;
+using ::testing::AllOf;
+using ::testing::Field;
using PrebuiltProfilePath = ProfilePath::PrebuiltProfilePath;
using PrimaryCurProfilePath = ProfilePath::PrimaryCurProfilePath;
@@ -50,75 +53,107 @@ TEST_F(PathUtilsTest, BuildArtBinPath) {
EXPECT_THAT(BuildArtBinPath("foo"), HasValue(scratch_dir->GetPath() + "/bin/foo"));
}
-TEST_F(PathUtilsTest, BuildOatPath) {
+TEST_F(PathUtilsTest, BuildArtifactsPath) {
EXPECT_THAT(
- BuildOatPath(ArtifactsPath{.dexPath = "/a/b.apk", .isa = "arm64", .isInDalvikCache = false}),
- HasValue("/a/oat/arm64/b.odex"));
+ BuildArtifactsPath(ArtifactsPath{
+ .dexPath = "/a/b.apk", .isa = "arm64", .isInDalvikCache = false, .isPreReboot = false}),
+ HasValue(AllOf(Field(&RawArtifactsPath::oat_path, "/a/oat/arm64/b.odex"),
+ Field(&RawArtifactsPath::vdex_path, "/a/oat/arm64/b.vdex"),
+ Field(&RawArtifactsPath::art_path, "/a/oat/arm64/b.art"))));
}
-TEST_F(PathUtilsTest, BuildOatPathDalvikCache) {
+TEST_F(PathUtilsTest, BuildArtifactsPathPreReboot) {
EXPECT_THAT(
- BuildOatPath(ArtifactsPath{.dexPath = "/a/b.apk", .isa = "arm64", .isInDalvikCache = true}),
- HasValue(android_data_ + "/dalvik-cache/arm64/a@b.apk@classes.dex"));
+ BuildArtifactsPath(ArtifactsPath{
+ .dexPath = "/a/b.apk", .isa = "arm64", .isInDalvikCache = false, .isPreReboot = true}),
+ HasValue(AllOf(Field(&RawArtifactsPath::oat_path, "/a/oat/arm64/b.odex.staged"),
+ Field(&RawArtifactsPath::vdex_path, "/a/oat/arm64/b.vdex.staged"),
+ Field(&RawArtifactsPath::art_path, "/a/oat/arm64/b.art.staged"))));
}
-TEST_F(PathUtilsTest, BuildOatPathInvalidDexPath) {
+TEST_F(PathUtilsTest, BuildArtifactsPathDalvikCache) {
EXPECT_THAT(
- BuildOatPath(ArtifactsPath{.dexPath = "a/b.apk", .isa = "arm64", .isInDalvikCache = false}),
- HasError(WithMessage("Path 'a/b.apk' is not an absolute path")));
+ BuildArtifactsPath(ArtifactsPath{
+ .dexPath = "/a/b.apk", .isa = "arm64", .isInDalvikCache = true, .isPreReboot = false}),
+ HasValue(AllOf(Field(&RawArtifactsPath::oat_path,
+ android_data_ + "/dalvik-cache/arm64/a@b.apk@classes.dex"),
+ Field(&RawArtifactsPath::vdex_path,
+ android_data_ + "/dalvik-cache/arm64/a@b.apk@classes.vdex"),
+ Field(&RawArtifactsPath::art_path,
+ android_data_ + "/dalvik-cache/arm64/a@b.apk@classes.art"))));
}
-TEST_F(PathUtilsTest, BuildOatPathInvalidIsa) {
- EXPECT_THAT(BuildOatPath(
- ArtifactsPath{.dexPath = "/a/b.apk", .isa = "invalid", .isInDalvikCache = false}),
- HasError(WithMessage("Instruction set 'invalid' is invalid")));
+TEST_F(PathUtilsTest, BuildArtifactsPathDalvikCachePreReboot) {
+ EXPECT_THAT(
+ BuildArtifactsPath(ArtifactsPath{
+ .dexPath = "/a/b.apk", .isa = "arm64", .isInDalvikCache = true, .isPreReboot = true}),
+ HasValue(AllOf(Field(&RawArtifactsPath::oat_path,
+ android_data_ + "/dalvik-cache/arm64/a@b.apk@classes.dex.staged"),
+ Field(&RawArtifactsPath::vdex_path,
+ android_data_ + "/dalvik-cache/arm64/a@b.apk@classes.vdex.staged"),
+ Field(&RawArtifactsPath::art_path,
+ android_data_ + "/dalvik-cache/arm64/a@b.apk@classes.art.staged"))));
}
-TEST_F(PathUtilsTest, OatPathToVdexPath) {
- EXPECT_EQ(OatPathToVdexPath("/a/oat/arm64/b.odex"), "/a/oat/arm64/b.vdex");
+TEST_F(PathUtilsTest, BuildOatPathInvalidDexPath) {
+ EXPECT_THAT(
+ BuildArtifactsPath(ArtifactsPath{
+ .dexPath = "a/b.apk", .isa = "arm64", .isInDalvikCache = false, .isPreReboot = false}),
+ HasError(WithMessage("Path 'a/b.apk' is not an absolute path")));
}
-TEST_F(PathUtilsTest, OatPathToArtPath) {
- EXPECT_EQ(OatPathToArtPath("/a/oat/arm64/b.odex"), "/a/oat/arm64/b.art");
+TEST_F(PathUtilsTest, BuildOatPathInvalidIsa) {
+ EXPECT_THAT(
+ BuildArtifactsPath(ArtifactsPath{
+ .dexPath = "/a/b.apk", .isa = "invalid", .isInDalvikCache = false, .isPreReboot = false}),
+ HasError(WithMessage("Instruction set 'invalid' is invalid")));
}
TEST_F(PathUtilsTest, BuildPrimaryRefProfilePath) {
- EXPECT_THAT(BuildPrimaryRefProfilePath(PrimaryRefProfilePath{.packageName = "com.android.foo",
- .profileName = "primary"}),
- HasValue(android_data_ + "/misc/profiles/ref/com.android.foo/primary.prof"));
+ EXPECT_THAT(
+ BuildPrimaryRefProfilePath(PrimaryRefProfilePath{
+ .packageName = "com.android.foo", .profileName = "primary", .isPreReboot = false}),
+ HasValue(android_data_ + "/misc/profiles/ref/com.android.foo/primary.prof"));
+}
+
+TEST_F(PathUtilsTest, BuildPrimaryRefProfilePathPreReboot) {
+ EXPECT_THAT(BuildPrimaryRefProfilePath(PrimaryRefProfilePath{
+ .packageName = "com.android.foo", .profileName = "primary", .isPreReboot = true}),
+ HasValue(android_data_ + "/misc/profiles/ref/com.android.foo/primary.prof.staged"));
}
TEST_F(PathUtilsTest, BuildPrimaryRefProfilePathPackageNameOk) {
- EXPECT_THAT(BuildPrimaryRefProfilePath(
- PrimaryRefProfilePath{.packageName = "...", .profileName = "primary"}),
+ EXPECT_THAT(BuildPrimaryRefProfilePath(PrimaryRefProfilePath{
+ .packageName = "...", .profileName = "primary", .isPreReboot = false}),
HasValue(android_data_ + "/misc/profiles/ref/.../primary.prof"));
}
TEST_F(PathUtilsTest, BuildPrimaryRefProfilePathPackageNameWrong) {
- EXPECT_THAT(BuildPrimaryRefProfilePath(
- PrimaryRefProfilePath{.packageName = "..", .profileName = "primary"}),
+ EXPECT_THAT(BuildPrimaryRefProfilePath(PrimaryRefProfilePath{
+ .packageName = "..", .profileName = "primary", .isPreReboot = false}),
HasError(WithMessage("Invalid packageName '..'")));
- EXPECT_THAT(BuildPrimaryRefProfilePath(
- PrimaryRefProfilePath{.packageName = "a/b", .profileName = "primary"}),
+ EXPECT_THAT(BuildPrimaryRefProfilePath(PrimaryRefProfilePath{
+ .packageName = "a/b", .profileName = "primary", .isPreReboot = false}),
HasError(WithMessage("packageName 'a/b' has invalid character '/'")));
}
TEST_F(PathUtilsTest, BuildPrimaryRefProfilePathProfileNameOk) {
- EXPECT_THAT(BuildPrimaryRefProfilePath(
- PrimaryRefProfilePath{.packageName = "com.android.foo", .profileName = ".."}),
+ EXPECT_THAT(BuildPrimaryRefProfilePath(PrimaryRefProfilePath{
+ .packageName = "com.android.foo", .profileName = "..", .isPreReboot = false}),
HasValue(android_data_ + "/misc/profiles/ref/com.android.foo/...prof"));
}
TEST_F(PathUtilsTest, BuildPrimaryRefProfilePathProfileNameWrong) {
- EXPECT_THAT(BuildPrimaryRefProfilePath(
- PrimaryRefProfilePath{.packageName = "com.android.foo", .profileName = "a/b"}),
+ EXPECT_THAT(BuildPrimaryRefProfilePath(PrimaryRefProfilePath{
+ .packageName = "com.android.foo", .profileName = "a/b", .isPreReboot = false}),
HasError(WithMessage("profileName 'a/b' has invalid character '/'")));
}
TEST_F(PathUtilsTest, BuildFinalProfilePathForPrimary) {
EXPECT_THAT(BuildFinalProfilePath(TmpProfilePath{
.finalPath = PrimaryRefProfilePath{.packageName = "com.android.foo",
- .profileName = "primary"},
+ .profileName = "primary",
+ .isPreReboot = false},
.id = "12345"}),
HasValue(android_data_ + "/misc/profiles/ref/com.android.foo/primary.prof"));
}
@@ -126,7 +161,8 @@ TEST_F(PathUtilsTest, BuildFinalProfilePathForPrimary) {
TEST_F(PathUtilsTest, BuildFinalProfilePathForSecondary) {
EXPECT_THAT(BuildFinalProfilePath(TmpProfilePath{
.finalPath = SecondaryRefProfilePath{.dexPath = android_data_ +
- "/user/0/com.android.foo/a.apk"},
+ "/user/0/com.android.foo/a.apk",
+ .isPreReboot = false},
.id = "12345"}),
HasValue(android_data_ + "/user/0/com.android.foo/oat/a.apk.prof"));
}
@@ -135,7 +171,8 @@ TEST_F(PathUtilsTest, BuildTmpProfilePathForPrimary) {
EXPECT_THAT(
BuildTmpProfilePath(TmpProfilePath{
.finalPath =
- PrimaryRefProfilePath{.packageName = "com.android.foo", .profileName = "primary"},
+ PrimaryRefProfilePath{
+ .packageName = "com.android.foo", .profileName = "primary", .isPreReboot = false},
.id = "12345"}),
HasValue(android_data_ + "/misc/profiles/ref/com.android.foo/primary.prof.12345.tmp"));
}
@@ -143,7 +180,8 @@ TEST_F(PathUtilsTest, BuildTmpProfilePathForPrimary) {
TEST_F(PathUtilsTest, BuildTmpProfilePathForSecondary) {
EXPECT_THAT(BuildTmpProfilePath(TmpProfilePath{
.finalPath = SecondaryRefProfilePath{.dexPath = android_data_ +
- "/user/0/com.android.foo/a.apk"},
+ "/user/0/com.android.foo/a.apk",
+ .isPreReboot = false},
.id = "12345"}),
HasValue(android_data_ + "/user/0/com.android.foo/oat/a.apk.prof.12345.tmp"));
}
@@ -151,7 +189,8 @@ TEST_F(PathUtilsTest, BuildTmpProfilePathForSecondary) {
TEST_F(PathUtilsTest, BuildTmpProfilePathIdWrong) {
EXPECT_THAT(BuildTmpProfilePath(TmpProfilePath{
.finalPath = PrimaryRefProfilePath{.packageName = "com.android.foo",
- .profileName = "primary"},
+ .profileName = "primary",
+ .isPreReboot = false},
.id = "123/45"}),
HasError(WithMessage("id '123/45' has invalid character '/'")));
}
@@ -168,9 +207,16 @@ TEST_F(PathUtilsTest, BuildPrimaryCurProfilePath) {
}
TEST_F(PathUtilsTest, BuildSecondaryRefProfilePath) {
+ EXPECT_THAT(
+ BuildSecondaryRefProfilePath(SecondaryRefProfilePath{
+ .dexPath = android_data_ + "/user/0/com.android.foo/a.apk", .isPreReboot = false}),
+ HasValue(android_data_ + "/user/0/com.android.foo/oat/a.apk.prof"));
+}
+
+TEST_F(PathUtilsTest, BuildSecondaryRefProfilePathPreReboot) {
EXPECT_THAT(BuildSecondaryRefProfilePath(SecondaryRefProfilePath{
- .dexPath = android_data_ + "/user/0/com.android.foo/a.apk"}),
- HasValue(android_data_ + "/user/0/com.android.foo/oat/a.apk.prof"));
+ .dexPath = android_data_ + "/user/0/com.android.foo/a.apk", .isPreReboot = true}),
+ HasValue(android_data_ + "/user/0/com.android.foo/oat/a.apk.prof.staged"));
}
TEST_F(PathUtilsTest, BuildSecondaryCurProfilePath) {
@@ -184,13 +230,15 @@ TEST_F(PathUtilsTest, BuildDexMetadataPath) {
}
TEST_F(PathUtilsTest, BuildProfilePath) {
- EXPECT_THAT(BuildProfileOrDmPath(PrimaryRefProfilePath{.packageName = "com.android.foo",
- .profileName = "primary"}),
- HasValue(android_data_ + "/misc/profiles/ref/com.android.foo/primary.prof"));
+ EXPECT_THAT(
+ BuildProfileOrDmPath(PrimaryRefProfilePath{
+ .packageName = "com.android.foo", .profileName = "primary", .isPreReboot = false}),
+ HasValue(android_data_ + "/misc/profiles/ref/com.android.foo/primary.prof"));
EXPECT_THAT(
BuildProfileOrDmPath(TmpProfilePath{
.finalPath =
- PrimaryRefProfilePath{.packageName = "com.android.foo", .profileName = "primary"},
+ PrimaryRefProfilePath{
+ .packageName = "com.android.foo", .profileName = "primary", .isPreReboot = false},
.id = "12345"}),
HasValue(android_data_ + "/misc/profiles/ref/com.android.foo/primary.prof.12345.tmp"));
EXPECT_THAT(BuildProfileOrDmPath(PrebuiltProfilePath{.dexPath = "/a/b.apk"}),
diff --git a/build/README.md b/build/README.md
index 7b4e402376..4d9656fc10 100644
--- a/build/README.md
+++ b/build/README.md
@@ -75,12 +75,29 @@ module build on `master-art` above (b/172480617).
2. Ensure the ART Module is built from source:
+ Active development on ART module happens in `trunk_staging` release
+ configuration. Whenever possible, use this configuration for local development.
+
+ ```
+ lunch <product>-trunk_staging-<variant>
+ ```
+
+ Some release configurations use prebuilts of ART module. To verify whether a
+ particular release configuration uses ART prebuilts, run the following command
+
```
- export ART_MODULE_BUILD_FROM_SOURCE=true
+ get_build_var RELEASE_APEX_CONTRIBUTIONS_ART
```
- If this isn't set then the build may use prebuilts of the ART Module that
- may be older than the sources.
+ If this returns a non-empty value, it usually means that this release
+ configuration uses ART prebuilts. (To verify, you can inspect the `contents` of
+ the `apex_contributions` Android.bp module reported by the above command.)
+
+ For troubleshooting, it might be desirable to build ART from source in that
+ release configuration. To do so, please modify the <release>.scl file and unset
+ the `RELEASE_APEX_CONTIRBUTIONS_ART` build flag. To determine which .scl files
+ are used in the current release configuration, please refer to
+ `out/release_config_entrypoint.scl`.
3. Build the system image the normal way, for example:
diff --git a/build/boot/boot-image-profile.txt b/build/boot/boot-image-profile.txt
index 571b7ff72f..367ccecf14 100644
--- a/build/boot/boot-image-profile.txt
+++ b/build/boot/boot-image-profile.txt
@@ -791,33 +791,25 @@ HSPLcom/android/okhttp/okio/Timeout;->timeoutNanos()J
HSPLcom/android/okhttp/okio/Util;->checkOffsetAndCount(JJJ)V
HSPLcom/android/okhttp/okio/Util;->reverseBytesInt(I)I
HSPLcom/android/org/bouncycastle/asn1/ASN1BitString;-><init>([BI)V
-HSPLcom/android/org/bouncycastle/asn1/ASN1BitString;->fromInputStream(ILjava/io/InputStream;)Lcom/android/org/bouncycastle/asn1/ASN1BitString;
HSPLcom/android/org/bouncycastle/asn1/ASN1EncodableVector;-><init>()V
HSPLcom/android/org/bouncycastle/asn1/ASN1EncodableVector;-><init>(I)V
HSPLcom/android/org/bouncycastle/asn1/ASN1EncodableVector;->add(Lcom/android/org/bouncycastle/asn1/ASN1Encodable;)V
HSPLcom/android/org/bouncycastle/asn1/ASN1EncodableVector;->get(I)Lcom/android/org/bouncycastle/asn1/ASN1Encodable;
-HSPLcom/android/org/bouncycastle/asn1/ASN1EncodableVector;->size()I
-HSPLcom/android/org/bouncycastle/asn1/ASN1EncodableVector;->takeElements()[Lcom/android/org/bouncycastle/asn1/ASN1Encodable;
HSPLcom/android/org/bouncycastle/asn1/ASN1InputStream;-><init>(Ljava/io/InputStream;)V
-HSPLcom/android/org/bouncycastle/asn1/ASN1InputStream;-><init>(Ljava/io/InputStream;I)V
HSPLcom/android/org/bouncycastle/asn1/ASN1InputStream;-><init>(Ljava/io/InputStream;IZ)V
HSPLcom/android/org/bouncycastle/asn1/ASN1InputStream;-><init>([B)V
HSPLcom/android/org/bouncycastle/asn1/ASN1InputStream;->buildObject(III)Lcom/android/org/bouncycastle/asn1/ASN1Primitive;
HSPLcom/android/org/bouncycastle/asn1/ASN1InputStream;->createPrimitiveDERObject(ILcom/android/org/bouncycastle/asn1/DefiniteLengthInputStream;[[B)Lcom/android/org/bouncycastle/asn1/ASN1Primitive;
HSPLcom/android/org/bouncycastle/asn1/ASN1InputStream;->getBuffer(Lcom/android/org/bouncycastle/asn1/DefiniteLengthInputStream;[[B)[B
-HSPLcom/android/org/bouncycastle/asn1/ASN1InputStream;->readLength()I
HSPLcom/android/org/bouncycastle/asn1/ASN1InputStream;->readLength(Ljava/io/InputStream;IZ)I
HSPLcom/android/org/bouncycastle/asn1/ASN1InputStream;->readObject()Lcom/android/org/bouncycastle/asn1/ASN1Primitive;
-HSPLcom/android/org/bouncycastle/asn1/ASN1InputStream;->readTagNumber(Ljava/io/InputStream;I)I
HSPLcom/android/org/bouncycastle/asn1/ASN1InputStream;->readVector(Lcom/android/org/bouncycastle/asn1/DefiniteLengthInputStream;)Lcom/android/org/bouncycastle/asn1/ASN1EncodableVector;
HSPLcom/android/org/bouncycastle/asn1/ASN1Integer;-><init>(Ljava/math/BigInteger;)V
-HSPLcom/android/org/bouncycastle/asn1/ASN1Integer;-><init>([BZ)V
HSPLcom/android/org/bouncycastle/asn1/ASN1Integer;->encode(Lcom/android/org/bouncycastle/asn1/ASN1OutputStream;Z)V
HSPLcom/android/org/bouncycastle/asn1/ASN1Integer;->encodedLength()I
HSPLcom/android/org/bouncycastle/asn1/ASN1Integer;->getInstance(Ljava/lang/Object;)Lcom/android/org/bouncycastle/asn1/ASN1Integer;
HSPLcom/android/org/bouncycastle/asn1/ASN1Integer;->getValue()Ljava/math/BigInteger;
HSPLcom/android/org/bouncycastle/asn1/ASN1Integer;->isMalformed([B)Z
-HSPLcom/android/org/bouncycastle/asn1/ASN1Object;-><init>()V
HSPLcom/android/org/bouncycastle/asn1/ASN1Object;->getEncoded()[B
HSPLcom/android/org/bouncycastle/asn1/ASN1Object;->getEncoded(Ljava/lang/String;)[B
HSPLcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier$OidHandle;-><init>([B)V
@@ -828,20 +820,16 @@ HSPLcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;->asn1Equals(Lcom/and
HSPLcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;->doOutput(Ljava/io/ByteArrayOutputStream;)V
HSPLcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;->encode(Lcom/android/org/bouncycastle/asn1/ASN1OutputStream;Z)V
HSPLcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;->encodedLength()I
-HSPLcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;->fromOctetString([B)Lcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;
HSPLcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;->getBody()[B
-HSPLcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;->getId()Ljava/lang/String;
-HSPLcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;->getInstance(Ljava/lang/Object;)Lcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;
HSPLcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;->hashCode()I
+HSPLcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;->toString()Ljava/lang/String;
HSPLcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;->writeField(Ljava/io/ByteArrayOutputStream;J)V
HSPLcom/android/org/bouncycastle/asn1/ASN1OutputStream;-><init>(Ljava/io/OutputStream;)V
-HSPLcom/android/org/bouncycastle/asn1/ASN1OutputStream;->flushInternal()V
HSPLcom/android/org/bouncycastle/asn1/ASN1OutputStream;->write(I)V
HSPLcom/android/org/bouncycastle/asn1/ASN1OutputStream;->write([BII)V
HSPLcom/android/org/bouncycastle/asn1/ASN1OutputStream;->writeEncoded(ZI[B)V
HSPLcom/android/org/bouncycastle/asn1/ASN1OutputStream;->writeLength(I)V
HSPLcom/android/org/bouncycastle/asn1/ASN1OutputStream;->writeObject(Lcom/android/org/bouncycastle/asn1/ASN1Encodable;)V
-HSPLcom/android/org/bouncycastle/asn1/ASN1Primitive;-><init>()V
HSPLcom/android/org/bouncycastle/asn1/ASN1Primitive;->equals(Lcom/android/org/bouncycastle/asn1/ASN1Primitive;)Z
HSPLcom/android/org/bouncycastle/asn1/ASN1Primitive;->fromByteArray([B)Lcom/android/org/bouncycastle/asn1/ASN1Primitive;
HSPLcom/android/org/bouncycastle/asn1/ASN1Primitive;->toASN1Primitive()Lcom/android/org/bouncycastle/asn1/ASN1Primitive;
@@ -858,58 +846,25 @@ HSPLcom/android/org/bouncycastle/asn1/ASN1Sequence;->toDERObject()Lcom/android/o
HSPLcom/android/org/bouncycastle/asn1/ASN1Set;-><init>()V
HSPLcom/android/org/bouncycastle/asn1/ASN1Set;-><init>(Lcom/android/org/bouncycastle/asn1/ASN1EncodableVector;Z)V
HSPLcom/android/org/bouncycastle/asn1/ASN1Set;->getInstance(Ljava/lang/Object;)Lcom/android/org/bouncycastle/asn1/ASN1Set;
-HSPLcom/android/org/bouncycastle/asn1/ASN1Set;->getObjectAt(I)Lcom/android/org/bouncycastle/asn1/ASN1Encodable;
-HSPLcom/android/org/bouncycastle/asn1/ASN1Set;->getObjects()Ljava/util/Enumeration;
-HSPLcom/android/org/bouncycastle/asn1/ASN1Set;->size()I
-HSPLcom/android/org/bouncycastle/asn1/ASN1TaggedObject;->getObject()Lcom/android/org/bouncycastle/asn1/ASN1Primitive;
-HSPLcom/android/org/bouncycastle/asn1/DERBitString;-><init>([BI)V
HSPLcom/android/org/bouncycastle/asn1/DERBitString;->getInstance(Ljava/lang/Object;)Lcom/android/org/bouncycastle/asn1/DERBitString;
-HSPLcom/android/org/bouncycastle/asn1/DERFactory;->createSequence(Lcom/android/org/bouncycastle/asn1/ASN1EncodableVector;)Lcom/android/org/bouncycastle/asn1/ASN1Sequence;
HSPLcom/android/org/bouncycastle/asn1/DERNull;->encodedLength()I
-HSPLcom/android/org/bouncycastle/asn1/DEROutputStream;-><init>(Ljava/io/OutputStream;)V
HSPLcom/android/org/bouncycastle/asn1/DEROutputStream;->getDERSubStream()Lcom/android/org/bouncycastle/asn1/DEROutputStream;
-HSPLcom/android/org/bouncycastle/asn1/DERSequence;-><init>()V
-HSPLcom/android/org/bouncycastle/asn1/DERSequence;-><init>(Lcom/android/org/bouncycastle/asn1/ASN1EncodableVector;)V
HSPLcom/android/org/bouncycastle/asn1/DERSequence;->encode(Lcom/android/org/bouncycastle/asn1/ASN1OutputStream;Z)V
HSPLcom/android/org/bouncycastle/asn1/DERSequence;->encodedLength()I
HSPLcom/android/org/bouncycastle/asn1/DERSequence;->getBodyLength()I
HSPLcom/android/org/bouncycastle/asn1/DERSequence;->toDERObject()Lcom/android/org/bouncycastle/asn1/ASN1Primitive;
HSPLcom/android/org/bouncycastle/asn1/DLFactory;-><clinit>()V
-HSPLcom/android/org/bouncycastle/asn1/DLFactory;->createSequence(Lcom/android/org/bouncycastle/asn1/ASN1EncodableVector;)Lcom/android/org/bouncycastle/asn1/ASN1Sequence;
-HSPLcom/android/org/bouncycastle/asn1/DLSequence;-><init>()V
-HSPLcom/android/org/bouncycastle/asn1/DLSequence;-><init>(Lcom/android/org/bouncycastle/asn1/ASN1EncodableVector;)V
-HSPLcom/android/org/bouncycastle/asn1/DefiniteLengthInputStream;->getRemaining()I
HSPLcom/android/org/bouncycastle/asn1/DefiniteLengthInputStream;->read()I
HSPLcom/android/org/bouncycastle/asn1/DefiniteLengthInputStream;->read([BII)I
-HSPLcom/android/org/bouncycastle/asn1/DefiniteLengthInputStream;->readAllIntoByteArray([B)V
HSPLcom/android/org/bouncycastle/asn1/DefiniteLengthInputStream;->toByteArray()[B
-HSPLcom/android/org/bouncycastle/asn1/LimitedInputStream;-><init>(Ljava/io/InputStream;I)V
-HSPLcom/android/org/bouncycastle/asn1/LimitedInputStream;->getLimit()I
-HSPLcom/android/org/bouncycastle/asn1/LimitedInputStream;->setParentEofDetect(Z)V
-HSPLcom/android/org/bouncycastle/asn1/OIDTokenizer;-><init>(Ljava/lang/String;)V
-HSPLcom/android/org/bouncycastle/asn1/OIDTokenizer;->hasMoreTokens()Z
-HSPLcom/android/org/bouncycastle/asn1/OIDTokenizer;->nextToken()Ljava/lang/String;
HSPLcom/android/org/bouncycastle/asn1/StreamUtil;->calculateBodyLength(I)I
HSPLcom/android/org/bouncycastle/asn1/StreamUtil;->findLimit(Ljava/io/InputStream;)I
-HSPLcom/android/org/bouncycastle/asn1/x509/AlgorithmIdentifier;-><init>(Lcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;Lcom/android/org/bouncycastle/asn1/ASN1Encodable;)V
-HSPLcom/android/org/bouncycastle/asn1/x509/AlgorithmIdentifier;-><init>(Lcom/android/org/bouncycastle/asn1/ASN1Sequence;)V
-HSPLcom/android/org/bouncycastle/asn1/x509/AlgorithmIdentifier;->getAlgorithm()Lcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;
HSPLcom/android/org/bouncycastle/asn1/x509/AlgorithmIdentifier;->getInstance(Ljava/lang/Object;)Lcom/android/org/bouncycastle/asn1/x509/AlgorithmIdentifier;
-HSPLcom/android/org/bouncycastle/asn1/x509/AlgorithmIdentifier;->getParameters()Lcom/android/org/bouncycastle/asn1/ASN1Encodable;
HSPLcom/android/org/bouncycastle/asn1/x509/AlgorithmIdentifier;->toASN1Primitive()Lcom/android/org/bouncycastle/asn1/ASN1Primitive;
-HSPLcom/android/org/bouncycastle/asn1/x509/SubjectPublicKeyInfo;-><init>(Lcom/android/org/bouncycastle/asn1/ASN1Sequence;)V
HSPLcom/android/org/bouncycastle/asn1/x509/SubjectPublicKeyInfo;->getInstance(Ljava/lang/Object;)Lcom/android/org/bouncycastle/asn1/x509/SubjectPublicKeyInfo;
-HSPLcom/android/org/bouncycastle/crypto/BufferedBlockCipher;-><init>()V
-HSPLcom/android/org/bouncycastle/crypto/BufferedBlockCipher;->getBlockSize()I
-HSPLcom/android/org/bouncycastle/crypto/BufferedBlockCipher;->getUnderlyingCipher()Lcom/android/org/bouncycastle/crypto/BlockCipher;
HSPLcom/android/org/bouncycastle/crypto/BufferedBlockCipher;->reset()V
HSPLcom/android/org/bouncycastle/crypto/CryptoServicesRegistrar;->getSecureRandom()Ljava/security/SecureRandom;
-HSPLcom/android/org/bouncycastle/crypto/PBEParametersGenerator;-><init>()V
HSPLcom/android/org/bouncycastle/crypto/PBEParametersGenerator;->PKCS12PasswordToBytes([C)[B
-HSPLcom/android/org/bouncycastle/crypto/PBEParametersGenerator;->PKCS5PasswordToUTF8Bytes([C)[B
-HSPLcom/android/org/bouncycastle/crypto/PBEParametersGenerator;->init([B[BI)V
-HSPLcom/android/org/bouncycastle/crypto/digests/AndroidDigestFactory;->getSHA1()Lcom/android/org/bouncycastle/crypto/Digest;
-HSPLcom/android/org/bouncycastle/crypto/digests/AndroidDigestFactoryOpenSSL;->getSHA1()Lcom/android/org/bouncycastle/crypto/Digest;
HSPLcom/android/org/bouncycastle/crypto/digests/OpenSSLDigest$SHA1;-><init>()V
HSPLcom/android/org/bouncycastle/crypto/digests/OpenSSLDigest;-><init>(Ljava/lang/String;I)V
HSPLcom/android/org/bouncycastle/crypto/digests/OpenSSLDigest;->doFinal([BI)I
@@ -918,12 +873,10 @@ HSPLcom/android/org/bouncycastle/crypto/digests/OpenSSLDigest;->getDigestSize()I
HSPLcom/android/org/bouncycastle/crypto/digests/OpenSSLDigest;->reset()V
HSPLcom/android/org/bouncycastle/crypto/digests/OpenSSLDigest;->update([BII)V
HSPLcom/android/org/bouncycastle/crypto/engines/AESEngine;-><init>()V
-HSPLcom/android/org/bouncycastle/crypto/engines/AESEngine;->generateWorkingKey([BZ)[[I
HSPLcom/android/org/bouncycastle/crypto/engines/AESEngine;->getAlgorithmName()Ljava/lang/String;
HSPLcom/android/org/bouncycastle/crypto/engines/AESEngine;->getBlockSize()I
HSPLcom/android/org/bouncycastle/crypto/engines/AESEngine;->init(ZLcom/android/org/bouncycastle/crypto/CipherParameters;)V
HSPLcom/android/org/bouncycastle/crypto/engines/AESEngine;->packBlock([BI)V
-HSPLcom/android/org/bouncycastle/crypto/engines/AESEngine;->processBlock([BI[BI)I
HSPLcom/android/org/bouncycastle/crypto/engines/AESEngine;->reset()V
HSPLcom/android/org/bouncycastle/crypto/engines/AESEngine;->shift(II)I
HSPLcom/android/org/bouncycastle/crypto/engines/AESEngine;->subWord(I)I
@@ -931,50 +884,29 @@ HSPLcom/android/org/bouncycastle/crypto/engines/AESEngine;->unpackBlock([BI)V
HSPLcom/android/org/bouncycastle/crypto/engines/DESEngine;-><clinit>()V
HSPLcom/android/org/bouncycastle/crypto/engines/DESEngine;-><init>()V
HSPLcom/android/org/bouncycastle/crypto/engines/DESEngine;->generateWorkingKey(Z[B)[I
-HSPLcom/android/org/bouncycastle/crypto/generators/PKCS12ParametersGenerator;-><init>(Lcom/android/org/bouncycastle/crypto/Digest;)V
-HSPLcom/android/org/bouncycastle/crypto/generators/PKCS12ParametersGenerator;->adjust([BI[B)V
HSPLcom/android/org/bouncycastle/crypto/generators/PKCS12ParametersGenerator;->generateDerivedKey(II)[B
-HSPLcom/android/org/bouncycastle/crypto/generators/PKCS5S2ParametersGenerator;-><init>(Lcom/android/org/bouncycastle/crypto/Digest;)V
-HSPLcom/android/org/bouncycastle/crypto/generators/PKCS5S2ParametersGenerator;->F([BI[B[BI)V
-HSPLcom/android/org/bouncycastle/crypto/generators/PKCS5S2ParametersGenerator;->generateDerivedKey(I)[B
-HSPLcom/android/org/bouncycastle/crypto/generators/PKCS5S2ParametersGenerator;->generateDerivedMacParameters(I)Lcom/android/org/bouncycastle/crypto/CipherParameters;
-HSPLcom/android/org/bouncycastle/crypto/generators/PKCS5S2ParametersGenerator;->generateDerivedParameters(I)Lcom/android/org/bouncycastle/crypto/CipherParameters;
HSPLcom/android/org/bouncycastle/crypto/macs/HMac;-><clinit>()V
-HSPLcom/android/org/bouncycastle/crypto/macs/HMac;-><init>(Lcom/android/org/bouncycastle/crypto/Digest;)V
-HSPLcom/android/org/bouncycastle/crypto/macs/HMac;-><init>(Lcom/android/org/bouncycastle/crypto/Digest;I)V
-HSPLcom/android/org/bouncycastle/crypto/macs/HMac;->doFinal([BI)I
-HSPLcom/android/org/bouncycastle/crypto/macs/HMac;->getByteLength(Lcom/android/org/bouncycastle/crypto/Digest;)I
HSPLcom/android/org/bouncycastle/crypto/macs/HMac;->getMacSize()I
HSPLcom/android/org/bouncycastle/crypto/macs/HMac;->init(Lcom/android/org/bouncycastle/crypto/CipherParameters;)V
HSPLcom/android/org/bouncycastle/crypto/macs/HMac;->update([BII)V
-HSPLcom/android/org/bouncycastle/crypto/macs/HMac;->xorPad([BIB)V
HSPLcom/android/org/bouncycastle/crypto/modes/CBCBlockCipher;-><init>(Lcom/android/org/bouncycastle/crypto/BlockCipher;)V
HSPLcom/android/org/bouncycastle/crypto/modes/CBCBlockCipher;->getBlockSize()I
HSPLcom/android/org/bouncycastle/crypto/modes/CBCBlockCipher;->init(ZLcom/android/org/bouncycastle/crypto/CipherParameters;)V
HSPLcom/android/org/bouncycastle/crypto/modes/CBCBlockCipher;->reset()V
-HSPLcom/android/org/bouncycastle/crypto/paddings/PKCS7Padding;-><init>()V
HSPLcom/android/org/bouncycastle/crypto/paddings/PKCS7Padding;->init(Ljava/security/SecureRandom;)V
HSPLcom/android/org/bouncycastle/crypto/paddings/PKCS7Padding;->padCount([B)I
-HSPLcom/android/org/bouncycastle/crypto/paddings/PaddedBufferedBlockCipher;-><init>(Lcom/android/org/bouncycastle/crypto/BlockCipher;)V
HSPLcom/android/org/bouncycastle/crypto/paddings/PaddedBufferedBlockCipher;-><init>(Lcom/android/org/bouncycastle/crypto/BlockCipher;Lcom/android/org/bouncycastle/crypto/paddings/BlockCipherPadding;)V
HSPLcom/android/org/bouncycastle/crypto/paddings/PaddedBufferedBlockCipher;->doFinal([BI)I
HSPLcom/android/org/bouncycastle/crypto/paddings/PaddedBufferedBlockCipher;->getOutputSize(I)I
HSPLcom/android/org/bouncycastle/crypto/paddings/PaddedBufferedBlockCipher;->getUpdateOutputSize(I)I
HSPLcom/android/org/bouncycastle/crypto/paddings/PaddedBufferedBlockCipher;->init(ZLcom/android/org/bouncycastle/crypto/CipherParameters;)V
-HSPLcom/android/org/bouncycastle/crypto/paddings/PaddedBufferedBlockCipher;->processBytes([BII[BI)I
HSPLcom/android/org/bouncycastle/crypto/params/AsymmetricKeyParameter;-><init>(Z)V
HSPLcom/android/org/bouncycastle/crypto/params/DSAKeyParameters;-><init>(ZLcom/android/org/bouncycastle/crypto/params/DSAParameters;)V
HSPLcom/android/org/bouncycastle/crypto/params/DSAParameters;-><init>(Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;)V
-HSPLcom/android/org/bouncycastle/crypto/params/DSAParameters;->getP()Ljava/math/BigInteger;
-HSPLcom/android/org/bouncycastle/crypto/params/DSAParameters;->getQ()Ljava/math/BigInteger;
HSPLcom/android/org/bouncycastle/crypto/params/DSAPublicKeyParameters;-><init>(Ljava/math/BigInteger;Lcom/android/org/bouncycastle/crypto/params/DSAParameters;)V
-HSPLcom/android/org/bouncycastle/crypto/params/DSAPublicKeyParameters;->validate(Ljava/math/BigInteger;Lcom/android/org/bouncycastle/crypto/params/DSAParameters;)Ljava/math/BigInteger;
HSPLcom/android/org/bouncycastle/crypto/params/KeyParameter;-><init>([B)V
-HSPLcom/android/org/bouncycastle/crypto/params/KeyParameter;-><init>([BII)V
-HSPLcom/android/org/bouncycastle/crypto/params/KeyParameter;->getKey()[B
HSPLcom/android/org/bouncycastle/crypto/params/ParametersWithIV;-><init>(Lcom/android/org/bouncycastle/crypto/CipherParameters;[BII)V
-HSPLcom/android/org/bouncycastle/crypto/params/ParametersWithIV;->getIV()[B
-HSPLcom/android/org/bouncycastle/crypto/params/ParametersWithIV;->getParameters()Lcom/android/org/bouncycastle/crypto/CipherParameters;
+HSPLcom/android/org/bouncycastle/jcajce/provider/asymmetric/DSA$Mappings;->configure(Lcom/android/org/bouncycastle/jcajce/provider/config/ConfigurableProvider;)V
HSPLcom/android/org/bouncycastle/jcajce/provider/asymmetric/dsa/BCDSAPublicKey;->getParams()Ljava/security/interfaces/DSAParams;
HSPLcom/android/org/bouncycastle/jcajce/provider/asymmetric/dsa/BCDSAPublicKey;->getY()Ljava/math/BigInteger;
HSPLcom/android/org/bouncycastle/jcajce/provider/asymmetric/dsa/BCDSAPublicKey;->hashCode()I
@@ -982,17 +914,14 @@ HSPLcom/android/org/bouncycastle/jcajce/provider/asymmetric/dsa/BCDSAPublicKey;-
HSPLcom/android/org/bouncycastle/jcajce/provider/asymmetric/dsa/DSAUtil;->toDSAParameters(Ljava/security/interfaces/DSAParams;)Lcom/android/org/bouncycastle/crypto/params/DSAParameters;
HSPLcom/android/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi$Std;-><init>()V
HSPLcom/android/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi$StoreEntry;-><init>(Lcom/android/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi;Ljava/lang/String;Ljava/security/cert/Certificate;)V
-HSPLcom/android/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi$StoreEntry;->getObject()Ljava/lang/Object;
-HSPLcom/android/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi$StoreEntry;->getType()I
HSPLcom/android/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi;-><init>(I)V
HSPLcom/android/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi;->engineAliases()Ljava/util/Enumeration;
HSPLcom/android/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi;->engineGetCertificate(Ljava/lang/String;)Ljava/security/cert/Certificate;
HSPLcom/android/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi;->engineLoad(Ljava/io/InputStream;[C)V
HSPLcom/android/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi;->engineSetCertificateEntry(Ljava/lang/String;Ljava/security/cert/Certificate;)V
HSPLcom/android/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi;->engineSize()I
-HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/AES$ECB$1;-><init>()V
-HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/AES$ECB$1;->get()Lcom/android/org/bouncycastle/crypto/BlockCipher;
HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/AES$ECB;-><init>()V
+HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/PBES2AlgorithmParameters$Mappings;->configure(Lcom/android/org/bouncycastle/jcajce/provider/config/ConfigurableProvider;)V
HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BCPBEKey;-><init>(Ljava/lang/String;Lcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;IIIILjavax/crypto/spec/PBEKeySpec;Lcom/android/org/bouncycastle/crypto/CipherParameters;)V
HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BCPBEKey;->getEncoded()[B
HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BCPBEKey;->isDestroyed()Z
@@ -1000,21 +929,18 @@ HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseBlockCipher$
HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseBlockCipher$BufferedGenericBlockCipher;->doFinal([BI)I
HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseBlockCipher$BufferedGenericBlockCipher;->getOutputSize(I)I
HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseBlockCipher$BufferedGenericBlockCipher;->init(ZLcom/android/org/bouncycastle/crypto/CipherParameters;)V
-HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseBlockCipher$BufferedGenericBlockCipher;->processBytes([BII[BI)I
-HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseBlockCipher;-><init>(Lcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BlockCipherProvider;)V
HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseBlockCipher;->engineDoFinal([BII)[B
HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseBlockCipher;->engineGetOutputSize(I)I
HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseBlockCipher;->engineInit(ILjava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)V
-HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseSecretKeyFactory;-><init>(Ljava/lang/String;Lcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;)V
HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseWrapCipher;-><init>()V
HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/PBE$Util;->convertPassword(ILjavax/crypto/spec/PBEKeySpec;)[B
HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/PBE$Util;->makePBEGenerator(II)Lcom/android/org/bouncycastle/crypto/PBEParametersGenerator;
HSPLcom/android/org/bouncycastle/jcajce/provider/symmetric/util/PBE$Util;->makePBEMacParameters(Ljavax/crypto/spec/PBEKeySpec;III)Lcom/android/org/bouncycastle/crypto/CipherParameters;
HSPLcom/android/org/bouncycastle/jcajce/util/BCJcaJceHelper;-><init>()V
-HSPLcom/android/org/bouncycastle/jcajce/util/BCJcaJceHelper;->getBouncyCastleProvider()Ljava/security/Provider;
-HSPLcom/android/org/bouncycastle/jcajce/util/DefaultJcaJceHelper;-><init>()V
-HSPLcom/android/org/bouncycastle/jcajce/util/DefaultJcaJceHelper;->createCertificateFactory(Ljava/lang/String;)Ljava/security/cert/CertificateFactory;
-HSPLcom/android/org/bouncycastle/jcajce/util/ProviderJcaJceHelper;-><init>(Ljava/security/Provider;)V
+HSPLcom/android/org/bouncycastle/jce/provider/BouncyCastleProvider;->addAlgorithm(Ljava/lang/String;Lcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;Ljava/lang/String;)V
+HSPLcom/android/org/bouncycastle/jce/provider/BouncyCastleProvider;->addAlgorithm(Ljava/lang/String;Ljava/lang/String;)V
+HSPLcom/android/org/bouncycastle/jce/provider/BouncyCastleProvider;->addAttributes(Ljava/lang/String;Ljava/util/Map;)V
+HSPLcom/android/org/bouncycastle/jce/provider/BouncyCastleProvider;->loadAlgorithms([Ljava/lang/String;Ljava/lang/String;)V
HSPLcom/android/org/bouncycastle/jce/provider/CertStoreCollectionSpi;-><init>(Ljava/security/cert/CertStoreParameters;)V
HSPLcom/android/org/bouncycastle/util/Arrays;->areEqual([B[B)Z
HSPLcom/android/org/bouncycastle/util/Arrays;->clone([B)[B
@@ -1023,16 +949,10 @@ HSPLcom/android/org/bouncycastle/util/Arrays;->fill([BB)V
HSPLcom/android/org/bouncycastle/util/Arrays;->hashCode([B)I
HSPLcom/android/org/bouncycastle/util/BigIntegers;-><clinit>()V
HSPLcom/android/org/bouncycastle/util/Integers;->valueOf(I)Ljava/lang/Integer;
-HSPLcom/android/org/bouncycastle/util/Pack;->intToBigEndian(I[BI)V
HSPLcom/android/org/bouncycastle/util/Pack;->littleEndianToInt([BI)I
-HSPLcom/android/org/bouncycastle/util/Properties$1;-><init>(Ljava/lang/String;)V
HSPLcom/android/org/bouncycastle/util/Properties$1;->run()Ljava/lang/Object;
HSPLcom/android/org/bouncycastle/util/Properties;->isOverrideSet(Ljava/lang/String;)Z
-HSPLcom/android/org/bouncycastle/util/Strings;->toUTF8ByteArray([C)[B
-HSPLcom/android/org/bouncycastle/util/Strings;->toUTF8ByteArray([CLjava/io/OutputStream;)V
HSPLcom/android/org/bouncycastle/util/Strings;->toUpperCase(Ljava/lang/String;)Ljava/lang/String;
-HSPLcom/android/org/bouncycastle/util/io/Streams;->readFully(Ljava/io/InputStream;[B)I
-HSPLcom/android/org/bouncycastle/util/io/Streams;->readFully(Ljava/io/InputStream;[BII)I
HSPLcom/android/org/kxml2/io/KXmlParser;-><init>()V
HSPLcom/android/org/kxml2/io/KXmlParser;->adjustNsp()Z
HSPLcom/android/org/kxml2/io/KXmlParser;->close()V
@@ -1180,7 +1100,7 @@ HSPLdalvik/system/VMRuntime;->getRuntime()Ldalvik/system/VMRuntime;
HSPLdalvik/system/VMRuntime;->getSdkVersion()I
HSPLdalvik/system/VMRuntime;->getTargetSdkVersion()I
HSPLdalvik/system/VMRuntime;->hiddenApiUsed(ILjava/lang/String;Ljava/lang/String;IZ)V
-HSPLdalvik/system/VMRuntime;->notifyNativeAllocation()V+]Ldalvik/system/VMRuntime;Ldalvik/system/VMRuntime;]Ljava/util/concurrent/atomic/AtomicInteger;Ljava/util/concurrent/atomic/AtomicInteger;
+HSPLdalvik/system/VMRuntime;->notifyNativeAllocation()V
HSPLdalvik/system/VMRuntime;->registerNativeAllocation(I)V
HSPLdalvik/system/VMRuntime;->registerNativeFree(I)V
HSPLdalvik/system/VMRuntime;->runFinalization(J)V
@@ -1291,13 +1211,13 @@ HSPLjava/io/DataInputStream;->read([BII)I
HSPLjava/io/DataInputStream;->readBoolean()Z
HSPLjava/io/DataInputStream;->readByte()B
HSPLjava/io/DataInputStream;->readFully([B)V
-HSPLjava/io/DataInputStream;->readFully([BII)V+]Ljava/io/InputStream;Ljava/io/ByteArrayInputStream;
+HSPLjava/io/DataInputStream;->readFully([BII)V
HSPLjava/io/DataInputStream;->readInt()I
HSPLjava/io/DataInputStream;->readLong()J
-HSPLjava/io/DataInputStream;->readShort()S+]Ljava/io/DataInputStream;Ljava/io/DataInputStream;
+HSPLjava/io/DataInputStream;->readShort()S
HSPLjava/io/DataInputStream;->readUTF()Ljava/lang/String;
HSPLjava/io/DataInputStream;->readUTF(Ljava/io/DataInput;)Ljava/lang/String;
-HSPLjava/io/DataInputStream;->readUnsignedByte()I+]Ljava/io/InputStream;Llibcore/io/ClassPathURLStreamHandler$ClassPathURLConnection$1;
+HSPLjava/io/DataInputStream;->readUnsignedByte()I
HSPLjava/io/DataInputStream;->readUnsignedShort()I
HSPLjava/io/DataInputStream;->skipBytes(I)I
HSPLjava/io/DataOutputStream;-><init>(Ljava/io/OutputStream;)V
@@ -1415,7 +1335,7 @@ HSPLjava/io/FilterInputStream;->available()I
HSPLjava/io/FilterInputStream;->close()V
HSPLjava/io/FilterInputStream;->mark(I)V
HSPLjava/io/FilterInputStream;->markSupported()Z
-HSPLjava/io/FilterInputStream;->read()I+]Ljava/io/InputStream;Ljava/io/BufferedInputStream;,Ljava/io/PushbackInputStream;,Ljava/util/jar/JarVerifier$VerifierStream;
+HSPLjava/io/FilterInputStream;->read()I
HSPLjava/io/FilterInputStream;->read([B)I
HSPLjava/io/FilterInputStream;->read([BII)I
HSPLjava/io/FilterInputStream;->reset()V
@@ -1720,11 +1640,13 @@ HSPLjava/io/ObjectStreamField;-><init>(Ljava/lang/String;Ljava/lang/Class;)V
HSPLjava/io/ObjectStreamField;-><init>(Ljava/lang/String;Ljava/lang/Class;Z)V
HSPLjava/io/ObjectStreamField;-><init>(Ljava/lang/String;Ljava/lang/String;Z)V
HSPLjava/io/ObjectStreamField;-><init>(Ljava/lang/reflect/Field;ZZ)V
+HSPLjava/io/ObjectStreamField;->appendClassSignature(Ljava/lang/StringBuilder;Ljava/lang/Class;)Ljava/lang/StringBuilder;
HSPLjava/io/ObjectStreamField;->compareTo(Ljava/lang/Object;)I
HSPLjava/io/ObjectStreamField;->getClassSignature(Ljava/lang/Class;)Ljava/lang/String;
HSPLjava/io/ObjectStreamField;->getField()Ljava/lang/reflect/Field;
HSPLjava/io/ObjectStreamField;->getName()Ljava/lang/String;
HSPLjava/io/ObjectStreamField;->getOffset()I
+HSPLjava/io/ObjectStreamField;->getPrimitiveSignature(Ljava/lang/Class;)Ljava/lang/String;
HSPLjava/io/ObjectStreamField;->getSignature()Ljava/lang/String;
HSPLjava/io/ObjectStreamField;->getType()Ljava/lang/Class;
HSPLjava/io/ObjectStreamField;->getTypeCode()C
@@ -1789,6 +1711,7 @@ HSPLjava/io/PushbackReader;->ensureOpen()V
HSPLjava/io/PushbackReader;->read()I
HSPLjava/io/PushbackReader;->unread(I)V
HSPLjava/io/RandomAccessFile;-><init>(Ljava/io/File;Ljava/lang/String;)V
+HSPLjava/io/RandomAccessFile;-><init>(Ljava/io/File;Ljava/lang/String;Z)V
HSPLjava/io/RandomAccessFile;-><init>(Ljava/lang/String;Ljava/lang/String;)V
HSPLjava/io/RandomAccessFile;->close()V
HSPLjava/io/RandomAccessFile;->finalize()V
@@ -1805,6 +1728,7 @@ HSPLjava/io/RandomAccessFile;->readBytes([BII)I
HSPLjava/io/RandomAccessFile;->readFully([B)V
HSPLjava/io/RandomAccessFile;->readFully([BII)V
HSPLjava/io/RandomAccessFile;->readInt()I
+HSPLjava/io/RandomAccessFile;->readLine()Ljava/lang/String;
HSPLjava/io/RandomAccessFile;->seek(J)V
HSPLjava/io/RandomAccessFile;->setLength(J)V
HSPLjava/io/RandomAccessFile;->write(I)V
@@ -1874,7 +1798,7 @@ HSPLjava/io/Writer;->append(C)Ljava/io/Writer;
HSPLjava/io/Writer;->append(Ljava/lang/CharSequence;)Ljava/io/Writer;
HSPLjava/io/Writer;->write(Ljava/lang/String;)V
HSPLjava/lang/AbstractStringBuilder;-><init>(I)V
-HSPLjava/lang/AbstractStringBuilder;->append(C)Ljava/lang/AbstractStringBuilder;+]Ljava/lang/AbstractStringBuilder;Ljava/lang/StringBuilder;
+HSPLjava/lang/AbstractStringBuilder;->append(C)Ljava/lang/AbstractStringBuilder;
HSPLjava/lang/AbstractStringBuilder;->append(D)Ljava/lang/AbstractStringBuilder;
HSPLjava/lang/AbstractStringBuilder;->append(F)Ljava/lang/AbstractStringBuilder;
HSPLjava/lang/AbstractStringBuilder;->append(I)Ljava/lang/AbstractStringBuilder;
@@ -1882,11 +1806,11 @@ HSPLjava/lang/AbstractStringBuilder;->append(J)Ljava/lang/AbstractStringBuilder;
HSPLjava/lang/AbstractStringBuilder;->append(Ljava/lang/AbstractStringBuilder;)Ljava/lang/AbstractStringBuilder;
HSPLjava/lang/AbstractStringBuilder;->append(Ljava/lang/CharSequence;)Ljava/lang/AbstractStringBuilder;
HSPLjava/lang/AbstractStringBuilder;->append(Ljava/lang/CharSequence;II)Ljava/lang/AbstractStringBuilder;
-HSPLjava/lang/AbstractStringBuilder;->append(Ljava/lang/String;)Ljava/lang/AbstractStringBuilder;+]Ljava/lang/String;Ljava/lang/String;
+HSPLjava/lang/AbstractStringBuilder;->append(Ljava/lang/String;)Ljava/lang/AbstractStringBuilder;
HSPLjava/lang/AbstractStringBuilder;->append(Ljava/lang/StringBuffer;)Ljava/lang/AbstractStringBuilder;
HSPLjava/lang/AbstractStringBuilder;->append(Z)Ljava/lang/AbstractStringBuilder;
HSPLjava/lang/AbstractStringBuilder;->append([CII)Ljava/lang/AbstractStringBuilder;
-HSPLjava/lang/AbstractStringBuilder;->appendChars(Ljava/lang/CharSequence;II)V+]Ljava/lang/CharSequence;Ljava/lang/String;]Ljava/lang/AbstractStringBuilder;Ljava/lang/StringBuilder;
+HSPLjava/lang/AbstractStringBuilder;->appendChars(Ljava/lang/CharSequence;II)V
HSPLjava/lang/AbstractStringBuilder;->appendChars([CII)V
HSPLjava/lang/AbstractStringBuilder;->appendCodePoint(I)Ljava/lang/AbstractStringBuilder;
HSPLjava/lang/AbstractStringBuilder;->appendNull()Ljava/lang/AbstractStringBuilder;
@@ -1903,6 +1827,7 @@ HSPLjava/lang/AbstractStringBuilder;->getChars(II[CI)V
HSPLjava/lang/AbstractStringBuilder;->getCoder()B
HSPLjava/lang/AbstractStringBuilder;->indexOf(Ljava/lang/String;)I
HSPLjava/lang/AbstractStringBuilder;->indexOf(Ljava/lang/String;I)I
+HSPLjava/lang/AbstractStringBuilder;->inflate()V
HSPLjava/lang/AbstractStringBuilder;->insert(IC)Ljava/lang/AbstractStringBuilder;
HSPLjava/lang/AbstractStringBuilder;->insert(II)Ljava/lang/AbstractStringBuilder;
HSPLjava/lang/AbstractStringBuilder;->insert(ILjava/lang/String;)Ljava/lang/AbstractStringBuilder;
@@ -1910,7 +1835,7 @@ HSPLjava/lang/AbstractStringBuilder;->isLatin1()Z
HSPLjava/lang/AbstractStringBuilder;->lastIndexOf(Ljava/lang/String;I)I
HSPLjava/lang/AbstractStringBuilder;->length()I
HSPLjava/lang/AbstractStringBuilder;->newCapacity(I)I
-HSPLjava/lang/AbstractStringBuilder;->putStringAt(ILjava/lang/String;)V+]Ljava/lang/String;Ljava/lang/String;]Ljava/lang/AbstractStringBuilder;Ljava/lang/StringBuilder;,Ljava/lang/StringBuffer;
+HSPLjava/lang/AbstractStringBuilder;->putStringAt(ILjava/lang/String;)V
HSPLjava/lang/AbstractStringBuilder;->replace(IILjava/lang/String;)Ljava/lang/AbstractStringBuilder;
HSPLjava/lang/AbstractStringBuilder;->reverse()Ljava/lang/AbstractStringBuilder;
HSPLjava/lang/AbstractStringBuilder;->setCharAt(IC)V
@@ -1952,8 +1877,8 @@ HSPLjava/lang/Byte;->toString()Ljava/lang/String;
HSPLjava/lang/Byte;->toString(B)Ljava/lang/String;
HSPLjava/lang/Byte;->toUnsignedInt(B)I
HSPLjava/lang/Byte;->valueOf(B)Ljava/lang/Byte;
-HSPLjava/lang/CaseMapper;->toLowerCase(Ljava/util/Locale;Ljava/lang/String;)Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String;]Ljava/util/Locale;Ljava/util/Locale;
-HSPLjava/lang/CaseMapper;->toUpperCase(Ljava/util/Locale;Ljava/lang/String;I)Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String;]Ljava/util/Locale;Ljava/util/Locale;
+HSPLjava/lang/CaseMapper;->toLowerCase(Ljava/util/Locale;Ljava/lang/String;)Ljava/lang/String;
+HSPLjava/lang/CaseMapper;->toUpperCase(Ljava/util/Locale;Ljava/lang/String;I)Ljava/lang/String;
HSPLjava/lang/CaseMapper;->upperIndex(I)I
HSPLjava/lang/Character$Subset;->equals(Ljava/lang/Object;)Z
HSPLjava/lang/Character$Subset;->hashCode()I
@@ -2032,7 +1957,7 @@ HSPLjava/lang/Class;->getConstructors()[Ljava/lang/reflect/Constructor;
HSPLjava/lang/Class;->getDeclaredConstructor([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;
HSPLjava/lang/Class;->getDeclaredConstructors()[Ljava/lang/reflect/Constructor;
HSPLjava/lang/Class;->getDeclaredMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
-HSPLjava/lang/Class;->getDeclaredMethods()[Ljava/lang/reflect/Method;+]Ljava/lang/reflect/Method;Ljava/lang/reflect/Method;]Ljava/lang/Class;Ljava/lang/Class;
+HSPLjava/lang/Class;->getDeclaredMethods()[Ljava/lang/reflect/Method;
HSPLjava/lang/Class;->getEnclosingConstructor()Ljava/lang/reflect/Constructor;
HSPLjava/lang/Class;->getEnclosingMethod()Ljava/lang/reflect/Method;
HSPLjava/lang/Class;->getEnumConstants()[Ljava/lang/Object;
@@ -2061,10 +1986,10 @@ HSPLjava/lang/Class;->getTypeName()Ljava/lang/String;
HSPLjava/lang/Class;->getTypeParameters()[Ljava/lang/reflect/TypeVariable;
HSPLjava/lang/Class;->isAnnotation()Z
HSPLjava/lang/Class;->isAnnotationPresent(Ljava/lang/Class;)Z
-HSPLjava/lang/Class;->isArray()Z+]Ljava/lang/Class;Ljava/lang/Class;
-HSPLjava/lang/Class;->isAssignableFrom(Ljava/lang/Class;)Z+]Ljava/lang/Class;Ljava/lang/Class;
+HSPLjava/lang/Class;->isArray()Z
+HSPLjava/lang/Class;->isAssignableFrom(Ljava/lang/Class;)Z
HSPLjava/lang/Class;->isEnum()Z
-HSPLjava/lang/Class;->isInstance(Ljava/lang/Object;)Z+]Ljava/lang/Class;Ljava/lang/Class;]Ljava/lang/Object;missing_types
+HSPLjava/lang/Class;->isInstance(Ljava/lang/Object;)Z
HSPLjava/lang/Class;->isInterface()Z
HSPLjava/lang/Class;->isLocalClass()Z
HSPLjava/lang/Class;->isLocalOrAnonymousClass()Z
@@ -2076,7 +2001,9 @@ HSPLjava/lang/Class;->toString()Ljava/lang/String;
HSPLjava/lang/ClassCastException;-><init>(Ljava/lang/String;)V
HSPLjava/lang/ClassLoader;-><init>()V
HSPLjava/lang/ClassLoader;-><init>(Ljava/lang/ClassLoader;)V
+HSPLjava/lang/ClassLoader;-><init>(Ljava/lang/Void;Ljava/lang/String;Ljava/lang/ClassLoader;)V
HSPLjava/lang/ClassLoader;->checkCreateClassLoader()Ljava/lang/Void;
+HSPLjava/lang/ClassLoader;->checkCreateClassLoader(Ljava/lang/String;)Ljava/lang/Void;
HSPLjava/lang/ClassLoader;->definePackage(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/net/URL;)Ljava/lang/Package;
HSPLjava/lang/ClassLoader;->findLoadedClass(Ljava/lang/String;)Ljava/lang/Class;
HSPLjava/lang/ClassLoader;->getClassLoader(Ljava/lang/Class;)Ljava/lang/ClassLoader;
@@ -2090,17 +2017,16 @@ HSPLjava/lang/ClassLoader;->loadClass(Ljava/lang/String;)Ljava/lang/Class;
HSPLjava/lang/ClassLoader;->loadClass(Ljava/lang/String;Z)Ljava/lang/Class;
HSPLjava/lang/ClassNotFoundException;-><init>(Ljava/lang/String;)V
HSPLjava/lang/ClassNotFoundException;-><init>(Ljava/lang/String;Ljava/lang/Throwable;)V
-HSPLjava/lang/ClassNotFoundException;->getCause()Ljava/lang/Throwable;
HSPLjava/lang/Daemons$Daemon;->interrupt(Ljava/lang/Thread;)V
HSPLjava/lang/Daemons$Daemon;->isRunning()Z
HSPLjava/lang/Daemons$Daemon;->run()V
+HSPLjava/lang/Daemons$Daemon;->start()V
HSPLjava/lang/Daemons$Daemon;->startInternal()V
-HSPLjava/lang/Daemons$Daemon;->startPostZygoteFork()V
HSPLjava/lang/Daemons$Daemon;->stop()V
HSPLjava/lang/Daemons$FinalizerDaemon;->-$$Nest$fgetprogressCounter(Ljava/lang/Daemons$FinalizerDaemon;)Ljava/util/concurrent/atomic/AtomicInteger;
HSPLjava/lang/Daemons$FinalizerDaemon;->-$$Nest$sfgetINSTANCE()Ljava/lang/Daemons$FinalizerDaemon;
HSPLjava/lang/Daemons$FinalizerDaemon;->doFinalize(Ljava/lang/ref/FinalizerReference;)V
-HSPLjava/lang/Daemons$FinalizerDaemon;->processReference(Ljava/lang/Object;)V+]Ljava/lang/ref/FinalizerReference;Ljava/lang/ref/FinalizerReference;
+HSPLjava/lang/Daemons$FinalizerDaemon;->processReference(Ljava/lang/Object;)V
HSPLjava/lang/Daemons$FinalizerDaemon;->runInternal()V
HSPLjava/lang/Daemons$FinalizerWatchdogDaemon;->-$$Nest$mmonitoringNeeded(Ljava/lang/Daemons$FinalizerWatchdogDaemon;I)V
HSPLjava/lang/Daemons$FinalizerWatchdogDaemon;->-$$Nest$mmonitoringNotNeeded(Ljava/lang/Daemons$FinalizerWatchdogDaemon;I)V
@@ -2118,7 +2044,9 @@ HSPLjava/lang/Daemons$HeapTaskDaemon;->runInternal()V
HSPLjava/lang/Daemons$ReferenceQueueDaemon;->-$$Nest$fgetprogressCounter(Ljava/lang/Daemons$ReferenceQueueDaemon;)Ljava/util/concurrent/atomic/AtomicInteger;
HSPLjava/lang/Daemons$ReferenceQueueDaemon;->-$$Nest$sfgetINSTANCE()Ljava/lang/Daemons$ReferenceQueueDaemon;
HSPLjava/lang/Daemons$ReferenceQueueDaemon;->runInternal()V
-HSPLjava/lang/Daemons;->-$$Nest$sfgetPOST_ZYGOTE_START_LATCH()Ljava/util/concurrent/CountDownLatch;
+HSPLjava/lang/Daemons;->-$$Nest$sfgetpostZygoteFork()Z
+HSPLjava/lang/Daemons;->-$$Nest$sfgetzygoteStartLatch()Ljava/util/concurrent/CountDownLatch;
+HSPLjava/lang/Daemons;->start()V
HSPLjava/lang/Daemons;->startPostZygoteFork()V
HSPLjava/lang/Daemons;->stop()V
HSPLjava/lang/Double;-><init>(D)V
@@ -2242,7 +2170,7 @@ HSPLjava/lang/Integer;->valueOf(I)Ljava/lang/Integer;
HSPLjava/lang/Integer;->valueOf(Ljava/lang/String;)Ljava/lang/Integer;
HSPLjava/lang/Integer;->valueOf(Ljava/lang/String;I)Ljava/lang/Integer;
HSPLjava/lang/InterruptedException;-><init>()V
-HSPLjava/lang/Iterable;->forEach(Ljava/util/function/Consumer;)V+]Ljava/lang/Iterable;Ljava/util/HashSet;,Ljava/util/WeakHashMap$KeySet;]Ljava/util/Iterator;missing_types]Ljava/util/function/Consumer;missing_types
+HSPLjava/lang/Iterable;->forEach(Ljava/util/function/Consumer;)V+]Ljava/lang/Iterable;megamorphic_types]Ljava/util/Iterator;megamorphic_types]Ljava/util/function/Consumer;missing_types
HSPLjava/lang/LinkageError;-><init>(Ljava/lang/String;)V
HSPLjava/lang/Long;-><init>(J)V
HSPLjava/lang/Long;->bitCount(J)I
@@ -2269,7 +2197,7 @@ HSPLjava/lang/Long;->numberOfLeadingZeros(J)I
HSPLjava/lang/Long;->numberOfTrailingZeros(J)I
HSPLjava/lang/Long;->parseLong(Ljava/lang/CharSequence;III)J
HSPLjava/lang/Long;->parseLong(Ljava/lang/String;)J
-HSPLjava/lang/Long;->parseLong(Ljava/lang/String;I)J+]Ljava/lang/String;Ljava/lang/String;
+HSPLjava/lang/Long;->parseLong(Ljava/lang/String;I)J
HSPLjava/lang/Long;->reverse(J)J
HSPLjava/lang/Long;->reverseBytes(J)J
HSPLjava/lang/Long;->rotateLeft(JI)J
@@ -2310,6 +2238,7 @@ HSPLjava/lang/Math;->min(DD)D
HSPLjava/lang/Math;->min(FF)F
HSPLjava/lang/Math;->min(II)I
HSPLjava/lang/Math;->min(JJ)J
+HSPLjava/lang/Math;->multiplyExact(II)I
HSPLjava/lang/Math;->multiplyExact(JI)J
HSPLjava/lang/Math;->multiplyExact(JJ)J
HSPLjava/lang/Math;->multiplyHigh(JJ)J
@@ -2409,34 +2338,34 @@ HSPLjava/lang/String;->checkOffset(II)V
HSPLjava/lang/String;->codePointAt(I)I
HSPLjava/lang/String;->codePointCount(II)I
HSPLjava/lang/String;->coder()B
-HSPLjava/lang/String;->compareTo(Ljava/lang/Object;)I+]Ljava/lang/String;Ljava/lang/String;
+HSPLjava/lang/String;->compareTo(Ljava/lang/Object;)I
HSPLjava/lang/String;->compareToIgnoreCase(Ljava/lang/String;)I
HSPLjava/lang/String;->contains(Ljava/lang/CharSequence;)Z
HSPLjava/lang/String;->contentEquals(Ljava/lang/CharSequence;)Z
HSPLjava/lang/String;->copyValueOf([C)Ljava/lang/String;
HSPLjava/lang/String;->endsWith(Ljava/lang/String;)Z
-HSPLjava/lang/String;->equals(Ljava/lang/Object;)Z+]Ljava/lang/String;Ljava/lang/String;
+HSPLjava/lang/String;->equals(Ljava/lang/Object;)Z
HSPLjava/lang/String;->equalsIgnoreCase(Ljava/lang/String;)Z
HSPLjava/lang/String;->format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;
HSPLjava/lang/String;->format(Ljava/util/Locale;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;
HSPLjava/lang/String;->getBytes()[B
HSPLjava/lang/String;->getBytes(Ljava/lang/String;)[B
-HSPLjava/lang/String;->getBytes(Ljava/nio/charset/Charset;)[B+]Ljava/lang/String;Ljava/lang/String;]Ljava/nio/charset/Charset;Lcom/android/icu/charset/CharsetICU;
-HSPLjava/lang/String;->getBytes([BIB)V+]Ljava/lang/String;Ljava/lang/String;
+HSPLjava/lang/String;->getBytes(Ljava/nio/charset/Charset;)[B
+HSPLjava/lang/String;->getBytes([BIB)V
HSPLjava/lang/String;->getChars(II[CI)V
HSPLjava/lang/String;->getChars([CI)V
-HSPLjava/lang/String;->hashCode()I+]Ljava/lang/String;Ljava/lang/String;
+HSPLjava/lang/String;->hashCode()I
HSPLjava/lang/String;->indexOf(I)I
-HSPLjava/lang/String;->indexOf(II)I+]Ljava/lang/String;Ljava/lang/String;
-HSPLjava/lang/String;->indexOf(Ljava/lang/String;)I+]Ljava/lang/String;Ljava/lang/String;
+HSPLjava/lang/String;->indexOf(II)I
+HSPLjava/lang/String;->indexOf(Ljava/lang/String;)I
HSPLjava/lang/String;->indexOf(Ljava/lang/String;I)I
-HSPLjava/lang/String;->indexOf(Ljava/lang/String;Ljava/lang/String;I)I+]Ljava/lang/String;Ljava/lang/String;
+HSPLjava/lang/String;->indexOf(Ljava/lang/String;Ljava/lang/String;I)I
HSPLjava/lang/String;->indexOf([BBILjava/lang/String;I)I
HSPLjava/lang/String;->isEmpty()Z
HSPLjava/lang/String;->join(Ljava/lang/CharSequence;Ljava/lang/Iterable;)Ljava/lang/String;
HSPLjava/lang/String;->join(Ljava/lang/CharSequence;[Ljava/lang/CharSequence;)Ljava/lang/String;
HSPLjava/lang/String;->lastIndexOf(I)I
-HSPLjava/lang/String;->lastIndexOf(II)I+]Ljava/lang/String;Ljava/lang/String;
+HSPLjava/lang/String;->lastIndexOf(II)I
HSPLjava/lang/String;->lastIndexOf(Ljava/lang/String;)I
HSPLjava/lang/String;->lastIndexOf(Ljava/lang/String;I)I
HSPLjava/lang/String;->lastIndexOf(Ljava/lang/String;Ljava/lang/String;I)I
@@ -2453,10 +2382,10 @@ HSPLjava/lang/String;->replaceFirst(Ljava/lang/String;Ljava/lang/String;)Ljava/l
HSPLjava/lang/String;->split(Ljava/lang/String;)[Ljava/lang/String;
HSPLjava/lang/String;->split(Ljava/lang/String;I)[Ljava/lang/String;
HSPLjava/lang/String;->startsWith(Ljava/lang/String;)Z
-HSPLjava/lang/String;->startsWith(Ljava/lang/String;I)Z+]Ljava/lang/String;Ljava/lang/String;
+HSPLjava/lang/String;->startsWith(Ljava/lang/String;I)Z
HSPLjava/lang/String;->subSequence(II)Ljava/lang/CharSequence;
HSPLjava/lang/String;->substring(I)Ljava/lang/String;
-HSPLjava/lang/String;->substring(II)Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String;
+HSPLjava/lang/String;->substring(II)Ljava/lang/String;
HSPLjava/lang/String;->toLowerCase()Ljava/lang/String;
HSPLjava/lang/String;->toLowerCase(Ljava/util/Locale;)Ljava/lang/String;
HSPLjava/lang/String;->toString()Ljava/lang/String;
@@ -2477,6 +2406,7 @@ HSPLjava/lang/StringBuffer;-><init>(Ljava/lang/String;)V
HSPLjava/lang/StringBuffer;->append(C)Ljava/lang/StringBuffer;
HSPLjava/lang/StringBuffer;->append(I)Ljava/lang/StringBuffer;
HSPLjava/lang/StringBuffer;->append(J)Ljava/lang/StringBuffer;
+HSPLjava/lang/StringBuffer;->append(Ljava/lang/AbstractStringBuilder;)Ljava/lang/AbstractStringBuilder;
HSPLjava/lang/StringBuffer;->append(Ljava/lang/AbstractStringBuilder;)Ljava/lang/StringBuffer;
HSPLjava/lang/StringBuffer;->append(Ljava/lang/CharSequence;)Ljava/lang/Appendable;
HSPLjava/lang/StringBuffer;->append(Ljava/lang/CharSequence;)Ljava/lang/StringBuffer;
@@ -2494,12 +2424,12 @@ HSPLjava/lang/StringBuffer;->getBytes([BIB)V
HSPLjava/lang/StringBuffer;->getChars(II[CI)V
HSPLjava/lang/StringBuffer;->length()I
HSPLjava/lang/StringBuffer;->setLength(I)V
-HSPLjava/lang/StringBuffer;->toString()Ljava/lang/String;+]Ljava/lang/StringBuffer;Ljava/lang/StringBuffer;
+HSPLjava/lang/StringBuffer;->toString()Ljava/lang/String;
HSPLjava/lang/StringBuilder;-><init>()V
HSPLjava/lang/StringBuilder;-><init>(I)V
HSPLjava/lang/StringBuilder;-><init>(Ljava/lang/CharSequence;)V
HSPLjava/lang/StringBuilder;-><init>(Ljava/lang/String;)V
-HSPLjava/lang/StringBuilder;->append(C)Ljava/lang/AbstractStringBuilder;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
+HSPLjava/lang/StringBuilder;->append(C)Ljava/lang/AbstractStringBuilder;
HSPLjava/lang/StringBuilder;->append(C)Ljava/lang/Appendable;
HSPLjava/lang/StringBuilder;->append(C)Ljava/lang/StringBuilder;
HSPLjava/lang/StringBuilder;->append(D)Ljava/lang/StringBuilder;
@@ -2511,7 +2441,7 @@ HSPLjava/lang/StringBuilder;->append(Ljava/lang/CharSequence;)Ljava/lang/StringB
HSPLjava/lang/StringBuilder;->append(Ljava/lang/CharSequence;II)Ljava/lang/AbstractStringBuilder;
HSPLjava/lang/StringBuilder;->append(Ljava/lang/CharSequence;II)Ljava/lang/Appendable;
HSPLjava/lang/StringBuilder;->append(Ljava/lang/CharSequence;II)Ljava/lang/StringBuilder;
-HSPLjava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
+HSPLjava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder;
HSPLjava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/AbstractStringBuilder;
HSPLjava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
HSPLjava/lang/StringBuilder;->append(Z)Ljava/lang/StringBuilder;
@@ -2538,7 +2468,7 @@ HSPLjava/lang/StringBuilder;->setLength(I)V
HSPLjava/lang/StringBuilder;->subSequence(II)Ljava/lang/CharSequence;
HSPLjava/lang/StringBuilder;->substring(I)Ljava/lang/String;
HSPLjava/lang/StringBuilder;->substring(II)Ljava/lang/String;
-HSPLjava/lang/StringBuilder;->toString()Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;
+HSPLjava/lang/StringBuilder;->toString()Ljava/lang/String;
HSPLjava/lang/StringFactory;->newEmptyString()Ljava/lang/String;
HSPLjava/lang/StringFactory;->newStringFromBytes([B)Ljava/lang/String;
HSPLjava/lang/StringFactory;->newStringFromBytes([BI)Ljava/lang/String;
@@ -2556,13 +2486,16 @@ HSPLjava/lang/StringLatin1;->lastIndexOf([BILjava/lang/String;II)I
HSPLjava/lang/StringLatin1;->newString([BII)Ljava/lang/String;
HSPLjava/lang/StringUTF16;->checkBoundsBeginEnd(II[B)V
HSPLjava/lang/StringUTF16;->checkBoundsOffCount(II[B)V
+HSPLjava/lang/StringUTF16;->checkIndex(I[B)V
HSPLjava/lang/StringUTF16;->getChar([BI)C
HSPLjava/lang/StringUTF16;->getChars(II[B)I
HSPLjava/lang/StringUTF16;->getChars([BII[CI)V
HSPLjava/lang/StringUTF16;->inflate([BI[BII)V
HSPLjava/lang/StringUTF16;->length([B)I
HSPLjava/lang/StringUTF16;->newBytesFor(I)[B
+HSPLjava/lang/StringUTF16;->newString([BII)Ljava/lang/String;
HSPLjava/lang/StringUTF16;->putChar([BII)V
+HSPLjava/lang/StringUTF16;->putCharSB([BII)V
HSPLjava/lang/System$PropertiesWithNonOverrideableDefaults;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
HSPLjava/lang/System$PropertiesWithNonOverrideableDefaults;->remove(Ljava/lang/Object;)Ljava/lang/Object;
HSPLjava/lang/System;->arraycopy([BI[BII)V
@@ -2662,8 +2595,8 @@ HSPLjava/lang/ThreadLocal$ThreadLocalMap;-><init>(Ljava/lang/ThreadLocal;Ljava/l
HSPLjava/lang/ThreadLocal$ThreadLocalMap;->cleanSomeSlots(II)Z
HSPLjava/lang/ThreadLocal$ThreadLocalMap;->expungeStaleEntries()V
HSPLjava/lang/ThreadLocal$ThreadLocalMap;->expungeStaleEntry(I)I
-HSPLjava/lang/ThreadLocal$ThreadLocalMap;->getEntry(Ljava/lang/ThreadLocal;)Ljava/lang/ThreadLocal$ThreadLocalMap$Entry;+]Ljava/lang/ThreadLocal$ThreadLocalMap$Entry;Ljava/lang/ThreadLocal$ThreadLocalMap$Entry;
-HSPLjava/lang/ThreadLocal$ThreadLocalMap;->getEntryAfterMiss(Ljava/lang/ThreadLocal;ILjava/lang/ThreadLocal$ThreadLocalMap$Entry;)Ljava/lang/ThreadLocal$ThreadLocalMap$Entry;+]Ljava/lang/ThreadLocal$ThreadLocalMap$Entry;Ljava/lang/ThreadLocal$ThreadLocalMap$Entry;
+HSPLjava/lang/ThreadLocal$ThreadLocalMap;->getEntry(Ljava/lang/ThreadLocal;)Ljava/lang/ThreadLocal$ThreadLocalMap$Entry;
+HSPLjava/lang/ThreadLocal$ThreadLocalMap;->getEntryAfterMiss(Ljava/lang/ThreadLocal;ILjava/lang/ThreadLocal$ThreadLocalMap$Entry;)Ljava/lang/ThreadLocal$ThreadLocalMap$Entry;
HSPLjava/lang/ThreadLocal$ThreadLocalMap;->nextIndex(II)I
HSPLjava/lang/ThreadLocal$ThreadLocalMap;->prevIndex(II)I
HSPLjava/lang/ThreadLocal$ThreadLocalMap;->rehash()V
@@ -2676,7 +2609,7 @@ HSPLjava/lang/ThreadLocal;->-$$Nest$fgetthreadLocalHashCode(Ljava/lang/ThreadLoc
HSPLjava/lang/ThreadLocal;-><init>()V
HSPLjava/lang/ThreadLocal;->createInheritedMap(Ljava/lang/ThreadLocal$ThreadLocalMap;)Ljava/lang/ThreadLocal$ThreadLocalMap;
HSPLjava/lang/ThreadLocal;->createMap(Ljava/lang/Thread;Ljava/lang/Object;)V
-HSPLjava/lang/ThreadLocal;->get()Ljava/lang/Object;+]Ljava/lang/ThreadLocal;missing_types
+HSPLjava/lang/ThreadLocal;->get()Ljava/lang/Object;
HSPLjava/lang/ThreadLocal;->getMap(Ljava/lang/Thread;)Ljava/lang/ThreadLocal$ThreadLocalMap;
HSPLjava/lang/ThreadLocal;->initialValue()Ljava/lang/Object;
HSPLjava/lang/ThreadLocal;->nextHashCode()I
@@ -2738,6 +2671,7 @@ HSPLjava/lang/UNIXProcess;->waitFor()I
HSPLjava/lang/UnsatisfiedLinkError;-><init>(Ljava/lang/String;)V
HSPLjava/lang/UnsupportedOperationException;-><init>()V
HSPLjava/lang/UnsupportedOperationException;-><init>(Ljava/lang/String;)V
+HPLjava/lang/VMClassLoader;->createBootClassPathUrlHandlers()[Llibcore/io/ClassPathURLStreamHandler;
HSPLjava/lang/VMClassLoader;->getResource(Ljava/lang/String;)Ljava/net/URL;
HSPLjava/lang/VMClassLoader;->getResources(Ljava/lang/String;)Ljava/util/List;
HSPLjava/lang/invoke/FieldVarHandle;-><init>(Ljava/lang/reflect/Field;Ljava/lang/Class;)V
@@ -2794,6 +2728,9 @@ HSPLjava/lang/invoke/VarHandle;->fullFence()V
HSPLjava/lang/invoke/VarHandle;->loadLoadFence()V
HSPLjava/lang/invoke/VarHandle;->releaseFence()V
HSPLjava/lang/invoke/VarHandle;->storeStoreFence()V
+HSPLjava/lang/ref/Cleaner$1;->apply(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLjava/lang/ref/Cleaner$1;->apply(Ljava/lang/ref/Cleaner;)Ljdk/internal/ref/CleanerImpl;
+HSPLjava/lang/ref/Cleaner;->register(Ljava/lang/Object;Ljava/lang/Runnable;)Ljava/lang/ref/Cleaner$Cleanable;
HSPLjava/lang/ref/FinalizerReference$Sentinel;-><init>()V
HSPLjava/lang/ref/FinalizerReference$Sentinel;-><init>(Ljava/lang/ref/FinalizerReference$Sentinel-IA;)V
HSPLjava/lang/ref/FinalizerReference$Sentinel;->awaitFinalization(J)V
@@ -2816,7 +2753,7 @@ HSPLjava/lang/ref/Reference;->refersTo(Ljava/lang/Object;)Z
HSPLjava/lang/ref/ReferenceQueue;-><init>()V
HSPLjava/lang/ref/ReferenceQueue;->add(Ljava/lang/ref/Reference;)V
HSPLjava/lang/ref/ReferenceQueue;->enqueueLocked(Ljava/lang/ref/Reference;)Z
-HSPLjava/lang/ref/ReferenceQueue;->enqueuePending(Ljava/lang/ref/Reference;Ljava/util/concurrent/atomic/AtomicInteger;)V+]Ljava/lang/Object;Ljava/lang/Object;]Ljava/util/concurrent/atomic/AtomicInteger;Ljava/util/concurrent/atomic/AtomicInteger;]Lsun/misc/Cleaner;Lsun/misc/Cleaner;
+HSPLjava/lang/ref/ReferenceQueue;->enqueuePending(Ljava/lang/ref/Reference;Ljava/util/concurrent/atomic/AtomicInteger;)V
HSPLjava/lang/ref/ReferenceQueue;->poll()Ljava/lang/ref/Reference;
HSPLjava/lang/ref/ReferenceQueue;->reallyPollLocked()Ljava/lang/ref/Reference;
HSPLjava/lang/ref/ReferenceQueue;->remove()Ljava/lang/ref/Reference;
@@ -2895,10 +2832,10 @@ HSPLjava/lang/reflect/Method;->getDeclaringClass()Ljava/lang/Class;
HSPLjava/lang/reflect/Method;->getGenericParameterTypes()[Ljava/lang/reflect/Type;
HSPLjava/lang/reflect/Method;->getGenericReturnType()Ljava/lang/reflect/Type;
HSPLjava/lang/reflect/Method;->getModifiers()I
-HSPLjava/lang/reflect/Method;->getName()Ljava/lang/String;+]Ljava/lang/reflect/Method;Ljava/lang/reflect/Method;
+HSPLjava/lang/reflect/Method;->getName()Ljava/lang/String;
HSPLjava/lang/reflect/Method;->getParameterAnnotations()[[Ljava/lang/annotation/Annotation;
HSPLjava/lang/reflect/Method;->getParameterTypes()[Ljava/lang/Class;
-HSPLjava/lang/reflect/Method;->getReturnType()Ljava/lang/Class;+]Ljava/lang/reflect/Method;Ljava/lang/reflect/Method;
+HSPLjava/lang/reflect/Method;->getReturnType()Ljava/lang/Class;
HSPLjava/lang/reflect/Method;->hashCode()I
HSPLjava/lang/reflect/Method;->isBridge()Z
HSPLjava/lang/reflect/Method;->isDefault()Z
@@ -3605,6 +3542,7 @@ HSPLjava/nio/Buffer;->capacity()I
HSPLjava/nio/Buffer;->checkBounds(III)V
HSPLjava/nio/Buffer;->checkIndex(I)I
HSPLjava/nio/Buffer;->checkIndex(II)I
+HSPLjava/nio/Buffer;->checkScope()V
HSPLjava/nio/Buffer;->clear()Ljava/nio/Buffer;
HSPLjava/nio/Buffer;->discardMark()V
HSPLjava/nio/Buffer;->flip()Ljava/nio/Buffer;
@@ -3645,6 +3583,7 @@ HSPLjava/nio/ByteBuffer;->order(Ljava/nio/ByteOrder;)Ljava/nio/ByteBuffer;
HSPLjava/nio/ByteBuffer;->position(I)Ljava/nio/Buffer;
HSPLjava/nio/ByteBuffer;->put(Ljava/nio/ByteBuffer;)Ljava/nio/ByteBuffer;
HSPLjava/nio/ByteBuffer;->put([B)Ljava/nio/ByteBuffer;
+HSPLjava/nio/ByteBuffer;->putBuffer(ILjava/nio/ByteBuffer;II)V+]Ljava/nio/ByteBuffer;Ljava/nio/DirectByteBuffer;,Ljava/nio/HeapByteBuffer;
HSPLjava/nio/ByteBuffer;->reset()Ljava/nio/Buffer;
HSPLjava/nio/ByteBuffer;->rewind()Ljava/nio/Buffer;
HSPLjava/nio/ByteBuffer;->wrap([B)Ljava/nio/ByteBuffer;
@@ -3681,7 +3620,7 @@ HSPLjava/nio/CharBuffer;-><init>(IIII[CI)V
HSPLjava/nio/CharBuffer;->allocate(I)Ljava/nio/CharBuffer;
HSPLjava/nio/CharBuffer;->array()[C
HSPLjava/nio/CharBuffer;->arrayOffset()I
-HSPLjava/nio/CharBuffer;->charAt(I)C+]Ljava/nio/CharBuffer;Ljava/nio/HeapCharBuffer;,Ljava/nio/ByteBufferAsCharBuffer;
+HSPLjava/nio/CharBuffer;->charAt(I)C
HSPLjava/nio/CharBuffer;->clear()Ljava/nio/Buffer;
HSPLjava/nio/CharBuffer;->flip()Ljava/nio/Buffer;
HSPLjava/nio/CharBuffer;->get([C)Ljava/nio/CharBuffer;
@@ -3786,6 +3725,7 @@ HSPLjava/nio/HeapByteBuffer;->isReadOnly()Z
HSPLjava/nio/HeapByteBuffer;->ix(I)I
HSPLjava/nio/HeapByteBuffer;->put(B)Ljava/nio/ByteBuffer;
HSPLjava/nio/HeapByteBuffer;->put(IB)Ljava/nio/ByteBuffer;
+HSPLjava/nio/HeapByteBuffer;->put(Ljava/nio/ByteBuffer;)Ljava/nio/ByteBuffer;
HSPLjava/nio/HeapByteBuffer;->put([BII)Ljava/nio/ByteBuffer;
HSPLjava/nio/HeapByteBuffer;->putChar(C)Ljava/nio/ByteBuffer;
HSPLjava/nio/HeapByteBuffer;->putFloat(F)Ljava/nio/ByteBuffer;
@@ -3796,6 +3736,7 @@ HSPLjava/nio/HeapByteBuffer;->putLong(J)Ljava/nio/ByteBuffer;
HSPLjava/nio/HeapByteBuffer;->putShort(IS)Ljava/nio/ByteBuffer;
HSPLjava/nio/HeapByteBuffer;->putShort(S)Ljava/nio/ByteBuffer;
HSPLjava/nio/HeapByteBuffer;->slice()Ljava/nio/ByteBuffer;
+HSPLjava/nio/HeapByteBuffer;->throwIfReadOnly()V
HSPLjava/nio/HeapCharBuffer;-><init>(II)V
HSPLjava/nio/HeapCharBuffer;-><init>(IIZ)V
HSPLjava/nio/HeapCharBuffer;-><init>([CII)V
@@ -3806,6 +3747,7 @@ HSPLjava/nio/HeapCharBuffer;->ix(I)I
HSPLjava/nio/HeapCharBuffer;->put(Ljava/nio/CharBuffer;)Ljava/nio/CharBuffer;
HSPLjava/nio/HeapCharBuffer;->put([CII)Ljava/nio/CharBuffer;
HSPLjava/nio/HeapCharBuffer;->slice()Ljava/nio/CharBuffer;
+HSPLjava/nio/HeapCharBuffer;->throwIfReadOnly()V
HSPLjava/nio/HeapCharBuffer;->toString(II)Ljava/lang/String;
HSPLjava/nio/IntBuffer;-><init>(IIII)V
HSPLjava/nio/IntBuffer;-><init>(IIII[II)V
@@ -3823,12 +3765,18 @@ HSPLjava/nio/LongBuffer;->get([J)Ljava/nio/LongBuffer;
HSPLjava/nio/LongBuffer;->limit(I)Ljava/nio/Buffer;
HSPLjava/nio/LongBuffer;->position(I)Ljava/nio/Buffer;
HSPLjava/nio/MappedByteBuffer;-><init>(IIII)V
+HSPLjava/nio/MappedByteBuffer;-><init>(IIIILjava/io/FileDescriptor;Z)V
HSPLjava/nio/MappedByteBuffer;-><init>(IIII[BI)V
HSPLjava/nio/MappedByteBuffer;->checkMapped()V
+HSPLjava/nio/MappedByteBuffer;->clear()Ljava/nio/Buffer;
+HSPLjava/nio/MappedByteBuffer;->flip()Ljava/nio/Buffer;
+HSPLjava/nio/MappedByteBuffer;->limit(I)Ljava/nio/Buffer;
HSPLjava/nio/MappedByteBuffer;->load()Ljava/nio/MappedByteBuffer;
HSPLjava/nio/MappedByteBuffer;->mappingAddress(J)J
HSPLjava/nio/MappedByteBuffer;->mappingLength(J)J
HSPLjava/nio/MappedByteBuffer;->mappingOffset()J
+HSPLjava/nio/MappedByteBuffer;->position(I)Ljava/nio/Buffer;
+HSPLjava/nio/MappedByteBuffer;->rewind()Ljava/nio/Buffer;
HSPLjava/nio/NIOAccess;->getBaseArray(Ljava/nio/Buffer;)Ljava/lang/Object;
HSPLjava/nio/NIOAccess;->getBaseArrayOffset(Ljava/nio/Buffer;)I
HSPLjava/nio/NioUtils;->freeDirectBuffer(Ljava/nio/ByteBuffer;)V
@@ -3914,7 +3862,7 @@ HSPLjava/nio/charset/Charset;->equals(Ljava/lang/Object;)Z
HSPLjava/nio/charset/Charset;->forName(Ljava/lang/String;)Ljava/nio/charset/Charset;
HSPLjava/nio/charset/Charset;->forNameUEE(Ljava/lang/String;)Ljava/nio/charset/Charset;
HSPLjava/nio/charset/Charset;->isSupported(Ljava/lang/String;)Z
-HSPLjava/nio/charset/Charset;->lookup(Ljava/lang/String;)Ljava/nio/charset/Charset;+]Ljava/lang/String;Ljava/lang/String;]Ljava/util/Map$Entry;Ljava/util/AbstractMap$SimpleImmutableEntry;
+HSPLjava/nio/charset/Charset;->lookup(Ljava/lang/String;)Ljava/nio/charset/Charset;
HSPLjava/nio/charset/Charset;->lookup2(Ljava/lang/String;)Ljava/nio/charset/Charset;
HSPLjava/nio/charset/Charset;->name()Ljava/lang/String;
HSPLjava/nio/charset/CharsetDecoder;-><init>(Ljava/nio/charset/Charset;FF)V
@@ -3986,6 +3934,8 @@ HSPLjava/nio/file/Paths;->get(Ljava/lang/String;[Ljava/lang/String;)Ljava/nio/fi
HSPLjava/nio/file/StandardOpenOption;->values()[Ljava/nio/file/StandardOpenOption;
HSPLjava/nio/file/attribute/FileTime;-><init>(JLjava/util/concurrent/TimeUnit;Ljava/time/Instant;)V
HSPLjava/nio/file/attribute/FileTime;->append(Ljava/lang/StringBuilder;II)Ljava/lang/StringBuilder;
+HSPLjava/nio/file/attribute/FileTime;->compareTo(Ljava/nio/file/attribute/FileTime;)I
+HSPLjava/nio/file/attribute/FileTime;->equals(Ljava/lang/Object;)Z
HSPLjava/nio/file/attribute/FileTime;->from(JLjava/util/concurrent/TimeUnit;)Ljava/nio/file/attribute/FileTime;
HSPLjava/nio/file/attribute/FileTime;->toMillis()J
HSPLjava/nio/file/attribute/FileTime;->toString()Ljava/lang/String;
@@ -4077,6 +4027,7 @@ HSPLjava/security/Provider$Service;->addAttribute(Ljava/lang/String;Ljava/lang/S
HSPLjava/security/Provider$Service;->getAlgorithm()Ljava/lang/String;
HSPLjava/security/Provider$Service;->getAttribute(Ljava/lang/String;)Ljava/lang/String;
HSPLjava/security/Provider$Service;->getClassName()Ljava/lang/String;
+HSPLjava/security/Provider$Service;->getDefaultConstructor()Ljava/lang/reflect/Constructor;
HSPLjava/security/Provider$Service;->getImplClass()Ljava/lang/Class;
HSPLjava/security/Provider$Service;->getKeyClass(Ljava/lang/String;)Ljava/lang/Class;
HSPLjava/security/Provider$Service;->getProvider()Ljava/security/Provider;
@@ -4084,6 +4035,8 @@ HSPLjava/security/Provider$Service;->getType()Ljava/lang/String;
HSPLjava/security/Provider$Service;->hasKeyAttributes()Z
HSPLjava/security/Provider$Service;->isValid()Z
HSPLjava/security/Provider$Service;->newInstance(Ljava/lang/Object;)Ljava/lang/Object;
+HSPLjava/security/Provider$Service;->newInstanceOf()Ljava/lang/Object;
+HSPLjava/security/Provider$Service;->newInstanceUtil(Ljava/lang/Class;Ljava/lang/Object;)Ljava/lang/Object;
HSPLjava/security/Provider$Service;->supportsKeyClass(Ljava/security/Key;)Z
HSPLjava/security/Provider$Service;->supportsKeyFormat(Ljava/security/Key;)Z
HSPLjava/security/Provider$Service;->supportsParameter(Ljava/lang/Object;)Z
@@ -4095,6 +4048,7 @@ HSPLjava/security/Provider$ServiceKey;->matches(Ljava/lang/String;Ljava/lang/Str
HSPLjava/security/Provider$UString;-><init>(Ljava/lang/String;)V
HSPLjava/security/Provider$UString;->equals(Ljava/lang/Object;)Z
HSPLjava/security/Provider$UString;->hashCode()I
+HSPLjava/security/Provider;->-$$Nest$sfgetEMPTY()[Ljava/lang/Object;
HSPLjava/security/Provider;->-$$Nest$sfgetknownEngines()Ljava/util/Map;
HSPLjava/security/Provider;-><init>(Ljava/lang/String;DLjava/lang/String;)V
HSPLjava/security/Provider;->check(Ljava/lang/String;)V
@@ -4103,11 +4057,12 @@ HSPLjava/security/Provider;->checkLegacy(Ljava/lang/Object;)Z
HSPLjava/security/Provider;->ensureLegacyParsed()V
HSPLjava/security/Provider;->getEngineName(Ljava/lang/String;)Ljava/lang/String;
HSPLjava/security/Provider;->getName()Ljava/lang/String;
+HSPLjava/security/Provider;->getProperty(Ljava/lang/String;)Ljava/lang/String;
HSPLjava/security/Provider;->getService(Ljava/lang/String;Ljava/lang/String;)Ljava/security/Provider$Service;
HSPLjava/security/Provider;->getServices()Ljava/util/Set;
HSPLjava/security/Provider;->getTypeAndAlgorithm(Ljava/lang/String;)[Ljava/lang/String;
HSPLjava/security/Provider;->implPut(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/security/Provider;->parseLegacyPut(Ljava/lang/String;Ljava/lang/String;)V+]Ljava/lang/String;Ljava/lang/String;]Ljava/security/Provider$Service;Ljava/security/Provider$Service;]Ljava/util/Map;Ljava/util/LinkedHashMap;
+HSPLjava/security/Provider;->parseLegacyPut(Ljava/lang/String;Ljava/lang/String;)V
HSPLjava/security/Provider;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
HSPLjava/security/Provider;->putId()V
HSPLjava/security/Provider;->removeInvalidServices(Ljava/util/Map;)V
@@ -4118,7 +4073,7 @@ HSPLjava/security/SecureRandom;->getDefaultPRNG(Z[B)V
HSPLjava/security/SecureRandom;->getInstance(Ljava/lang/String;)Ljava/security/SecureRandom;
HSPLjava/security/SecureRandom;->getPrngAlgorithm()Ljava/lang/String;
HSPLjava/security/SecureRandom;->getProvider()Ljava/security/Provider;
-HSPLjava/security/SecureRandom;->getSecureRandomSpi()Ljava/security/SecureRandomSpi;
+HSPLjava/security/SecureRandom;->getThreadSafe()Z
HSPLjava/security/SecureRandom;->next(I)I
HSPLjava/security/SecureRandom;->nextBytes([B)V
HSPLjava/security/SecureRandom;->setSeed(J)V
@@ -4585,7 +4540,6 @@ HSPLjava/time/LocalTime;->ofSecondOfDay(J)Ljava/time/LocalTime;
HSPLjava/time/LocalTime;->toNanoOfDay()J
HSPLjava/time/LocalTime;->toSecondOfDay()I
HSPLjava/time/LocalTime;->toString()Ljava/lang/String;
-HSPLjava/time/Month$1;-><clinit>()V
HSPLjava/time/Month;->getValue()I
HSPLjava/time/Month;->length(Z)I
HSPLjava/time/Month;->maxLength()I
@@ -4639,11 +4593,11 @@ HSPLjava/time/chrono/AbstractChronology;->resolveDate(Ljava/util/Map;Ljava/time/
HSPLjava/time/chrono/ChronoLocalDate;->isSupported(Ljava/time/temporal/TemporalField;)Z
HSPLjava/time/chrono/ChronoLocalDateTime;->getChronology()Ljava/time/chrono/Chronology;
HSPLjava/time/chrono/ChronoLocalDateTime;->query(Ljava/time/temporal/TemporalQuery;)Ljava/lang/Object;
-HSPLjava/time/chrono/ChronoLocalDateTime;->toEpochSecond(Ljava/time/ZoneOffset;)J
-HSPLjava/time/chrono/ChronoZonedDateTime;->getChronology()Ljava/time/chrono/Chronology;
+HSPLjava/time/chrono/ChronoLocalDateTime;->toEpochSecond(Ljava/time/ZoneOffset;)J+]Ljava/time/chrono/ChronoLocalDateTime;Ljava/time/LocalDateTime;]Ljava/time/chrono/ChronoLocalDate;Ljava/time/LocalDate;
+HSPLjava/time/chrono/ChronoZonedDateTime;->getChronology()Ljava/time/chrono/Chronology;+]Ljava/time/chrono/ChronoZonedDateTime;Ljava/time/ZonedDateTime;]Ljava/time/chrono/ChronoLocalDate;Ljava/time/LocalDate;
HSPLjava/time/chrono/ChronoZonedDateTime;->query(Ljava/time/temporal/TemporalQuery;)Ljava/lang/Object;
-HSPLjava/time/chrono/ChronoZonedDateTime;->toEpochSecond()J+]Ljava/time/ZoneOffset;Ljava/time/ZoneOffset;]Ljava/time/LocalTime;Ljava/time/LocalTime;]Ljava/time/chrono/ChronoZonedDateTime;Ljava/time/ZonedDateTime;]Ljava/time/chrono/ChronoLocalDate;Ljava/time/LocalDate;
-HSPLjava/time/chrono/ChronoZonedDateTime;->toInstant()Ljava/time/Instant;+]Ljava/time/LocalTime;Ljava/time/LocalTime;]Ljava/time/chrono/ChronoZonedDateTime;Ljava/time/ZonedDateTime;
+HSPLjava/time/chrono/ChronoZonedDateTime;->toEpochSecond()J+]Ljava/time/chrono/ChronoZonedDateTime;Ljava/time/ZonedDateTime;]Ljava/time/chrono/ChronoLocalDate;Ljava/time/LocalDate;
+HSPLjava/time/chrono/ChronoZonedDateTime;->toInstant()Ljava/time/Instant;+]Ljava/time/chrono/ChronoZonedDateTime;Ljava/time/ZonedDateTime;
HSPLjava/time/chrono/IsoChronology;->isLeapYear(J)Z
HSPLjava/time/chrono/IsoChronology;->resolveDate(Ljava/util/Map;Ljava/time/format/ResolverStyle;)Ljava/time/LocalDate;
HSPLjava/time/chrono/IsoChronology;->resolveDate(Ljava/util/Map;Ljava/time/format/ResolverStyle;)Ljava/time/chrono/ChronoLocalDate;
@@ -4692,6 +4646,7 @@ HSPLjava/time/format/DateTimeFormatterBuilder;->appendInternal(Ljava/time/format
HSPLjava/time/format/DateTimeFormatterBuilder;->appendLiteral(C)Ljava/time/format/DateTimeFormatterBuilder;
HSPLjava/time/format/DateTimeFormatterBuilder;->appendValue(Ljava/time/format/DateTimeFormatterBuilder$NumberPrinterParser;)Ljava/time/format/DateTimeFormatterBuilder;
HSPLjava/time/format/DateTimeFormatterBuilder;->appendValue(Ljava/time/temporal/TemporalField;I)Ljava/time/format/DateTimeFormatterBuilder;
+HSPLjava/time/format/DateTimeFormatterBuilder;->optionalEnd()Ljava/time/format/DateTimeFormatterBuilder;
HSPLjava/time/format/DateTimeFormatterBuilder;->toFormatter()Ljava/time/format/DateTimeFormatter;
HSPLjava/time/format/DateTimeFormatterBuilder;->toFormatter(Ljava/util/Locale;)Ljava/time/format/DateTimeFormatter;
HSPLjava/time/format/DateTimeFormatterBuilder;->toFormatter(Ljava/util/Locale;Ljava/time/format/ResolverStyle;Ljava/time/chrono/Chronology;)Ljava/time/format/DateTimeFormatter;
@@ -4713,6 +4668,7 @@ HSPLjava/time/format/DateTimePrintContext;-><init>(Ljava/time/temporal/TemporalA
HSPLjava/time/format/DateTimePrintContext;->adjust(Ljava/time/temporal/TemporalAccessor;Ljava/time/format/DateTimeFormatter;)Ljava/time/temporal/TemporalAccessor;
HSPLjava/time/format/DateTimePrintContext;->getDecimalStyle()Ljava/time/format/DecimalStyle;
HSPLjava/time/format/DateTimePrintContext;->getValue(Ljava/time/temporal/TemporalField;)Ljava/lang/Long;
+HSPLjava/time/format/DateTimeTextProvider$LocaleStore;-><init>(Ljava/util/Map;)V
HSPLjava/time/format/DecimalStyle;->convertNumberToI18N(Ljava/lang/String;)Ljava/lang/String;
HSPLjava/time/format/DecimalStyle;->convertToDigit(C)I
HSPLjava/time/format/DecimalStyle;->getDecimalSeparator()C
@@ -4747,8 +4703,8 @@ HSPLjava/time/temporal/ChronoField;->range()Ljava/time/temporal/ValueRange;
HSPLjava/time/temporal/ChronoField;->values()[Ljava/time/temporal/ChronoField;
HSPLjava/time/temporal/ChronoUnit;->getDuration()Ljava/time/Duration;
HSPLjava/time/temporal/ChronoUnit;->values()[Ljava/time/temporal/ChronoUnit;
-HSPLjava/time/temporal/TemporalAccessor;->get(Ljava/time/temporal/TemporalField;)I
-HSPLjava/time/temporal/TemporalAccessor;->range(Ljava/time/temporal/TemporalField;)Ljava/time/temporal/ValueRange;
+HSPLjava/time/temporal/TemporalAccessor;->get(Ljava/time/temporal/TemporalField;)I+]Ljava/time/temporal/TemporalAccessor;Ljava/time/format/Parsed;
+HSPLjava/time/temporal/TemporalAccessor;->range(Ljava/time/temporal/TemporalField;)Ljava/time/temporal/ValueRange;+]Ljava/time/temporal/TemporalAccessor;Ljava/time/format/Parsed;
HSPLjava/time/temporal/TemporalAdjusters$$ExternalSyntheticLambda11;-><init>(I)V
HSPLjava/time/temporal/TemporalAdjusters$$ExternalSyntheticLambda11;->adjustInto(Ljava/time/temporal/Temporal;)Ljava/time/temporal/Temporal;
HSPLjava/time/temporal/TemporalAdjusters$$ExternalSyntheticLambda1;->adjustInto(Ljava/time/temporal/Temporal;)Ljava/time/temporal/Temporal;
@@ -4994,7 +4950,7 @@ HSPLjava/util/ArrayList;->batchRemove(Ljava/util/Collection;ZII)Z
HSPLjava/util/ArrayList;->checkForComodification(I)V
HSPLjava/util/ArrayList;->clear()V
HSPLjava/util/ArrayList;->clone()Ljava/lang/Object;
-HSPLjava/util/ArrayList;->contains(Ljava/lang/Object;)Z+]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLjava/util/ArrayList;->contains(Ljava/lang/Object;)Z
HSPLjava/util/ArrayList;->elementAt([Ljava/lang/Object;I)Ljava/lang/Object;
HSPLjava/util/ArrayList;->elementData(I)Ljava/lang/Object;
HSPLjava/util/ArrayList;->ensureCapacity(I)V
@@ -5003,13 +4959,13 @@ HSPLjava/util/ArrayList;->equalsArrayList(Ljava/util/ArrayList;)Z
HSPLjava/util/ArrayList;->equalsRange(Ljava/util/List;II)Z
HSPLjava/util/ArrayList;->fastRemove([Ljava/lang/Object;I)V
HSPLjava/util/ArrayList;->forEach(Ljava/util/function/Consumer;)V
-HSPLjava/util/ArrayList;->get(I)Ljava/lang/Object;+]Ljava/util/ArrayList;Ljava/util/ArrayList;
+HSPLjava/util/ArrayList;->get(I)Ljava/lang/Object;
HSPLjava/util/ArrayList;->grow()[Ljava/lang/Object;
HSPLjava/util/ArrayList;->grow(I)[Ljava/lang/Object;
HSPLjava/util/ArrayList;->hashCode()I
HSPLjava/util/ArrayList;->hashCodeRange(II)I
-HSPLjava/util/ArrayList;->indexOf(Ljava/lang/Object;)I+]Ljava/util/ArrayList;Ljava/util/ArrayList;
-HSPLjava/util/ArrayList;->indexOfRange(Ljava/lang/Object;II)I+]Ljava/lang/Object;missing_types
+HSPLjava/util/ArrayList;->indexOf(Ljava/lang/Object;)I
+HSPLjava/util/ArrayList;->indexOfRange(Ljava/lang/Object;II)I
HSPLjava/util/ArrayList;->isEmpty()Z
HSPLjava/util/ArrayList;->iterator()Ljava/util/Iterator;
HSPLjava/util/ArrayList;->lastIndexOf(Ljava/lang/Object;)I
@@ -5049,6 +5005,7 @@ HSPLjava/util/Arrays$ArrayList;->sort(Ljava/util/Comparator;)V
HSPLjava/util/Arrays$ArrayList;->spliterator()Ljava/util/Spliterator;
HSPLjava/util/Arrays$ArrayList;->toArray()[Ljava/lang/Object;
HSPLjava/util/Arrays$ArrayList;->toArray([Ljava/lang/Object;)[Ljava/lang/Object;
+HSPLjava/util/Arrays$ArrayList;->toArrayPreserveComponentType()[Ljava/lang/Object;+][Ljava/lang/Object;missing_types
HSPLjava/util/Arrays;->asList([Ljava/lang/Object;)Ljava/util/List;
HSPLjava/util/Arrays;->binarySearch([CC)I
HSPLjava/util/Arrays;->binarySearch([II)I
@@ -5105,7 +5062,7 @@ HSPLjava/util/Arrays;->hashCode([B)I
HSPLjava/util/Arrays;->hashCode([F)I
HSPLjava/util/Arrays;->hashCode([I)I
HSPLjava/util/Arrays;->hashCode([J)I
-HSPLjava/util/Arrays;->hashCode([Ljava/lang/Object;)I+]Ljava/lang/Object;Ljava/lang/Integer;,Ljava/lang/Long;
+HSPLjava/util/Arrays;->hashCode([Ljava/lang/Object;)I
HSPLjava/util/Arrays;->rangeCheck(III)V
HSPLjava/util/Arrays;->sort([C)V
HSPLjava/util/Arrays;->sort([F)V
@@ -5210,7 +5167,7 @@ HSPLjava/util/Calendar;->setTimeZone(Ljava/util/TimeZone;)V
HSPLjava/util/Calendar;->setWeekCountData(Ljava/util/Locale;)V
HSPLjava/util/Calendar;->setZoneShared(Z)V
HSPLjava/util/Calendar;->updateTime()V
-HSPLjava/util/Collection;->removeIf(Ljava/util/function/Predicate;)Z+]Ljava/util/Collection;Landroid/util/MapCollections$ValuesCollection;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;
+HSPLjava/util/Collection;->removeIf(Ljava/util/function/Predicate;)Z+]Ljava/util/Collection;Landroid/util/MapCollections$ValuesCollection;,Landroid/util/MapCollections$EntrySet;,Ljava/util/LinkedHashMap$LinkedEntrySet;,Ljava/util/LinkedList;,Landroid/util/MapCollections$KeySet;,Ljava/util/HashSet;,Ljava/util/LinkedHashMap$LinkedValues;,Ljava/util/LinkedHashSet;,Ljava/util/HashMap$EntrySet;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;,Landroid/util/MapCollections$MapIterator;,Ljava/util/LinkedList$ListItr;,Ljava/util/LinkedHashMap$LinkedEntryIterator;,Ljava/util/HashMap$KeyIterator;,Ljava/util/LinkedHashMap$LinkedValueIterator;,Ljava/util/LinkedHashMap$LinkedKeyIterator;,Ljava/util/HashMap$EntryIterator;
HSPLjava/util/Collection;->spliterator()Ljava/util/Spliterator;
HSPLjava/util/Collection;->stream()Ljava/util/stream/Stream;+]Ljava/util/Collection;megamorphic_types
HSPLjava/util/Collections$1;-><init>(Ljava/lang/Object;)V
@@ -5311,6 +5268,7 @@ HSPLjava/util/Collections$SynchronizedMap;->isEmpty()Z
HSPLjava/util/Collections$SynchronizedMap;->keySet()Ljava/util/Set;
HSPLjava/util/Collections$SynchronizedMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
HSPLjava/util/Collections$SynchronizedMap;->putAll(Ljava/util/Map;)V
+HSPLjava/util/Collections$SynchronizedMap;->putIfAbsent(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
HSPLjava/util/Collections$SynchronizedMap;->remove(Ljava/lang/Object;)Ljava/lang/Object;
HSPLjava/util/Collections$SynchronizedMap;->size()I
HSPLjava/util/Collections$SynchronizedMap;->values()Ljava/util/Collection;
@@ -5397,6 +5355,7 @@ HSPLjava/util/Collections;->rotate(Ljava/util/List;I)V
HSPLjava/util/Collections;->rotate1(Ljava/util/List;I)V
HSPLjava/util/Collections;->shuffle(Ljava/util/List;)V
HSPLjava/util/Collections;->shuffle(Ljava/util/List;Ljava/util/Random;)V
+HSPLjava/util/Collections;->shuffle(Ljava/util/List;Ljava/util/random/RandomGenerator;)V+]Ljava/util/random/RandomGenerator;Ljava/util/Random;]Ljava/util/List;missing_types
HSPLjava/util/Collections;->singleton(Ljava/lang/Object;)Ljava/util/Set;
HSPLjava/util/Collections;->singletonIterator(Ljava/lang/Object;)Ljava/util/Iterator;
HSPLjava/util/Collections;->singletonList(Ljava/lang/Object;)Ljava/util/List;
@@ -5445,7 +5404,7 @@ HSPLjava/util/Comparator;->naturalOrder()Ljava/util/Comparator;
HSPLjava/util/Comparator;->nullsFirst(Ljava/util/Comparator;)Ljava/util/Comparator;
HSPLjava/util/Comparator;->reversed()Ljava/util/Comparator;
HSPLjava/util/Comparator;->thenComparing(Ljava/util/Comparator;)Ljava/util/Comparator;
-HSPLjava/util/Comparator;->thenComparing(Ljava/util/function/Function;)Ljava/util/Comparator;+]Ljava/util/Comparator;Ljava/util/Comparator$$ExternalSyntheticLambda5;
+HSPLjava/util/Comparator;->thenComparing(Ljava/util/function/Function;)Ljava/util/Comparator;+]Ljava/util/Comparator;Ljava/util/Comparator$$ExternalSyntheticLambda3;
HSPLjava/util/Comparators$NaturalOrderComparator;->compare(Ljava/lang/Comparable;Ljava/lang/Comparable;)I
HSPLjava/util/Comparators$NaturalOrderComparator;->compare(Ljava/lang/Object;Ljava/lang/Object;)I
HSPLjava/util/Comparators$NullComparator;-><init>(ZLjava/util/Comparator;)V
@@ -5568,6 +5527,7 @@ HSPLjava/util/Formatter$Flags;->valueOf()I
HSPLjava/util/Formatter$FormatSpecifier;-><init>(Ljava/util/Formatter;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
HSPLjava/util/Formatter$FormatSpecifier;->addZeros(Ljava/lang/StringBuilder;I)V
HSPLjava/util/Formatter$FormatSpecifier;->adjustWidth(ILjava/util/Formatter$Flags;Z)I
+HSPLjava/util/Formatter$FormatSpecifier;->appendJustified(Ljava/lang/Appendable;Ljava/lang/CharSequence;)V+]Ljava/util/Formatter$Flags;Ljava/util/Formatter$Flags;]Ljava/lang/CharSequence;Ljava/lang/String;,Ljava/lang/StringBuilder;]Ljava/lang/Appendable;megamorphic_types
HSPLjava/util/Formatter$FormatSpecifier;->checkBadFlags([Ljava/util/Formatter$Flags;)V
HSPLjava/util/Formatter$FormatSpecifier;->checkCharacter()V
HSPLjava/util/Formatter$FormatSpecifier;->checkDateTime()V
@@ -5576,11 +5536,14 @@ HSPLjava/util/Formatter$FormatSpecifier;->checkGeneral()V
HSPLjava/util/Formatter$FormatSpecifier;->checkInteger()V
HSPLjava/util/Formatter$FormatSpecifier;->checkNumeric()V
HSPLjava/util/Formatter$FormatSpecifier;->checkText()V
+HSPLjava/util/Formatter$FormatSpecifier;->conversion(C)V
HSPLjava/util/Formatter$FormatSpecifier;->getZero(Ljava/util/Locale;)C
HSPLjava/util/Formatter$FormatSpecifier;->index()I
+HSPLjava/util/Formatter$FormatSpecifier;->index(Ljava/lang/String;)V
HSPLjava/util/Formatter$FormatSpecifier;->leadingSign(Ljava/lang/StringBuilder;Z)Ljava/lang/StringBuilder;
HSPLjava/util/Formatter$FormatSpecifier;->localizedMagnitude(Ljava/lang/StringBuilder;JLjava/util/Formatter$Flags;ILjava/util/Locale;)Ljava/lang/StringBuilder;
HSPLjava/util/Formatter$FormatSpecifier;->localizedMagnitude(Ljava/lang/StringBuilder;Ljava/lang/CharSequence;ILjava/util/Formatter$Flags;ILjava/util/Locale;)Ljava/lang/StringBuilder;
+HSPLjava/util/Formatter$FormatSpecifier;->precision(Ljava/lang/String;)V
HSPLjava/util/Formatter$FormatSpecifier;->print(BLjava/util/Locale;)V
HSPLjava/util/Formatter$FormatSpecifier;->print(DLjava/util/Locale;)V
HSPLjava/util/Formatter$FormatSpecifier;->print(FLjava/util/Locale;)V
@@ -5600,6 +5563,7 @@ HSPLjava/util/Formatter$FormatSpecifier;->printInteger(Ljava/lang/Object;Ljava/u
HSPLjava/util/Formatter$FormatSpecifier;->printString(Ljava/lang/Object;Ljava/util/Locale;)V
HSPLjava/util/Formatter$FormatSpecifier;->trailingSign(Ljava/lang/StringBuilder;Z)Ljava/lang/StringBuilder;
HSPLjava/util/Formatter$FormatSpecifier;->trailingZeros(Ljava/lang/StringBuilder;I)V
+HSPLjava/util/Formatter$FormatSpecifier;->width(Ljava/lang/String;)V
HSPLjava/util/Formatter$FormatSpecifierParser;-><init>(Ljava/util/Formatter;Ljava/lang/String;I)V
HSPLjava/util/Formatter$FormatSpecifierParser;->advance()C
HSPLjava/util/Formatter$FormatSpecifierParser;->back(I)V
@@ -5610,6 +5574,7 @@ HSPLjava/util/Formatter$FormatSpecifierParser;->nextInt()Ljava/lang/String;
HSPLjava/util/Formatter$FormatSpecifierParser;->nextIsInt()Z
HSPLjava/util/Formatter$FormatSpecifierParser;->peek()C
HSPLjava/util/Formatter;->-$$Nest$fgeta(Ljava/util/Formatter;)Ljava/lang/Appendable;
+HSPLjava/util/Formatter;->-$$Nest$smisStrictValidationEnabled()Z
HSPLjava/util/Formatter;-><init>()V
HSPLjava/util/Formatter;-><init>(Ljava/lang/Appendable;)V
HSPLjava/util/Formatter;-><init>(Ljava/lang/Appendable;Ljava/util/Locale;)V
@@ -5619,11 +5584,13 @@ HSPLjava/util/Formatter;->close()V
HSPLjava/util/Formatter;->ensureOpen()V
HSPLjava/util/Formatter;->format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/util/Formatter;
HSPLjava/util/Formatter;->format(Ljava/util/Locale;Ljava/lang/String;[Ljava/lang/Object;)Ljava/util/Formatter;
+HSPLjava/util/Formatter;->isStrictValidationEnabled()Z
HSPLjava/util/Formatter;->locale()Ljava/util/Locale;
HSPLjava/util/Formatter;->nonNullAppendable(Ljava/lang/Appendable;)Ljava/lang/Appendable;
HSPLjava/util/Formatter;->out()Ljava/lang/Appendable;
HSPLjava/util/Formatter;->parse(Ljava/lang/String;)Ljava/util/List;
HSPLjava/util/Formatter;->toString()Ljava/lang/String;
+HSPLjava/util/Formatter;->zero()C+]Llibcore/icu/DecimalFormatData;Llibcore/icu/DecimalFormatData;
HSPLjava/util/GregorianCalendar;-><init>()V
HSPLjava/util/GregorianCalendar;-><init>(IIIIII)V
HSPLjava/util/GregorianCalendar;-><init>(IIIIIII)V
@@ -5723,6 +5690,7 @@ HSPLjava/util/HashMap;-><init>(Ljava/util/Map;)V
HSPLjava/util/HashMap;->afterNodeAccess(Ljava/util/HashMap$Node;)V
HSPLjava/util/HashMap;->afterNodeInsertion(Z)V
HSPLjava/util/HashMap;->afterNodeRemoval(Ljava/util/HashMap$Node;)V
+HSPLjava/util/HashMap;->calculateHashMapCapacity(I)I
HSPLjava/util/HashMap;->capacity()I
HSPLjava/util/HashMap;->clear()V
HSPLjava/util/HashMap;->clone()Ljava/lang/Object;
@@ -5732,15 +5700,16 @@ HSPLjava/util/HashMap;->containsValue(Ljava/lang/Object;)Z
HSPLjava/util/HashMap;->entrySet()Ljava/util/Set;
HSPLjava/util/HashMap;->forEach(Ljava/util/function/BiConsumer;)V
HSPLjava/util/HashMap;->get(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/HashMap;->getNode(Ljava/lang/Object;)Ljava/util/HashMap$Node;+]Ljava/lang/Object;megamorphic_types
+HSPLjava/util/HashMap;->getNode(Ljava/lang/Object;)Ljava/util/HashMap$Node;
HSPLjava/util/HashMap;->getOrDefault(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/HashMap;->hash(Ljava/lang/Object;)I+]Ljava/lang/Object;megamorphic_types
+HSPLjava/util/HashMap;->hash(Ljava/lang/Object;)I
HSPLjava/util/HashMap;->internalWriteEntries(Ljava/io/ObjectOutputStream;)V
HSPLjava/util/HashMap;->isEmpty()Z
HSPLjava/util/HashMap;->keySet()Ljava/util/Set;
HSPLjava/util/HashMap;->keysToArray([Ljava/lang/Object;)[Ljava/lang/Object;
HSPLjava/util/HashMap;->loadFactor()F
HSPLjava/util/HashMap;->merge(Ljava/lang/Object;Ljava/lang/Object;Ljava/util/function/BiFunction;)Ljava/lang/Object;
+HSPLjava/util/HashMap;->newHashMap(I)Ljava/util/HashMap;
HSPLjava/util/HashMap;->newNode(ILjava/lang/Object;Ljava/lang/Object;Ljava/util/HashMap$Node;)Ljava/util/HashMap$Node;
HSPLjava/util/HashMap;->newTreeNode(ILjava/lang/Object;Ljava/lang/Object;Ljava/util/HashMap$Node;)Ljava/util/HashMap$TreeNode;
HSPLjava/util/HashMap;->prepareArray([Ljava/lang/Object;)[Ljava/lang/Object;
@@ -5777,6 +5746,8 @@ HSPLjava/util/HashSet;->readObject(Ljava/io/ObjectInputStream;)V
HSPLjava/util/HashSet;->remove(Ljava/lang/Object;)Z
HSPLjava/util/HashSet;->size()I
HSPLjava/util/HashSet;->spliterator()Ljava/util/Spliterator;
+HSPLjava/util/HashSet;->toArray()[Ljava/lang/Object;+]Ljava/util/HashMap;Ljava/util/HashMap;,Ljava/util/LinkedHashMap;
+HSPLjava/util/HashSet;->toArray([Ljava/lang/Object;)[Ljava/lang/Object;+]Ljava/util/HashMap;Ljava/util/HashMap;,Ljava/util/LinkedHashMap;
HSPLjava/util/HashSet;->writeObject(Ljava/io/ObjectOutputStream;)V
HSPLjava/util/Hashtable$EntrySet;-><init>(Ljava/util/Hashtable;)V
HSPLjava/util/Hashtable$EntrySet;->iterator()Ljava/util/Iterator;
@@ -5825,7 +5796,6 @@ HSPLjava/util/IdentityHashMap$EntryIterator;-><init>(Ljava/util/IdentityHashMap;
HSPLjava/util/IdentityHashMap$EntryIterator;->next()Ljava/lang/Object;
HSPLjava/util/IdentityHashMap$EntryIterator;->next()Ljava/util/Map$Entry;
HSPLjava/util/IdentityHashMap$EntrySet;-><init>(Ljava/util/IdentityHashMap;)V
-HSPLjava/util/IdentityHashMap$EntrySet;-><init>(Ljava/util/IdentityHashMap;Ljava/util/IdentityHashMap$EntrySet-IA;)V
HSPLjava/util/IdentityHashMap$EntrySet;->iterator()Ljava/util/Iterator;
HSPLjava/util/IdentityHashMap$EntrySet;->size()I
HSPLjava/util/IdentityHashMap$IdentityHashMapIterator;-><init>(Ljava/util/IdentityHashMap;)V
@@ -5866,6 +5836,9 @@ HSPLjava/util/ImmutableCollections$AbstractImmutableList;-><init>()V
HSPLjava/util/ImmutableCollections$AbstractImmutableList;->iterator()Ljava/util/Iterator;
HSPLjava/util/ImmutableCollections$AbstractImmutableMap;-><init>()V
HSPLjava/util/ImmutableCollections$AbstractImmutableSet;-><init>()V
+HSPLjava/util/ImmutableCollections$Access$1;-><init>()V
+HSPLjava/util/ImmutableCollections$Access$1;->listFromTrustedArray([Ljava/lang/Object;)Ljava/util/List;
+HSPLjava/util/ImmutableCollections$Access;-><clinit>()V
HSPLjava/util/ImmutableCollections$List12;-><init>(Ljava/lang/Object;)V
HSPLjava/util/ImmutableCollections$List12;-><init>(Ljava/lang/Object;Ljava/lang/Object;)V
HSPLjava/util/ImmutableCollections$List12;->get(I)Ljava/lang/Object;
@@ -5873,6 +5846,8 @@ HSPLjava/util/ImmutableCollections$List12;->size()I
HSPLjava/util/ImmutableCollections$ListItr;-><init>(Ljava/util/List;I)V
HSPLjava/util/ImmutableCollections$ListItr;->hasNext()Z
HSPLjava/util/ImmutableCollections$ListItr;->next()Ljava/lang/Object;
+HSPLjava/util/ImmutableCollections$ListN;-><init>([Ljava/lang/Object;Z)V
+HSPLjava/util/ImmutableCollections$ListN;-><init>([Ljava/lang/Object;ZLjava/util/ImmutableCollections$ListN-IA;)V
HSPLjava/util/ImmutableCollections$ListN;->get(I)Ljava/lang/Object;
HSPLjava/util/ImmutableCollections$ListN;->size()I
HSPLjava/util/ImmutableCollections$Map1;-><init>(Ljava/lang/Object;Ljava/lang/Object;)V
@@ -5880,13 +5855,14 @@ HSPLjava/util/ImmutableCollections$Map1;->entrySet()Ljava/util/Set;
HSPLjava/util/ImmutableCollections$MapN;-><init>([Ljava/lang/Object;)V
HSPLjava/util/ImmutableCollections$MapN;->containsKey(Ljava/lang/Object;)Z
HSPLjava/util/ImmutableCollections$MapN;->get(Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/ImmutableCollections$MapN;->probe(Ljava/lang/Object;)I+]Ljava/lang/Object;Ljava/lang/String;
+HSPLjava/util/ImmutableCollections$MapN;->probe(Ljava/lang/Object;)I
HSPLjava/util/ImmutableCollections$SetN;-><init>([Ljava/lang/Object;)V
HSPLjava/util/ImmutableCollections$SetN;->contains(Ljava/lang/Object;)Z
HSPLjava/util/ImmutableCollections$SetN;->probe(Ljava/lang/Object;)I
HSPLjava/util/ImmutableCollections;-><clinit>()V
HSPLjava/util/ImmutableCollections;->listCopy(Ljava/util/Collection;)Ljava/util/List;
-HSPLjava/util/Iterator;->forEachRemaining(Ljava/util/function/Consumer;)V+]Ljava/util/function/Consumer;missing_types]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;
+HSPLjava/util/ImmutableCollections;->listFromTrustedArray([Ljava/lang/Object;)Ljava/util/List;
+HSPLjava/util/Iterator;->forEachRemaining(Ljava/util/function/Consumer;)V+]Ljava/util/function/Consumer;megamorphic_types]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;,Ljava/util/AbstractMap$2$1;,Ljava/util/AbstractList$Itr;,Ljava/util/LinkedHashMap$LinkedValueIterator;
HSPLjava/util/JumboEnumSet$EnumSetIterator;-><init>(Ljava/util/JumboEnumSet;)V
HSPLjava/util/JumboEnumSet$EnumSetIterator;->hasNext()Z
HSPLjava/util/JumboEnumSet$EnumSetIterator;->next()Ljava/lang/Enum;
@@ -5901,28 +5877,29 @@ HSPLjava/util/JumboEnumSet;->size()I
HSPLjava/util/KeyValueHolder;-><init>(Ljava/lang/Object;Ljava/lang/Object;)V
HSPLjava/util/KeyValueHolder;->getKey()Ljava/lang/Object;
HSPLjava/util/KeyValueHolder;->getValue()Ljava/lang/Object;
-HSPLjava/util/LinkedHashMap$LinkedEntryIterator;-><init>(Ljava/util/LinkedHashMap;)V
+HSPLjava/util/LinkedHashMap$Entry;-><init>(ILjava/lang/Object;Ljava/lang/Object;Ljava/util/HashMap$Node;)V
+HSPLjava/util/LinkedHashMap$LinkedEntryIterator;-><init>(Ljava/util/LinkedHashMap;Z)V
HSPLjava/util/LinkedHashMap$LinkedEntryIterator;->next()Ljava/lang/Object;
HSPLjava/util/LinkedHashMap$LinkedEntryIterator;->next()Ljava/util/Map$Entry;
-HSPLjava/util/LinkedHashMap$LinkedEntrySet;-><init>(Ljava/util/LinkedHashMap;)V
+HSPLjava/util/LinkedHashMap$LinkedEntrySet;-><init>(Ljava/util/LinkedHashMap;Z)V
HSPLjava/util/LinkedHashMap$LinkedEntrySet;->iterator()Ljava/util/Iterator;
HSPLjava/util/LinkedHashMap$LinkedEntrySet;->size()I
-HSPLjava/util/LinkedHashMap$LinkedHashIterator;-><init>(Ljava/util/LinkedHashMap;)V
+HSPLjava/util/LinkedHashMap$LinkedHashIterator;-><init>(Ljava/util/LinkedHashMap;Z)V
HSPLjava/util/LinkedHashMap$LinkedHashIterator;->hasNext()Z
-HSPLjava/util/LinkedHashMap$LinkedHashIterator;->nextNode()Ljava/util/LinkedHashMap$LinkedHashMapEntry;
+HSPLjava/util/LinkedHashMap$LinkedHashIterator;->nextNode()Ljava/util/LinkedHashMap$Entry;
HSPLjava/util/LinkedHashMap$LinkedHashIterator;->remove()V
-HSPLjava/util/LinkedHashMap$LinkedHashMapEntry;-><init>(ILjava/lang/Object;Ljava/lang/Object;Ljava/util/HashMap$Node;)V
-HSPLjava/util/LinkedHashMap$LinkedKeyIterator;-><init>(Ljava/util/LinkedHashMap;)V
HSPLjava/util/LinkedHashMap$LinkedKeyIterator;->next()Ljava/lang/Object;
-HSPLjava/util/LinkedHashMap$LinkedKeySet;-><init>(Ljava/util/LinkedHashMap;)V
+HSPLjava/util/LinkedHashMap$LinkedKeySet;-><init>(Ljava/util/LinkedHashMap;Z)V
HSPLjava/util/LinkedHashMap$LinkedKeySet;->contains(Ljava/lang/Object;)Z
HSPLjava/util/LinkedHashMap$LinkedKeySet;->iterator()Ljava/util/Iterator;
HSPLjava/util/LinkedHashMap$LinkedKeySet;->size()I
-HSPLjava/util/LinkedHashMap$LinkedValueIterator;-><init>(Ljava/util/LinkedHashMap;)V
+HSPLjava/util/LinkedHashMap$LinkedKeySet;->toArray()[Ljava/lang/Object;
+HSPLjava/util/LinkedHashMap$LinkedValueIterator;-><init>(Ljava/util/LinkedHashMap;Z)V
HSPLjava/util/LinkedHashMap$LinkedValueIterator;->next()Ljava/lang/Object;
-HSPLjava/util/LinkedHashMap$LinkedValues;-><init>(Ljava/util/LinkedHashMap;)V
+HSPLjava/util/LinkedHashMap$LinkedValues;-><init>(Ljava/util/LinkedHashMap;Z)V
HSPLjava/util/LinkedHashMap$LinkedValues;->iterator()Ljava/util/Iterator;
HSPLjava/util/LinkedHashMap$LinkedValues;->size()I
+HSPLjava/util/LinkedHashMap$LinkedValues;->toArray()[Ljava/lang/Object;
HSPLjava/util/LinkedHashMap;-><init>()V
HSPLjava/util/LinkedHashMap;-><init>(I)V
HSPLjava/util/LinkedHashMap;-><init>(IF)V
@@ -5934,16 +5911,21 @@ HSPLjava/util/LinkedHashMap;->afterNodeRemoval(Ljava/util/HashMap$Node;)V
HSPLjava/util/LinkedHashMap;->clear()V
HSPLjava/util/LinkedHashMap;->eldest()Ljava/util/Map$Entry;
HSPLjava/util/LinkedHashMap;->entrySet()Ljava/util/Set;
-HSPLjava/util/LinkedHashMap;->get(Ljava/lang/Object;)Ljava/lang/Object;+]Ljava/util/LinkedHashMap;Ljava/util/LinkedHashMap;,Lcom/android/i18n/timezone/internal/BasicLruCache$CacheMap;,Landroid/app/PropertyInvalidatedCache$1;
+HSPLjava/util/LinkedHashMap;->get(Ljava/lang/Object;)Ljava/lang/Object;
HSPLjava/util/LinkedHashMap;->keySet()Ljava/util/Set;
-HSPLjava/util/LinkedHashMap;->linkNodeLast(Ljava/util/LinkedHashMap$LinkedHashMapEntry;)V
+HSPLjava/util/LinkedHashMap;->keysToArray([Ljava/lang/Object;)[Ljava/lang/Object;
+HSPLjava/util/LinkedHashMap;->keysToArray([Ljava/lang/Object;Z)[Ljava/lang/Object;
+HSPLjava/util/LinkedHashMap;->linkNodeAtEnd(Ljava/util/LinkedHashMap$Entry;)V
HSPLjava/util/LinkedHashMap;->newNode(ILjava/lang/Object;Ljava/lang/Object;Ljava/util/HashMap$Node;)Ljava/util/HashMap$Node;
HSPLjava/util/LinkedHashMap;->newTreeNode(ILjava/lang/Object;Ljava/lang/Object;Ljava/util/HashMap$Node;)Ljava/util/HashMap$TreeNode;
HSPLjava/util/LinkedHashMap;->reinitialize()V
HSPLjava/util/LinkedHashMap;->removeEldestEntry(Ljava/util/Map$Entry;)Z
HSPLjava/util/LinkedHashMap;->replacementTreeNode(Ljava/util/HashMap$Node;Ljava/util/HashMap$Node;)Ljava/util/HashMap$TreeNode;
-HSPLjava/util/LinkedHashMap;->transferLinks(Ljava/util/LinkedHashMap$LinkedHashMapEntry;Ljava/util/LinkedHashMap$LinkedHashMapEntry;)V
+HSPLjava/util/LinkedHashMap;->sequencedEntrySet()Ljava/util/SequencedSet;
+HSPLjava/util/LinkedHashMap;->sequencedKeySet()Ljava/util/SequencedSet;
+HSPLjava/util/LinkedHashMap;->sequencedValues()Ljava/util/SequencedCollection;
HSPLjava/util/LinkedHashMap;->values()Ljava/util/Collection;
+HSPLjava/util/LinkedHashMap;->valuesToArray([Ljava/lang/Object;Z)[Ljava/lang/Object;
HSPLjava/util/LinkedHashSet;-><init>()V
HSPLjava/util/LinkedHashSet;-><init>(I)V
HSPLjava/util/LinkedHashSet;-><init>(Ljava/util/Collection;)V
@@ -5961,7 +5943,7 @@ HSPLjava/util/LinkedList;-><init>()V
HSPLjava/util/LinkedList;-><init>(Ljava/util/Collection;)V
HSPLjava/util/LinkedList;->add(ILjava/lang/Object;)V
HSPLjava/util/LinkedList;->add(Ljava/lang/Object;)Z
-HSPLjava/util/LinkedList;->addAll(ILjava/util/Collection;)Z+]Ljava/util/Collection;Ljava/util/LinkedList;]Ljava/util/LinkedList;Ljava/util/LinkedList;
+HSPLjava/util/LinkedList;->addAll(ILjava/util/Collection;)Z
HSPLjava/util/LinkedList;->addAll(Ljava/util/Collection;)Z
HSPLjava/util/LinkedList;->addFirst(Ljava/lang/Object;)V
HSPLjava/util/LinkedList;->addLast(Ljava/lang/Object;)V
@@ -6008,7 +5990,7 @@ HSPLjava/util/List;->of(Ljava/lang/Object;)Ljava/util/List;
HSPLjava/util/List;->of(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;
HSPLjava/util/List;->of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;
HSPLjava/util/List;->of([Ljava/lang/Object;)Ljava/util/List;
-HSPLjava/util/List;->sort(Ljava/util/Comparator;)V+]Ljava/util/ListIterator;Ljava/util/LinkedList$ListItr;]Ljava/util/List;Ljava/util/LinkedList;
+HSPLjava/util/List;->sort(Ljava/util/Comparator;)V+]Ljava/util/ListIterator;Ljava/util/ArrayList$SubList$1;,Ljava/util/LinkedList$ListItr;]Ljava/util/List;Ljava/util/ArrayList$SubList;,Ljava/util/LinkedList;
HSPLjava/util/List;->spliterator()Ljava/util/Spliterator;
HSPLjava/util/Locale$Builder;-><init>()V
HSPLjava/util/Locale$Builder;->build()Ljava/util/Locale;
@@ -6016,6 +5998,7 @@ HSPLjava/util/Locale$Builder;->setLanguage(Ljava/lang/String;)Ljava/util/Locale$
HSPLjava/util/Locale$Builder;->setRegion(Ljava/lang/String;)Ljava/util/Locale$Builder;
HSPLjava/util/Locale$Builder;->setScript(Ljava/lang/String;)Ljava/util/Locale$Builder;
HSPLjava/util/Locale$Builder;->setVariant(Ljava/lang/String;)Ljava/util/Locale$Builder;
+HSPLjava/util/Locale$Cache;->-$$Nest$sfgetLOCALECACHE()Ljava/util/Locale$Cache;
HSPLjava/util/Locale$Cache;->createObject(Ljava/lang/Object;)Ljava/lang/Object;
HSPLjava/util/Locale$Cache;->createObject(Ljava/lang/Object;)Ljava/util/Locale;
HSPLjava/util/Locale$LocaleKey;->-$$Nest$fgetbase(Ljava/util/Locale$LocaleKey;)Lsun/util/locale/BaseLocale;
@@ -6032,12 +6015,12 @@ HSPLjava/util/Locale;-><init>(Lsun/util/locale/BaseLocale;Lsun/util/locale/Local
HSPLjava/util/Locale;->cleanCache()V
HSPLjava/util/Locale;->clone()Ljava/lang/Object;
HSPLjava/util/Locale;->convertOldISOCodes(Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/util/Locale;->equals(Ljava/lang/Object;)Z+]Lsun/util/locale/BaseLocale;Lsun/util/locale/BaseLocale;
+HSPLjava/util/Locale;->equals(Ljava/lang/Object;)Z
HSPLjava/util/Locale;->forLanguageTag(Ljava/lang/String;)Ljava/util/Locale;
HSPLjava/util/Locale;->getAvailableLocales()[Ljava/util/Locale;
HSPLjava/util/Locale;->getBaseLocale()Lsun/util/locale/BaseLocale;
HSPLjava/util/Locale;->getCompatibilityExtensions(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lsun/util/locale/LocaleExtensions;
-HSPLjava/util/Locale;->getCountry()Ljava/lang/String;+]Lsun/util/locale/BaseLocale;Lsun/util/locale/BaseLocale;
+HSPLjava/util/Locale;->getCountry()Ljava/lang/String;
HSPLjava/util/Locale;->getDefault()Ljava/util/Locale;
HSPLjava/util/Locale;->getDefault(Ljava/util/Locale$Category;)Ljava/util/Locale;
HSPLjava/util/Locale;->getDisplayCountry(Ljava/util/Locale;)Ljava/lang/String;
@@ -6049,10 +6032,10 @@ HSPLjava/util/Locale;->getISO3Language()Ljava/lang/String;
HSPLjava/util/Locale;->getISOLanguages()[Ljava/lang/String;
HSPLjava/util/Locale;->getInstance(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lsun/util/locale/LocaleExtensions;)Ljava/util/Locale;
HSPLjava/util/Locale;->getInstance(Lsun/util/locale/BaseLocale;Lsun/util/locale/LocaleExtensions;)Ljava/util/Locale;
-HSPLjava/util/Locale;->getLanguage()Ljava/lang/String;+]Lsun/util/locale/BaseLocale;Lsun/util/locale/BaseLocale;
+HSPLjava/util/Locale;->getLanguage()Ljava/lang/String;
HSPLjava/util/Locale;->getScript()Ljava/lang/String;
HSPLjava/util/Locale;->getUnicodeLocaleType(Ljava/lang/String;)Ljava/lang/String;
-HSPLjava/util/Locale;->getVariant()Ljava/lang/String;+]Lsun/util/locale/BaseLocale;Lsun/util/locale/BaseLocale;
+HSPLjava/util/Locale;->getVariant()Ljava/lang/String;
HSPLjava/util/Locale;->hasExtensions()Z
HSPLjava/util/Locale;->hashCode()I
HSPLjava/util/Locale;->isUnicodeExtensionKey(Ljava/lang/String;)Z
@@ -6063,19 +6046,22 @@ HSPLjava/util/Locale;->readObject(Ljava/io/ObjectInputStream;)V
HSPLjava/util/Locale;->readResolve()Ljava/lang/Object;
HSPLjava/util/Locale;->setDefault(Ljava/util/Locale$Category;Ljava/util/Locale;)V
HSPLjava/util/Locale;->setDefault(Ljava/util/Locale;)V
-HSPLjava/util/Locale;->toLanguageTag()Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lsun/util/locale/LanguageTag;Lsun/util/locale/LanguageTag;]Ljava/util/List;Ljava/util/Collections$EmptyList;]Ljava/util/Iterator;Ljava/util/Collections$EmptyIterator;
+HSPLjava/util/Locale;->toLanguageTag()Ljava/lang/String;
HSPLjava/util/Locale;->toString()Ljava/lang/String;
HSPLjava/util/Locale;->writeObject(Ljava/io/ObjectOutputStream;)V
-HSPLjava/util/Map;->computeIfAbsent(Ljava/lang/Object;Ljava/util/function/Function;)Ljava/lang/Object;+]Ljava/util/function/Function;missing_types]Ljava/util/Map;Landroid/util/ArrayMap;
-HSPLjava/util/Map;->forEach(Ljava/util/function/BiConsumer;)V
+HSPLjava/util/Map;->computeIfAbsent(Ljava/lang/Object;Ljava/util/function/Function;)Ljava/lang/Object;+]Ljava/util/Map;Landroid/util/ArrayMap;]Ljava/util/function/Function;missing_types
+HSPLjava/util/Map;->entry(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map$Entry;
+HSPLjava/util/Map;->forEach(Ljava/util/function/BiConsumer;)V+]Ljava/util/Map$Entry;Ljava/util/KeyValueHolder;]Ljava/util/Map;Ljava/util/ImmutableCollections$MapN;]Ljava/util/Iterator;Ljava/util/ImmutableCollections$MapN$MapNIterator;]Ljava/util/Set;Ljava/util/ImmutableCollections$MapN$1;
HSPLjava/util/Map;->getOrDefault(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;+]Ljava/util/Map;Landroid/util/ArrayMap;
HSPLjava/util/Map;->of(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;
+HSPLjava/util/Map;->ofEntries([Ljava/util/Map$Entry;)Ljava/util/Map;
HSPLjava/util/MissingResourceException;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
HSPLjava/util/NoSuchElementException;-><init>()V
HSPLjava/util/NoSuchElementException;-><init>(Ljava/lang/String;)V
HSPLjava/util/Objects;->checkFromIndexSize(III)I
+HSPLjava/util/Objects;->checkFromToIndex(III)I
HSPLjava/util/Objects;->checkIndex(II)I
-HSPLjava/util/Objects;->equals(Ljava/lang/Object;Ljava/lang/Object;)Z+]Ljava/lang/Object;megamorphic_types
+HSPLjava/util/Objects;->equals(Ljava/lang/Object;Ljava/lang/Object;)Z
HSPLjava/util/Objects;->hash([Ljava/lang/Object;)I
HSPLjava/util/Objects;->hashCode(Ljava/lang/Object;)I
HSPLjava/util/Objects;->nonNull(Ljava/lang/Object;)Z
@@ -6143,11 +6129,15 @@ HSPLjava/util/PriorityQueue;->toArray([Ljava/lang/Object;)[Ljava/lang/Object;
HSPLjava/util/Properties$LineReader;->readLine()I
HSPLjava/util/Properties;-><init>()V
HSPLjava/util/Properties;-><init>(Ljava/util/Properties;)V
+HSPLjava/util/Properties;-><init>(Ljava/util/Properties;I)V
+HSPLjava/util/Properties;->containsKey(Ljava/lang/Object;)Z
HSPLjava/util/Properties;->getProperty(Ljava/lang/String;)Ljava/lang/String;
HSPLjava/util/Properties;->getProperty(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
HSPLjava/util/Properties;->load(Ljava/io/InputStream;)V
HSPLjava/util/Properties;->load(Ljava/io/Reader;)V
HSPLjava/util/Properties;->load0(Ljava/util/Properties$LineReader;)V
+HSPLjava/util/Properties;->loadConvert([CIILjava/lang/StringBuilder;)Ljava/lang/String;
+HSPLjava/util/Properties;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
HSPLjava/util/Properties;->saveConvert(Ljava/lang/String;ZZ)Ljava/lang/String;
HSPLjava/util/Properties;->setProperty(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;
HSPLjava/util/Properties;->store(Ljava/io/OutputStream;Ljava/lang/String;)V
@@ -6259,7 +6249,7 @@ HSPLjava/util/SimpleTimeZone;->getOffset(J)I
HSPLjava/util/SimpleTimeZone;->getOffsets(J[I)I
HSPLjava/util/SimpleTimeZone;->getRawOffset()I
HSPLjava/util/SimpleTimeZone;->hasSameRules(Ljava/util/TimeZone;)Z
-HSPLjava/util/Spliterator$OfInt;->forEachRemaining(Ljava/util/function/Consumer;)V+]Ljava/util/Spliterator$OfInt;Ljava/util/Spliterators$IntArraySpliterator;,Ljava/util/stream/Streams$RangeIntSpliterator;
+HSPLjava/util/Spliterator$OfInt;->forEachRemaining(Ljava/util/function/Consumer;)V+]Ljava/util/Spliterator$OfInt;Ljava/util/Spliterators$IntArraySpliterator;,Ljava/util/Spliterators$EmptySpliterator$OfInt;,Ljava/util/stream/Streams$RangeIntSpliterator;,Ljava/lang/StringUTF16$CodePointsSpliteratorForString;
HSPLjava/util/Spliterator;->getExactSizeIfKnown()J+]Ljava/util/Spliterator;megamorphic_types
HSPLjava/util/Spliterators$ArraySpliterator;-><init>([Ljava/lang/Object;I)V
HSPLjava/util/Spliterators$ArraySpliterator;-><init>([Ljava/lang/Object;III)V
@@ -6431,6 +6421,8 @@ HSPLjava/util/TreeMap;-><init>()V
HSPLjava/util/TreeMap;-><init>(Ljava/util/Comparator;)V
HSPLjava/util/TreeMap;-><init>(Ljava/util/Map;)V
HSPLjava/util/TreeMap;->addAllForTreeSet(Ljava/util/SortedSet;Ljava/lang/Object;)V
+HSPLjava/util/TreeMap;->addEntry(Ljava/lang/Object;Ljava/lang/Object;Ljava/util/TreeMap$TreeMapEntry;Z)V
+HSPLjava/util/TreeMap;->addEntryToEmptyMap(Ljava/lang/Object;Ljava/lang/Object;)V
HSPLjava/util/TreeMap;->buildFromSorted(IIIILjava/util/Iterator;Ljava/io/ObjectInputStream;Ljava/lang/Object;)Ljava/util/TreeMap$TreeMapEntry;
HSPLjava/util/TreeMap;->buildFromSorted(ILjava/util/Iterator;Ljava/io/ObjectInputStream;Ljava/lang/Object;)V
HSPLjava/util/TreeMap;->ceilingEntry(Ljava/lang/Object;)Ljava/util/Map$Entry;
@@ -6474,6 +6466,7 @@ HSPLjava/util/TreeMap;->parentOf(Ljava/util/TreeMap$TreeMapEntry;)Ljava/util/Tre
HSPLjava/util/TreeMap;->pollFirstEntry()Ljava/util/Map$Entry;
HSPLjava/util/TreeMap;->predecessor(Ljava/util/TreeMap$TreeMapEntry;)Ljava/util/TreeMap$TreeMapEntry;
HSPLjava/util/TreeMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+HSPLjava/util/TreeMap;->put(Ljava/lang/Object;Ljava/lang/Object;Z)Ljava/lang/Object;
HSPLjava/util/TreeMap;->putAll(Ljava/util/Map;)V
HSPLjava/util/TreeMap;->remove(Ljava/lang/Object;)Ljava/lang/Object;
HSPLjava/util/TreeMap;->rightOf(Ljava/util/TreeMap$TreeMapEntry;)Ljava/util/TreeMap$TreeMapEntry;
@@ -6512,11 +6505,13 @@ HSPLjava/util/UUID;-><init>([B)V
HSPLjava/util/UUID;->digits(JI)Ljava/lang/String;
HSPLjava/util/UUID;->equals(Ljava/lang/Object;)Z
HSPLjava/util/UUID;->fromString(Ljava/lang/String;)Ljava/util/UUID;
+HSPLjava/util/UUID;->fromStringCurrentJava(Ljava/lang/String;)Ljava/util/UUID;
HSPLjava/util/UUID;->fromStringJava8(Ljava/lang/String;)Ljava/util/UUID;
HSPLjava/util/UUID;->getLeastSignificantBits()J
HSPLjava/util/UUID;->getMostSignificantBits()J
HSPLjava/util/UUID;->hashCode()I
HSPLjava/util/UUID;->nameUUIDFromBytes([B)Ljava/util/UUID;
+HSPLjava/util/UUID;->parse4Nibbles(Ljava/lang/String;I)J
HSPLjava/util/UUID;->randomUUID()Ljava/util/UUID;
HSPLjava/util/UUID;->toString()Ljava/lang/String;
HSPLjava/util/Vector$1;-><init>(Ljava/util/Vector;)V
@@ -6686,7 +6681,7 @@ HSPLjava/util/concurrent/ConcurrentHashMap;-><init>()V
HSPLjava/util/concurrent/ConcurrentHashMap;-><init>(I)V
HSPLjava/util/concurrent/ConcurrentHashMap;-><init>(IFI)V
HSPLjava/util/concurrent/ConcurrentHashMap;-><init>(Ljava/util/Map;)V
-HSPLjava/util/concurrent/ConcurrentHashMap;->addCount(JI)V+]Ljdk/internal/misc/Unsafe;Ljdk/internal/misc/Unsafe;]Ljava/util/concurrent/ConcurrentHashMap;Ljava/util/concurrent/ConcurrentHashMap;
+HSPLjava/util/concurrent/ConcurrentHashMap;->addCount(JI)V
HSPLjava/util/concurrent/ConcurrentHashMap;->casTabAt([Ljava/util/concurrent/ConcurrentHashMap$Node;ILjava/util/concurrent/ConcurrentHashMap$Node;Ljava/util/concurrent/ConcurrentHashMap$Node;)Z
HSPLjava/util/concurrent/ConcurrentHashMap;->clear()V
HSPLjava/util/concurrent/ConcurrentHashMap;->computeIfAbsent(Ljava/lang/Object;Ljava/util/function/Function;)Ljava/lang/Object;
@@ -6704,11 +6699,11 @@ HSPLjava/util/concurrent/ConcurrentHashMap;->mappingCount()J
HSPLjava/util/concurrent/ConcurrentHashMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
HSPLjava/util/concurrent/ConcurrentHashMap;->putAll(Ljava/util/Map;)V
HSPLjava/util/concurrent/ConcurrentHashMap;->putIfAbsent(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-HSPLjava/util/concurrent/ConcurrentHashMap;->putVal(Ljava/lang/Object;Ljava/lang/Object;Z)Ljava/lang/Object;+]Ljava/lang/Object;megamorphic_types
+HSPLjava/util/concurrent/ConcurrentHashMap;->putVal(Ljava/lang/Object;Ljava/lang/Object;Z)Ljava/lang/Object;
HSPLjava/util/concurrent/ConcurrentHashMap;->remove(Ljava/lang/Object;)Ljava/lang/Object;
HSPLjava/util/concurrent/ConcurrentHashMap;->remove(Ljava/lang/Object;Ljava/lang/Object;)Z
HSPLjava/util/concurrent/ConcurrentHashMap;->replace(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Z
-HSPLjava/util/concurrent/ConcurrentHashMap;->replaceNode(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;+]Ljava/lang/Object;Landroid/icu/impl/locale/BaseLocale$Key;
+HSPLjava/util/concurrent/ConcurrentHashMap;->replaceNode(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
HSPLjava/util/concurrent/ConcurrentHashMap;->resizeStamp(I)I
HSPLjava/util/concurrent/ConcurrentHashMap;->setTabAt([Ljava/util/concurrent/ConcurrentHashMap$Node;ILjava/util/concurrent/ConcurrentHashMap$Node;)V
HSPLjava/util/concurrent/ConcurrentHashMap;->size()I
@@ -7059,7 +7054,6 @@ HSPLjava/util/concurrent/ThreadLocalRandom;->current()Ljava/util/concurrent/Thre
HSPLjava/util/concurrent/ThreadLocalRandom;->getProbe()I
HSPLjava/util/concurrent/ThreadLocalRandom;->localInit()V
HSPLjava/util/concurrent/ThreadLocalRandom;->mix32(J)I
-HSPLjava/util/concurrent/ThreadLocalRandom;->mix64(J)J
HSPLjava/util/concurrent/ThreadLocalRandom;->nextInt()I
HSPLjava/util/concurrent/ThreadLocalRandom;->nextSecondarySeed()I
HSPLjava/util/concurrent/ThreadLocalRandom;->nextSeed()J
@@ -7191,7 +7185,7 @@ HSPLjava/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater;->accessCheck(
HSPLjava/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater;->addAndGet(Ljava/lang/Object;J)J
HSPLjava/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater;->compareAndSet(Ljava/lang/Object;JJ)Z
HSPLjava/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater;->getAndAdd(Ljava/lang/Object;J)J
-HSPLjava/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater;->getAndIncrement(Ljava/lang/Object;)J+]Ljava/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater;Ljava/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater;
+HSPLjava/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater;->getAndIncrement(Ljava/lang/Object;)J
HSPLjava/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater;->incrementAndGet(Ljava/lang/Object;)J
HSPLjava/util/concurrent/atomic/AtomicLongFieldUpdater;-><init>()V
HSPLjava/util/concurrent/atomic/AtomicLongFieldUpdater;->newUpdater(Ljava/lang/Class;Ljava/lang/String;)Ljava/util/concurrent/atomic/AtomicLongFieldUpdater;
@@ -7351,6 +7345,8 @@ HSPLjava/util/function/BinaryOperator$$ExternalSyntheticLambda0;-><init>(Ljava/u
HSPLjava/util/function/BinaryOperator;->maxBy(Ljava/util/Comparator;)Ljava/util/function/BinaryOperator;
HSPLjava/util/function/DoubleUnaryOperator$$ExternalSyntheticLambda1;->applyAsDouble(D)D
HSPLjava/util/function/DoubleUnaryOperator;->andThen(Ljava/util/function/DoubleUnaryOperator;)Ljava/util/function/DoubleUnaryOperator;
+HSPLjava/util/function/Function$$ExternalSyntheticLambda0;-><init>()V
+HSPLjava/util/function/Function$$ExternalSyntheticLambda0;->apply(Ljava/lang/Object;)Ljava/lang/Object;
HSPLjava/util/function/Function$$ExternalSyntheticLambda1;->apply(Ljava/lang/Object;)Ljava/lang/Object;
HSPLjava/util/function/Function$$ExternalSyntheticLambda2;->apply(Ljava/lang/Object;)Ljava/lang/Object;
HSPLjava/util/function/Function;->identity()Ljava/util/function/Function;
@@ -7365,15 +7361,20 @@ HSPLjava/util/jar/Attributes;-><init>(I)V
HSPLjava/util/jar/Attributes;->entrySet()Ljava/util/Set;
HSPLjava/util/jar/Attributes;->get(Ljava/lang/Object;)Ljava/lang/Object;
HSPLjava/util/jar/Attributes;->getValue(Ljava/util/jar/Attributes$Name;)Ljava/lang/String;
-HSPLjava/util/jar/Attributes;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;+]Ljava/util/Map;Ljava/util/LinkedHashMap;
+HSPLjava/util/jar/Attributes;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
HSPLjava/util/jar/Attributes;->putValue(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
HSPLjava/util/jar/Attributes;->read(Ljava/util/jar/Manifest$FastInputStream;[B)V
-HSPLjava/util/jar/Attributes;->read(Ljava/util/jar/Manifest$FastInputStream;[BLjava/lang/String;I)I+]Ljava/util/jar/Attributes;Ljava/util/jar/Attributes;]Ljava/util/jar/Manifest$FastInputStream;Ljava/util/jar/Manifest$FastInputStream;
+HSPLjava/util/jar/Attributes;->read(Ljava/util/jar/Manifest$FastInputStream;[BLjava/lang/String;I)I
HSPLjava/util/jar/Attributes;->size()I
+HSPLjava/util/jar/JarEntry;-><init>(Ljava/lang/String;)V
HSPLjava/util/jar/JarEntry;-><init>(Ljava/util/zip/ZipEntry;)V
+HSPLjava/util/jar/JarFile$JarFileEntry;-><init>(Ljava/util/jar/JarFile;Ljava/lang/String;)V
HSPLjava/util/jar/JarFile$JarFileEntry;-><init>(Ljava/util/jar/JarFile;Ljava/util/zip/ZipEntry;)V
HSPLjava/util/jar/JarFile;-><init>(Ljava/io/File;ZI)V
+HSPLjava/util/jar/JarFile;-><init>(Ljava/io/File;ZZI)V
HSPLjava/util/jar/JarFile;-><init>(Ljava/lang/String;)V
+HSPLjava/util/jar/JarFile;-><init>(Ljava/lang/String;ZZ)V
+HSPLjava/util/jar/JarFile;->entryFor(Ljava/lang/String;)Ljava/util/jar/JarEntry;
HSPLjava/util/jar/JarFile;->getBytes(Ljava/util/zip/ZipEntry;)[B
HSPLjava/util/jar/JarFile;->getEntry(Ljava/lang/String;)Ljava/util/zip/ZipEntry;
HSPLjava/util/jar/JarFile;->getInputStream(Ljava/util/zip/ZipEntry;)Ljava/io/InputStream;
@@ -7573,7 +7574,7 @@ HSPLjava/util/logging/StreamHandler;->setOutputStream(Ljava/io/OutputStream;)V
HSPLjava/util/logging/XMLFormatter;-><init>()V
HSPLjava/util/regex/Matcher;-><init>(Ljava/util/regex/Pattern;Ljava/lang/CharSequence;)V
HSPLjava/util/regex/Matcher;->appendEvaluated(Ljava/lang/StringBuilder;Ljava/lang/String;)V
-HSPLjava/util/regex/Matcher;->appendExpandedReplacement(Ljava/lang/String;Ljava/lang/StringBuilder;)Ljava/lang/StringBuilder;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/regex/Matcher;Ljava/util/regex/Matcher;
+HSPLjava/util/regex/Matcher;->appendExpandedReplacement(Ljava/lang/String;Ljava/lang/StringBuilder;)Ljava/lang/StringBuilder;
HSPLjava/util/regex/Matcher;->appendReplacement(Ljava/lang/StringBuffer;Ljava/lang/String;)Ljava/util/regex/Matcher;
HSPLjava/util/regex/Matcher;->appendReplacement(Ljava/lang/StringBuilder;Ljava/lang/String;)Ljava/util/regex/Matcher;
HSPLjava/util/regex/Matcher;->appendReplacementInternal(Ljava/lang/StringBuilder;Ljava/lang/String;)V
@@ -7582,13 +7583,13 @@ HSPLjava/util/regex/Matcher;->appendTail(Ljava/lang/StringBuilder;)Ljava/lang/St
HSPLjava/util/regex/Matcher;->end()I
HSPLjava/util/regex/Matcher;->end(I)I
HSPLjava/util/regex/Matcher;->ensureMatch()V
-HSPLjava/util/regex/Matcher;->find()Z+]Lcom/android/icu/util/regex/MatcherNative;Lcom/android/icu/util/regex/MatcherNative;
+HSPLjava/util/regex/Matcher;->find()Z
HSPLjava/util/regex/Matcher;->find(I)Z
HSPLjava/util/regex/Matcher;->getSubSequence(II)Ljava/lang/CharSequence;
HSPLjava/util/regex/Matcher;->getTextLength()I
HSPLjava/util/regex/Matcher;->group()Ljava/lang/String;
HSPLjava/util/regex/Matcher;->group(I)Ljava/lang/String;
-HSPLjava/util/regex/Matcher;->groupCount()I+]Lcom/android/icu/util/regex/MatcherNative;Lcom/android/icu/util/regex/MatcherNative;
+HSPLjava/util/regex/Matcher;->groupCount()I
HSPLjava/util/regex/Matcher;->hitEnd()Z
HSPLjava/util/regex/Matcher;->lookingAt()Z
HSPLjava/util/regex/Matcher;->matches()Z
@@ -7598,8 +7599,8 @@ HSPLjava/util/regex/Matcher;->replaceAll(Ljava/lang/String;)Ljava/lang/String;
HSPLjava/util/regex/Matcher;->replaceFirst(Ljava/lang/String;)Ljava/lang/String;
HSPLjava/util/regex/Matcher;->reset()Ljava/util/regex/Matcher;
HSPLjava/util/regex/Matcher;->reset(Ljava/lang/CharSequence;)Ljava/util/regex/Matcher;
-HSPLjava/util/regex/Matcher;->reset(Ljava/lang/CharSequence;II)Ljava/util/regex/Matcher;+]Ljava/lang/CharSequence;Ljava/lang/String;
-HSPLjava/util/regex/Matcher;->resetForInput()V+]Lcom/android/icu/util/regex/MatcherNative;Lcom/android/icu/util/regex/MatcherNative;
+HSPLjava/util/regex/Matcher;->reset(Ljava/lang/CharSequence;II)Ljava/util/regex/Matcher;
+HSPLjava/util/regex/Matcher;->resetForInput()V
HSPLjava/util/regex/Matcher;->start()I
HSPLjava/util/regex/Matcher;->start(I)I
HSPLjava/util/regex/Matcher;->useAnchoringBounds(Z)Ljava/util/regex/Matcher;
@@ -7609,7 +7610,7 @@ HSPLjava/util/regex/Pattern;-><init>(Ljava/lang/String;I)V
HSPLjava/util/regex/Pattern;->compile()V
HSPLjava/util/regex/Pattern;->compile(Ljava/lang/String;)Ljava/util/regex/Pattern;
HSPLjava/util/regex/Pattern;->compile(Ljava/lang/String;I)Ljava/util/regex/Pattern;
-HSPLjava/util/regex/Pattern;->fastSplit(Ljava/lang/String;Ljava/lang/String;I)[Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String;
+HSPLjava/util/regex/Pattern;->fastSplit(Ljava/lang/String;Ljava/lang/String;I)[Ljava/lang/String;
HSPLjava/util/regex/Pattern;->matcher(Ljava/lang/CharSequence;)Ljava/util/regex/Matcher;
HSPLjava/util/regex/Pattern;->matches(Ljava/lang/String;Ljava/lang/CharSequence;)Z
HSPLjava/util/regex/Pattern;->pattern()Ljava/lang/String;
@@ -7618,9 +7619,9 @@ HSPLjava/util/regex/Pattern;->split(Ljava/lang/CharSequence;)[Ljava/lang/String;
HSPLjava/util/regex/Pattern;->split(Ljava/lang/CharSequence;I)[Ljava/lang/String;
HSPLjava/util/regex/Pattern;->toString()Ljava/lang/String;
HSPLjava/util/stream/AbstractPipeline;-><init>(Ljava/util/Spliterator;IZ)V
-HSPLjava/util/stream/AbstractPipeline;-><init>(Ljava/util/stream/AbstractPipeline;I)V+]Ljava/util/stream/AbstractPipeline;Ljava/util/stream/IntPipeline$4;,Ljava/util/stream/ReferencePipeline$4;
+HSPLjava/util/stream/AbstractPipeline;-><init>(Ljava/util/stream/AbstractPipeline;I)V
HSPLjava/util/stream/AbstractPipeline;->close()V
-HSPLjava/util/stream/AbstractPipeline;->copyInto(Ljava/util/stream/Sink;Ljava/util/Spliterator;)V+]Ljava/util/Spliterator;Ljava/util/Spliterators$IntArraySpliterator;,Ljava/util/HashMap$KeySpliterator;]Ljava/util/stream/AbstractPipeline;Ljava/util/stream/IntPipeline$4;,Ljava/util/stream/ReferencePipeline$4;]Ljava/util/stream/Sink;Ljava/util/stream/ReferencePipeline$4$1;,Ljava/util/stream/IntPipeline$4$1;]Ljava/util/stream/StreamOpFlag;Ljava/util/stream/StreamOpFlag;
+HSPLjava/util/stream/AbstractPipeline;->copyInto(Ljava/util/stream/Sink;Ljava/util/Spliterator;)V
HSPLjava/util/stream/AbstractPipeline;->evaluate(Ljava/util/Spliterator;ZLjava/util/function/IntFunction;)Ljava/util/stream/Node;
HSPLjava/util/stream/AbstractPipeline;->evaluate(Ljava/util/stream/TerminalOp;)Ljava/lang/Object;
HSPLjava/util/stream/AbstractPipeline;->evaluateToArrayNode(Ljava/util/function/IntFunction;)Ljava/util/stream/Node;
@@ -7638,10 +7639,19 @@ HSPLjava/util/stream/AbstractSpinedBuffer;-><init>()V
HSPLjava/util/stream/AbstractSpinedBuffer;->count()J
HSPLjava/util/stream/Collectors$$ExternalSyntheticLambda0;-><init>()V
HSPLjava/util/stream/Collectors$$ExternalSyntheticLambda20;->accept(Ljava/lang/Object;Ljava/lang/Object;)V
+HSPLjava/util/stream/Collectors$$ExternalSyntheticLambda25;-><init>()V
+HSPLjava/util/stream/Collectors$$ExternalSyntheticLambda25;->get()Ljava/lang/Object;
+HSPLjava/util/stream/Collectors$$ExternalSyntheticLambda26;-><init>()V
+HSPLjava/util/stream/Collectors$$ExternalSyntheticLambda26;->accept(Ljava/lang/Object;Ljava/lang/Object;)V+]Ljava/util/List;Ljava/util/ArrayList;
+HSPLjava/util/stream/Collectors$$ExternalSyntheticLambda27;-><init>()V
+HSPLjava/util/stream/Collectors$$ExternalSyntheticLambda28;-><init>()V
+HSPLjava/util/stream/Collectors$$ExternalSyntheticLambda28;->apply(Ljava/lang/Object;)Ljava/lang/Object;
HSPLjava/util/stream/Collectors$$ExternalSyntheticLambda42;-><init>()V
HSPLjava/util/stream/Collectors$$ExternalSyntheticLambda65;->get()Ljava/lang/Object;
+HSPLjava/util/stream/Collectors$$ExternalSyntheticLambda72;->get()Ljava/lang/Object;
HSPLjava/util/stream/Collectors$$ExternalSyntheticLambda74;-><init>()V
HSPLjava/util/stream/Collectors$$ExternalSyntheticLambda75;-><init>()V
+HSPLjava/util/stream/Collectors$$ExternalSyntheticLambda75;->apply(Ljava/lang/Object;)Ljava/lang/Object;
HSPLjava/util/stream/Collectors$$ExternalSyntheticLambda76;-><init>()V
HSPLjava/util/stream/Collectors$$ExternalSyntheticLambda87;-><init>()V
HSPLjava/util/stream/Collectors$CollectorImpl;-><init>(Ljava/util/function/Supplier;Ljava/util/function/BiConsumer;Ljava/util/function/BinaryOperator;Ljava/util/Set;)V
@@ -7659,6 +7669,7 @@ HSPLjava/util/stream/Collectors;->groupingBy(Ljava/util/function/Function;Ljava/
HSPLjava/util/stream/Collectors;->joining(Ljava/lang/CharSequence;)Ljava/util/stream/Collector;
HSPLjava/util/stream/Collectors;->joining(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Ljava/util/stream/Collector;
HSPLjava/util/stream/Collectors;->lambda$joining$11(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Ljava/util/StringJoiner;
+HSPLjava/util/stream/Collectors;->lambda$toUnmodifiableList$6(Ljava/util/ArrayList;)Ljava/util/List;+]Ljdk/internal/access/JavaUtilCollectionAccess;Ljava/util/ImmutableCollections$Access$1;
HSPLjava/util/stream/Collectors;->lambda$uniqKeysMapAccumulator$1(Ljava/util/function/Function;Ljava/util/function/Function;Ljava/util/Map;Ljava/lang/Object;)V
HSPLjava/util/stream/Collectors;->mapMerger(Ljava/util/function/BinaryOperator;)Ljava/util/function/BinaryOperator;
HSPLjava/util/stream/Collectors;->toCollection(Ljava/util/function/Supplier;)Ljava/util/stream/Collector;
@@ -7666,6 +7677,7 @@ HSPLjava/util/stream/Collectors;->toList()Ljava/util/stream/Collector;
HSPLjava/util/stream/Collectors;->toMap(Ljava/util/function/Function;Ljava/util/function/Function;)Ljava/util/stream/Collector;
HSPLjava/util/stream/Collectors;->toMap(Ljava/util/function/Function;Ljava/util/function/Function;Ljava/util/function/BinaryOperator;Ljava/util/function/Supplier;)Ljava/util/stream/Collector;
HSPLjava/util/stream/Collectors;->toSet()Ljava/util/stream/Collector;
+HSPLjava/util/stream/Collectors;->toUnmodifiableList()Ljava/util/stream/Collector;
HSPLjava/util/stream/DistinctOps$1$2;-><init>(Ljava/util/stream/DistinctOps$1;Ljava/util/stream/Sink;)V
HSPLjava/util/stream/DistinctOps$1$2;->accept(Ljava/lang/Object;)V
HSPLjava/util/stream/DistinctOps$1$2;->begin(J)V
@@ -7697,8 +7709,13 @@ HSPLjava/util/stream/ForEachOps$ForEachOp;->evaluateSequential(Ljava/util/stream
HSPLjava/util/stream/ForEachOps$ForEachOp;->get()Ljava/lang/Void;
HSPLjava/util/stream/ForEachOps$ForEachOp;->getOpFlags()I
HSPLjava/util/stream/ForEachOps;->makeRef(Ljava/util/function/Consumer;Z)Ljava/util/stream/TerminalOp;
+HSPLjava/util/stream/IntPipeline$$ExternalSyntheticLambda12;->apply(I)Ljava/lang/Object;
HSPLjava/util/stream/IntPipeline$$ExternalSyntheticLambda7;-><init>()V
HSPLjava/util/stream/IntPipeline$$ExternalSyntheticLambda8;-><init>()V
+HSPLjava/util/stream/IntPipeline$1$1;-><init>(Ljava/util/stream/IntPipeline$1;Ljava/util/stream/Sink;)V
+HSPLjava/util/stream/IntPipeline$1$1;->accept(I)V+]Ljava/util/function/IntFunction;megamorphic_types]Ljava/util/stream/Sink;megamorphic_types
+HSPLjava/util/stream/IntPipeline$1;-><init>(Ljava/util/stream/IntPipeline;Ljava/util/stream/AbstractPipeline;Ljava/util/stream/StreamShape;ILjava/util/function/IntFunction;)V
+HSPLjava/util/stream/IntPipeline$1;->opWrapSink(ILjava/util/stream/Sink;)Ljava/util/stream/Sink;
HSPLjava/util/stream/IntPipeline$4$1;-><init>(Ljava/util/stream/IntPipeline$4;Ljava/util/stream/Sink;)V
HSPLjava/util/stream/IntPipeline$4$1;->accept(I)V
HSPLjava/util/stream/IntPipeline$4;->opWrapSink(ILjava/util/stream/Sink;)Ljava/util/stream/Sink;
@@ -7718,6 +7735,7 @@ HSPLjava/util/stream/IntPipeline;->distinct()Ljava/util/stream/IntStream;
HSPLjava/util/stream/IntPipeline;->filter(Ljava/util/function/IntPredicate;)Ljava/util/stream/IntStream;
HSPLjava/util/stream/IntPipeline;->makeNodeBuilder(JLjava/util/function/IntFunction;)Ljava/util/stream/Node$Builder;
HSPLjava/util/stream/IntPipeline;->mapToObj(Ljava/util/function/IntFunction;)Ljava/util/stream/Stream;
+HSPLjava/util/stream/IntPipeline;->mapToObj(Ljava/util/function/IntFunction;I)Ljava/util/stream/Stream;
HSPLjava/util/stream/IntPipeline;->reduce(ILjava/util/function/IntBinaryOperator;)I
HSPLjava/util/stream/IntPipeline;->sum()I
HSPLjava/util/stream/IntPipeline;->toArray()[I
@@ -7823,6 +7841,10 @@ HSPLjava/util/stream/ReduceOps;->makeInt(ILjava/util/function/IntBinaryOperator;
HSPLjava/util/stream/ReduceOps;->makeLong(JLjava/util/function/LongBinaryOperator;)Ljava/util/stream/TerminalOp;
HSPLjava/util/stream/ReduceOps;->makeRef(Ljava/util/function/BinaryOperator;)Ljava/util/stream/TerminalOp;
HSPLjava/util/stream/ReduceOps;->makeRef(Ljava/util/stream/Collector;)Ljava/util/stream/TerminalOp;
+HSPLjava/util/stream/ReferencePipeline$15$1;-><init>(Ljava/util/stream/ReferencePipeline$15;Ljava/util/stream/Sink;)V
+HSPLjava/util/stream/ReferencePipeline$15$1;->accept(Ljava/lang/Object;)V+]Ljava/util/stream/Sink;Ljava/util/stream/ReduceOps$3ReducingSink;]Ljava/util/function/Consumer;Landroid/content/ContentCaptureOptions$ContentProtectionOptions$$ExternalSyntheticLambda2;
+HSPLjava/util/stream/ReferencePipeline$15;-><init>(Ljava/util/stream/ReferencePipeline;Ljava/util/stream/AbstractPipeline;Ljava/util/stream/StreamShape;ILjava/util/function/Consumer;)V
+HSPLjava/util/stream/ReferencePipeline$15;->opWrapSink(ILjava/util/stream/Sink;)Ljava/util/stream/Sink;
HSPLjava/util/stream/ReferencePipeline$2$1;-><init>(Ljava/util/stream/ReferencePipeline$2;Ljava/util/stream/Sink;)V
HSPLjava/util/stream/ReferencePipeline$2$1;->accept(Ljava/lang/Object;)V
HSPLjava/util/stream/ReferencePipeline$2$1;->begin(J)V
@@ -7875,6 +7897,7 @@ HSPLjava/util/stream/ReferencePipeline;->mapToInt(Ljava/util/function/ToIntFunct
HSPLjava/util/stream/ReferencePipeline;->mapToLong(Ljava/util/function/ToLongFunction;)Ljava/util/stream/LongStream;
HSPLjava/util/stream/ReferencePipeline;->max(Ljava/util/Comparator;)Ljava/util/Optional;
HSPLjava/util/stream/ReferencePipeline;->noneMatch(Ljava/util/function/Predicate;)Z
+HSPLjava/util/stream/ReferencePipeline;->peek(Ljava/util/function/Consumer;)Ljava/util/stream/Stream;
HSPLjava/util/stream/ReferencePipeline;->reduce(Ljava/util/function/BinaryOperator;)Ljava/util/Optional;
HSPLjava/util/stream/ReferencePipeline;->sorted()Ljava/util/stream/Stream;
HSPLjava/util/stream/ReferencePipeline;->sorted(Ljava/util/Comparator;)Ljava/util/stream/Stream;
@@ -7947,13 +7970,18 @@ HSPLjava/util/zip/CRC32;->updateBytes(I[BII)I
HSPLjava/util/zip/CheckedInputStream;-><init>(Ljava/io/InputStream;Ljava/util/zip/Checksum;)V
HSPLjava/util/zip/CheckedInputStream;->read()I
HSPLjava/util/zip/CheckedInputStream;->read([BII)I
+HSPLjava/util/zip/Deflater$DeflaterZStreamRef;-><init>(Ljava/util/zip/Deflater;J)V
+HSPLjava/util/zip/Deflater$DeflaterZStreamRef;-><init>(Ljava/util/zip/Deflater;JLjava/util/zip/Deflater$DeflaterZStreamRef-IA;)V
+HSPLjava/util/zip/Deflater$DeflaterZStreamRef;->address()J
+HSPLjava/util/zip/Deflater$DeflaterZStreamRef;->clean()V+]Ljava/lang/ref/Cleaner$Cleanable;Ljdk/internal/ref/CleanerImpl$PhantomCleanableRef;
+HSPLjava/util/zip/Deflater$DeflaterZStreamRef;->run()V
+HSPLjava/util/zip/Deflater;->-$$Nest$smend(J)V
HSPLjava/util/zip/Deflater;-><init>()V
HSPLjava/util/zip/Deflater;-><init>(IZ)V
HSPLjava/util/zip/Deflater;->deflate([BII)I
HSPLjava/util/zip/Deflater;->deflate([BIII)I
HSPLjava/util/zip/Deflater;->end()V
HSPLjava/util/zip/Deflater;->ensureOpen()V
-HSPLjava/util/zip/Deflater;->finalize()V
HSPLjava/util/zip/Deflater;->finish()V
HSPLjava/util/zip/Deflater;->finished()Z
HSPLjava/util/zip/Deflater;->getBytesRead()J
@@ -7991,12 +8019,14 @@ HSPLjava/util/zip/GZIPOutputStream;->writeHeader()V
HSPLjava/util/zip/GZIPOutputStream;->writeInt(I[BI)V
HSPLjava/util/zip/GZIPOutputStream;->writeShort(I[BI)V
HSPLjava/util/zip/GZIPOutputStream;->writeTrailer([BI)V
+HSPLjava/util/zip/Inflater$InflaterZStreamRef;->address()J
+HSPLjava/util/zip/Inflater$InflaterZStreamRef;->clean()V+]Ljava/lang/ref/Cleaner$Cleanable;Ljdk/internal/ref/CleanerImpl$PhantomCleanableRef;
+HSPLjava/util/zip/Inflater$InflaterZStreamRef;->run()V
+HSPLjava/util/zip/Inflater;->-$$Nest$smend(J)V
HSPLjava/util/zip/Inflater;-><init>()V
HSPLjava/util/zip/Inflater;-><init>(Z)V
HSPLjava/util/zip/Inflater;->end()V
-HSPLjava/util/zip/Inflater;->ended()Z
HSPLjava/util/zip/Inflater;->ensureOpen()V
-HSPLjava/util/zip/Inflater;->finalize()V
HSPLjava/util/zip/Inflater;->finished()Z
HSPLjava/util/zip/Inflater;->getBytesRead()J
HSPLjava/util/zip/Inflater;->getBytesWritten()J
@@ -8009,15 +8039,17 @@ HSPLjava/util/zip/Inflater;->reset()V
HSPLjava/util/zip/Inflater;->setInput([BII)V
HSPLjava/util/zip/InflaterInputStream;-><init>(Ljava/io/InputStream;Ljava/util/zip/Inflater;)V
HSPLjava/util/zip/InflaterInputStream;-><init>(Ljava/io/InputStream;Ljava/util/zip/Inflater;I)V
+HSPLjava/util/zip/InflaterInputStream;-><init>(Ljava/io/InputStream;Ljava/util/zip/Inflater;IZ)V
HSPLjava/util/zip/InflaterInputStream;->available()I
HSPLjava/util/zip/InflaterInputStream;->close()V
HSPLjava/util/zip/InflaterInputStream;->ensureOpen()V
HSPLjava/util/zip/InflaterInputStream;->fill()V
HSPLjava/util/zip/InflaterInputStream;->read()I
HSPLjava/util/zip/InflaterInputStream;->read([BII)I
-HSPLjava/util/zip/ZStreamRef;-><init>(J)V
-HSPLjava/util/zip/ZStreamRef;->address()J
-HSPLjava/util/zip/ZStreamRef;->clear()V
+HSPLjava/util/zip/ZipCoder$UTF8ZipCoder;->checkedHash([BII)I
+HSPLjava/util/zip/ZipCoder$UTF8ZipCoder;->hasTrailingSlash([BI)Z
+HSPLjava/util/zip/ZipCoder$UTF8ZipCoder;->isUTF8()Z
+HSPLjava/util/zip/ZipCoder$UTF8ZipCoder;->toString([BII)Ljava/lang/String;
HSPLjava/util/zip/ZipCoder;-><init>(Ljava/nio/charset/Charset;)V
HSPLjava/util/zip/ZipCoder;->decoder()Ljava/nio/charset/CharsetDecoder;
HSPLjava/util/zip/ZipCoder;->encoder()Ljava/nio/charset/CharsetEncoder;
@@ -8034,41 +8066,68 @@ HSPLjava/util/zip/ZipEntry;->getMethod()I
HSPLjava/util/zip/ZipEntry;->getName()Ljava/lang/String;
HSPLjava/util/zip/ZipEntry;->getSize()J
HSPLjava/util/zip/ZipEntry;->isDirectory()Z
-HSPLjava/util/zip/ZipFile$ZipEntryIterator;-><init>(Ljava/util/zip/ZipFile;)V
+HSPLjava/util/zip/ZipEntry;->setExtra0([BZZ)V
+HSPLjava/util/zip/ZipFile$CleanableResource;-><init>(Ljava/util/zip/ZipFile;Ljava/util/zip/ZipCoder;Ljava/io/File;IZ)V
+HSPLjava/util/zip/ZipFile$CleanableResource;->clean()V+]Ljava/lang/ref/Cleaner$Cleanable;Ljdk/internal/ref/CleanerImpl$PhantomCleanableRef;
+HSPLjava/util/zip/ZipFile$CleanableResource;->getInflater()Ljava/util/zip/Inflater;+]Ljava/util/Deque;Ljava/util/ArrayDeque;
+HSPLjava/util/zip/ZipFile$CleanableResource;->releaseInflater(Ljava/util/zip/Inflater;)V+]Ljava/util/Deque;Ljava/util/ArrayDeque;]Ljava/util/zip/Inflater;Ljava/util/zip/Inflater;
+HSPLjava/util/zip/ZipFile$CleanableResource;->run()V+]Ljava/util/Deque;Ljava/util/ArrayDeque;]Ljava/util/Set;Ljava/util/Collections$SetFromMap;]Ljava/util/zip/Inflater;Ljava/util/zip/Inflater;
+HSPLjava/util/zip/ZipFile$InflaterCleanupAction;->run()V+]Ljava/util/zip/ZipFile$CleanableResource;Ljava/util/zip/ZipFile$CleanableResource;
+HSPLjava/util/zip/ZipFile$Source$End;-><init>()V
+HSPLjava/util/zip/ZipFile$Source$End;-><init>(Ljava/util/zip/ZipFile$Source$End-IA;)V
+HSPLjava/util/zip/ZipFile$Source$Key;-><init>(Ljava/io/File;Ljava/nio/file/attribute/BasicFileAttributes;Ljava/util/zip/ZipCoder;Z)V
+HSPLjava/util/zip/ZipFile$Source$Key;->equals(Ljava/lang/Object;)Z+]Ljava/lang/Object;Lsun/nio/fs/UnixFileKey;]Ljava/nio/file/attribute/BasicFileAttributes;Lsun/nio/fs/UnixFileAttributes$UnixAsBasicFileAttributes;
+HSPLjava/util/zip/ZipFile$Source$Key;->hashCode()I
+HSPLjava/util/zip/ZipFile$Source;->-$$Nest$fgetlocpos(Ljava/util/zip/ZipFile$Source;)J
+HSPLjava/util/zip/ZipFile$Source;->-$$Nest$mgetEntryPos(Ljava/util/zip/ZipFile$Source;Ljava/lang/String;Z)I
+HSPLjava/util/zip/ZipFile$Source;->-$$Nest$mreadAt(Ljava/util/zip/ZipFile$Source;[BIIJ)I
+HSPLjava/util/zip/ZipFile$Source;->-$$Nest$mreadFullyAt(Ljava/util/zip/ZipFile$Source;[BIIJ)I
+HSPLjava/util/zip/ZipFile$Source;-><init>(Ljava/util/zip/ZipFile$Source$Key;ZLjava/util/zip/ZipCoder;)V
+HSPLjava/util/zip/ZipFile$Source;->checkAndAddEntry(II)I
+HSPLjava/util/zip/ZipFile$Source;->close()V+]Ljava/io/RandomAccessFile;Ljava/io/RandomAccessFile;
+HSPLjava/util/zip/ZipFile$Source;->findEND()Ljava/util/zip/ZipFile$Source$End;
+HSPLjava/util/zip/ZipFile$Source;->get(Ljava/io/File;ZLjava/util/zip/ZipCoder;Z)Ljava/util/zip/ZipFile$Source;
+HSPLjava/util/zip/ZipFile$Source;->getEntryPos(Ljava/lang/String;Z)I
+HSPLjava/util/zip/ZipFile$Source;->getMetaVersion(II)I
+HSPLjava/util/zip/ZipFile$Source;->initCEN(I)V
+HSPLjava/util/zip/ZipFile$Source;->isManifestName(II)Z
+HSPLjava/util/zip/ZipFile$Source;->isMetaName([BII)Z
+HSPLjava/util/zip/ZipFile$Source;->isSignatureRelated(II)Z
+HSPLjava/util/zip/ZipFile$Source;->nextEntryPos(III)I
+HSPLjava/util/zip/ZipFile$Source;->readAt([BIIJ)I+]Ljava/io/RandomAccessFile;Ljava/io/RandomAccessFile;
+HSPLjava/util/zip/ZipFile$Source;->readFullyAt([BIIJ)I
+HSPLjava/util/zip/ZipFile$Source;->release(Ljava/util/zip/ZipFile$Source;)V+]Ljava/util/HashMap;Ljava/util/HashMap;
+HSPLjava/util/zip/ZipFile$Source;->zipCoderForPos(I)Ljava/util/zip/ZipCoder;
HSPLjava/util/zip/ZipFile$ZipEntryIterator;->hasMoreElements()Z
HSPLjava/util/zip/ZipFile$ZipEntryIterator;->hasNext()Z
HSPLjava/util/zip/ZipFile$ZipEntryIterator;->next()Ljava/util/zip/ZipEntry;
HSPLjava/util/zip/ZipFile$ZipEntryIterator;->nextElement()Ljava/lang/Object;
HSPLjava/util/zip/ZipFile$ZipEntryIterator;->nextElement()Ljava/util/zip/ZipEntry;
-HSPLjava/util/zip/ZipFile$ZipFileInflaterInputStream;-><init>(Ljava/util/zip/ZipFile;Ljava/util/zip/ZipFile$ZipFileInputStream;Ljava/util/zip/Inflater;I)V
HSPLjava/util/zip/ZipFile$ZipFileInflaterInputStream;->available()I
HSPLjava/util/zip/ZipFile$ZipFileInflaterInputStream;->close()V
HSPLjava/util/zip/ZipFile$ZipFileInflaterInputStream;->fill()V
-HSPLjava/util/zip/ZipFile$ZipFileInflaterInputStream;->finalize()V
-HSPLjava/util/zip/ZipFile$ZipFileInputStream;-><init>(Ljava/util/zip/ZipFile;J)V
+HSPLjava/util/zip/ZipFile$ZipFileInputStream;-><init>(Ljava/util/zip/ZipFile;[BI)V
HSPLjava/util/zip/ZipFile$ZipFileInputStream;->available()I
HSPLjava/util/zip/ZipFile$ZipFileInputStream;->close()V
-HSPLjava/util/zip/ZipFile$ZipFileInputStream;->finalize()V
+HSPLjava/util/zip/ZipFile$ZipFileInputStream;->initDataOffset()J
HSPLjava/util/zip/ZipFile$ZipFileInputStream;->read()I
-HSPLjava/util/zip/ZipFile$ZipFileInputStream;->read([BII)I+]Ljava/util/zip/ZipFile$ZipFileInputStream;Ljava/util/zip/ZipFile$ZipFileInputStream;
+HSPLjava/util/zip/ZipFile$ZipFileInputStream;->read([BII)I
HSPLjava/util/zip/ZipFile$ZipFileInputStream;->size()J
+HSPLjava/util/zip/ZipFile;->-$$Nest$fgetres(Ljava/util/zip/ZipFile;)Ljava/util/zip/ZipFile$CleanableResource;
HSPLjava/util/zip/ZipFile;->-$$Nest$mensureOpen(Ljava/util/zip/ZipFile;)V
HSPLjava/util/zip/ZipFile;-><init>(Ljava/io/File;)V
HSPLjava/util/zip/ZipFile;-><init>(Ljava/io/File;I)V
HSPLjava/util/zip/ZipFile;-><init>(Ljava/io/File;ILjava/nio/charset/Charset;)V
HSPLjava/util/zip/ZipFile;-><init>(Ljava/io/File;ILjava/nio/charset/Charset;Z)V
+HSPLjava/util/zip/ZipFile;-><init>(Ljava/io/File;IZ)V
HSPLjava/util/zip/ZipFile;-><init>(Ljava/lang/String;)V
HSPLjava/util/zip/ZipFile;->close()V
HSPLjava/util/zip/ZipFile;->ensureOpen()V
HSPLjava/util/zip/ZipFile;->ensureOpenOrZipException()V
HSPLjava/util/zip/ZipFile;->entries()Ljava/util/Enumeration;
-HSPLjava/util/zip/ZipFile;->finalize()V
HSPLjava/util/zip/ZipFile;->getEntry(Ljava/lang/String;)Ljava/util/zip/ZipEntry;
-HSPLjava/util/zip/ZipFile;->getInflater()Ljava/util/zip/Inflater;
HSPLjava/util/zip/ZipFile;->getInputStream(Ljava/util/zip/ZipEntry;)Ljava/io/InputStream;
-HSPLjava/util/zip/ZipFile;->getZipEntry(Ljava/lang/String;J)Ljava/util/zip/ZipEntry;
-HSPLjava/util/zip/ZipFile;->onZipEntryAccess([BI)V
-HSPLjava/util/zip/ZipFile;->releaseInflater(Ljava/util/zip/Inflater;)V
+HSPLjava/util/zip/ZipFile;->getZipEntry(Ljava/lang/String;I)Ljava/util/zip/ZipEntry;
HSPLjava/util/zip/ZipInputStream;-><init>(Ljava/io/InputStream;)V
HSPLjava/util/zip/ZipInputStream;-><init>(Ljava/io/InputStream;Ljava/nio/charset/Charset;)V
HSPLjava/util/zip/ZipInputStream;->close()V
@@ -8080,6 +8139,20 @@ HSPLjava/util/zip/ZipInputStream;->read([BII)I
HSPLjava/util/zip/ZipInputStream;->readEnd(Ljava/util/zip/ZipEntry;)V
HSPLjava/util/zip/ZipInputStream;->readFully([BII)V
HSPLjava/util/zip/ZipInputStream;->readLOC()Ljava/util/zip/ZipEntry;
+HSPLjava/util/zip/ZipUtils;->CENFLG([BI)I
+HSPLjava/util/zip/ZipUtils;->CENLEN([BI)J
+HSPLjava/util/zip/ZipUtils;->CENOFF([BI)J
+HSPLjava/util/zip/ZipUtils;->CENSIZ([BI)J
+HSPLjava/util/zip/ZipUtils;->ENDCOM([B)I
+HSPLjava/util/zip/ZipUtils;->ENDOFF([B)J
+HSPLjava/util/zip/ZipUtils;->ENDSIZ([B)J
+HSPLjava/util/zip/ZipUtils;->ENDTOT([B)I
+HSPLjava/util/zip/ZipUtils;->GETSIG([B)J
+HSPLjava/util/zip/ZipUtils;->LG([BI)J
+HSPLjava/util/zip/ZipUtils;->LOCEXT([B)I
+HSPLjava/util/zip/ZipUtils;->LOCNAM([B)I
+HSPLjava/util/zip/ZipUtils;->LOCSIG([B)J
+HSPLjava/util/zip/ZipUtils;->SH([BI)I
HSPLjava/util/zip/ZipUtils;->get16([BI)I
HSPLjava/util/zip/ZipUtils;->get32([BI)J
HSPLjava/util/zip/ZipUtils;->unixTimeToFileTime(J)Ljava/nio/file/attribute/FileTime;
@@ -8285,6 +8358,8 @@ HSPLjavax/xml/parsers/DocumentBuilderFactory;->isValidating()Z
HSPLjavax/xml/parsers/DocumentBuilderFactory;->newInstance()Ljavax/xml/parsers/DocumentBuilderFactory;
HSPLjavax/xml/parsers/SAXParserFactory;-><init>()V
HSPLjavax/xml/parsers/SAXParserFactory;->newInstance()Ljavax/xml/parsers/SAXParserFactory;
+HSPLjdk/internal/access/SharedSecrets;->getJavaUtilCollectionAccess()Ljdk/internal/access/JavaUtilCollectionAccess;
+HSPLjdk/internal/access/SharedSecrets;->setJavaUtilCollectionAccess(Ljdk/internal/access/JavaUtilCollectionAccess;)V
HSPLjdk/internal/math/FDBigInteger;-><init>(J[CII)V
HSPLjdk/internal/math/FDBigInteger;-><init>([II)V
HSPLjdk/internal/math/FDBigInteger;->add(Ljdk/internal/math/FDBigInteger;)Ljdk/internal/math/FDBigInteger;
@@ -8346,7 +8421,6 @@ HSPLjdk/internal/math/FloatingDecimal;->toJavaFormatString(D)Ljava/lang/String;
HSPLjdk/internal/math/FloatingDecimal;->toJavaFormatString(F)Ljava/lang/String;
HSPLjdk/internal/math/FormattedFloatingDecimal$1;-><init>()V
HSPLjdk/internal/math/FormattedFloatingDecimal$1;->initialValue()Ljava/lang/Object;
-HSPLjdk/internal/math/FormattedFloatingDecimal$2;-><clinit>()V
HSPLjdk/internal/math/FormattedFloatingDecimal$Form;-><clinit>()V
HSPLjdk/internal/math/FormattedFloatingDecimal$Form;-><init>(Ljava/lang/String;I)V
HSPLjdk/internal/math/FormattedFloatingDecimal$Form;->values()[Ljdk/internal/math/FormattedFloatingDecimal$Form;
@@ -8367,10 +8441,11 @@ HSPLjdk/internal/misc/Unsafe;->getAndBitwiseAndInt(Ljava/lang/Object;JI)I
HSPLjdk/internal/misc/Unsafe;->getAndSetInt(Ljava/lang/Object;JI)I
HSPLjdk/internal/misc/Unsafe;->getAndSetLong(Ljava/lang/Object;JJ)J
HSPLjdk/internal/misc/Unsafe;->getAndSetObject(Ljava/lang/Object;JLjava/lang/Object;)Ljava/lang/Object;
+HSPLjdk/internal/misc/Unsafe;->getAndSetReference(Ljava/lang/Object;JLjava/lang/Object;)Ljava/lang/Object;
HSPLjdk/internal/misc/Unsafe;->getIntAcquire(Ljava/lang/Object;J)I
HSPLjdk/internal/misc/Unsafe;->getIntUnaligned(Ljava/lang/Object;J)I
HSPLjdk/internal/misc/Unsafe;->getLongAcquire(Ljava/lang/Object;J)J
-HSPLjdk/internal/misc/Unsafe;->getLongUnaligned(Ljava/lang/Object;J)J+]Ljdk/internal/misc/Unsafe;Ljdk/internal/misc/Unsafe;
+HSPLjdk/internal/misc/Unsafe;->getLongUnaligned(Ljava/lang/Object;J)J
HSPLjdk/internal/misc/Unsafe;->getObject(Ljava/lang/Object;J)Ljava/lang/Object;
HSPLjdk/internal/misc/Unsafe;->getObjectAcquire(Ljava/lang/Object;J)Ljava/lang/Object;
HSPLjdk/internal/misc/Unsafe;->getObjectVolatile(Ljava/lang/Object;J)Ljava/lang/Object;
@@ -8392,6 +8467,14 @@ HSPLjdk/internal/misc/Unsafe;->toUnsignedLong(I)J
HSPLjdk/internal/misc/Unsafe;->weakCompareAndSetInt(Ljava/lang/Object;JII)Z
HSPLjdk/internal/misc/Unsafe;->weakCompareAndSetReference(Ljava/lang/Object;JLjava/lang/Object;Ljava/lang/Object;)Z
HSPLjdk/internal/misc/VM;->getSavedProperty(Ljava/lang/String;)Ljava/lang/String;
+HSPLjdk/internal/ref/CleanerFactory;->cleaner()Ljava/lang/ref/Cleaner;
+HSPLjdk/internal/ref/CleanerImpl$PhantomCleanableRef;-><init>(Ljava/lang/Object;Ljava/lang/ref/Cleaner;Ljava/lang/Runnable;)V
+HSPLjdk/internal/ref/CleanerImpl$PhantomCleanableRef;->performCleanup()V+]Ljava/lang/Runnable;megamorphic_types
+HSPLjdk/internal/ref/CleanerImpl;->getCleanerImpl(Ljava/lang/ref/Cleaner;)Ljdk/internal/ref/CleanerImpl;
+HSPLjdk/internal/ref/PhantomCleanable;-><init>(Ljava/lang/Object;Ljava/lang/ref/Cleaner;)V
+HSPLjdk/internal/ref/PhantomCleanable;->clean()V+]Ljdk/internal/ref/PhantomCleanable;Ljdk/internal/ref/CleanerImpl$PhantomCleanableRef;
+HSPLjdk/internal/ref/PhantomCleanable;->insert()V
+HSPLjdk/internal/ref/PhantomCleanable;->remove()Z
HSPLjdk/internal/reflect/Reflection;->getCallerClass()Ljava/lang/Class;
HSPLjdk/internal/util/ArraysSupport;->mismatch([B[BI)I
HSPLjdk/internal/util/ArraysSupport;->mismatch([FI[FII)I
@@ -8399,9 +8482,12 @@ HSPLjdk/internal/util/ArraysSupport;->mismatch([I[II)I
HSPLjdk/internal/util/ArraysSupport;->mismatch([J[JI)I
HSPLjdk/internal/util/ArraysSupport;->mismatch([Z[ZI)I
HSPLjdk/internal/util/ArraysSupport;->newLength(III)I
-HSPLjdk/internal/util/ArraysSupport;->vectorizedMismatch(Ljava/lang/Object;JLjava/lang/Object;JII)I+]Ljdk/internal/misc/Unsafe;Ljdk/internal/misc/Unsafe;
+HSPLjdk/internal/util/ArraysSupport;->vectorizedMismatch(Ljava/lang/Object;JLjava/lang/Object;JII)I
HSPLjdk/internal/util/Preconditions;->checkFromIndexSize(IIILjava/util/function/BiFunction;)I
HSPLjdk/internal/util/Preconditions;->checkIndex(IILjava/util/function/BiFunction;)I
+HSPLjdk/internal/util/random/RandomSupport;-><clinit>()V
+HSPLjdk/internal/util/random/RandomSupport;->mixMurmur64(J)J
+HSPLjdk/internal/util/random/RandomSupport;->secureRandomSeedRequested()Z
HSPLlibcore/content/type/MimeMap$Builder$Element;-><init>(Ljava/lang/String;Z)V
HSPLlibcore/content/type/MimeMap$Builder$Element;->ofExtensionSpec(Ljava/lang/String;)Llibcore/content/type/MimeMap$Builder$Element;
HSPLlibcore/content/type/MimeMap$Builder$Element;->ofMimeSpec(Ljava/lang/String;)Llibcore/content/type/MimeMap$Builder$Element;
@@ -8425,8 +8511,8 @@ HSPLlibcore/icu/DecimalFormatData;->getGroupingSeparator()C
HSPLlibcore/icu/DecimalFormatData;->getInfinity()Ljava/lang/String;
HSPLlibcore/icu/DecimalFormatData;->getInstance(Ljava/util/Locale;)Llibcore/icu/DecimalFormatData;
HSPLlibcore/icu/DecimalFormatData;->getMinusSign()Ljava/lang/String;
+HSPLlibcore/icu/DecimalFormatData;->getMonetaryDecimalSeparator()Ljava/lang/String;
HSPLlibcore/icu/DecimalFormatData;->getMonetaryGroupSeparator()Ljava/lang/String;
-HSPLlibcore/icu/DecimalFormatData;->getMonetarySeparator()Ljava/lang/String;
HSPLlibcore/icu/DecimalFormatData;->getNaN()Ljava/lang/String;
HSPLlibcore/icu/DecimalFormatData;->getNumberPattern()Ljava/lang/String;
HSPLlibcore/icu/DecimalFormatData;->getPatternSeparator()C
@@ -8436,6 +8522,7 @@ HSPLlibcore/icu/DecimalFormatData;->getPercentPattern()Ljava/lang/String;
HSPLlibcore/icu/DecimalFormatData;->getZeroDigit()C
HSPLlibcore/icu/DecimalFormatData;->loadPatternSeparator(Ljava/util/Locale;)C
HSPLlibcore/icu/ICU;->getAvailableLocales()[Ljava/util/Locale;
+HSPLlibcore/icu/ICU;->getBestDateTimePattern(Ljava/lang/String;Ljava/util/Locale;)Ljava/lang/String;
HSPLlibcore/icu/ICU;->getCurrencyCode(Ljava/lang/String;)Ljava/lang/String;
HSPLlibcore/icu/ICU;->getExtendedCalendar(Ljava/util/Locale;Ljava/lang/String;)Lcom/android/icu/util/ExtendedCalendar;
HSPLlibcore/icu/ICU;->getISOLanguages()[Ljava/lang/String;
@@ -8500,6 +8587,7 @@ HSPLlibcore/io/ClassPathURLStreamHandler$ClassPathURLConnection;-><init>(Llibcor
HSPLlibcore/io/ClassPathURLStreamHandler$ClassPathURLConnection;->connect()V
HSPLlibcore/io/ClassPathURLStreamHandler$ClassPathURLConnection;->getInputStream()Ljava/io/InputStream;
HSPLlibcore/io/ClassPathURLStreamHandler;-><init>(Ljava/lang/String;)V
+HSPLlibcore/io/ClassPathURLStreamHandler;-><init>(Ljava/lang/String;Z)V
HSPLlibcore/io/ClassPathURLStreamHandler;->getEntryUrlOrNull(Ljava/lang/String;)Ljava/net/URL;
HSPLlibcore/io/ClassPathURLStreamHandler;->isEntryStored(Ljava/lang/String;)Z
HSPLlibcore/io/ClassPathURLStreamHandler;->openConnection(Ljava/net/URL;)Ljava/net/URLConnection;
@@ -8728,9 +8816,9 @@ HSPLlibcore/util/NativeAllocationRegistry;-><init>(Ljava/lang/ClassLoader;JJZ)V
HSPLlibcore/util/NativeAllocationRegistry;->createMalloced(Ljava/lang/ClassLoader;J)Llibcore/util/NativeAllocationRegistry;
HSPLlibcore/util/NativeAllocationRegistry;->createMalloced(Ljava/lang/ClassLoader;JJ)Llibcore/util/NativeAllocationRegistry;
HSPLlibcore/util/NativeAllocationRegistry;->createNonmalloced(Ljava/lang/ClassLoader;JJ)Llibcore/util/NativeAllocationRegistry;
-HSPLlibcore/util/NativeAllocationRegistry;->registerNativeAllocation(J)V+]Ldalvik/system/VMRuntime;Ldalvik/system/VMRuntime;
-HSPLlibcore/util/NativeAllocationRegistry;->registerNativeAllocation(Ljava/lang/Object;J)Ljava/lang/Runnable;+]Llibcore/util/NativeAllocationRegistry$CleanerThunk;Llibcore/util/NativeAllocationRegistry$CleanerThunk;
-HSPLlibcore/util/NativeAllocationRegistry;->registerNativeFree(J)V+]Ldalvik/system/VMRuntime;Ldalvik/system/VMRuntime;
+HSPLlibcore/util/NativeAllocationRegistry;->registerNativeAllocation(J)V
+HSPLlibcore/util/NativeAllocationRegistry;->registerNativeAllocation(Ljava/lang/Object;J)Ljava/lang/Runnable;
+HSPLlibcore/util/NativeAllocationRegistry;->registerNativeFree(J)V
HSPLlibcore/util/SneakyThrow;->sneakyThrow(Ljava/lang/Throwable;)V
HSPLlibcore/util/SneakyThrow;->sneakyThrow_(Ljava/lang/Throwable;)V
HSPLlibcore/util/XmlObjectFactory;->newXmlPullParser()Lorg/xmlpull/v1/XmlPullParser;
@@ -8747,6 +8835,7 @@ HSPLlibcore/util/ZoneInfo;->hashCode()I
HSPLlibcore/util/ZoneInfo;->inDaylightTime(Ljava/util/Date;)Z
HSPLorg/apache/harmony/dalvik/ddmc/Chunk;-><init>(ILjava/nio/ByteBuffer;)V
HSPLorg/apache/harmony/dalvik/ddmc/Chunk;-><init>(I[BII)V
+HSPLorg/apache/harmony/dalvik/ddmc/ChunkHandler;->type(Ljava/lang/String;)I
HSPLorg/apache/harmony/dalvik/ddmc/DdmServer;->broadcast(I)V
HSPLorg/apache/harmony/dalvik/ddmc/DdmServer;->dispatch(I[BII)Lorg/apache/harmony/dalvik/ddmc/Chunk;
HSPLorg/apache/harmony/dalvik/ddmc/DdmServer;->sendChunk(Lorg/apache/harmony/dalvik/ddmc/Chunk;)V
@@ -8951,7 +9040,8 @@ HSPLsun/misc/ASCIICaseInsensitiveComparator;->lowerCaseHashCode(Ljava/lang/Strin
HSPLsun/misc/ASCIICaseInsensitiveComparator;->toLower(I)I
HSPLsun/misc/Cleaner;-><init>(Ljava/lang/Object;Ljava/lang/Runnable;)V
HSPLsun/misc/Cleaner;->add(Lsun/misc/Cleaner;)Lsun/misc/Cleaner;
-HSPLsun/misc/Cleaner;->clean()V+]Ljava/lang/Runnable;Llibcore/util/NativeAllocationRegistry$CleanerThunk;
+HSPLsun/misc/Cleaner;->checkCleanerQueueEmpty()V
+HSPLsun/misc/Cleaner;->clean()V
HSPLsun/misc/Cleaner;->create(Ljava/lang/Object;Ljava/lang/Runnable;)Lsun/misc/Cleaner;
HSPLsun/misc/Cleaner;->isCleanerQueue(Ljava/lang/ref/ReferenceQueue;)Z
HSPLsun/misc/Cleaner;->remove(Lsun/misc/Cleaner;)Z
@@ -9010,7 +9100,7 @@ HSPLsun/nio/ch/DefaultSelectorProvider;->create()Ljava/nio/channels/spi/Selector
HSPLsun/nio/ch/FileChannelImpl$Unmapper;-><init>(JJILjava/io/FileDescriptor;)V
HSPLsun/nio/ch/FileChannelImpl$Unmapper;-><init>(JJILjava/io/FileDescriptor;Lsun/nio/ch/FileChannelImpl$Unmapper-IA;)V
HSPLsun/nio/ch/FileChannelImpl$Unmapper;->run()V
-HSPLsun/nio/ch/FileChannelImpl;-><init>(Ljava/io/FileDescriptor;Ljava/lang/String;ZZZLjava/lang/Object;)V
+HSPLsun/nio/ch/FileChannelImpl;-><init>(Ljava/io/FileDescriptor;Ljava/lang/String;ZZLjava/lang/Object;)V
HSPLsun/nio/ch/FileChannelImpl;->ensureOpen()V
HSPLsun/nio/ch/FileChannelImpl;->fileLockTable()Lsun/nio/ch/FileLockTable;
HSPLsun/nio/ch/FileChannelImpl;->finalize()V
@@ -9020,7 +9110,6 @@ HSPLsun/nio/ch/FileChannelImpl;->isSharedFileLockTable()Z
HSPLsun/nio/ch/FileChannelImpl;->lock(JJZ)Ljava/nio/channels/FileLock;
HSPLsun/nio/ch/FileChannelImpl;->map(Ljava/nio/channels/FileChannel$MapMode;JJ)Ljava/nio/MappedByteBuffer;
HSPLsun/nio/ch/FileChannelImpl;->open(Ljava/io/FileDescriptor;Ljava/lang/String;ZZLjava/lang/Object;)Ljava/nio/channels/FileChannel;
-HSPLsun/nio/ch/FileChannelImpl;->open(Ljava/io/FileDescriptor;Ljava/lang/String;ZZZLjava/lang/Object;)Ljava/nio/channels/FileChannel;
HSPLsun/nio/ch/FileChannelImpl;->position()J
HSPLsun/nio/ch/FileChannelImpl;->position(J)Ljava/nio/channels/FileChannel;
HSPLsun/nio/ch/FileChannelImpl;->read(Ljava/nio/ByteBuffer;)I
@@ -9030,7 +9119,7 @@ HSPLsun/nio/ch/FileChannelImpl;->tryLock(JJZ)Ljava/nio/channels/FileLock;
HSPLsun/nio/ch/FileChannelImpl;->write(Ljava/nio/ByteBuffer;)I
HSPLsun/nio/ch/FileDescriptorHolderSocketImpl;-><init>(Ljava/io/FileDescriptor;)V
HSPLsun/nio/ch/FileDispatcher;-><init>()V
-HSPLsun/nio/ch/FileDispatcherImpl;-><init>(Z)V
+HSPLsun/nio/ch/FileDispatcherImpl;-><init>()V
HSPLsun/nio/ch/FileDispatcherImpl;->close(Ljava/io/FileDescriptor;)V
HSPLsun/nio/ch/FileDispatcherImpl;->duplicateForMapping(Ljava/io/FileDescriptor;)Ljava/io/FileDescriptor;
HSPLsun/nio/ch/FileDispatcherImpl;->force(Ljava/io/FileDescriptor;Z)I
@@ -9180,6 +9269,7 @@ HSPLsun/nio/cs/StreamEncoder;->forOutputStreamWriter(Ljava/io/OutputStream;Ljava
HSPLsun/nio/cs/StreamEncoder;->implClose()V
HSPLsun/nio/cs/StreamEncoder;->implFlush()V
HSPLsun/nio/cs/StreamEncoder;->implFlushBuffer()V
+HSPLsun/nio/cs/StreamEncoder;->implWrite(Ljava/nio/CharBuffer;)V+]Ljava/nio/charset/CoderResult;Ljava/nio/charset/CoderResult;
HSPLsun/nio/cs/StreamEncoder;->implWrite([CII)V
HSPLsun/nio/cs/StreamEncoder;->write(I)V
HSPLsun/nio/cs/StreamEncoder;->write(Ljava/lang/String;II)V
@@ -9244,6 +9334,7 @@ HSPLsun/nio/fs/UnixFileAttributeViews$Basic;->readAttributes()Ljava/nio/file/att
HSPLsun/nio/fs/UnixFileAttributeViews;->createBasicView(Lsun/nio/fs/UnixPath;Z)Lsun/nio/fs/UnixFileAttributeViews$Basic;
HSPLsun/nio/fs/UnixFileAttributes$UnixAsBasicFileAttributes;-><init>(Lsun/nio/fs/UnixFileAttributes;)V
HSPLsun/nio/fs/UnixFileAttributes$UnixAsBasicFileAttributes;->creationTime()Ljava/nio/file/attribute/FileTime;
+HSPLsun/nio/fs/UnixFileAttributes$UnixAsBasicFileAttributes;->fileKey()Ljava/lang/Object;+]Lsun/nio/fs/UnixFileAttributes;Lsun/nio/fs/UnixFileAttributes;
HSPLsun/nio/fs/UnixFileAttributes$UnixAsBasicFileAttributes;->isDirectory()Z
HSPLsun/nio/fs/UnixFileAttributes$UnixAsBasicFileAttributes;->isRegularFile()Z
HSPLsun/nio/fs/UnixFileAttributes$UnixAsBasicFileAttributes;->isSymbolicLink()Z
@@ -9254,6 +9345,7 @@ HSPLsun/nio/fs/UnixFileAttributes$UnixAsBasicFileAttributes;->wrap(Lsun/nio/fs/U
HSPLsun/nio/fs/UnixFileAttributes;-><init>()V
HSPLsun/nio/fs/UnixFileAttributes;->asBasicFileAttributes()Ljava/nio/file/attribute/BasicFileAttributes;
HSPLsun/nio/fs/UnixFileAttributes;->creationTime()Ljava/nio/file/attribute/FileTime;
+HSPLsun/nio/fs/UnixFileAttributes;->fileKey()Lsun/nio/fs/UnixFileKey;
HSPLsun/nio/fs/UnixFileAttributes;->get(Lsun/nio/fs/UnixPath;Z)Lsun/nio/fs/UnixFileAttributes;
HSPLsun/nio/fs/UnixFileAttributes;->isDirectory()Z
HSPLsun/nio/fs/UnixFileAttributes;->isRegularFile()Z
@@ -9262,6 +9354,8 @@ HSPLsun/nio/fs/UnixFileAttributes;->lastAccessTime()Ljava/nio/file/attribute/Fil
HSPLsun/nio/fs/UnixFileAttributes;->lastModifiedTime()Ljava/nio/file/attribute/FileTime;
HSPLsun/nio/fs/UnixFileAttributes;->size()J
HSPLsun/nio/fs/UnixFileAttributes;->toFileTime(JJ)Ljava/nio/file/attribute/FileTime;
+HSPLsun/nio/fs/UnixFileKey;-><init>(JJ)V
+HSPLsun/nio/fs/UnixFileKey;->equals(Ljava/lang/Object;)Z
HSPLsun/nio/fs/UnixFileModeAttribute;->toUnixMode(I[Ljava/nio/file/attribute/FileAttribute;)I
HSPLsun/nio/fs/UnixFileSystem;->getPath(Ljava/lang/String;[Ljava/lang/String;)Ljava/nio/file/Path;
HSPLsun/nio/fs/UnixFileSystem;->needToResolveAgainstDefaultDirectory()Z
@@ -9588,7 +9682,7 @@ HSPLsun/security/util/DerInputStream;->init([BIIZ)V
HSPLsun/security/util/DerInputStream;->mark(I)V
HSPLsun/security/util/DerInputStream;->peekByte()I
HSPLsun/security/util/DerInputStream;->readVector(I)[Lsun/security/util/DerValue;
-HSPLsun/security/util/DerInputStream;->readVector(IZ)[Lsun/security/util/DerValue;+]Lsun/security/util/DerInputBuffer;Lsun/security/util/DerInputBuffer;]Ljava/util/Vector;Ljava/util/Vector;]Lsun/security/util/DerInputStream;Lsun/security/util/DerInputStream;
+HSPLsun/security/util/DerInputStream;->readVector(IZ)[Lsun/security/util/DerValue;
HSPLsun/security/util/DerInputStream;->reset()V
HSPLsun/security/util/DerInputStream;->subStream(IZ)Lsun/security/util/DerInputStream;
HSPLsun/security/util/DerInputStream;->toByteArray()[B
@@ -9606,7 +9700,7 @@ HSPLsun/security/util/DerOutputStream;->write(B[B)V
HSPLsun/security/util/DerValue;-><init>(B[B)V
HSPLsun/security/util/DerValue;-><init>(Ljava/io/InputStream;)V
HSPLsun/security/util/DerValue;-><init>(Ljava/lang/String;)V
-HSPLsun/security/util/DerValue;-><init>(Lsun/security/util/DerInputBuffer;Z)V+]Lsun/security/util/DerInputBuffer;Lsun/security/util/DerInputBuffer;
+HSPLsun/security/util/DerValue;-><init>(Lsun/security/util/DerInputBuffer;Z)V
HSPLsun/security/util/DerValue;-><init>([B)V
HSPLsun/security/util/DerValue;->encode(Lsun/security/util/DerOutputStream;)V
HSPLsun/security/util/DerValue;->getBigInteger()Ljava/math/BigInteger;
@@ -9631,6 +9725,7 @@ HSPLsun/security/util/DerValue;->length()I
HSPLsun/security/util/DerValue;->resetTag(B)V
HSPLsun/security/util/DerValue;->toByteArray()[B
HSPLsun/security/util/DerValue;->toDerInputStream()Lsun/security/util/DerInputStream;
+HPLsun/security/util/DisabledAlgorithmConstraints$Constraints;-><init>([Ljava/lang/String;)V
HSPLsun/security/util/DisabledAlgorithmConstraints$Constraints;->getConstraints(Ljava/lang/String;)Ljava/util/Set;
HSPLsun/security/util/DisabledAlgorithmConstraints$Constraints;->permits(Ljava/security/Key;)Z
HSPLsun/security/util/DisabledAlgorithmConstraints$Constraints;->permits(Lsun/security/util/CertConstraintParameters;)V
@@ -9941,6 +10036,7 @@ HSPLsun/util/calendar/JulianCalendar;->getFixedDate(IIILsun/util/calendar/BaseCa
HSPLsun/util/calendar/JulianCalendar;->isLeapYear(I)Z
HSPLsun/util/calendar/JulianCalendar;->newCalendarDate(Ljava/util/TimeZone;)Lsun/util/calendar/CalendarDate;
HSPLsun/util/calendar/JulianCalendar;->newCalendarDate(Ljava/util/TimeZone;)Lsun/util/calendar/JulianCalendar$Date;
+HSPLsun/util/locale/BaseLocale$Cache;->-$$Nest$sfgetCACHE()Lsun/util/locale/BaseLocale$Cache;
HSPLsun/util/locale/BaseLocale$Cache;->createObject(Ljava/lang/Object;)Ljava/lang/Object;
HSPLsun/util/locale/BaseLocale$Cache;->createObject(Lsun/util/locale/BaseLocale$Key;)Lsun/util/locale/BaseLocale;
HSPLsun/util/locale/BaseLocale$Cache;->normalizeKey(Ljava/lang/Object;)Ljava/lang/Object;
@@ -9948,16 +10044,17 @@ HSPLsun/util/locale/BaseLocale$Cache;->normalizeKey(Lsun/util/locale/BaseLocale$
HSPLsun/util/locale/BaseLocale$Key;->-$$Nest$mgetBaseLocale(Lsun/util/locale/BaseLocale$Key;)Lsun/util/locale/BaseLocale;
HSPLsun/util/locale/BaseLocale$Key;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)V
HSPLsun/util/locale/BaseLocale$Key;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLsun/util/locale/BaseLocale$Key-IA;)V
-HSPLsun/util/locale/BaseLocale$Key;->equals(Ljava/lang/Object;)Z+]Ljava/lang/String;Ljava/lang/String;]Lsun/util/locale/BaseLocale;Lsun/util/locale/BaseLocale;
+HSPLsun/util/locale/BaseLocale$Key;->equals(Ljava/lang/Object;)Z
HSPLsun/util/locale/BaseLocale$Key;->getBaseLocale()Lsun/util/locale/BaseLocale;
HSPLsun/util/locale/BaseLocale$Key;->hashCode()I
-HSPLsun/util/locale/BaseLocale$Key;->hashCode(Lsun/util/locale/BaseLocale;)I+]Ljava/lang/String;Ljava/lang/String;]Lsun/util/locale/BaseLocale;Lsun/util/locale/BaseLocale;
+HSPLsun/util/locale/BaseLocale$Key;->hashCode(Lsun/util/locale/BaseLocale;)I
HSPLsun/util/locale/BaseLocale$Key;->normalize(Lsun/util/locale/BaseLocale$Key;)Lsun/util/locale/BaseLocale$Key;
-HSPLsun/util/locale/BaseLocale;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)V+]Ljava/lang/String;Ljava/lang/String;
+HSPLsun/util/locale/BaseLocale;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)V
HSPLsun/util/locale/BaseLocale;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLsun/util/locale/BaseLocale-IA;)V
HSPLsun/util/locale/BaseLocale;->cleanCache()V
+HSPLsun/util/locale/BaseLocale;->convertOldISOCodes(Ljava/lang/String;)Ljava/lang/String;
HSPLsun/util/locale/BaseLocale;->equals(Ljava/lang/Object;)Z
-HSPLsun/util/locale/BaseLocale;->getInstance(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lsun/util/locale/BaseLocale;+]Lsun/util/locale/BaseLocale$Cache;Lsun/util/locale/BaseLocale$Cache;
+HSPLsun/util/locale/BaseLocale;->getInstance(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lsun/util/locale/BaseLocale;
HSPLsun/util/locale/BaseLocale;->getLanguage()Ljava/lang/String;
HSPLsun/util/locale/BaseLocale;->getRegion()Ljava/lang/String;
HSPLsun/util/locale/BaseLocale;->getScript()Ljava/lang/String;
@@ -9971,7 +10068,7 @@ HSPLsun/util/locale/InternalLocaleBuilder;->getBaseLocale()Lsun/util/locale/Base
HSPLsun/util/locale/InternalLocaleBuilder;->getLocaleExtensions()Lsun/util/locale/LocaleExtensions;
HSPLsun/util/locale/InternalLocaleBuilder;->setExtensions(Ljava/util/List;Ljava/lang/String;)Lsun/util/locale/InternalLocaleBuilder;
HSPLsun/util/locale/InternalLocaleBuilder;->setLanguage(Ljava/lang/String;)Lsun/util/locale/InternalLocaleBuilder;
-HSPLsun/util/locale/InternalLocaleBuilder;->setLanguageTag(Lsun/util/locale/LanguageTag;)Lsun/util/locale/InternalLocaleBuilder;+]Lsun/util/locale/InternalLocaleBuilder;Lsun/util/locale/InternalLocaleBuilder;]Ljava/lang/String;Ljava/lang/String;]Lsun/util/locale/LanguageTag;Lsun/util/locale/LanguageTag;]Ljava/util/List;Ljava/util/Collections$EmptyList;
+HSPLsun/util/locale/InternalLocaleBuilder;->setLanguageTag(Lsun/util/locale/LanguageTag;)Lsun/util/locale/InternalLocaleBuilder;
HSPLsun/util/locale/InternalLocaleBuilder;->setRegion(Ljava/lang/String;)Lsun/util/locale/InternalLocaleBuilder;
HSPLsun/util/locale/InternalLocaleBuilder;->setScript(Ljava/lang/String;)Lsun/util/locale/InternalLocaleBuilder;
HSPLsun/util/locale/InternalLocaleBuilder;->setVariant(Ljava/lang/String;)Lsun/util/locale/InternalLocaleBuilder;
@@ -9991,7 +10088,7 @@ HSPLsun/util/locale/LanguageTag;->isLanguage(Ljava/lang/String;)Z
HSPLsun/util/locale/LanguageTag;->isRegion(Ljava/lang/String;)Z
HSPLsun/util/locale/LanguageTag;->isScript(Ljava/lang/String;)Z
HSPLsun/util/locale/LanguageTag;->isVariant(Ljava/lang/String;)Z
-HSPLsun/util/locale/LanguageTag;->parse(Ljava/lang/String;Lsun/util/locale/ParseStatus;)Lsun/util/locale/LanguageTag;+]Lsun/util/locale/StringTokenIterator;Lsun/util/locale/StringTokenIterator;]Ljava/util/Map;Ljava/util/HashMap;
+HSPLsun/util/locale/LanguageTag;->parse(Ljava/lang/String;Lsun/util/locale/ParseStatus;)Lsun/util/locale/LanguageTag;
HSPLsun/util/locale/LanguageTag;->parseExtensions(Lsun/util/locale/StringTokenIterator;Lsun/util/locale/ParseStatus;)Z
HSPLsun/util/locale/LanguageTag;->parseExtlangs(Lsun/util/locale/StringTokenIterator;Lsun/util/locale/ParseStatus;)Z
HSPLsun/util/locale/LanguageTag;->parseLanguage(Lsun/util/locale/StringTokenIterator;Lsun/util/locale/ParseStatus;)Z
@@ -10003,7 +10100,7 @@ HSPLsun/util/locale/LanguageTag;->parseVariants(Lsun/util/locale/StringTokenIter
HSPLsun/util/locale/LocaleObjectCache$CacheEntry;-><init>(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/ref/ReferenceQueue;)V
HSPLsun/util/locale/LocaleObjectCache$CacheEntry;->getKey()Ljava/lang/Object;
HSPLsun/util/locale/LocaleObjectCache;->cleanStaleEntries()V
-HSPLsun/util/locale/LocaleObjectCache;->get(Ljava/lang/Object;)Ljava/lang/Object;+]Ljava/util/concurrent/ConcurrentMap;Ljava/util/concurrent/ConcurrentHashMap;]Lsun/util/locale/LocaleObjectCache;Lsun/util/locale/BaseLocale$Cache;,Ljava/util/Locale$Cache;]Lsun/util/locale/LocaleObjectCache$CacheEntry;Lsun/util/locale/LocaleObjectCache$CacheEntry;
+HSPLsun/util/locale/LocaleObjectCache;->get(Ljava/lang/Object;)Ljava/lang/Object;
HSPLsun/util/locale/LocaleObjectCache;->normalizeKey(Ljava/lang/Object;)Ljava/lang/Object;
HSPLsun/util/locale/LocaleUtils;->caseIgnoreMatch(Ljava/lang/String;Ljava/lang/String;)Z
HSPLsun/util/locale/LocaleUtils;->isAlpha(C)Z
@@ -10019,7 +10116,7 @@ HSPLsun/util/locale/LocaleUtils;->isNumeric(C)Z
HSPLsun/util/locale/LocaleUtils;->isNumericString(Ljava/lang/String;)Z
HSPLsun/util/locale/LocaleUtils;->isUpper(C)Z
HSPLsun/util/locale/LocaleUtils;->toLower(C)C
-HSPLsun/util/locale/LocaleUtils;->toLowerString(Ljava/lang/String;)Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String;
+HSPLsun/util/locale/LocaleUtils;->toLowerString(Ljava/lang/String;)Ljava/lang/String;
HSPLsun/util/locale/LocaleUtils;->toTitleString(Ljava/lang/String;)Ljava/lang/String;
HSPLsun/util/locale/LocaleUtils;->toUpperString(Ljava/lang/String;)Ljava/lang/String;
HSPLsun/util/locale/ParseStatus;-><init>()V
@@ -10094,6 +10191,7 @@ Lcom/android/okhttp/ConfigAwareConnectionPool;
Lcom/android/okhttp/Connection;
Lcom/android/okhttp/ConnectionPool$1;
Lcom/android/okhttp/ConnectionPool;
+Lcom/android/okhttp/ConnectionSpec$1;
Lcom/android/okhttp/ConnectionSpec$Builder;
Lcom/android/okhttp/ConnectionSpec;
Lcom/android/okhttp/ConnectionSpecs;
@@ -10101,6 +10199,7 @@ Lcom/android/okhttp/Dispatcher;
Lcom/android/okhttp/Dns$1;
Lcom/android/okhttp/Dns;
Lcom/android/okhttp/Handshake;
+Lcom/android/okhttp/Headers$1;
Lcom/android/okhttp/Headers$Builder;
Lcom/android/okhttp/Headers;
Lcom/android/okhttp/HttpHandler$CleartextURLFilter;
@@ -10109,7 +10208,6 @@ Lcom/android/okhttp/HttpUrl$1;
Lcom/android/okhttp/HttpUrl$Builder$ParseResult;
Lcom/android/okhttp/HttpUrl$Builder;
Lcom/android/okhttp/HttpUrl;
-Lcom/android/okhttp/HttpsHandler;
Lcom/android/okhttp/Interceptor$Chain;
Lcom/android/okhttp/MediaType;
Lcom/android/okhttp/OkCacheContainer;
@@ -10118,10 +10216,12 @@ Lcom/android/okhttp/OkHttpClient;
Lcom/android/okhttp/OkUrlFactories;
Lcom/android/okhttp/OkUrlFactory;
Lcom/android/okhttp/Protocol;
+Lcom/android/okhttp/Request$1;
Lcom/android/okhttp/Request$Builder;
Lcom/android/okhttp/Request;
Lcom/android/okhttp/RequestBody$2;
Lcom/android/okhttp/RequestBody;
+Lcom/android/okhttp/Response$1;
Lcom/android/okhttp/Response$Builder;
Lcom/android/okhttp/Response;
Lcom/android/okhttp/ResponseBody;
@@ -10136,6 +10236,7 @@ Lcom/android/okhttp/internal/DiskLruCache;
Lcom/android/okhttp/internal/FaultHidingSink;
Lcom/android/okhttp/internal/Internal;
Lcom/android/okhttp/internal/InternalCache;
+Lcom/android/okhttp/internal/NamedRunnable;
Lcom/android/okhttp/internal/OptionalMethod;
Lcom/android/okhttp/internal/Platform;
Lcom/android/okhttp/internal/RouteDatabase;
@@ -10144,6 +10245,7 @@ Lcom/android/okhttp/internal/Util$1;
Lcom/android/okhttp/internal/Util;
Lcom/android/okhttp/internal/Version;
Lcom/android/okhttp/internal/framed/FrameWriter;
+Lcom/android/okhttp/internal/framed/FramedConnection$1;
Lcom/android/okhttp/internal/framed/FramedConnection$Builder;
Lcom/android/okhttp/internal/framed/FramedConnection$Listener$1;
Lcom/android/okhttp/internal/framed/FramedConnection$Listener;
@@ -10154,9 +10256,11 @@ Lcom/android/okhttp/internal/framed/PushObserver;
Lcom/android/okhttp/internal/framed/Settings;
Lcom/android/okhttp/internal/http/AuthenticatorAdapter;
Lcom/android/okhttp/internal/http/CacheRequest;
+Lcom/android/okhttp/internal/http/CacheStrategy$1;
Lcom/android/okhttp/internal/http/CacheStrategy$Factory;
Lcom/android/okhttp/internal/http/CacheStrategy;
Lcom/android/okhttp/internal/http/HeaderParser;
+Lcom/android/okhttp/internal/http/Http1xStream$1;
Lcom/android/okhttp/internal/http/Http1xStream$AbstractSource;
Lcom/android/okhttp/internal/http/Http1xStream$ChunkedSink;
Lcom/android/okhttp/internal/http/Http1xStream$ChunkedSource;
@@ -10184,7 +10288,6 @@ Lcom/android/okhttp/internal/http/StatusLine;
Lcom/android/okhttp/internal/http/StreamAllocation;
Lcom/android/okhttp/internal/huc/DelegatingHttpsURLConnection;
Lcom/android/okhttp/internal/huc/HttpURLConnectionImpl;
-Lcom/android/okhttp/internal/huc/HttpsURLConnectionImpl;
Lcom/android/okhttp/internal/io/FileSystem$1;
Lcom/android/okhttp/internal/io/FileSystem;
Lcom/android/okhttp/internal/io/RealConnection;
@@ -10217,7 +10320,6 @@ Lcom/android/okhttp/okio/Okio$3;
Lcom/android/okhttp/okio/Okio;
Lcom/android/okhttp/okio/RealBufferedSink$1;
Lcom/android/okhttp/okio/RealBufferedSink;
-Lcom/android/okhttp/okio/RealBufferedSource$1;
Lcom/android/okhttp/okio/RealBufferedSource;
Lcom/android/okhttp/okio/Segment;
Lcom/android/okhttp/okio/SegmentPool;
@@ -10227,7 +10329,6 @@ Lcom/android/okhttp/okio/Timeout$1;
Lcom/android/okhttp/okio/Timeout;
Lcom/android/okhttp/okio/Util;
Lcom/android/org/bouncycastle/asn1/ASN1ApplicationSpecific;
-Lcom/android/org/bouncycastle/asn1/ASN1ApplicationSpecificParser;
Lcom/android/org/bouncycastle/asn1/ASN1BitString;
Lcom/android/org/bouncycastle/asn1/ASN1Boolean;
Lcom/android/org/bouncycastle/asn1/ASN1Choice;
@@ -10239,7 +10340,6 @@ Lcom/android/org/bouncycastle/asn1/ASN1External;
Lcom/android/org/bouncycastle/asn1/ASN1GeneralizedTime;
Lcom/android/org/bouncycastle/asn1/ASN1InputStream;
Lcom/android/org/bouncycastle/asn1/ASN1Integer;
-Lcom/android/org/bouncycastle/asn1/ASN1Null;
Lcom/android/org/bouncycastle/asn1/ASN1Object;
Lcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier$OidHandle;
Lcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;
@@ -10256,7 +10356,6 @@ Lcom/android/org/bouncycastle/asn1/ASN1SetParser;
Lcom/android/org/bouncycastle/asn1/ASN1StreamParser;
Lcom/android/org/bouncycastle/asn1/ASN1String;
Lcom/android/org/bouncycastle/asn1/ASN1TaggedObject;
-Lcom/android/org/bouncycastle/asn1/ASN1TaggedObjectParser;
Lcom/android/org/bouncycastle/asn1/ASN1UTCTime;
Lcom/android/org/bouncycastle/asn1/BERApplicationSpecific;
Lcom/android/org/bouncycastle/asn1/BERApplicationSpecificParser;
@@ -10267,16 +10366,13 @@ Lcom/android/org/bouncycastle/asn1/BERSequenceParser;
Lcom/android/org/bouncycastle/asn1/BERSet;
Lcom/android/org/bouncycastle/asn1/BERSetParser;
Lcom/android/org/bouncycastle/asn1/BERTaggedObjectParser;
-Lcom/android/org/bouncycastle/asn1/BERTags;
Lcom/android/org/bouncycastle/asn1/ConstructedOctetStream;
Lcom/android/org/bouncycastle/asn1/DERBMPString;
Lcom/android/org/bouncycastle/asn1/DERBitString;
Lcom/android/org/bouncycastle/asn1/DERExternalParser;
-Lcom/android/org/bouncycastle/asn1/DERFactory;
Lcom/android/org/bouncycastle/asn1/DERGeneralString;
Lcom/android/org/bouncycastle/asn1/DERGraphicString;
Lcom/android/org/bouncycastle/asn1/DERIA5String;
-Lcom/android/org/bouncycastle/asn1/DERInteger;
Lcom/android/org/bouncycastle/asn1/DERNull;
Lcom/android/org/bouncycastle/asn1/DERNumericString;
Lcom/android/org/bouncycastle/asn1/DEROctetString;
@@ -10301,16 +10397,13 @@ Lcom/android/org/bouncycastle/asn1/InMemoryRepresentable;
Lcom/android/org/bouncycastle/asn1/IndefiniteLengthInputStream;
Lcom/android/org/bouncycastle/asn1/LazyEncodedSequence;
Lcom/android/org/bouncycastle/asn1/LimitedInputStream;
-Lcom/android/org/bouncycastle/asn1/OIDTokenizer;
Lcom/android/org/bouncycastle/asn1/StreamUtil;
Lcom/android/org/bouncycastle/asn1/bc/BCObjectIdentifiers;
-Lcom/android/org/bouncycastle/asn1/iana/IANAObjectIdentifiers;
Lcom/android/org/bouncycastle/asn1/misc/MiscObjectIdentifiers;
Lcom/android/org/bouncycastle/asn1/nist/NISTObjectIdentifiers;
Lcom/android/org/bouncycastle/asn1/oiw/OIWObjectIdentifiers;
Lcom/android/org/bouncycastle/asn1/pkcs/PKCSObjectIdentifiers;
Lcom/android/org/bouncycastle/asn1/x500/X500Name;
-Lcom/android/org/bouncycastle/asn1/x500/X500NameStyle;
Lcom/android/org/bouncycastle/asn1/x500/style/AbstractX500NameStyle;
Lcom/android/org/bouncycastle/asn1/x500/style/BCStyle;
Lcom/android/org/bouncycastle/asn1/x509/AlgorithmIdentifier;
@@ -10318,8 +10411,6 @@ Lcom/android/org/bouncycastle/asn1/x509/Certificate;
Lcom/android/org/bouncycastle/asn1/x509/DSAParameter;
Lcom/android/org/bouncycastle/asn1/x509/SubjectPublicKeyInfo;
Lcom/android/org/bouncycastle/asn1/x509/Time;
-Lcom/android/org/bouncycastle/asn1/x509/V3TBSCertificateGenerator;
-Lcom/android/org/bouncycastle/asn1/x509/X509ExtensionsGenerator;
Lcom/android/org/bouncycastle/asn1/x509/X509Name;
Lcom/android/org/bouncycastle/asn1/x509/X509ObjectIdentifiers;
Lcom/android/org/bouncycastle/asn1/x9/X9ECParameters;
@@ -10342,14 +10433,23 @@ Lcom/android/org/bouncycastle/crypto/RuntimeCryptoException;
Lcom/android/org/bouncycastle/crypto/Wrapper;
Lcom/android/org/bouncycastle/crypto/digests/AndroidDigestFactory;
Lcom/android/org/bouncycastle/crypto/digests/AndroidDigestFactoryBouncyCastle;
-Lcom/android/org/bouncycastle/crypto/digests/AndroidDigestFactoryInterface;
Lcom/android/org/bouncycastle/crypto/digests/AndroidDigestFactoryOpenSSL;
Lcom/android/org/bouncycastle/crypto/digests/EncodableDigest;
Lcom/android/org/bouncycastle/crypto/digests/GeneralDigest;
+Lcom/android/org/bouncycastle/crypto/digests/LongDigest;
+Lcom/android/org/bouncycastle/crypto/digests/MD5Digest;
Lcom/android/org/bouncycastle/crypto/digests/OpenSSLDigest$MD5;
Lcom/android/org/bouncycastle/crypto/digests/OpenSSLDigest$SHA1;
+Lcom/android/org/bouncycastle/crypto/digests/OpenSSLDigest$SHA224;
+Lcom/android/org/bouncycastle/crypto/digests/OpenSSLDigest$SHA256;
+Lcom/android/org/bouncycastle/crypto/digests/OpenSSLDigest$SHA384;
+Lcom/android/org/bouncycastle/crypto/digests/OpenSSLDigest$SHA512;
Lcom/android/org/bouncycastle/crypto/digests/OpenSSLDigest;
Lcom/android/org/bouncycastle/crypto/digests/SHA1Digest;
+Lcom/android/org/bouncycastle/crypto/digests/SHA224Digest;
+Lcom/android/org/bouncycastle/crypto/digests/SHA256Digest;
+Lcom/android/org/bouncycastle/crypto/digests/SHA384Digest;
+Lcom/android/org/bouncycastle/crypto/digests/SHA512Digest;
Lcom/android/org/bouncycastle/crypto/engines/AESEngine;
Lcom/android/org/bouncycastle/crypto/engines/DESEngine;
Lcom/android/org/bouncycastle/crypto/generators/OpenSSLPBEParametersGenerator;
@@ -10358,7 +10458,7 @@ Lcom/android/org/bouncycastle/crypto/generators/PKCS5S1ParametersGenerator;
Lcom/android/org/bouncycastle/crypto/generators/PKCS5S2ParametersGenerator;
Lcom/android/org/bouncycastle/crypto/io/MacInputStream;
Lcom/android/org/bouncycastle/crypto/macs/HMac;
-Lcom/android/org/bouncycastle/crypto/modes/AEADCipher;
+Lcom/android/org/bouncycastle/crypto/modes/AEADBlockCipher;
Lcom/android/org/bouncycastle/crypto/modes/CBCBlockCipher;
Lcom/android/org/bouncycastle/crypto/paddings/BlockCipherPadding;
Lcom/android/org/bouncycastle/crypto/paddings/PKCS7Padding;
@@ -10374,25 +10474,16 @@ Lcom/android/org/bouncycastle/crypto/params/DSAValidationParameters;
Lcom/android/org/bouncycastle/crypto/params/KeyParameter;
Lcom/android/org/bouncycastle/crypto/params/ParametersWithIV;
Lcom/android/org/bouncycastle/crypto/params/ParametersWithRandom;
-Lcom/android/org/bouncycastle/jcajce/PBKDFKey;
Lcom/android/org/bouncycastle/jcajce/PKCS12Key;
-Lcom/android/org/bouncycastle/jcajce/PKCS12KeyWithParameters;
Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/DH$Mappings;
Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/DH;
Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/DSA$Mappings;
-Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/EC$Mappings;
-Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/EC;
Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/RSA$Mappings;
Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/RSA;
-Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/X509$Mappings;
Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/dh/KeyFactorySpi;
-Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/dsa/BCDSAPublicKey;
Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/dsa/DSAUtil;
Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/dsa/KeyFactorySpi;
-Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/ec/KeyFactorySpi$EC;
-Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/ec/KeyFactorySpi;
Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/rsa/CipherSpi$NoPadding;
-Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/rsa/CipherSpi;
Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/rsa/KeyFactorySpi;
Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/rsa/RSAUtil;
Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/util/BaseCipherSpi;
@@ -10405,8 +10496,7 @@ Lcom/android/org/bouncycastle/jcajce/provider/config/ConfigurableProvider;
Lcom/android/org/bouncycastle/jcajce/provider/config/ProviderConfiguration;
Lcom/android/org/bouncycastle/jcajce/provider/config/ProviderConfigurationPermission;
Lcom/android/org/bouncycastle/jcajce/provider/digest/DigestAlgorithmProvider;
-Lcom/android/org/bouncycastle/jcajce/provider/digest/MD5$Mappings;
-Lcom/android/org/bouncycastle/jcajce/provider/digest/MD5;
+Lcom/android/org/bouncycastle/jcajce/provider/digest/SHA1$Mappings$$ExternalSyntheticOutline0;
Lcom/android/org/bouncycastle/jcajce/provider/digest/SHA1$Mappings;
Lcom/android/org/bouncycastle/jcajce/provider/digest/SHA1;
Lcom/android/org/bouncycastle/jcajce/provider/digest/SHA224$Mappings;
@@ -10422,8 +10512,6 @@ Lcom/android/org/bouncycastle/jcajce/provider/keystore/PKCS12$Mappings;
Lcom/android/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi$Std;
Lcom/android/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi$StoreEntry;
Lcom/android/org/bouncycastle/jcajce/provider/keystore/bc/BcKeyStoreSpi;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/AES$ECB$1;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/AES$ECB;
Lcom/android/org/bouncycastle/jcajce/provider/symmetric/AES$Mappings;
Lcom/android/org/bouncycastle/jcajce/provider/symmetric/AES;
Lcom/android/org/bouncycastle/jcajce/provider/symmetric/ARC4$Mappings;
@@ -10457,7 +10545,7 @@ Lcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseSecretKeyFactor
Lcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseWrapCipher$ErasableOutputStream;
Lcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseWrapCipher$InvalidKeyOrParametersException;
Lcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseWrapCipher;
-Lcom/android/org/bouncycastle/jcajce/provider/symmetric/util/BlockCipherProvider;
+Lcom/android/org/bouncycastle/jcajce/provider/symmetric/util/ClassUtil$1;
Lcom/android/org/bouncycastle/jcajce/provider/symmetric/util/ClassUtil;
Lcom/android/org/bouncycastle/jcajce/provider/symmetric/util/GcmSpecUtil$2;
Lcom/android/org/bouncycastle/jcajce/provider/symmetric/util/GcmSpecUtil;
@@ -10467,43 +10555,32 @@ Lcom/android/org/bouncycastle/jcajce/provider/util/AlgorithmProvider;
Lcom/android/org/bouncycastle/jcajce/provider/util/AsymmetricAlgorithmProvider;
Lcom/android/org/bouncycastle/jcajce/provider/util/AsymmetricKeyInfoConverter;
Lcom/android/org/bouncycastle/jcajce/provider/util/DigestFactory;
-Lcom/android/org/bouncycastle/jcajce/spec/AEADParameterSpec;
Lcom/android/org/bouncycastle/jcajce/spec/PBKDF2KeySpec;
Lcom/android/org/bouncycastle/jcajce/util/BCJcaJceHelper;
Lcom/android/org/bouncycastle/jcajce/util/DefaultJcaJceHelper;
Lcom/android/org/bouncycastle/jcajce/util/JcaJceHelper;
-Lcom/android/org/bouncycastle/jcajce/util/ProviderJcaJceHelper;
Lcom/android/org/bouncycastle/jce/X509Principal;
-Lcom/android/org/bouncycastle/jce/interfaces/BCKeyStore;
Lcom/android/org/bouncycastle/jce/interfaces/PKCS12BagAttributeCarrier;
Lcom/android/org/bouncycastle/jce/provider/BouncyCastleProvider$1;
Lcom/android/org/bouncycastle/jce/provider/BouncyCastleProvider$PrivateProvider;
Lcom/android/org/bouncycastle/jce/provider/BouncyCastleProvider;
Lcom/android/org/bouncycastle/jce/provider/BouncyCastleProviderConfiguration;
Lcom/android/org/bouncycastle/jce/provider/CertStoreCollectionSpi;
-Lcom/android/org/bouncycastle/jce/provider/X509CertificateObject;
-Lcom/android/org/bouncycastle/jce/spec/ECKeySpec;
-Lcom/android/org/bouncycastle/jce/spec/ECPublicKeySpec;
+Lcom/android/org/bouncycastle/jce/provider/X509CRLObject;
Lcom/android/org/bouncycastle/util/Arrays;
Lcom/android/org/bouncycastle/util/BigIntegers;
-Lcom/android/org/bouncycastle/util/Encodable;
Lcom/android/org/bouncycastle/util/Integers;
-Lcom/android/org/bouncycastle/util/Iterable;
Lcom/android/org/bouncycastle/util/Memoable;
Lcom/android/org/bouncycastle/util/Pack;
Lcom/android/org/bouncycastle/util/Properties$1;
Lcom/android/org/bouncycastle/util/Properties;
Lcom/android/org/bouncycastle/util/Strings$1;
Lcom/android/org/bouncycastle/util/Strings;
-Lcom/android/org/bouncycastle/util/encoders/Encoder;
Lcom/android/org/bouncycastle/util/encoders/Hex;
Lcom/android/org/bouncycastle/util/encoders/HexEncoder;
Lcom/android/org/bouncycastle/util/io/Streams;
-Lcom/android/org/bouncycastle/x509/X509V3CertificateGenerator;
Lcom/android/org/kxml2/io/KXmlParser$ContentSource;
Lcom/android/org/kxml2/io/KXmlParser$ValueContext;
-Lcom/android/org/kxml2/io/KXmlParser;
-Lcom/android/org/kxml2/io/KXmlSerializer;
Lcom/sun/security/cert/internal/x509/X509V1CertImpl;
Ldalvik/annotation/optimization/CriticalNative;
Ldalvik/annotation/optimization/FastNative;
@@ -10512,9 +10589,7 @@ Ldalvik/annotation/optimization/NeverInline;
Ldalvik/system/AppSpecializationHooks;
Ldalvik/system/BaseDexClassLoader$Reporter;
Ldalvik/system/BaseDexClassLoader;
-Ldalvik/system/BlockGuard$1;
Ldalvik/system/BlockGuard$2;
-Ldalvik/system/BlockGuard$3;
Ldalvik/system/BlockGuard$BlockGuardPolicyException;
Ldalvik/system/BlockGuard$Policy;
Ldalvik/system/BlockGuard$VmPolicy;
@@ -10554,7 +10629,6 @@ Ljava/awt/font/NumericShaper;
Ljava/awt/font/TextAttribute;
Ljava/io/Bits;
Ljava/io/BufferedInputStream;
-Ljava/io/BufferedOutputStream;
Ljava/io/BufferedReader;
Ljava/io/BufferedWriter;
Ljava/io/ByteArrayInputStream;
@@ -10616,16 +10690,16 @@ Ljava/io/ObjectInputStream$ValidationList;
Ljava/io/ObjectInputStream;
Ljava/io/ObjectOutput;
Ljava/io/ObjectOutputStream$1;
-Ljava/io/ObjectOutputStream$BlockDataOutputStream;
Ljava/io/ObjectOutputStream$Caches;
Ljava/io/ObjectOutputStream$DebugTraceInfoStack;
Ljava/io/ObjectOutputStream$HandleTable;
Ljava/io/ObjectOutputStream$PutField;
Ljava/io/ObjectOutputStream$PutFieldImpl;
Ljava/io/ObjectOutputStream$ReplaceTable;
-Ljava/io/ObjectOutputStream;
Ljava/io/ObjectStreamClass$$ExternalSyntheticLambda0;
Ljava/io/ObjectStreamClass$$ExternalSyntheticLambda1;
+Ljava/io/ObjectStreamClass$$ExternalSyntheticLambda2;
+Ljava/io/ObjectStreamClass$$ExternalSyntheticLambda3;
Ljava/io/ObjectStreamClass$1;
Ljava/io/ObjectStreamClass$2;
Ljava/io/ObjectStreamClass$3;
@@ -10636,6 +10710,7 @@ Ljava/io/ObjectStreamClass$ClassDataSlot;
Ljava/io/ObjectStreamClass$DefaultSUIDCompatibilityListener;
Ljava/io/ObjectStreamClass$DeserializationConstructorsCache;
Ljava/io/ObjectStreamClass$EntryFuture$1;
+Ljava/io/ObjectStreamClass$EntryFuture-IA;
Ljava/io/ObjectStreamClass$EntryFuture;
Ljava/io/ObjectStreamClass$ExceptionInfo;
Ljava/io/ObjectStreamClass$FieldReflector;
@@ -10668,7 +10743,6 @@ Ljava/io/StringWriter;
Ljava/io/SyncFailedException;
Ljava/io/UTFDataFormatException;
Ljava/io/UncheckedIOException;
-Ljava/io/UnixFileSystem;
Ljava/io/UnsupportedEncodingException;
Ljava/io/WriteAbortedException;
Ljava/io/Writer;
@@ -10698,10 +10772,15 @@ Ljava/lang/Character$CharacterCache;
Ljava/lang/Character$Subset;
Ljava/lang/Character$UnicodeBlock;
Ljava/lang/Character;
+Ljava/lang/Class$$ExternalSyntheticLambda0;
+Ljava/lang/Class$$ExternalSyntheticLambda1;
Ljava/lang/Class$Caches;
Ljava/lang/Class;
Ljava/lang/ClassCastException;
Ljava/lang/ClassFormatError;
+Ljava/lang/ClassLoader$$ExternalSyntheticLambda0;
+Ljava/lang/ClassLoader$$ExternalSyntheticLambda1;
+Ljava/lang/ClassLoader$$ExternalSyntheticLambda2;
Ljava/lang/ClassLoader$SystemClassLoader;
Ljava/lang/ClassLoader;
Ljava/lang/ClassNotFoundException;
@@ -10710,6 +10789,7 @@ Ljava/lang/ClassValue;
Ljava/lang/CloneNotSupportedException;
Ljava/lang/Cloneable;
Ljava/lang/Comparable;
+Ljava/lang/CompoundEnumeration;
Ljava/lang/Daemons$Daemon;
Ljava/lang/Daemons$FinalizerDaemon;
Ljava/lang/Daemons$FinalizerWatchdogDaemon;
@@ -10719,7 +10799,9 @@ Ljava/lang/Daemons;
Ljava/lang/Deprecated;
Ljava/lang/DexCache;
Ljava/lang/Double;
+Ljava/lang/Enum$$ExternalSyntheticLambda0;
Ljava/lang/Enum$1;
+Ljava/lang/Enum$EnumDesc;
Ljava/lang/Enum;
Ljava/lang/EnumConstantNotPresentException;
Ljava/lang/Error;
@@ -10797,7 +10879,6 @@ Ljava/lang/String$$ExternalSyntheticLambda1;
Ljava/lang/String$$ExternalSyntheticLambda2;
Ljava/lang/String$$ExternalSyntheticLambda3;
Ljava/lang/String$CaseInsensitiveComparator-IA;
-Ljava/lang/String$CaseInsensitiveComparator;
Ljava/lang/String;
Ljava/lang/StringBuffer;
Ljava/lang/StringBuilder;
@@ -10821,11 +10902,10 @@ Ljava/lang/Thread$WeakClassKey;
Ljava/lang/Thread;
Ljava/lang/ThreadDeath;
Ljava/lang/ThreadGroup;
-Ljava/lang/ThreadLocal$SuppliedThreadLocal;
Ljava/lang/ThreadLocal$ThreadLocalMap$Entry;
Ljava/lang/ThreadLocal$ThreadLocalMap-IA;
Ljava/lang/ThreadLocal$ThreadLocalMap;
-Ljava/lang/ThreadLocal;
+Ljava/lang/Throwable$PrintStreamOrWriter-IA;
Ljava/lang/Throwable$PrintStreamOrWriter;
Ljava/lang/Throwable$SentinelHolder;
Ljava/lang/Throwable$WrappedPrintStream;
@@ -10859,7 +10939,6 @@ Ljava/lang/constant/Constable;
Ljava/lang/constant/ConstantDesc;
Ljava/lang/constant/ConstantDescs;
Ljava/lang/constant/ConstantUtils;
-Ljava/lang/constant/DirectMethodHandleDesc$1;
Ljava/lang/constant/DirectMethodHandleDesc$Kind;
Ljava/lang/constant/DirectMethodHandleDesc;
Ljava/lang/constant/DirectMethodHandleDescImpl$1;
@@ -10884,13 +10963,16 @@ Ljava/lang/invoke/MethodHandleImpl;
Ljava/lang/invoke/MethodHandleInfo;
Ljava/lang/invoke/MethodHandleStatics;
Ljava/lang/invoke/MethodHandles$$ExternalSyntheticLambda0;
+Ljava/lang/invoke/MethodHandles$$ExternalSyntheticLambda10;
Ljava/lang/invoke/MethodHandles$$ExternalSyntheticLambda11;
Ljava/lang/invoke/MethodHandles$$ExternalSyntheticLambda12;
Ljava/lang/invoke/MethodHandles$$ExternalSyntheticLambda13;
Ljava/lang/invoke/MethodHandles$$ExternalSyntheticLambda14;
Ljava/lang/invoke/MethodHandles$$ExternalSyntheticLambda15;
+Ljava/lang/invoke/MethodHandles$$ExternalSyntheticLambda16;
Ljava/lang/invoke/MethodHandles$$ExternalSyntheticLambda17;
Ljava/lang/invoke/MethodHandles$$ExternalSyntheticLambda18;
+Ljava/lang/invoke/MethodHandles$$ExternalSyntheticLambda19;
Ljava/lang/invoke/MethodHandles$$ExternalSyntheticLambda1;
Ljava/lang/invoke/MethodHandles$$ExternalSyntheticLambda20;
Ljava/lang/invoke/MethodHandles$$ExternalSyntheticLambda21;
@@ -10945,13 +11027,14 @@ Ljava/lang/invoke/Transformers$ZeroValue;
Ljava/lang/invoke/TypeDescriptor$OfField;
Ljava/lang/invoke/TypeDescriptor$OfMethod;
Ljava/lang/invoke/TypeDescriptor;
-Ljava/lang/invoke/VarHandle$1;
Ljava/lang/invoke/VarHandle$AccessMode;
Ljava/lang/invoke/VarHandle$AccessType;
Ljava/lang/invoke/VarHandle$VarHandleDesc$Kind;
Ljava/lang/invoke/VarHandle;
Ljava/lang/invoke/WrongMethodTypeException;
+Ljava/lang/ref/Cleaner$1;
Ljava/lang/ref/Cleaner$Cleanable;
+Ljava/lang/ref/Cleaner;
Ljava/lang/ref/FinalizerReference$Sentinel-IA;
Ljava/lang/ref/FinalizerReference$Sentinel;
Ljava/lang/ref/FinalizerReference;
@@ -11053,13 +11136,13 @@ Ljava/net/HttpURLConnection;
Ljava/net/IDN;
Ljava/net/InMemoryCookieStore;
Ljava/net/Inet4Address;
+Ljava/net/Inet6Address$Inet6AddressHolder-IA;
Ljava/net/Inet6Address$Inet6AddressHolder;
Ljava/net/Inet6Address;
-Ljava/net/Inet6AddressImpl;
Ljava/net/InetAddress$1;
-Ljava/net/InetAddress$InetAddressHolder;
Ljava/net/InetAddress;
Ljava/net/InetAddressImpl;
+Ljava/net/InetSocketAddress$InetSocketAddressHolder-IA;
Ljava/net/InetSocketAddress$InetSocketAddressHolder;
Ljava/net/InetSocketAddress;
Ljava/net/InterfaceAddress;
@@ -11091,10 +11174,8 @@ Ljava/net/SocketAddress;
Ljava/net/SocketException;
Ljava/net/SocketImpl;
Ljava/net/SocketImplFactory;
-Ljava/net/SocketInputStream;
Ljava/net/SocketOption;
Ljava/net/SocketOptions;
-Ljava/net/SocketOutputStream;
Ljava/net/SocketPermission;
Ljava/net/SocketTimeoutException;
Ljava/net/SocksConsts;
@@ -11121,18 +11202,13 @@ Ljava/nio/BufferUnderflowException;
Ljava/nio/ByteBuffer;
Ljava/nio/ByteBufferAsCharBuffer;
Ljava/nio/ByteBufferAsDoubleBuffer;
-Ljava/nio/ByteBufferAsFloatBuffer;
-Ljava/nio/ByteBufferAsIntBuffer;
Ljava/nio/ByteBufferAsLongBuffer;
Ljava/nio/ByteBufferAsShortBuffer;
Ljava/nio/ByteOrder;
Ljava/nio/CharBuffer;
Ljava/nio/DirectByteBuffer$MemoryRef;
-Ljava/nio/DirectByteBuffer;
Ljava/nio/DoubleBuffer;
Ljava/nio/FloatBuffer;
-Ljava/nio/HeapByteBuffer;
-Ljava/nio/HeapCharBuffer;
Ljava/nio/HeapIntBuffer;
Ljava/nio/IntBuffer;
Ljava/nio/InvalidMarkException;
@@ -11284,7 +11360,6 @@ Ljava/security/KeyStore$TrustedCertificateEntry;
Ljava/security/KeyStore;
Ljava/security/KeyStoreException;
Ljava/security/KeyStoreSpi;
-Ljava/security/MessageDigest$Delegate;
Ljava/security/MessageDigest;
Ljava/security/MessageDigestSpi;
Ljava/security/NoSuchAlgorithmException;
@@ -11299,19 +11374,21 @@ Ljava/security/PrivilegedActionException;
Ljava/security/PrivilegedExceptionAction;
Ljava/security/ProtectionDomain;
Ljava/security/Provider$EngineDescription;
+Ljava/security/Provider$Service-IA;
Ljava/security/Provider$Service;
+Ljava/security/Provider$ServiceKey-IA;
Ljava/security/Provider$ServiceKey;
Ljava/security/Provider$UString;
Ljava/security/Provider;
Ljava/security/ProviderException;
Ljava/security/PublicKey;
Ljava/security/SecureRandom;
+Ljava/security/SecureRandomParameters;
Ljava/security/SecureRandomSpi;
Ljava/security/Security$1;
Ljava/security/Security;
Ljava/security/SecurityPermission;
Ljava/security/Signature$CipherAdapter;
-Ljava/security/Signature$Delegate;
Ljava/security/Signature;
Ljava/security/SignatureException;
Ljava/security/SignatureSpi;
@@ -11421,6 +11498,7 @@ Ljava/text/DecimalFormat;
Ljava/text/DecimalFormatSymbols;
Ljava/text/DontCareFieldPosition$1;
Ljava/text/DontCareFieldPosition;
+Ljava/text/FieldPosition$Delegate-IA;
Ljava/text/FieldPosition$Delegate;
Ljava/text/FieldPosition;
Ljava/text/Format$Field;
@@ -11436,13 +11514,13 @@ Ljava/text/Normalizer$Form$$ExternalSyntheticLambda3;
Ljava/text/Normalizer$Form;
Ljava/text/Normalizer;
Ljava/text/NumberFormat$Field;
+Ljava/text/NumberFormat$Style;
Ljava/text/NumberFormat;
Ljava/text/ParseException;
Ljava/text/ParsePosition;
Ljava/text/RuleBasedCollator;
Ljava/text/SimpleDateFormat;
Ljava/text/StringCharacterIterator;
-Ljava/time/Clock$SystemClock;
Ljava/time/Clock;
Ljava/time/DateTimeException;
Ljava/time/DayOfWeek;
@@ -11455,14 +11533,12 @@ Ljava/time/LocalDate;
Ljava/time/LocalDateTime;
Ljava/time/LocalTime$1;
Ljava/time/LocalTime;
-Ljava/time/Month$1;
Ljava/time/Month;
Ljava/time/OffsetDateTime;
Ljava/time/Period;
Ljava/time/Year;
Ljava/time/ZoneId;
Ljava/time/ZoneOffset;
-Ljava/time/ZoneRegion;
Ljava/time/ZonedDateTime$$ExternalSyntheticLambda0;
Ljava/time/ZonedDateTime$1;
Ljava/time/ZonedDateTime;
@@ -11489,7 +11565,9 @@ Ljava/time/format/DateTimeFormatterBuilder$InstantPrinterParser;
Ljava/time/format/DateTimeFormatterBuilder$NumberPrinterParser;
Ljava/time/format/DateTimeFormatterBuilder$OffsetIdPrinterParser;
Ljava/time/format/DateTimeFormatterBuilder$PadPrinterParserDecorator;
+Ljava/time/format/DateTimeFormatterBuilder$PrefixTree$CI-IA;
Ljava/time/format/DateTimeFormatterBuilder$PrefixTree$CI;
+Ljava/time/format/DateTimeFormatterBuilder$PrefixTree-IA;
Ljava/time/format/DateTimeFormatterBuilder$PrefixTree;
Ljava/time/format/DateTimeFormatterBuilder$SettingsParser;
Ljava/time/format/DateTimeFormatterBuilder$StringLiteralPrinterParser;
@@ -11526,6 +11604,8 @@ Ljava/time/temporal/TemporalAdjuster;
Ljava/time/temporal/TemporalAdjusters$$ExternalSyntheticLambda11;
Ljava/time/temporal/TemporalAdjusters$$ExternalSyntheticLambda1;
Ljava/time/temporal/TemporalAdjusters$$ExternalSyntheticLambda3;
+Ljava/time/temporal/TemporalAdjusters$$ExternalSyntheticLambda6;
+Ljava/time/temporal/TemporalAdjusters$$ExternalSyntheticLambda8;
Ljava/time/temporal/TemporalAdjusters;
Ljava/time/temporal/TemporalAmount;
Ljava/time/temporal/TemporalField;
@@ -11544,7 +11624,6 @@ Ljava/time/temporal/ValueRange;
Ljava/time/zone/IcuZoneRulesProvider$ZoneRulesCache;
Ljava/time/zone/IcuZoneRulesProvider;
Ljava/time/zone/ZoneOffsetTransition;
-Ljava/time/zone/ZoneOffsetTransitionRule$1;
Ljava/time/zone/ZoneOffsetTransitionRule$TimeDefinition;
Ljava/time/zone/ZoneOffsetTransitionRule;
Ljava/time/zone/ZoneRules;
@@ -11552,7 +11631,6 @@ Ljava/time/zone/ZoneRulesException;
Ljava/time/zone/ZoneRulesProvider;
Ljava/util/AbstractCollection;
Ljava/util/AbstractList$Itr-IA;
-Ljava/util/AbstractList$Itr;
Ljava/util/AbstractList$ListItr;
Ljava/util/AbstractList$RandomAccessSpliterator;
Ljava/util/AbstractList$RandomAccessSubList;
@@ -11561,23 +11639,18 @@ Ljava/util/AbstractList$SubList;
Ljava/util/AbstractList;
Ljava/util/AbstractMap$1;
Ljava/util/AbstractMap$2$1;
-Ljava/util/AbstractMap$2;
Ljava/util/AbstractMap$SimpleEntry;
Ljava/util/AbstractMap$SimpleImmutableEntry;
+Ljava/util/AbstractMap$ViewCollection;
Ljava/util/AbstractMap;
Ljava/util/AbstractQueue;
Ljava/util/AbstractSequentialList;
Ljava/util/AbstractSet;
Ljava/util/ArrayDeque$$ExternalSyntheticLambda1;
-Ljava/util/ArrayDeque$DeqIterator;
-Ljava/util/ArrayDeque$DescendingIterator;
Ljava/util/ArrayDeque;
Ljava/util/ArrayList$ArrayListSpliterator;
-Ljava/util/ArrayList$Itr;
Ljava/util/ArrayList$ListItr;
-Ljava/util/ArrayList$SubList$1;
Ljava/util/ArrayList$SubList$2;
-Ljava/util/ArrayList$SubList;
Ljava/util/ArrayList;
Ljava/util/ArrayPrefixHelpers$CumulateTask;
Ljava/util/ArrayPrefixHelpers$DoubleCumulateTask;
@@ -11587,8 +11660,6 @@ Ljava/util/Arrays$$ExternalSyntheticLambda0;
Ljava/util/Arrays$$ExternalSyntheticLambda1;
Ljava/util/Arrays$$ExternalSyntheticLambda2;
Ljava/util/Arrays$$ExternalSyntheticLambda3;
-Ljava/util/Arrays$ArrayItr;
-Ljava/util/Arrays$ArrayList;
Ljava/util/Arrays$NaturalOrder;
Ljava/util/Arrays;
Ljava/util/ArraysParallelSortHelpers$FJObject$Sorter;
@@ -11600,7 +11671,6 @@ Ljava/util/Calendar$$ExternalSyntheticLambda0;
Ljava/util/Calendar$Builder;
Ljava/util/Calendar;
Ljava/util/Collection;
-Ljava/util/Collections$1;
Ljava/util/Collections$2;
Ljava/util/Collections$3;
Ljava/util/Collections$AsLIFOQueue;
@@ -11616,48 +11686,31 @@ Ljava/util/Collections$CheckedSortedMap;
Ljava/util/Collections$CheckedSortedSet;
Ljava/util/Collections$CopiesList;
Ljava/util/Collections$EmptyEnumeration;
-Ljava/util/Collections$EmptyIterator;
Ljava/util/Collections$EmptyList-IA;
-Ljava/util/Collections$EmptyList;
Ljava/util/Collections$EmptyListIterator;
Ljava/util/Collections$EmptyMap-IA;
-Ljava/util/Collections$EmptyMap;
Ljava/util/Collections$EmptySet-IA;
-Ljava/util/Collections$EmptySet;
Ljava/util/Collections$ReverseComparator2;
Ljava/util/Collections$ReverseComparator;
-Ljava/util/Collections$SetFromMap;
-Ljava/util/Collections$SingletonList;
-Ljava/util/Collections$SingletonMap;
-Ljava/util/Collections$SingletonSet;
-Ljava/util/Collections$SynchronizedCollection;
+Ljava/util/Collections$SequencedSetFromMap;
Ljava/util/Collections$SynchronizedList;
-Ljava/util/Collections$SynchronizedMap;
Ljava/util/Collections$SynchronizedNavigableMap;
Ljava/util/Collections$SynchronizedNavigableSet;
-Ljava/util/Collections$SynchronizedRandomAccessList;
Ljava/util/Collections$SynchronizedSet;
Ljava/util/Collections$SynchronizedSortedMap;
Ljava/util/Collections$SynchronizedSortedSet;
-Ljava/util/Collections$UnmodifiableCollection$1;
-Ljava/util/Collections$UnmodifiableCollection;
Ljava/util/Collections$UnmodifiableList$1;
Ljava/util/Collections$UnmodifiableList;
-Ljava/util/Collections$UnmodifiableMap$UnmodifiableEntrySet$1;
-Ljava/util/Collections$UnmodifiableMap$UnmodifiableEntrySet$UnmodifiableEntry;
-Ljava/util/Collections$UnmodifiableMap$UnmodifiableEntrySet;
-Ljava/util/Collections$UnmodifiableMap;
Ljava/util/Collections$UnmodifiableNavigableMap$EmptyNavigableMap;
Ljava/util/Collections$UnmodifiableNavigableMap;
Ljava/util/Collections$UnmodifiableNavigableSet$EmptyNavigableSet;
Ljava/util/Collections$UnmodifiableNavigableSet;
-Ljava/util/Collections$UnmodifiableRandomAccessList;
-Ljava/util/Collections$UnmodifiableSet;
+Ljava/util/Collections$UnmodifiableSequencedCollection;
+Ljava/util/Collections$UnmodifiableSequencedMap;
+Ljava/util/Collections$UnmodifiableSequencedSet;
Ljava/util/Collections$UnmodifiableSortedMap;
-Ljava/util/Collections$UnmodifiableSortedSet;
Ljava/util/Collections;
Ljava/util/ComparableTimSort;
-Ljava/util/Comparator$$ExternalSyntheticLambda0;
Ljava/util/Comparator$$ExternalSyntheticLambda1;
Ljava/util/Comparator$$ExternalSyntheticLambda2;
Ljava/util/Comparator$$ExternalSyntheticLambda3;
@@ -11671,18 +11724,28 @@ Ljava/util/Currency;
Ljava/util/Date;
Ljava/util/Deque;
Ljava/util/Dictionary;
+Ljava/util/DoubleSummaryStatistics;
+Ljava/util/DualPivotQuicksort$Sorter-IA;
Ljava/util/DualPivotQuicksort$Sorter;
Ljava/util/DualPivotQuicksort;
Ljava/util/DuplicateFormatFlagsException;
Ljava/util/EmptyStackException;
Ljava/util/EnumMap$1;
+Ljava/util/EnumMap$EntryIterator$Entry-IA;
Ljava/util/EnumMap$EntryIterator$Entry;
+Ljava/util/EnumMap$EntryIterator-IA;
Ljava/util/EnumMap$EntryIterator;
+Ljava/util/EnumMap$EntrySet-IA;
Ljava/util/EnumMap$EntrySet;
+Ljava/util/EnumMap$EnumMapIterator-IA;
Ljava/util/EnumMap$EnumMapIterator;
+Ljava/util/EnumMap$KeyIterator-IA;
Ljava/util/EnumMap$KeyIterator;
+Ljava/util/EnumMap$KeySet-IA;
Ljava/util/EnumMap$KeySet;
+Ljava/util/EnumMap$ValueIterator-IA;
Ljava/util/EnumMap$ValueIterator;
+Ljava/util/EnumMap$Values-IA;
Ljava/util/EnumMap$Values;
Ljava/util/EnumMap;
Ljava/util/EnumSet$SerializationProxy;
@@ -11701,35 +11764,38 @@ Ljava/util/Formatter$FormatSpecifierParser;
Ljava/util/Formatter$FormatString;
Ljava/util/Formatter;
Ljava/util/FormatterClosedException;
-Ljava/util/GregorianCalendar;
-Ljava/util/HashMap$EntryIterator;
-Ljava/util/HashMap$EntrySet;
Ljava/util/HashMap$EntrySpliterator;
Ljava/util/HashMap$HashIterator;
Ljava/util/HashMap$HashMapSpliterator;
-Ljava/util/HashMap$KeyIterator;
-Ljava/util/HashMap$KeySet;
Ljava/util/HashMap$KeySpliterator;
-Ljava/util/HashMap$Node;
-Ljava/util/HashMap$TreeNode;
-Ljava/util/HashMap$ValueIterator;
+Ljava/util/HashMap$UnsafeHolder;
Ljava/util/HashMap$ValueSpliterator;
-Ljava/util/HashMap$Values;
Ljava/util/HashMap;
Ljava/util/HashSet;
+Ljava/util/Hashtable$EntrySet-IA;
Ljava/util/Hashtable$EntrySet;
-Ljava/util/Hashtable$Enumerator;
Ljava/util/Hashtable$HashtableEntry;
+Ljava/util/Hashtable$KeySet-IA;
Ljava/util/Hashtable$KeySet;
+Ljava/util/Hashtable$ValueCollection-IA;
Ljava/util/Hashtable$ValueCollection;
Ljava/util/Hashtable;
+Ljava/util/HexFormat;
+Ljava/util/IdentityHashMap$EntryIterator$Entry-IA;
Ljava/util/IdentityHashMap$EntryIterator$Entry;
+Ljava/util/IdentityHashMap$EntryIterator-IA;
Ljava/util/IdentityHashMap$EntryIterator;
+Ljava/util/IdentityHashMap$EntrySet-IA;
Ljava/util/IdentityHashMap$EntrySet;
+Ljava/util/IdentityHashMap$IdentityHashMapIterator-IA;
Ljava/util/IdentityHashMap$IdentityHashMapIterator;
+Ljava/util/IdentityHashMap$KeyIterator-IA;
Ljava/util/IdentityHashMap$KeyIterator;
+Ljava/util/IdentityHashMap$KeySet-IA;
Ljava/util/IdentityHashMap$KeySet;
+Ljava/util/IdentityHashMap$ValueIterator-IA;
Ljava/util/IdentityHashMap$ValueIterator;
+Ljava/util/IdentityHashMap$Values-IA;
Ljava/util/IdentityHashMap$Values;
Ljava/util/IdentityHashMap;
Ljava/util/IllegalFormatCodePointException;
@@ -11743,15 +11809,11 @@ Ljava/util/ImmutableCollections$AbstractImmutableCollection;
Ljava/util/ImmutableCollections$AbstractImmutableList;
Ljava/util/ImmutableCollections$AbstractImmutableMap;
Ljava/util/ImmutableCollections$AbstractImmutableSet;
-Ljava/util/ImmutableCollections$List12;
-Ljava/util/ImmutableCollections$ListItr;
-Ljava/util/ImmutableCollections$ListN;
-Ljava/util/ImmutableCollections$Map1;
+Ljava/util/ImmutableCollections$Access$1;
+Ljava/util/ImmutableCollections$Access;
+Ljava/util/ImmutableCollections$ListN-IA;
Ljava/util/ImmutableCollections$MapN$1;
Ljava/util/ImmutableCollections$MapN$MapNIterator;
-Ljava/util/ImmutableCollections$MapN;
-Ljava/util/ImmutableCollections$Set12;
-Ljava/util/ImmutableCollections$SetN;
Ljava/util/ImmutableCollections$SubList;
Ljava/util/ImmutableCollections;
Ljava/util/InputMismatchException;
@@ -11759,24 +11821,16 @@ Ljava/util/Iterator;
Ljava/util/JumboEnumSet$EnumSetIterator;
Ljava/util/JumboEnumSet;
Ljava/util/KeyValueHolder;
-Ljava/util/LinkedHashMap$LinkedEntryIterator;
-Ljava/util/LinkedHashMap$LinkedEntrySet;
Ljava/util/LinkedHashMap$LinkedHashIterator;
-Ljava/util/LinkedHashMap$LinkedHashMapEntry;
-Ljava/util/LinkedHashMap$LinkedKeyIterator;
-Ljava/util/LinkedHashMap$LinkedKeySet;
-Ljava/util/LinkedHashMap$LinkedValueIterator;
-Ljava/util/LinkedHashMap$LinkedValues;
+Ljava/util/LinkedHashMap$ReversedLinkedHashMapView;
Ljava/util/LinkedHashMap;
Ljava/util/LinkedHashSet;
-Ljava/util/LinkedList$DescendingIterator;
-Ljava/util/LinkedList$ListItr;
+Ljava/util/LinkedList$DescendingIterator-IA;
Ljava/util/LinkedList$Node;
Ljava/util/LinkedList;
Ljava/util/List;
Ljava/util/ListIterator;
Ljava/util/ListResourceBundle;
-Ljava/util/Locale$1;
Ljava/util/Locale$Builder;
Ljava/util/Locale$Cache;
Ljava/util/Locale$Category;
@@ -11786,9 +11840,12 @@ Ljava/util/Locale$IsoCountryCode$2;
Ljava/util/Locale$IsoCountryCode$3;
Ljava/util/Locale$IsoCountryCode;
Ljava/util/Locale$LanguageRange;
+Ljava/util/Locale$LocaleKey-IA;
Ljava/util/Locale$LocaleKey;
Ljava/util/Locale$NoImagePreloadHolder;
+Ljava/util/Locale-IA;
Ljava/util/Locale;
+Ljava/util/LongSummaryStatistics;
Ljava/util/Map$Entry;
Ljava/util/Map;
Ljava/util/MissingFormatArgumentException;
@@ -11806,8 +11863,8 @@ Ljava/util/OptionalInt;
Ljava/util/PrimitiveIterator$OfInt$$ExternalSyntheticLambda0;
Ljava/util/PrimitiveIterator$OfInt;
Ljava/util/PrimitiveIterator;
-Ljava/util/PriorityQueue$Itr;
Ljava/util/PriorityQueue;
+Ljava/util/Properties$EntrySet;
Ljava/util/Properties$LineReader;
Ljava/util/Properties;
Ljava/util/PropertyPermission;
@@ -11830,10 +11887,19 @@ Ljava/util/ResourceBundle$RBClassLoader$1;
Ljava/util/ResourceBundle$RBClassLoader;
Ljava/util/ResourceBundle$SingleFormatControl;
Ljava/util/ResourceBundle;
+Ljava/util/ReverseOrderListView;
Ljava/util/Scanner$PatternLRUCache;
Ljava/util/Scanner;
+Ljava/util/SequencedCollection;
+Ljava/util/SequencedMap$1SeqEntrySet;
+Ljava/util/SequencedMap$1SeqKeySet;
+Ljava/util/SequencedMap$1SeqValues;
+Ljava/util/SequencedMap;
+Ljava/util/SequencedSet;
Ljava/util/ServiceConfigurationError;
Ljava/util/ServiceLoader$1;
+Ljava/util/ServiceLoader$2;
+Ljava/util/ServiceLoader$LazyClassPathLookupIterator;
Ljava/util/ServiceLoader;
Ljava/util/Set;
Ljava/util/SimpleTimeZone$Cache;
@@ -11860,6 +11926,7 @@ Ljava/util/StringTokenizer;
Ljava/util/TaskQueue;
Ljava/util/TimSort;
Ljava/util/TimeZone;
+Ljava/util/Timer$ThreadReaper;
Ljava/util/Timer;
Ljava/util/TimerTask;
Ljava/util/TimerThread;
@@ -11867,18 +11934,12 @@ Ljava/util/TooManyListenersException;
Ljava/util/TreeMap$AscendingSubMap$AscendingEntrySetView;
Ljava/util/TreeMap$AscendingSubMap;
Ljava/util/TreeMap$DescendingSubMap;
-Ljava/util/TreeMap$EntryIterator;
-Ljava/util/TreeMap$EntrySet;
-Ljava/util/TreeMap$KeyIterator;
-Ljava/util/TreeMap$KeySet;
Ljava/util/TreeMap$NavigableSubMap$DescendingSubMapKeyIterator;
Ljava/util/TreeMap$NavigableSubMap$EntrySetView;
Ljava/util/TreeMap$NavigableSubMap$SubMapEntryIterator;
Ljava/util/TreeMap$NavigableSubMap$SubMapIterator;
-Ljava/util/TreeMap$NavigableSubMap$SubMapKeyIterator;
Ljava/util/TreeMap$NavigableSubMap;
Ljava/util/TreeMap$PrivateEntryIterator;
-Ljava/util/TreeMap$TreeMapEntry;
Ljava/util/TreeMap$ValueIterator;
Ljava/util/TreeMap$Values;
Ljava/util/TreeMap;
@@ -11890,16 +11951,18 @@ Ljava/util/UUID;
Ljava/util/UnknownFormatConversionException;
Ljava/util/UnknownFormatFlagsException;
Ljava/util/Vector$1;
+Ljava/util/Vector$Itr-IA;
Ljava/util/Vector$Itr;
Ljava/util/Vector;
Ljava/util/WeakHashMap$Entry;
+Ljava/util/WeakHashMap$EntryIterator-IA;
Ljava/util/WeakHashMap$EntryIterator;
Ljava/util/WeakHashMap$EntrySet-IA;
Ljava/util/WeakHashMap$EntrySet;
Ljava/util/WeakHashMap$HashIterator;
-Ljava/util/WeakHashMap$KeyIterator;
+Ljava/util/WeakHashMap$KeyIterator-IA;
Ljava/util/WeakHashMap$KeySet-IA;
-Ljava/util/WeakHashMap$KeySet;
+Ljava/util/WeakHashMap$ValueIterator-IA;
Ljava/util/WeakHashMap$ValueIterator;
Ljava/util/WeakHashMap$Values-IA;
Ljava/util/WeakHashMap$Values;
@@ -11926,8 +11989,6 @@ Ljava/util/concurrent/ConcurrentHashMap$BaseIterator;
Ljava/util/concurrent/ConcurrentHashMap$BulkTask;
Ljava/util/concurrent/ConcurrentHashMap$CollectionView;
Ljava/util/concurrent/ConcurrentHashMap$CounterCell;
-Ljava/util/concurrent/ConcurrentHashMap$EntryIterator;
-Ljava/util/concurrent/ConcurrentHashMap$EntrySetView;
Ljava/util/concurrent/ConcurrentHashMap$ForEachEntryTask;
Ljava/util/concurrent/ConcurrentHashMap$ForEachKeyTask;
Ljava/util/concurrent/ConcurrentHashMap$ForEachMappingTask;
@@ -11940,7 +12001,6 @@ Ljava/util/concurrent/ConcurrentHashMap$ForwardingNode;
Ljava/util/concurrent/ConcurrentHashMap$KeyIterator;
Ljava/util/concurrent/ConcurrentHashMap$KeySetView;
Ljava/util/concurrent/ConcurrentHashMap$KeySpliterator;
-Ljava/util/concurrent/ConcurrentHashMap$MapEntry;
Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesTask;
Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesToDoubleTask;
Ljava/util/concurrent/ConcurrentHashMap$MapReduceEntriesToIntTask;
@@ -11971,13 +12031,11 @@ Ljava/util/concurrent/ConcurrentHashMap$TableStack;
Ljava/util/concurrent/ConcurrentHashMap$Traverser;
Ljava/util/concurrent/ConcurrentHashMap$TreeBin;
Ljava/util/concurrent/ConcurrentHashMap$TreeNode;
-Ljava/util/concurrent/ConcurrentHashMap$ValueIterator;
-Ljava/util/concurrent/ConcurrentHashMap$ValuesView;
Ljava/util/concurrent/ConcurrentHashMap;
Ljava/util/concurrent/ConcurrentLinkedDeque$Node;
Ljava/util/concurrent/ConcurrentLinkedDeque;
Ljava/util/concurrent/ConcurrentLinkedQueue$$ExternalSyntheticLambda0;
-Ljava/util/concurrent/ConcurrentLinkedQueue$Itr;
+Ljava/util/concurrent/ConcurrentLinkedQueue$$ExternalSyntheticLambda2;
Ljava/util/concurrent/ConcurrentLinkedQueue$Node;
Ljava/util/concurrent/ConcurrentLinkedQueue;
Ljava/util/concurrent/ConcurrentMap$$ExternalSyntheticLambda0;
@@ -11992,8 +12050,6 @@ Ljava/util/concurrent/ConcurrentSkipListMap$Values;
Ljava/util/concurrent/ConcurrentSkipListMap;
Ljava/util/concurrent/ConcurrentSkipListSet;
Ljava/util/concurrent/CopyOnWriteArrayList$$ExternalSyntheticLambda2;
-Ljava/util/concurrent/CopyOnWriteArrayList$COWIterator;
-Ljava/util/concurrent/CopyOnWriteArrayList;
Ljava/util/concurrent/CopyOnWriteArraySet;
Ljava/util/concurrent/CountDownLatch$Sync;
Ljava/util/concurrent/CountDownLatch;
@@ -12005,8 +12061,6 @@ Ljava/util/concurrent/Executor;
Ljava/util/concurrent/ExecutorService;
Ljava/util/concurrent/Executors$DefaultThreadFactory;
Ljava/util/concurrent/Executors$DelegatedExecutorService;
-Ljava/util/concurrent/Executors$DelegatedScheduledExecutorService;
-Ljava/util/concurrent/Executors$FinalizableDelegatedExecutorService;
Ljava/util/concurrent/Executors$RunnableAdapter;
Ljava/util/concurrent/Executors;
Ljava/util/concurrent/ForkJoinPool$1;
@@ -12039,8 +12093,6 @@ Ljava/util/concurrent/ScheduledExecutorService;
Ljava/util/concurrent/ScheduledFuture;
Ljava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue$Itr;
Ljava/util/concurrent/ScheduledThreadPoolExecutor$DelayedWorkQueue;
-Ljava/util/concurrent/ScheduledThreadPoolExecutor$ScheduledFutureTask;
-Ljava/util/concurrent/ScheduledThreadPoolExecutor;
Ljava/util/concurrent/Semaphore$FairSync;
Ljava/util/concurrent/Semaphore$NonfairSync;
Ljava/util/concurrent/Semaphore$Sync;
@@ -12055,8 +12107,6 @@ Ljava/util/concurrent/ThreadFactory;
Ljava/util/concurrent/ThreadLocalRandom;
Ljava/util/concurrent/ThreadPoolExecutor$AbortPolicy;
Ljava/util/concurrent/ThreadPoolExecutor$DiscardPolicy;
-Ljava/util/concurrent/ThreadPoolExecutor$Worker;
-Ljava/util/concurrent/ThreadPoolExecutor;
Ljava/util/concurrent/TimeUnit$1;
Ljava/util/concurrent/TimeUnit;
Ljava/util/concurrent/TimeoutException;
@@ -12095,11 +12145,9 @@ Ljava/util/concurrent/locks/ReentrantLock$Sync;
Ljava/util/concurrent/locks/ReentrantLock;
Ljava/util/concurrent/locks/ReentrantReadWriteLock$FairSync;
Ljava/util/concurrent/locks/ReentrantReadWriteLock$NonfairSync;
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$ReadLock;
Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync$HoldCounter;
Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync$ThreadLocalHoldCounter;
Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync;
-Ljava/util/concurrent/locks/ReentrantReadWriteLock$WriteLock;
Ljava/util/concurrent/locks/ReentrantReadWriteLock;
Ljava/util/function/BiConsumer;
Ljava/util/function/BiFunction$$ExternalSyntheticLambda0;
@@ -12115,8 +12163,8 @@ Ljava/util/function/DoubleConsumer;
Ljava/util/function/DoubleSupplier;
Ljava/util/function/DoubleUnaryOperator$$ExternalSyntheticLambda0;
Ljava/util/function/DoubleUnaryOperator$$ExternalSyntheticLambda1;
-Ljava/util/function/DoubleUnaryOperator$$ExternalSyntheticLambda2;
Ljava/util/function/DoubleUnaryOperator;
+Ljava/util/function/Function$$ExternalSyntheticLambda0;
Ljava/util/function/Function$$ExternalSyntheticLambda1;
Ljava/util/function/Function$$ExternalSyntheticLambda2;
Ljava/util/function/Function;
@@ -12161,6 +12209,7 @@ Ljava/util/jar/Manifest;
Ljava/util/logging/ConsoleHandler;
Ljava/util/logging/ErrorManager;
Ljava/util/logging/FileHandler$1;
+Ljava/util/logging/FileHandler$InitializationErrorManager-IA;
Ljava/util/logging/FileHandler$InitializationErrorManager;
Ljava/util/logging/FileHandler$MeteredStream;
Ljava/util/logging/FileHandler;
@@ -12202,10 +12251,13 @@ Ljava/util/prefs/FileSystemPreferences;
Ljava/util/prefs/FileSystemPreferencesFactory;
Ljava/util/prefs/Preferences;
Ljava/util/prefs/PreferencesFactory;
+Ljava/util/random/RandomGenerator;
+Ljava/util/regex/ASCII;
Ljava/util/regex/MatchResult;
Ljava/util/regex/Matcher;
Ljava/util/regex/Pattern;
Ljava/util/regex/PatternSyntaxException;
+Ljava/util/stream/AbstractPipeline$$ExternalSyntheticLambda0;
Ljava/util/stream/AbstractPipeline$$ExternalSyntheticLambda2;
Ljava/util/stream/AbstractPipeline;
Ljava/util/stream/AbstractSpinedBuffer;
@@ -12219,14 +12271,21 @@ Ljava/util/stream/Collectors$$ExternalSyntheticLambda1;
Ljava/util/stream/Collectors$$ExternalSyntheticLambda20;
Ljava/util/stream/Collectors$$ExternalSyntheticLambda21;
Ljava/util/stream/Collectors$$ExternalSyntheticLambda22;
+Ljava/util/stream/Collectors$$ExternalSyntheticLambda23;
Ljava/util/stream/Collectors$$ExternalSyntheticLambda24;
+Ljava/util/stream/Collectors$$ExternalSyntheticLambda25;
Ljava/util/stream/Collectors$$ExternalSyntheticLambda26;
+Ljava/util/stream/Collectors$$ExternalSyntheticLambda27;
+Ljava/util/stream/Collectors$$ExternalSyntheticLambda28;
+Ljava/util/stream/Collectors$$ExternalSyntheticLambda30;
Ljava/util/stream/Collectors$$ExternalSyntheticLambda34;
Ljava/util/stream/Collectors$$ExternalSyntheticLambda37;
Ljava/util/stream/Collectors$$ExternalSyntheticLambda39;
Ljava/util/stream/Collectors$$ExternalSyntheticLambda41;
Ljava/util/stream/Collectors$$ExternalSyntheticLambda42;
Ljava/util/stream/Collectors$$ExternalSyntheticLambda45;
+Ljava/util/stream/Collectors$$ExternalSyntheticLambda47;
+Ljava/util/stream/Collectors$$ExternalSyntheticLambda48;
Ljava/util/stream/Collectors$$ExternalSyntheticLambda49;
Ljava/util/stream/Collectors$$ExternalSyntheticLambda4;
Ljava/util/stream/Collectors$$ExternalSyntheticLambda50;
@@ -12236,14 +12295,20 @@ Ljava/util/stream/Collectors$$ExternalSyntheticLambda53;
Ljava/util/stream/Collectors$$ExternalSyntheticLambda54;
Ljava/util/stream/Collectors$$ExternalSyntheticLambda56;
Ljava/util/stream/Collectors$$ExternalSyntheticLambda57;
+Ljava/util/stream/Collectors$$ExternalSyntheticLambda63;
Ljava/util/stream/Collectors$$ExternalSyntheticLambda64;
Ljava/util/stream/Collectors$$ExternalSyntheticLambda65;
Ljava/util/stream/Collectors$$ExternalSyntheticLambda66;
+Ljava/util/stream/Collectors$$ExternalSyntheticLambda68;
+Ljava/util/stream/Collectors$$ExternalSyntheticLambda69;
+Ljava/util/stream/Collectors$$ExternalSyntheticLambda72;
+Ljava/util/stream/Collectors$$ExternalSyntheticLambda73;
Ljava/util/stream/Collectors$$ExternalSyntheticLambda74;
Ljava/util/stream/Collectors$$ExternalSyntheticLambda75;
Ljava/util/stream/Collectors$$ExternalSyntheticLambda76;
Ljava/util/stream/Collectors$$ExternalSyntheticLambda77;
Ljava/util/stream/Collectors$$ExternalSyntheticLambda79;
+Ljava/util/stream/Collectors$$ExternalSyntheticLambda80;
Ljava/util/stream/Collectors$$ExternalSyntheticLambda82;
Ljava/util/stream/Collectors$$ExternalSyntheticLambda87;
Ljava/util/stream/Collectors$$ExternalSyntheticLambda94;
@@ -12251,16 +12316,21 @@ Ljava/util/stream/Collectors$CollectorImpl;
Ljava/util/stream/Collectors;
Ljava/util/stream/DistinctOps$1$1;
Ljava/util/stream/DistinctOps$1$2;
-Ljava/util/stream/DistinctOps$1;
Ljava/util/stream/DistinctOps;
Ljava/util/stream/DoublePipeline$$ExternalSyntheticLambda0;
Ljava/util/stream/DoublePipeline$$ExternalSyntheticLambda4;
+Ljava/util/stream/DoublePipeline$$ExternalSyntheticLambda5;
+Ljava/util/stream/DoublePipeline$$ExternalSyntheticLambda7;
Ljava/util/stream/DoublePipeline$$ExternalSyntheticLambda9;
Ljava/util/stream/DoublePipeline$StatelessOp;
Ljava/util/stream/DoublePipeline;
Ljava/util/stream/DoubleStream;
Ljava/util/stream/FindOps$FindOp;
+Ljava/util/stream/FindOps$FindSink$OfInt$$ExternalSyntheticLambda0;
+Ljava/util/stream/FindOps$FindSink$OfInt$$ExternalSyntheticLambda1;
Ljava/util/stream/FindOps$FindSink$OfInt;
+Ljava/util/stream/FindOps$FindSink$OfRef$$ExternalSyntheticLambda0;
+Ljava/util/stream/FindOps$FindSink$OfRef$$ExternalSyntheticLambda1;
Ljava/util/stream/FindOps$FindSink$OfRef;
Ljava/util/stream/FindOps$FindSink;
Ljava/util/stream/FindOps;
@@ -12269,19 +12339,24 @@ Ljava/util/stream/ForEachOps$ForEachOp$OfRef;
Ljava/util/stream/ForEachOps$ForEachOp;
Ljava/util/stream/ForEachOps;
Ljava/util/stream/IntPipeline$$ExternalSyntheticLambda0;
+Ljava/util/stream/IntPipeline$$ExternalSyntheticLambda10;
+Ljava/util/stream/IntPipeline$$ExternalSyntheticLambda11;
+Ljava/util/stream/IntPipeline$$ExternalSyntheticLambda12;
Ljava/util/stream/IntPipeline$$ExternalSyntheticLambda1;
+Ljava/util/stream/IntPipeline$$ExternalSyntheticLambda5;
Ljava/util/stream/IntPipeline$$ExternalSyntheticLambda7;
Ljava/util/stream/IntPipeline$$ExternalSyntheticLambda8;
+Ljava/util/stream/IntPipeline$1$1;
Ljava/util/stream/IntPipeline$4$1;
-Ljava/util/stream/IntPipeline$4;
Ljava/util/stream/IntPipeline$9;
-Ljava/util/stream/IntPipeline$Head;
Ljava/util/stream/IntPipeline$StatelessOp;
Ljava/util/stream/IntPipeline;
Ljava/util/stream/IntStream;
+Ljava/util/stream/LongPipeline$$ExternalSyntheticLambda2;
Ljava/util/stream/LongPipeline$$ExternalSyntheticLambda3;
Ljava/util/stream/LongPipeline$$ExternalSyntheticLambda4;
Ljava/util/stream/LongPipeline$$ExternalSyntheticLambda7;
+Ljava/util/stream/LongPipeline$$ExternalSyntheticLambda9;
Ljava/util/stream/LongPipeline$StatelessOp;
Ljava/util/stream/LongPipeline;
Ljava/util/stream/LongStream;
@@ -12313,14 +12388,19 @@ Ljava/util/stream/Nodes$IntArrayNode;
Ljava/util/stream/Nodes$IntFixedNodeBuilder;
Ljava/util/stream/Nodes$IntSpinedNodeBuilder;
Ljava/util/stream/Nodes$SpinedNodeBuilder;
+Ljava/util/stream/Nodes$ToArrayTask$OfInt-IA;
Ljava/util/stream/Nodes$ToArrayTask$OfInt;
+Ljava/util/stream/Nodes$ToArrayTask$OfPrimitive-IA;
Ljava/util/stream/Nodes$ToArrayTask$OfPrimitive;
+Ljava/util/stream/Nodes$ToArrayTask$OfRef-IA;
Ljava/util/stream/Nodes$ToArrayTask$OfRef;
Ljava/util/stream/Nodes$ToArrayTask;
Ljava/util/stream/Nodes;
Ljava/util/stream/PipelineHelper;
+Ljava/util/stream/ReduceOps$10;
Ljava/util/stream/ReduceOps$12;
Ljava/util/stream/ReduceOps$12ReducingSink;
+Ljava/util/stream/ReduceOps$15;
Ljava/util/stream/ReduceOps$1;
Ljava/util/stream/ReduceOps$1ReducingSink;
Ljava/util/stream/ReduceOps$2;
@@ -12329,26 +12409,25 @@ Ljava/util/stream/ReduceOps$3;
Ljava/util/stream/ReduceOps$3ReducingSink;
Ljava/util/stream/ReduceOps$5;
Ljava/util/stream/ReduceOps$5ReducingSink;
+Ljava/util/stream/ReduceOps$6;
Ljava/util/stream/ReduceOps$8;
Ljava/util/stream/ReduceOps$8ReducingSink;
Ljava/util/stream/ReduceOps$AccumulatingSink;
Ljava/util/stream/ReduceOps$Box;
Ljava/util/stream/ReduceOps$ReduceOp;
Ljava/util/stream/ReduceOps;
+Ljava/util/stream/ReferencePipeline$$ExternalSyntheticLambda0;
Ljava/util/stream/ReferencePipeline$$ExternalSyntheticLambda1;
+Ljava/util/stream/ReferencePipeline$15$1;
Ljava/util/stream/ReferencePipeline$2$1;
-Ljava/util/stream/ReferencePipeline$2;
Ljava/util/stream/ReferencePipeline$3$1;
-Ljava/util/stream/ReferencePipeline$3;
Ljava/util/stream/ReferencePipeline$4$1;
-Ljava/util/stream/ReferencePipeline$4;
Ljava/util/stream/ReferencePipeline$5$1;
Ljava/util/stream/ReferencePipeline$5;
Ljava/util/stream/ReferencePipeline$6$1;
Ljava/util/stream/ReferencePipeline$6;
Ljava/util/stream/ReferencePipeline$7$1;
Ljava/util/stream/ReferencePipeline$7;
-Ljava/util/stream/ReferencePipeline$Head;
Ljava/util/stream/ReferencePipeline$StatefulOp;
Ljava/util/stream/ReferencePipeline$StatelessOp;
Ljava/util/stream/ReferencePipeline;
@@ -12362,7 +12441,6 @@ Ljava/util/stream/SliceOps$1$1;
Ljava/util/stream/SliceOps$1;
Ljava/util/stream/SliceOps;
Ljava/util/stream/SortedOps$AbstractRefSortingSink;
-Ljava/util/stream/SortedOps$OfRef;
Ljava/util/stream/SortedOps$RefSortingSink$$ExternalSyntheticLambda0;
Ljava/util/stream/SortedOps$RefSortingSink;
Ljava/util/stream/SortedOps$SizedRefSortingSink;
@@ -12383,6 +12461,7 @@ Ljava/util/stream/StreamSpliterators$WrappingSpliterator;
Ljava/util/stream/StreamSupport;
Ljava/util/stream/Streams$1;
Ljava/util/stream/Streams$2;
+Ljava/util/stream/Streams$AbstractStreamBuilderImpl-IA;
Ljava/util/stream/Streams$AbstractStreamBuilderImpl;
Ljava/util/stream/Streams$ConcatSpliterator$OfRef;
Ljava/util/stream/Streams$ConcatSpliterator;
@@ -12399,19 +12478,27 @@ Ljava/util/zip/CheckedInputStream;
Ljava/util/zip/Checksum$1;
Ljava/util/zip/Checksum;
Ljava/util/zip/DataFormatException;
+Ljava/util/zip/Deflater$DeflaterZStreamRef;
Ljava/util/zip/Deflater;
Ljava/util/zip/DeflaterOutputStream;
Ljava/util/zip/GZIPInputStream$1;
-Ljava/util/zip/GZIPInputStream;
Ljava/util/zip/GZIPOutputStream;
+Ljava/util/zip/Inflater$InflaterZStreamRef-IA;
+Ljava/util/zip/Inflater$InflaterZStreamRef;
Ljava/util/zip/Inflater;
Ljava/util/zip/InflaterInputStream;
-Ljava/util/zip/ZStreamRef;
+Ljava/util/zip/ZipCoder$UTF8ZipCoder;
Ljava/util/zip/ZipCoder;
Ljava/util/zip/ZipConstants;
Ljava/util/zip/ZipEntry;
Ljava/util/zip/ZipError;
Ljava/util/zip/ZipException;
+Ljava/util/zip/ZipFile$CleanableResource;
+Ljava/util/zip/ZipFile$InflaterCleanupAction;
+Ljava/util/zip/ZipFile$Source$End-IA;
+Ljava/util/zip/ZipFile$Source$End;
+Ljava/util/zip/ZipFile$Source$Key;
+Ljava/util/zip/ZipFile$Source;
Ljava/util/zip/ZipFile$ZipEntryIterator;
Ljava/util/zip/ZipFile$ZipFileInflaterInputStream;
Ljava/util/zip/ZipFile$ZipFileInputStream;
@@ -12421,7 +12508,6 @@ Ljava/util/zip/ZipOutputStream;
Ljava/util/zip/ZipUtils;
Ljavax/crypto/AEADBadTagException;
Ljavax/crypto/BadPaddingException;
-Ljavax/crypto/Cipher$1;
Ljavax/crypto/Cipher$CipherSpiAndProvider;
Ljavax/crypto/Cipher$InitParams;
Ljavax/crypto/Cipher$InitType;
@@ -12537,18 +12623,18 @@ Ljavax/xml/parsers/DocumentBuilderFactory;
Ljavax/xml/parsers/ParserConfigurationException;
Ljavax/xml/parsers/SAXParser;
Ljavax/xml/parsers/SAXParserFactory;
+Ljdk/internal/access/JavaIOFileDescriptorAccess;
+Ljdk/internal/access/JavaObjectInputStreamAccess;
+Ljdk/internal/access/JavaUtilCollectionAccess;
+Ljdk/internal/access/SharedSecrets;
Ljdk/internal/math/FDBigInteger;
Ljdk/internal/math/FloatingDecimal$1;
-Ljdk/internal/math/FloatingDecimal$ASCIIToBinaryBuffer;
Ljdk/internal/math/FloatingDecimal$ASCIIToBinaryConverter;
-Ljdk/internal/math/FloatingDecimal$BinaryToASCIIBuffer;
Ljdk/internal/math/FloatingDecimal$BinaryToASCIIConverter;
Ljdk/internal/math/FloatingDecimal$ExceptionalBinaryToASCIIBuffer;
Ljdk/internal/math/FloatingDecimal$HexFloatPattern;
-Ljdk/internal/math/FloatingDecimal$PreparedASCIIToBinaryBuffer;
Ljdk/internal/math/FloatingDecimal;
Ljdk/internal/math/FormattedFloatingDecimal$1;
-Ljdk/internal/math/FormattedFloatingDecimal$2;
Ljdk/internal/math/FormattedFloatingDecimal$Form;
Ljdk/internal/math/FormattedFloatingDecimal;
Ljdk/internal/misc/TerminatingThreadLocal$1;
@@ -12556,16 +12642,21 @@ Ljdk/internal/misc/TerminatingThreadLocal;
Ljdk/internal/misc/Unsafe;
Ljdk/internal/misc/UnsafeConstants;
Ljdk/internal/misc/VM;
+Ljdk/internal/ref/CleanerFactory;
Ljdk/internal/ref/CleanerImpl$PhantomCleanableRef;
+Ljdk/internal/ref/CleanerImpl;
Ljdk/internal/ref/PhantomCleanable;
Ljdk/internal/reflect/Reflection;
Ljdk/internal/util/ArraysSupport;
+Ljdk/internal/util/NullableKeyValueHolder;
Ljdk/internal/util/Preconditions;
Ljdk/internal/util/StaticProperty;
+Ljdk/internal/util/random/RandomSupport;
Llibcore/content/type/MimeMap$$ExternalSyntheticLambda0;
Llibcore/content/type/MimeMap$Builder$Element;
Llibcore/content/type/MimeMap$Builder;
Llibcore/content/type/MimeMap$MemoizingSupplier;
+Llibcore/content/type/MimeMap-IA;
Llibcore/content/type/MimeMap;
Llibcore/icu/CollationKeyICU;
Llibcore/icu/DateIntervalFormat;
@@ -12578,7 +12669,6 @@ Llibcore/icu/TimeZoneNames$ZoneStringsCache;
Llibcore/icu/TimeZoneNames;
Llibcore/internal/StringPool;
Llibcore/io/AsynchronousCloseMonitor;
-Llibcore/io/BlockGuardOs;
Llibcore/io/BufferIterator;
Llibcore/io/ClassPathURLStreamHandler$ClassPathURLConnection$1;
Llibcore/io/ClassPathURLStreamHandler$ClassPathURLConnection;
@@ -12628,18 +12718,18 @@ Llibcore/util/FP16;
Llibcore/util/HexEncoding;
Llibcore/util/NativeAllocationRegistry$CleanerRunner;
Llibcore/util/NativeAllocationRegistry$CleanerThunk;
-Llibcore/util/NativeAllocationRegistry;
Llibcore/util/Objects;
Llibcore/util/SneakyThrow;
Llibcore/util/XmlObjectFactory;
-Llibcore/util/ZoneInfo;
Lorg/apache/harmony/dalvik/ddmc/Chunk;
Lorg/apache/harmony/dalvik/ddmc/ChunkHandler;
Lorg/apache/harmony/dalvik/ddmc/DdmServer;
Lorg/apache/harmony/dalvik/ddmc/DdmVmInternal;
Lorg/apache/harmony/xml/ExpatAttributes;
Lorg/apache/harmony/xml/ExpatException;
+Lorg/apache/harmony/xml/ExpatParser$CurrentAttributes-IA;
Lorg/apache/harmony/xml/ExpatParser$CurrentAttributes;
+Lorg/apache/harmony/xml/ExpatParser$ExpatLocator-IA;
Lorg/apache/harmony/xml/ExpatParser$ExpatLocator;
Lorg/apache/harmony/xml/ExpatParser$ParseException;
Lorg/apache/harmony/xml/ExpatParser;
@@ -12649,9 +12739,7 @@ Lorg/apache/harmony/xml/dom/CDATASectionImpl;
Lorg/apache/harmony/xml/dom/CharacterDataImpl;
Lorg/apache/harmony/xml/dom/CommentImpl;
Lorg/apache/harmony/xml/dom/DOMImplementationImpl;
-Lorg/apache/harmony/xml/dom/DocumentImpl;
Lorg/apache/harmony/xml/dom/DocumentTypeImpl;
-Lorg/apache/harmony/xml/dom/ElementImpl;
Lorg/apache/harmony/xml/dom/EntityReferenceImpl;
Lorg/apache/harmony/xml/dom/InnerNodeImpl;
Lorg/apache/harmony/xml/dom/LeafNodeImpl;
@@ -12659,7 +12747,6 @@ Lorg/apache/harmony/xml/dom/NodeImpl$1;
Lorg/apache/harmony/xml/dom/NodeImpl;
Lorg/apache/harmony/xml/dom/NodeListImpl;
Lorg/apache/harmony/xml/dom/ProcessingInstructionImpl;
-Lorg/apache/harmony/xml/dom/TextImpl;
Lorg/apache/harmony/xml/parsers/DocumentBuilderFactoryImpl;
Lorg/apache/harmony/xml/parsers/DocumentBuilderImpl;
Lorg/apache/harmony/xml/parsers/SAXParserFactoryImpl;
@@ -12757,8 +12844,8 @@ Lsun/nio/ch/DatagramDispatcher;
Lsun/nio/ch/DefaultSelectorProvider;
Lsun/nio/ch/DirectBuffer;
Lsun/nio/ch/FileChannelImpl$SimpleFileLockTable;
+Lsun/nio/ch/FileChannelImpl$Unmapper-IA;
Lsun/nio/ch/FileChannelImpl$Unmapper;
-Lsun/nio/ch/FileChannelImpl;
Lsun/nio/ch/FileDescriptorHolderSocketImpl;
Lsun/nio/ch/FileDispatcher;
Lsun/nio/ch/FileDispatcherImpl;
@@ -12811,7 +12898,6 @@ Lsun/nio/fs/AbstractPath;
Lsun/nio/fs/DefaultFileSystemProvider;
Lsun/nio/fs/DynamicFileAttributeView;
Lsun/nio/fs/FileOwnerAttributeViewImpl;
-Lsun/nio/fs/LinuxFileSystem;
Lsun/nio/fs/LinuxFileSystemProvider;
Lsun/nio/fs/NativeBuffer$Deallocator;
Lsun/nio/fs/NativeBuffer;
@@ -12828,6 +12914,7 @@ Lsun/nio/fs/UnixFileAttributeViews$Posix;
Lsun/nio/fs/UnixFileAttributeViews;
Lsun/nio/fs/UnixFileAttributes$UnixAsBasicFileAttributes;
Lsun/nio/fs/UnixFileAttributes;
+Lsun/nio/fs/UnixFileKey;
Lsun/nio/fs/UnixFileModeAttribute;
Lsun/nio/fs/UnixFileStoreAttributes;
Lsun/nio/fs/UnixFileSystem;
@@ -12835,7 +12922,6 @@ Lsun/nio/fs/UnixFileSystemProvider$3;
Lsun/nio/fs/UnixFileSystemProvider;
Lsun/nio/fs/UnixMountEntry;
Lsun/nio/fs/UnixNativeDispatcher;
-Lsun/nio/fs/UnixPath;
Lsun/nio/fs/UnixSecureDirectoryStream;
Lsun/nio/fs/Util;
Lsun/reflect/Reflection;
@@ -12843,6 +12929,7 @@ Lsun/reflect/misc/ReflectUtil;
Lsun/security/action/GetBooleanAction;
Lsun/security/action/GetIntegerAction;
Lsun/security/action/GetPropertyAction;
+Lsun/security/jca/GetInstance$Instance-IA;
Lsun/security/jca/GetInstance$Instance;
Lsun/security/jca/GetInstance;
Lsun/security/jca/JCAUtil$CachedSecureRandomHolder;
@@ -12880,8 +12967,8 @@ Lsun/security/provider/certpath/KeyChecker;
Lsun/security/provider/certpath/OCSP$RevocationStatus$CertStatus;
Lsun/security/provider/certpath/OCSP$RevocationStatus;
Lsun/security/provider/certpath/OCSP;
-Lsun/security/provider/certpath/OCSPResponse$1;
Lsun/security/provider/certpath/OCSPResponse$ResponseStatus;
+Lsun/security/provider/certpath/OCSPResponse$SingleResponse-IA;
Lsun/security/provider/certpath/OCSPResponse$SingleResponse;
Lsun/security/provider/certpath/OCSPResponse;
Lsun/security/provider/certpath/PKIX$ValidatorParams;
@@ -12893,6 +12980,7 @@ Lsun/security/provider/certpath/PolicyNodeImpl;
Lsun/security/provider/certpath/RevocationChecker$1;
Lsun/security/provider/certpath/RevocationChecker$2;
Lsun/security/provider/certpath/RevocationChecker$Mode;
+Lsun/security/provider/certpath/RevocationChecker$RevocationProperties-IA;
Lsun/security/provider/certpath/RevocationChecker$RevocationProperties;
Lsun/security/provider/certpath/RevocationChecker;
Lsun/security/timestamp/TimestampToken;
@@ -12914,11 +13002,11 @@ Lsun/security/util/DerInputBuffer;
Lsun/security/util/DerInputStream;
Lsun/security/util/DerOutputStream;
Lsun/security/util/DerValue;
-Lsun/security/util/DisabledAlgorithmConstraints$1;
Lsun/security/util/DisabledAlgorithmConstraints$Constraint$Operator;
Lsun/security/util/DisabledAlgorithmConstraints$Constraint;
Lsun/security/util/DisabledAlgorithmConstraints$Constraints;
Lsun/security/util/DisabledAlgorithmConstraints$KeySizeConstraint;
+Lsun/security/util/DisabledAlgorithmConstraints$jdkCAConstraint;
Lsun/security/util/DisabledAlgorithmConstraints;
Lsun/security/util/FilePaths;
Lsun/security/util/KeyUtil;
@@ -13022,9 +13110,12 @@ Lsun/util/calendar/JulianCalendar$Date;
Lsun/util/calendar/JulianCalendar;
Lsun/util/calendar/LocalGregorianCalendar;
Lsun/util/locale/BaseLocale$Cache;
+Lsun/util/locale/BaseLocale$Key-IA;
Lsun/util/locale/BaseLocale$Key;
+Lsun/util/locale/BaseLocale-IA;
Lsun/util/locale/BaseLocale;
Lsun/util/locale/Extension;
+Lsun/util/locale/InternalLocaleBuilder$CaseInsensitiveChar-IA;
Lsun/util/locale/InternalLocaleBuilder$CaseInsensitiveChar;
Lsun/util/locale/InternalLocaleBuilder;
Lsun/util/locale/LanguageTag;
@@ -13095,6 +13186,7 @@ Lsun/util/logging/PlatformLogger;
[Ljava/lang/Number;
[Ljava/lang/Object;
[Ljava/lang/Package;
+[Ljava/lang/ProcessBuilder$Redirect;
[Ljava/lang/Runnable;
[Ljava/lang/Short;
[Ljava/lang/StackTraceElement;
@@ -13162,6 +13254,7 @@ Lsun/util/logging/PlatformLogger;
[Ljava/text/DateFormat$Field;
[Ljava/text/Format;
[Ljava/text/Normalizer$Form;
+[Ljava/text/NumberFormat$Style;
[Ljava/time/DayOfWeek;
[Ljava/time/LocalDateTime;
[Ljava/time/LocalTime;
@@ -13234,6 +13327,7 @@ Lsun/util/logging/PlatformLogger;
[Lsun/security/provider/certpath/OCSP$RevocationStatus$CertStatus;
[Lsun/security/provider/certpath/OCSPResponse$ResponseStatus;
[Lsun/security/provider/certpath/RevocationChecker$Mode;
+[Lsun/security/util/DerEncoder;
[Lsun/security/util/DerOutputStream;
[Lsun/security/util/DerValue;
[Lsun/security/util/DisabledAlgorithmConstraints$Constraint$Operator;
@@ -13243,6 +13337,7 @@ Lsun/util/logging/PlatformLogger;
[Lsun/security/x509/NetscapeCertTypeExtension$MapEntry;
[Lsun/security/x509/RDN;
[Lsun/util/calendar/Era;
+[Lsun/util/locale/BaseLocale;
[Lsun/util/logging/PlatformLogger$Level;
[S
[Z
diff --git a/build/boot/preloaded-classes b/build/boot/preloaded-classes
index 3551e76af5..1c5c1032c5 100644
--- a/build/boot/preloaded-classes
+++ b/build/boot/preloaded-classes
@@ -71,6 +71,7 @@ com.android.okhttp.ConfigAwareConnectionPool
com.android.okhttp.Connection
com.android.okhttp.ConnectionPool$1
com.android.okhttp.ConnectionPool
+com.android.okhttp.ConnectionSpec$1
com.android.okhttp.ConnectionSpec$Builder
com.android.okhttp.ConnectionSpec
com.android.okhttp.ConnectionSpecs
@@ -78,6 +79,7 @@ com.android.okhttp.Dispatcher
com.android.okhttp.Dns$1
com.android.okhttp.Dns
com.android.okhttp.Handshake
+com.android.okhttp.Headers$1
com.android.okhttp.Headers$Builder
com.android.okhttp.Headers
com.android.okhttp.HttpHandler$CleartextURLFilter
@@ -86,7 +88,6 @@ com.android.okhttp.HttpUrl$1
com.android.okhttp.HttpUrl$Builder$ParseResult
com.android.okhttp.HttpUrl$Builder
com.android.okhttp.HttpUrl
-com.android.okhttp.HttpsHandler
com.android.okhttp.Interceptor$Chain
com.android.okhttp.MediaType
com.android.okhttp.OkCacheContainer
@@ -95,10 +96,12 @@ com.android.okhttp.OkHttpClient
com.android.okhttp.OkUrlFactories
com.android.okhttp.OkUrlFactory
com.android.okhttp.Protocol
+com.android.okhttp.Request$1
com.android.okhttp.Request$Builder
com.android.okhttp.Request
com.android.okhttp.RequestBody$2
com.android.okhttp.RequestBody
+com.android.okhttp.Response$1
com.android.okhttp.Response$Builder
com.android.okhttp.Response
com.android.okhttp.ResponseBody
@@ -113,6 +116,7 @@ com.android.okhttp.internal.DiskLruCache
com.android.okhttp.internal.FaultHidingSink
com.android.okhttp.internal.Internal
com.android.okhttp.internal.InternalCache
+com.android.okhttp.internal.NamedRunnable
com.android.okhttp.internal.OptionalMethod
com.android.okhttp.internal.Platform
com.android.okhttp.internal.RouteDatabase
@@ -121,6 +125,7 @@ com.android.okhttp.internal.Util$1
com.android.okhttp.internal.Util
com.android.okhttp.internal.Version
com.android.okhttp.internal.framed.FrameWriter
+com.android.okhttp.internal.framed.FramedConnection$1
com.android.okhttp.internal.framed.FramedConnection$Builder
com.android.okhttp.internal.framed.FramedConnection$Listener$1
com.android.okhttp.internal.framed.FramedConnection$Listener
@@ -131,9 +136,11 @@ com.android.okhttp.internal.framed.PushObserver
com.android.okhttp.internal.framed.Settings
com.android.okhttp.internal.http.AuthenticatorAdapter
com.android.okhttp.internal.http.CacheRequest
+com.android.okhttp.internal.http.CacheStrategy$1
com.android.okhttp.internal.http.CacheStrategy$Factory
com.android.okhttp.internal.http.CacheStrategy
com.android.okhttp.internal.http.HeaderParser
+com.android.okhttp.internal.http.Http1xStream$1
com.android.okhttp.internal.http.Http1xStream$AbstractSource
com.android.okhttp.internal.http.Http1xStream$ChunkedSink
com.android.okhttp.internal.http.Http1xStream$ChunkedSource
@@ -161,7 +168,6 @@ com.android.okhttp.internal.http.StatusLine
com.android.okhttp.internal.http.StreamAllocation
com.android.okhttp.internal.huc.DelegatingHttpsURLConnection
com.android.okhttp.internal.huc.HttpURLConnectionImpl
-com.android.okhttp.internal.huc.HttpsURLConnectionImpl
com.android.okhttp.internal.io.FileSystem$1
com.android.okhttp.internal.io.FileSystem
com.android.okhttp.internal.io.RealConnection
@@ -192,9 +198,7 @@ com.android.okhttp.okio.Okio$1
com.android.okhttp.okio.Okio$2
com.android.okhttp.okio.Okio$3
com.android.okhttp.okio.Okio
-com.android.okhttp.okio.RealBufferedSink$1
com.android.okhttp.okio.RealBufferedSink
-com.android.okhttp.okio.RealBufferedSource$1
com.android.okhttp.okio.RealBufferedSource
com.android.okhttp.okio.Segment
com.android.okhttp.okio.SegmentPool
@@ -204,7 +208,6 @@ com.android.okhttp.okio.Timeout$1
com.android.okhttp.okio.Timeout
com.android.okhttp.okio.Util
com.android.org.bouncycastle.asn1.ASN1ApplicationSpecific
-com.android.org.bouncycastle.asn1.ASN1ApplicationSpecificParser
com.android.org.bouncycastle.asn1.ASN1BitString
com.android.org.bouncycastle.asn1.ASN1Boolean
com.android.org.bouncycastle.asn1.ASN1Choice
@@ -216,7 +219,6 @@ com.android.org.bouncycastle.asn1.ASN1External
com.android.org.bouncycastle.asn1.ASN1GeneralizedTime
com.android.org.bouncycastle.asn1.ASN1InputStream
com.android.org.bouncycastle.asn1.ASN1Integer
-com.android.org.bouncycastle.asn1.ASN1Null
com.android.org.bouncycastle.asn1.ASN1Object
com.android.org.bouncycastle.asn1.ASN1ObjectIdentifier$OidHandle
com.android.org.bouncycastle.asn1.ASN1ObjectIdentifier
@@ -233,7 +235,6 @@ com.android.org.bouncycastle.asn1.ASN1SetParser
com.android.org.bouncycastle.asn1.ASN1StreamParser
com.android.org.bouncycastle.asn1.ASN1String
com.android.org.bouncycastle.asn1.ASN1TaggedObject
-com.android.org.bouncycastle.asn1.ASN1TaggedObjectParser
com.android.org.bouncycastle.asn1.ASN1UTCTime
com.android.org.bouncycastle.asn1.BERApplicationSpecific
com.android.org.bouncycastle.asn1.BERApplicationSpecificParser
@@ -244,16 +245,13 @@ com.android.org.bouncycastle.asn1.BERSequenceParser
com.android.org.bouncycastle.asn1.BERSet
com.android.org.bouncycastle.asn1.BERSetParser
com.android.org.bouncycastle.asn1.BERTaggedObjectParser
-com.android.org.bouncycastle.asn1.BERTags
com.android.org.bouncycastle.asn1.ConstructedOctetStream
com.android.org.bouncycastle.asn1.DERBMPString
com.android.org.bouncycastle.asn1.DERBitString
com.android.org.bouncycastle.asn1.DERExternalParser
-com.android.org.bouncycastle.asn1.DERFactory
com.android.org.bouncycastle.asn1.DERGeneralString
com.android.org.bouncycastle.asn1.DERGraphicString
com.android.org.bouncycastle.asn1.DERIA5String
-com.android.org.bouncycastle.asn1.DERInteger
com.android.org.bouncycastle.asn1.DERNull
com.android.org.bouncycastle.asn1.DERNumericString
com.android.org.bouncycastle.asn1.DEROctetString
@@ -278,16 +276,13 @@ com.android.org.bouncycastle.asn1.InMemoryRepresentable
com.android.org.bouncycastle.asn1.IndefiniteLengthInputStream
com.android.org.bouncycastle.asn1.LazyEncodedSequence
com.android.org.bouncycastle.asn1.LimitedInputStream
-com.android.org.bouncycastle.asn1.OIDTokenizer
com.android.org.bouncycastle.asn1.StreamUtil
com.android.org.bouncycastle.asn1.bc.BCObjectIdentifiers
-com.android.org.bouncycastle.asn1.iana.IANAObjectIdentifiers
com.android.org.bouncycastle.asn1.misc.MiscObjectIdentifiers
com.android.org.bouncycastle.asn1.nist.NISTObjectIdentifiers
com.android.org.bouncycastle.asn1.oiw.OIWObjectIdentifiers
com.android.org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers
com.android.org.bouncycastle.asn1.x500.X500Name
-com.android.org.bouncycastle.asn1.x500.X500NameStyle
com.android.org.bouncycastle.asn1.x500.style.AbstractX500NameStyle
com.android.org.bouncycastle.asn1.x500.style.BCStyle
com.android.org.bouncycastle.asn1.x509.AlgorithmIdentifier
@@ -295,8 +290,6 @@ com.android.org.bouncycastle.asn1.x509.Certificate
com.android.org.bouncycastle.asn1.x509.DSAParameter
com.android.org.bouncycastle.asn1.x509.SubjectPublicKeyInfo
com.android.org.bouncycastle.asn1.x509.Time
-com.android.org.bouncycastle.asn1.x509.V3TBSCertificateGenerator
-com.android.org.bouncycastle.asn1.x509.X509ExtensionsGenerator
com.android.org.bouncycastle.asn1.x509.X509Name
com.android.org.bouncycastle.asn1.x509.X509ObjectIdentifiers
com.android.org.bouncycastle.asn1.x9.X9ECParameters
@@ -319,14 +312,23 @@ com.android.org.bouncycastle.crypto.RuntimeCryptoException
com.android.org.bouncycastle.crypto.Wrapper
com.android.org.bouncycastle.crypto.digests.AndroidDigestFactory
com.android.org.bouncycastle.crypto.digests.AndroidDigestFactoryBouncyCastle
-com.android.org.bouncycastle.crypto.digests.AndroidDigestFactoryInterface
com.android.org.bouncycastle.crypto.digests.AndroidDigestFactoryOpenSSL
com.android.org.bouncycastle.crypto.digests.EncodableDigest
com.android.org.bouncycastle.crypto.digests.GeneralDigest
+com.android.org.bouncycastle.crypto.digests.LongDigest
+com.android.org.bouncycastle.crypto.digests.MD5Digest
com.android.org.bouncycastle.crypto.digests.OpenSSLDigest$MD5
com.android.org.bouncycastle.crypto.digests.OpenSSLDigest$SHA1
+com.android.org.bouncycastle.crypto.digests.OpenSSLDigest$SHA224
+com.android.org.bouncycastle.crypto.digests.OpenSSLDigest$SHA256
+com.android.org.bouncycastle.crypto.digests.OpenSSLDigest$SHA384
+com.android.org.bouncycastle.crypto.digests.OpenSSLDigest$SHA512
com.android.org.bouncycastle.crypto.digests.OpenSSLDigest
com.android.org.bouncycastle.crypto.digests.SHA1Digest
+com.android.org.bouncycastle.crypto.digests.SHA224Digest
+com.android.org.bouncycastle.crypto.digests.SHA256Digest
+com.android.org.bouncycastle.crypto.digests.SHA384Digest
+com.android.org.bouncycastle.crypto.digests.SHA512Digest
com.android.org.bouncycastle.crypto.engines.AESEngine
com.android.org.bouncycastle.crypto.engines.DESEngine
com.android.org.bouncycastle.crypto.generators.OpenSSLPBEParametersGenerator
@@ -335,7 +337,7 @@ com.android.org.bouncycastle.crypto.generators.PKCS5S1ParametersGenerator
com.android.org.bouncycastle.crypto.generators.PKCS5S2ParametersGenerator
com.android.org.bouncycastle.crypto.io.MacInputStream
com.android.org.bouncycastle.crypto.macs.HMac
-com.android.org.bouncycastle.crypto.modes.AEADCipher
+com.android.org.bouncycastle.crypto.modes.AEADBlockCipher
com.android.org.bouncycastle.crypto.modes.CBCBlockCipher
com.android.org.bouncycastle.crypto.paddings.BlockCipherPadding
com.android.org.bouncycastle.crypto.paddings.PKCS7Padding
@@ -351,25 +353,16 @@ com.android.org.bouncycastle.crypto.params.DSAValidationParameters
com.android.org.bouncycastle.crypto.params.KeyParameter
com.android.org.bouncycastle.crypto.params.ParametersWithIV
com.android.org.bouncycastle.crypto.params.ParametersWithRandom
-com.android.org.bouncycastle.jcajce.PBKDFKey
com.android.org.bouncycastle.jcajce.PKCS12Key
-com.android.org.bouncycastle.jcajce.PKCS12KeyWithParameters
com.android.org.bouncycastle.jcajce.provider.asymmetric.DH$Mappings
com.android.org.bouncycastle.jcajce.provider.asymmetric.DH
com.android.org.bouncycastle.jcajce.provider.asymmetric.DSA$Mappings
-com.android.org.bouncycastle.jcajce.provider.asymmetric.EC$Mappings
-com.android.org.bouncycastle.jcajce.provider.asymmetric.EC
com.android.org.bouncycastle.jcajce.provider.asymmetric.RSA$Mappings
com.android.org.bouncycastle.jcajce.provider.asymmetric.RSA
-com.android.org.bouncycastle.jcajce.provider.asymmetric.X509$Mappings
com.android.org.bouncycastle.jcajce.provider.asymmetric.dh.KeyFactorySpi
-com.android.org.bouncycastle.jcajce.provider.asymmetric.dsa.BCDSAPublicKey
com.android.org.bouncycastle.jcajce.provider.asymmetric.dsa.DSAUtil
com.android.org.bouncycastle.jcajce.provider.asymmetric.dsa.KeyFactorySpi
-com.android.org.bouncycastle.jcajce.provider.asymmetric.ec.KeyFactorySpi$EC
-com.android.org.bouncycastle.jcajce.provider.asymmetric.ec.KeyFactorySpi
com.android.org.bouncycastle.jcajce.provider.asymmetric.rsa.CipherSpi$NoPadding
-com.android.org.bouncycastle.jcajce.provider.asymmetric.rsa.CipherSpi
com.android.org.bouncycastle.jcajce.provider.asymmetric.rsa.KeyFactorySpi
com.android.org.bouncycastle.jcajce.provider.asymmetric.rsa.RSAUtil
com.android.org.bouncycastle.jcajce.provider.asymmetric.util.BaseCipherSpi
@@ -382,8 +375,7 @@ com.android.org.bouncycastle.jcajce.provider.config.ConfigurableProvider
com.android.org.bouncycastle.jcajce.provider.config.ProviderConfiguration
com.android.org.bouncycastle.jcajce.provider.config.ProviderConfigurationPermission
com.android.org.bouncycastle.jcajce.provider.digest.DigestAlgorithmProvider
-com.android.org.bouncycastle.jcajce.provider.digest.MD5$Mappings
-com.android.org.bouncycastle.jcajce.provider.digest.MD5
+com.android.org.bouncycastle.jcajce.provider.digest.SHA1$Mappings$$ExternalSyntheticOutline0
com.android.org.bouncycastle.jcajce.provider.digest.SHA1$Mappings
com.android.org.bouncycastle.jcajce.provider.digest.SHA1
com.android.org.bouncycastle.jcajce.provider.digest.SHA224$Mappings
@@ -399,8 +391,6 @@ com.android.org.bouncycastle.jcajce.provider.keystore.PKCS12$Mappings
com.android.org.bouncycastle.jcajce.provider.keystore.bc.BcKeyStoreSpi$Std
com.android.org.bouncycastle.jcajce.provider.keystore.bc.BcKeyStoreSpi$StoreEntry
com.android.org.bouncycastle.jcajce.provider.keystore.bc.BcKeyStoreSpi
-com.android.org.bouncycastle.jcajce.provider.symmetric.AES$ECB$1
-com.android.org.bouncycastle.jcajce.provider.symmetric.AES$ECB
com.android.org.bouncycastle.jcajce.provider.symmetric.AES$Mappings
com.android.org.bouncycastle.jcajce.provider.symmetric.AES
com.android.org.bouncycastle.jcajce.provider.symmetric.ARC4$Mappings
@@ -434,7 +424,7 @@ com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseSecretKeyFactory
com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseWrapCipher$ErasableOutputStream
com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseWrapCipher$InvalidKeyOrParametersException
com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseWrapCipher
-com.android.org.bouncycastle.jcajce.provider.symmetric.util.BlockCipherProvider
+com.android.org.bouncycastle.jcajce.provider.symmetric.util.ClassUtil$1
com.android.org.bouncycastle.jcajce.provider.symmetric.util.ClassUtil
com.android.org.bouncycastle.jcajce.provider.symmetric.util.GcmSpecUtil$2
com.android.org.bouncycastle.jcajce.provider.symmetric.util.GcmSpecUtil
@@ -444,43 +434,32 @@ com.android.org.bouncycastle.jcajce.provider.util.AlgorithmProvider
com.android.org.bouncycastle.jcajce.provider.util.AsymmetricAlgorithmProvider
com.android.org.bouncycastle.jcajce.provider.util.AsymmetricKeyInfoConverter
com.android.org.bouncycastle.jcajce.provider.util.DigestFactory
-com.android.org.bouncycastle.jcajce.spec.AEADParameterSpec
com.android.org.bouncycastle.jcajce.spec.PBKDF2KeySpec
com.android.org.bouncycastle.jcajce.util.BCJcaJceHelper
com.android.org.bouncycastle.jcajce.util.DefaultJcaJceHelper
com.android.org.bouncycastle.jcajce.util.JcaJceHelper
-com.android.org.bouncycastle.jcajce.util.ProviderJcaJceHelper
com.android.org.bouncycastle.jce.X509Principal
-com.android.org.bouncycastle.jce.interfaces.BCKeyStore
com.android.org.bouncycastle.jce.interfaces.PKCS12BagAttributeCarrier
com.android.org.bouncycastle.jce.provider.BouncyCastleProvider$1
com.android.org.bouncycastle.jce.provider.BouncyCastleProvider$PrivateProvider
com.android.org.bouncycastle.jce.provider.BouncyCastleProvider
com.android.org.bouncycastle.jce.provider.BouncyCastleProviderConfiguration
com.android.org.bouncycastle.jce.provider.CertStoreCollectionSpi
-com.android.org.bouncycastle.jce.provider.X509CertificateObject
-com.android.org.bouncycastle.jce.spec.ECKeySpec
-com.android.org.bouncycastle.jce.spec.ECPublicKeySpec
+com.android.org.bouncycastle.jce.provider.X509CRLObject
com.android.org.bouncycastle.util.Arrays
com.android.org.bouncycastle.util.BigIntegers
-com.android.org.bouncycastle.util.Encodable
com.android.org.bouncycastle.util.Integers
-com.android.org.bouncycastle.util.Iterable
com.android.org.bouncycastle.util.Memoable
com.android.org.bouncycastle.util.Pack
com.android.org.bouncycastle.util.Properties$1
com.android.org.bouncycastle.util.Properties
com.android.org.bouncycastle.util.Strings$1
com.android.org.bouncycastle.util.Strings
-com.android.org.bouncycastle.util.encoders.Encoder
com.android.org.bouncycastle.util.encoders.Hex
com.android.org.bouncycastle.util.encoders.HexEncoder
com.android.org.bouncycastle.util.io.Streams
-com.android.org.bouncycastle.x509.X509V3CertificateGenerator
com.android.org.kxml2.io.KXmlParser$ContentSource
com.android.org.kxml2.io.KXmlParser$ValueContext
-com.android.org.kxml2.io.KXmlParser
-com.android.org.kxml2.io.KXmlSerializer
com.sun.security.cert.internal.x509.X509V1CertImpl
dalvik.annotation.optimization.CriticalNative
dalvik.annotation.optimization.FastNative
@@ -489,9 +468,6 @@ dalvik.annotation.optimization.NeverInline
dalvik.system.AppSpecializationHooks
dalvik.system.BaseDexClassLoader$Reporter
dalvik.system.BaseDexClassLoader
-dalvik.system.BlockGuard$1
-dalvik.system.BlockGuard$2
-dalvik.system.BlockGuard$3
dalvik.system.BlockGuard$BlockGuardPolicyException
dalvik.system.BlockGuard$Policy
dalvik.system.BlockGuard$VmPolicy
@@ -531,7 +507,6 @@ java.awt.font.NumericShaper
java.awt.font.TextAttribute
java.io.Bits
java.io.BufferedInputStream
-java.io.BufferedOutputStream
java.io.BufferedReader
java.io.BufferedWriter
java.io.ByteArrayInputStream
@@ -593,16 +568,16 @@ java.io.ObjectInputStream$ValidationList
java.io.ObjectInputStream
java.io.ObjectOutput
java.io.ObjectOutputStream$1
-java.io.ObjectOutputStream$BlockDataOutputStream
java.io.ObjectOutputStream$Caches
java.io.ObjectOutputStream$DebugTraceInfoStack
java.io.ObjectOutputStream$HandleTable
java.io.ObjectOutputStream$PutField
java.io.ObjectOutputStream$PutFieldImpl
java.io.ObjectOutputStream$ReplaceTable
-java.io.ObjectOutputStream
java.io.ObjectStreamClass$$ExternalSyntheticLambda0
java.io.ObjectStreamClass$$ExternalSyntheticLambda1
+java.io.ObjectStreamClass$$ExternalSyntheticLambda2
+java.io.ObjectStreamClass$$ExternalSyntheticLambda3
java.io.ObjectStreamClass$1
java.io.ObjectStreamClass$2
java.io.ObjectStreamClass$3
@@ -613,6 +588,7 @@ java.io.ObjectStreamClass$ClassDataSlot
java.io.ObjectStreamClass$DefaultSUIDCompatibilityListener
java.io.ObjectStreamClass$DeserializationConstructorsCache
java.io.ObjectStreamClass$EntryFuture$1
+java.io.ObjectStreamClass$EntryFuture-IA
java.io.ObjectStreamClass$EntryFuture
java.io.ObjectStreamClass$ExceptionInfo
java.io.ObjectStreamClass$FieldReflector
@@ -645,7 +621,6 @@ java.io.StringWriter
java.io.SyncFailedException
java.io.UTFDataFormatException
java.io.UncheckedIOException
-java.io.UnixFileSystem
java.io.UnsupportedEncodingException
java.io.WriteAbortedException
java.io.Writer
@@ -675,10 +650,15 @@ java.lang.Character$CharacterCache
java.lang.Character$Subset
java.lang.Character$UnicodeBlock
java.lang.Character
+java.lang.Class$$ExternalSyntheticLambda0
+java.lang.Class$$ExternalSyntheticLambda1
java.lang.Class$Caches
java.lang.Class
java.lang.ClassCastException
java.lang.ClassFormatError
+java.lang.ClassLoader$$ExternalSyntheticLambda0
+java.lang.ClassLoader$$ExternalSyntheticLambda1
+java.lang.ClassLoader$$ExternalSyntheticLambda2
java.lang.ClassLoader$SystemClassLoader
java.lang.ClassLoader
java.lang.ClassNotFoundException
@@ -687,6 +667,7 @@ java.lang.ClassValue
java.lang.CloneNotSupportedException
java.lang.Cloneable
java.lang.Comparable
+java.lang.CompoundEnumeration
java.lang.Daemons$Daemon
java.lang.Daemons$FinalizerDaemon
java.lang.Daemons$FinalizerWatchdogDaemon
@@ -696,7 +677,9 @@ java.lang.Daemons
java.lang.Deprecated
java.lang.DexCache
java.lang.Double
+java.lang.Enum$$ExternalSyntheticLambda0
java.lang.Enum$1
+java.lang.Enum$EnumDesc
java.lang.Enum
java.lang.EnumConstantNotPresentException
java.lang.Error
@@ -774,7 +757,6 @@ java.lang.String$$ExternalSyntheticLambda1
java.lang.String$$ExternalSyntheticLambda2
java.lang.String$$ExternalSyntheticLambda3
java.lang.String$CaseInsensitiveComparator-IA
-java.lang.String$CaseInsensitiveComparator
java.lang.String
java.lang.StringBuffer
java.lang.StringBuilder
@@ -798,11 +780,10 @@ java.lang.Thread$WeakClassKey
java.lang.Thread
java.lang.ThreadDeath
java.lang.ThreadGroup
-java.lang.ThreadLocal$SuppliedThreadLocal
java.lang.ThreadLocal$ThreadLocalMap$Entry
java.lang.ThreadLocal$ThreadLocalMap-IA
java.lang.ThreadLocal$ThreadLocalMap
-java.lang.ThreadLocal
+java.lang.Throwable$PrintStreamOrWriter-IA
java.lang.Throwable$PrintStreamOrWriter
java.lang.Throwable$SentinelHolder
java.lang.Throwable$WrappedPrintStream
@@ -836,7 +817,6 @@ java.lang.constant.Constable
java.lang.constant.ConstantDesc
java.lang.constant.ConstantDescs
java.lang.constant.ConstantUtils
-java.lang.constant.DirectMethodHandleDesc$1
java.lang.constant.DirectMethodHandleDesc$Kind
java.lang.constant.DirectMethodHandleDesc
java.lang.constant.DirectMethodHandleDescImpl$1
@@ -861,13 +841,16 @@ java.lang.invoke.MethodHandleImpl
java.lang.invoke.MethodHandleInfo
java.lang.invoke.MethodHandleStatics
java.lang.invoke.MethodHandles$$ExternalSyntheticLambda0
+java.lang.invoke.MethodHandles$$ExternalSyntheticLambda10
java.lang.invoke.MethodHandles$$ExternalSyntheticLambda11
java.lang.invoke.MethodHandles$$ExternalSyntheticLambda12
java.lang.invoke.MethodHandles$$ExternalSyntheticLambda13
java.lang.invoke.MethodHandles$$ExternalSyntheticLambda14
java.lang.invoke.MethodHandles$$ExternalSyntheticLambda15
+java.lang.invoke.MethodHandles$$ExternalSyntheticLambda16
java.lang.invoke.MethodHandles$$ExternalSyntheticLambda17
java.lang.invoke.MethodHandles$$ExternalSyntheticLambda18
+java.lang.invoke.MethodHandles$$ExternalSyntheticLambda19
java.lang.invoke.MethodHandles$$ExternalSyntheticLambda1
java.lang.invoke.MethodHandles$$ExternalSyntheticLambda20
java.lang.invoke.MethodHandles$$ExternalSyntheticLambda21
@@ -922,13 +905,14 @@ java.lang.invoke.Transformers$ZeroValue
java.lang.invoke.TypeDescriptor$OfField
java.lang.invoke.TypeDescriptor$OfMethod
java.lang.invoke.TypeDescriptor
-java.lang.invoke.VarHandle$1
java.lang.invoke.VarHandle$AccessMode
java.lang.invoke.VarHandle$AccessType
java.lang.invoke.VarHandle$VarHandleDesc$Kind
java.lang.invoke.VarHandle
java.lang.invoke.WrongMethodTypeException
+java.lang.ref.Cleaner$1
java.lang.ref.Cleaner$Cleanable
+java.lang.ref.Cleaner
java.lang.ref.FinalizerReference$Sentinel-IA
java.lang.ref.FinalizerReference$Sentinel
java.lang.ref.FinalizerReference
@@ -1030,13 +1014,13 @@ java.net.HttpURLConnection
java.net.IDN
java.net.InMemoryCookieStore
java.net.Inet4Address
+java.net.Inet6Address$Inet6AddressHolder-IA
java.net.Inet6Address$Inet6AddressHolder
java.net.Inet6Address
-java.net.Inet6AddressImpl
java.net.InetAddress$1
-java.net.InetAddress$InetAddressHolder
java.net.InetAddress
java.net.InetAddressImpl
+java.net.InetSocketAddress$InetSocketAddressHolder-IA
java.net.InetSocketAddress$InetSocketAddressHolder
java.net.InetSocketAddress
java.net.InterfaceAddress
@@ -1068,10 +1052,8 @@ java.net.SocketAddress
java.net.SocketException
java.net.SocketImpl
java.net.SocketImplFactory
-java.net.SocketInputStream
java.net.SocketOption
java.net.SocketOptions
-java.net.SocketOutputStream
java.net.SocketPermission
java.net.SocketTimeoutException
java.net.SocksConsts
@@ -1098,18 +1080,11 @@ java.nio.BufferUnderflowException
java.nio.ByteBuffer
java.nio.ByteBufferAsCharBuffer
java.nio.ByteBufferAsDoubleBuffer
-java.nio.ByteBufferAsFloatBuffer
-java.nio.ByteBufferAsIntBuffer
-java.nio.ByteBufferAsLongBuffer
-java.nio.ByteBufferAsShortBuffer
java.nio.ByteOrder
java.nio.CharBuffer
java.nio.DirectByteBuffer$MemoryRef
-java.nio.DirectByteBuffer
java.nio.DoubleBuffer
java.nio.FloatBuffer
-java.nio.HeapByteBuffer
-java.nio.HeapCharBuffer
java.nio.HeapIntBuffer
java.nio.IntBuffer
java.nio.InvalidMarkException
@@ -1261,7 +1236,6 @@ java.security.KeyStore$TrustedCertificateEntry
java.security.KeyStore
java.security.KeyStoreException
java.security.KeyStoreSpi
-java.security.MessageDigest$Delegate
java.security.MessageDigest
java.security.MessageDigestSpi
java.security.NoSuchAlgorithmException
@@ -1276,19 +1250,21 @@ java.security.PrivilegedActionException
java.security.PrivilegedExceptionAction
java.security.ProtectionDomain
java.security.Provider$EngineDescription
+java.security.Provider$Service-IA
java.security.Provider$Service
+java.security.Provider$ServiceKey-IA
java.security.Provider$ServiceKey
java.security.Provider$UString
java.security.Provider
java.security.ProviderException
java.security.PublicKey
java.security.SecureRandom
+java.security.SecureRandomParameters
java.security.SecureRandomSpi
java.security.Security$1
java.security.Security
java.security.SecurityPermission
java.security.Signature$CipherAdapter
-java.security.Signature$Delegate
java.security.Signature
java.security.SignatureException
java.security.SignatureSpi
@@ -1398,6 +1374,7 @@ java.text.DecimalFormat
java.text.DecimalFormatSymbols
java.text.DontCareFieldPosition$1
java.text.DontCareFieldPosition
+java.text.FieldPosition$Delegate-IA
java.text.FieldPosition$Delegate
java.text.FieldPosition
java.text.Format$Field
@@ -1413,13 +1390,13 @@ java.text.Normalizer$Form$$ExternalSyntheticLambda3
java.text.Normalizer$Form
java.text.Normalizer
java.text.NumberFormat$Field
+java.text.NumberFormat$Style
java.text.NumberFormat
java.text.ParseException
java.text.ParsePosition
java.text.RuleBasedCollator
java.text.SimpleDateFormat
java.text.StringCharacterIterator
-java.time.Clock$SystemClock
java.time.Clock
java.time.DateTimeException
java.time.DayOfWeek
@@ -1432,14 +1409,12 @@ java.time.LocalDate
java.time.LocalDateTime
java.time.LocalTime$1
java.time.LocalTime
-java.time.Month$1
java.time.Month
java.time.OffsetDateTime
java.time.Period
java.time.Year
java.time.ZoneId
java.time.ZoneOffset
-java.time.ZoneRegion
java.time.ZonedDateTime$$ExternalSyntheticLambda0
java.time.ZonedDateTime$1
java.time.ZonedDateTime
@@ -1466,7 +1441,9 @@ java.time.format.DateTimeFormatterBuilder$InstantPrinterParser
java.time.format.DateTimeFormatterBuilder$NumberPrinterParser
java.time.format.DateTimeFormatterBuilder$OffsetIdPrinterParser
java.time.format.DateTimeFormatterBuilder$PadPrinterParserDecorator
+java.time.format.DateTimeFormatterBuilder$PrefixTree$CI-IA
java.time.format.DateTimeFormatterBuilder$PrefixTree$CI
+java.time.format.DateTimeFormatterBuilder$PrefixTree-IA
java.time.format.DateTimeFormatterBuilder$PrefixTree
java.time.format.DateTimeFormatterBuilder$SettingsParser
java.time.format.DateTimeFormatterBuilder$StringLiteralPrinterParser
@@ -1503,6 +1480,8 @@ java.time.temporal.TemporalAdjuster
java.time.temporal.TemporalAdjusters$$ExternalSyntheticLambda11
java.time.temporal.TemporalAdjusters$$ExternalSyntheticLambda1
java.time.temporal.TemporalAdjusters$$ExternalSyntheticLambda3
+java.time.temporal.TemporalAdjusters$$ExternalSyntheticLambda6
+java.time.temporal.TemporalAdjusters$$ExternalSyntheticLambda8
java.time.temporal.TemporalAdjusters
java.time.temporal.TemporalAmount
java.time.temporal.TemporalField
@@ -1521,7 +1500,6 @@ java.time.temporal.ValueRange
java.time.zone.IcuZoneRulesProvider$ZoneRulesCache
java.time.zone.IcuZoneRulesProvider
java.time.zone.ZoneOffsetTransition
-java.time.zone.ZoneOffsetTransitionRule$1
java.time.zone.ZoneOffsetTransitionRule$TimeDefinition
java.time.zone.ZoneOffsetTransitionRule
java.time.zone.ZoneRules
@@ -1529,7 +1507,6 @@ java.time.zone.ZoneRulesException
java.time.zone.ZoneRulesProvider
java.util.AbstractCollection
java.util.AbstractList$Itr-IA
-java.util.AbstractList$Itr
java.util.AbstractList$ListItr
java.util.AbstractList$RandomAccessSpliterator
java.util.AbstractList$RandomAccessSubList
@@ -1538,23 +1515,18 @@ java.util.AbstractList$SubList
java.util.AbstractList
java.util.AbstractMap$1
java.util.AbstractMap$2$1
-java.util.AbstractMap$2
java.util.AbstractMap$SimpleEntry
java.util.AbstractMap$SimpleImmutableEntry
+java.util.AbstractMap$ViewCollection
java.util.AbstractMap
java.util.AbstractQueue
java.util.AbstractSequentialList
java.util.AbstractSet
java.util.ArrayDeque$$ExternalSyntheticLambda1
-java.util.ArrayDeque$DeqIterator
-java.util.ArrayDeque$DescendingIterator
java.util.ArrayDeque
java.util.ArrayList$ArrayListSpliterator
-java.util.ArrayList$Itr
java.util.ArrayList$ListItr
-java.util.ArrayList$SubList$1
java.util.ArrayList$SubList$2
-java.util.ArrayList$SubList
java.util.ArrayList
java.util.ArrayPrefixHelpers$CumulateTask
java.util.ArrayPrefixHelpers$DoubleCumulateTask
@@ -1564,8 +1536,6 @@ java.util.Arrays$$ExternalSyntheticLambda0
java.util.Arrays$$ExternalSyntheticLambda1
java.util.Arrays$$ExternalSyntheticLambda2
java.util.Arrays$$ExternalSyntheticLambda3
-java.util.Arrays$ArrayItr
-java.util.Arrays$ArrayList
java.util.Arrays$NaturalOrder
java.util.Arrays
java.util.ArraysParallelSortHelpers$FJObject$Sorter
@@ -1577,7 +1547,6 @@ java.util.Calendar$$ExternalSyntheticLambda0
java.util.Calendar$Builder
java.util.Calendar
java.util.Collection
-java.util.Collections$1
java.util.Collections$2
java.util.Collections$3
java.util.Collections$AsLIFOQueue
@@ -1593,48 +1562,30 @@ java.util.Collections$CheckedSortedMap
java.util.Collections$CheckedSortedSet
java.util.Collections$CopiesList
java.util.Collections$EmptyEnumeration
-java.util.Collections$EmptyIterator
java.util.Collections$EmptyList-IA
-java.util.Collections$EmptyList
java.util.Collections$EmptyListIterator
java.util.Collections$EmptyMap-IA
-java.util.Collections$EmptyMap
java.util.Collections$EmptySet-IA
-java.util.Collections$EmptySet
java.util.Collections$ReverseComparator2
java.util.Collections$ReverseComparator
-java.util.Collections$SetFromMap
-java.util.Collections$SingletonList
-java.util.Collections$SingletonMap
-java.util.Collections$SingletonSet
-java.util.Collections$SynchronizedCollection
+java.util.Collections$SequencedSetFromMap
java.util.Collections$SynchronizedList
-java.util.Collections$SynchronizedMap
java.util.Collections$SynchronizedNavigableMap
java.util.Collections$SynchronizedNavigableSet
-java.util.Collections$SynchronizedRandomAccessList
-java.util.Collections$SynchronizedSet
java.util.Collections$SynchronizedSortedMap
java.util.Collections$SynchronizedSortedSet
-java.util.Collections$UnmodifiableCollection$1
-java.util.Collections$UnmodifiableCollection
java.util.Collections$UnmodifiableList$1
java.util.Collections$UnmodifiableList
-java.util.Collections$UnmodifiableMap$UnmodifiableEntrySet$1
-java.util.Collections$UnmodifiableMap$UnmodifiableEntrySet$UnmodifiableEntry
-java.util.Collections$UnmodifiableMap$UnmodifiableEntrySet
-java.util.Collections$UnmodifiableMap
java.util.Collections$UnmodifiableNavigableMap$EmptyNavigableMap
java.util.Collections$UnmodifiableNavigableMap
java.util.Collections$UnmodifiableNavigableSet$EmptyNavigableSet
java.util.Collections$UnmodifiableNavigableSet
-java.util.Collections$UnmodifiableRandomAccessList
-java.util.Collections$UnmodifiableSet
+java.util.Collections$UnmodifiableSequencedCollection
+java.util.Collections$UnmodifiableSequencedMap
+java.util.Collections$UnmodifiableSequencedSet
java.util.Collections$UnmodifiableSortedMap
-java.util.Collections$UnmodifiableSortedSet
java.util.Collections
java.util.ComparableTimSort
-java.util.Comparator$$ExternalSyntheticLambda0
java.util.Comparator$$ExternalSyntheticLambda1
java.util.Comparator$$ExternalSyntheticLambda2
java.util.Comparator$$ExternalSyntheticLambda3
@@ -1648,18 +1599,28 @@ java.util.Currency
java.util.Date
java.util.Deque
java.util.Dictionary
+java.util.DoubleSummaryStatistics
+java.util.DualPivotQuicksort$Sorter-IA
java.util.DualPivotQuicksort$Sorter
java.util.DualPivotQuicksort
java.util.DuplicateFormatFlagsException
java.util.EmptyStackException
java.util.EnumMap$1
+java.util.EnumMap$EntryIterator$Entry-IA
java.util.EnumMap$EntryIterator$Entry
+java.util.EnumMap$EntryIterator-IA
java.util.EnumMap$EntryIterator
+java.util.EnumMap$EntrySet-IA
java.util.EnumMap$EntrySet
+java.util.EnumMap$EnumMapIterator-IA
java.util.EnumMap$EnumMapIterator
+java.util.EnumMap$KeyIterator-IA
java.util.EnumMap$KeyIterator
+java.util.EnumMap$KeySet-IA
java.util.EnumMap$KeySet
+java.util.EnumMap$ValueIterator-IA
java.util.EnumMap$ValueIterator
+java.util.EnumMap$Values-IA
java.util.EnumMap$Values
java.util.EnumMap
java.util.EnumSet$SerializationProxy
@@ -1678,35 +1639,38 @@ java.util.Formatter$FormatSpecifierParser
java.util.Formatter$FormatString
java.util.Formatter
java.util.FormatterClosedException
-java.util.GregorianCalendar
-java.util.HashMap$EntryIterator
-java.util.HashMap$EntrySet
java.util.HashMap$EntrySpliterator
java.util.HashMap$HashIterator
java.util.HashMap$HashMapSpliterator
-java.util.HashMap$KeyIterator
-java.util.HashMap$KeySet
java.util.HashMap$KeySpliterator
-java.util.HashMap$Node
-java.util.HashMap$TreeNode
-java.util.HashMap$ValueIterator
+java.util.HashMap$UnsafeHolder
java.util.HashMap$ValueSpliterator
-java.util.HashMap$Values
java.util.HashMap
java.util.HashSet
+java.util.Hashtable$EntrySet-IA
java.util.Hashtable$EntrySet
-java.util.Hashtable$Enumerator
java.util.Hashtable$HashtableEntry
+java.util.Hashtable$KeySet-IA
java.util.Hashtable$KeySet
+java.util.Hashtable$ValueCollection-IA
java.util.Hashtable$ValueCollection
java.util.Hashtable
+java.util.HexFormat
+java.util.IdentityHashMap$EntryIterator$Entry-IA
java.util.IdentityHashMap$EntryIterator$Entry
+java.util.IdentityHashMap$EntryIterator-IA
java.util.IdentityHashMap$EntryIterator
+java.util.IdentityHashMap$EntrySet-IA
java.util.IdentityHashMap$EntrySet
+java.util.IdentityHashMap$IdentityHashMapIterator-IA
java.util.IdentityHashMap$IdentityHashMapIterator
+java.util.IdentityHashMap$KeyIterator-IA
java.util.IdentityHashMap$KeyIterator
+java.util.IdentityHashMap$KeySet-IA
java.util.IdentityHashMap$KeySet
+java.util.IdentityHashMap$ValueIterator-IA
java.util.IdentityHashMap$ValueIterator
+java.util.IdentityHashMap$Values-IA
java.util.IdentityHashMap$Values
java.util.IdentityHashMap
java.util.IllegalFormatCodePointException
@@ -1720,39 +1684,26 @@ java.util.ImmutableCollections$AbstractImmutableCollection
java.util.ImmutableCollections$AbstractImmutableList
java.util.ImmutableCollections$AbstractImmutableMap
java.util.ImmutableCollections$AbstractImmutableSet
-java.util.ImmutableCollections$List12
-java.util.ImmutableCollections$ListItr
-java.util.ImmutableCollections$ListN
-java.util.ImmutableCollections$Map1
+java.util.ImmutableCollections$Access
+java.util.ImmutableCollections$ListN-IA
java.util.ImmutableCollections$MapN$1
java.util.ImmutableCollections$MapN$MapNIterator
-java.util.ImmutableCollections$MapN
-java.util.ImmutableCollections$Set12
-java.util.ImmutableCollections$SetN
java.util.ImmutableCollections$SubList
java.util.InputMismatchException
java.util.Iterator
java.util.JumboEnumSet$EnumSetIterator
java.util.JumboEnumSet
java.util.KeyValueHolder
-java.util.LinkedHashMap$LinkedEntryIterator
-java.util.LinkedHashMap$LinkedEntrySet
java.util.LinkedHashMap$LinkedHashIterator
-java.util.LinkedHashMap$LinkedHashMapEntry
-java.util.LinkedHashMap$LinkedKeyIterator
-java.util.LinkedHashMap$LinkedKeySet
-java.util.LinkedHashMap$LinkedValueIterator
-java.util.LinkedHashMap$LinkedValues
+java.util.LinkedHashMap$ReversedLinkedHashMapView
java.util.LinkedHashMap
java.util.LinkedHashSet
-java.util.LinkedList$DescendingIterator
-java.util.LinkedList$ListItr
+java.util.LinkedList$DescendingIterator-IA
java.util.LinkedList$Node
java.util.LinkedList
java.util.List
java.util.ListIterator
java.util.ListResourceBundle
-java.util.Locale$1
java.util.Locale$Builder
java.util.Locale$Cache
java.util.Locale$Category
@@ -1762,9 +1713,12 @@ java.util.Locale$IsoCountryCode$2
java.util.Locale$IsoCountryCode$3
java.util.Locale$IsoCountryCode
java.util.Locale$LanguageRange
+java.util.Locale$LocaleKey-IA
java.util.Locale$LocaleKey
java.util.Locale$NoImagePreloadHolder
+java.util.Locale-IA
java.util.Locale
+java.util.LongSummaryStatistics
java.util.Map$Entry
java.util.Map
java.util.MissingFormatArgumentException
@@ -1782,8 +1736,8 @@ java.util.OptionalInt
java.util.PrimitiveIterator$OfInt$$ExternalSyntheticLambda0
java.util.PrimitiveIterator$OfInt
java.util.PrimitiveIterator
-java.util.PriorityQueue$Itr
java.util.PriorityQueue
+java.util.Properties$EntrySet
java.util.Properties$LineReader
java.util.Properties
java.util.PropertyPermission
@@ -1806,10 +1760,19 @@ java.util.ResourceBundle$RBClassLoader$1
java.util.ResourceBundle$RBClassLoader
java.util.ResourceBundle$SingleFormatControl
java.util.ResourceBundle
+java.util.ReverseOrderListView
java.util.Scanner$PatternLRUCache
java.util.Scanner
+java.util.SequencedCollection
+java.util.SequencedMap$1SeqEntrySet
+java.util.SequencedMap$1SeqKeySet
+java.util.SequencedMap$1SeqValues
+java.util.SequencedMap
+java.util.SequencedSet
java.util.ServiceConfigurationError
java.util.ServiceLoader$1
+java.util.ServiceLoader$2
+java.util.ServiceLoader$LazyClassPathLookupIterator
java.util.ServiceLoader
java.util.Set
java.util.SimpleTimeZone$Cache
@@ -1836,6 +1799,7 @@ java.util.StringTokenizer
java.util.TaskQueue
java.util.TimSort
java.util.TimeZone
+java.util.Timer$ThreadReaper
java.util.Timer
java.util.TimerTask
java.util.TimerThread
@@ -1843,18 +1807,12 @@ java.util.TooManyListenersException
java.util.TreeMap$AscendingSubMap$AscendingEntrySetView
java.util.TreeMap$AscendingSubMap
java.util.TreeMap$DescendingSubMap
-java.util.TreeMap$EntryIterator
-java.util.TreeMap$EntrySet
-java.util.TreeMap$KeyIterator
-java.util.TreeMap$KeySet
java.util.TreeMap$NavigableSubMap$DescendingSubMapKeyIterator
java.util.TreeMap$NavigableSubMap$EntrySetView
java.util.TreeMap$NavigableSubMap$SubMapEntryIterator
java.util.TreeMap$NavigableSubMap$SubMapIterator
-java.util.TreeMap$NavigableSubMap$SubMapKeyIterator
java.util.TreeMap$NavigableSubMap
java.util.TreeMap$PrivateEntryIterator
-java.util.TreeMap$TreeMapEntry
java.util.TreeMap$ValueIterator
java.util.TreeMap$Values
java.util.TreeMap
@@ -1866,16 +1824,18 @@ java.util.UUID
java.util.UnknownFormatConversionException
java.util.UnknownFormatFlagsException
java.util.Vector$1
+java.util.Vector$Itr-IA
java.util.Vector$Itr
java.util.Vector
java.util.WeakHashMap$Entry
+java.util.WeakHashMap$EntryIterator-IA
java.util.WeakHashMap$EntryIterator
java.util.WeakHashMap$EntrySet-IA
java.util.WeakHashMap$EntrySet
java.util.WeakHashMap$HashIterator
-java.util.WeakHashMap$KeyIterator
+java.util.WeakHashMap$KeyIterator-IA
java.util.WeakHashMap$KeySet-IA
-java.util.WeakHashMap$KeySet
+java.util.WeakHashMap$ValueIterator-IA
java.util.WeakHashMap$ValueIterator
java.util.WeakHashMap$Values-IA
java.util.WeakHashMap$Values
@@ -1888,7 +1848,6 @@ java.util.concurrent.BlockingQueue
java.util.concurrent.Callable
java.util.concurrent.CancellationException
java.util.concurrent.CompletableFuture$AltResult
-java.util.concurrent.CompletableFuture$AsyncRun
java.util.concurrent.CompletableFuture$AsyncSupply
java.util.concurrent.CompletableFuture$AsynchronousCompletionTask
java.util.concurrent.CompletableFuture$Completion
@@ -1902,8 +1861,6 @@ java.util.concurrent.ConcurrentHashMap$BaseIterator
java.util.concurrent.ConcurrentHashMap$BulkTask
java.util.concurrent.ConcurrentHashMap$CollectionView
java.util.concurrent.ConcurrentHashMap$CounterCell
-java.util.concurrent.ConcurrentHashMap$EntryIterator
-java.util.concurrent.ConcurrentHashMap$EntrySetView
java.util.concurrent.ConcurrentHashMap$ForEachEntryTask
java.util.concurrent.ConcurrentHashMap$ForEachKeyTask
java.util.concurrent.ConcurrentHashMap$ForEachMappingTask
@@ -1916,7 +1873,6 @@ java.util.concurrent.ConcurrentHashMap$ForwardingNode
java.util.concurrent.ConcurrentHashMap$KeyIterator
java.util.concurrent.ConcurrentHashMap$KeySetView
java.util.concurrent.ConcurrentHashMap$KeySpliterator
-java.util.concurrent.ConcurrentHashMap$MapEntry
java.util.concurrent.ConcurrentHashMap$MapReduceEntriesTask
java.util.concurrent.ConcurrentHashMap$MapReduceEntriesToDoubleTask
java.util.concurrent.ConcurrentHashMap$MapReduceEntriesToIntTask
@@ -1947,13 +1903,11 @@ java.util.concurrent.ConcurrentHashMap$TableStack
java.util.concurrent.ConcurrentHashMap$Traverser
java.util.concurrent.ConcurrentHashMap$TreeBin
java.util.concurrent.ConcurrentHashMap$TreeNode
-java.util.concurrent.ConcurrentHashMap$ValueIterator
-java.util.concurrent.ConcurrentHashMap$ValuesView
java.util.concurrent.ConcurrentHashMap
java.util.concurrent.ConcurrentLinkedDeque$Node
java.util.concurrent.ConcurrentLinkedDeque
java.util.concurrent.ConcurrentLinkedQueue$$ExternalSyntheticLambda0
-java.util.concurrent.ConcurrentLinkedQueue$Itr
+java.util.concurrent.ConcurrentLinkedQueue$$ExternalSyntheticLambda2
java.util.concurrent.ConcurrentLinkedQueue$Node
java.util.concurrent.ConcurrentLinkedQueue
java.util.concurrent.ConcurrentMap$$ExternalSyntheticLambda0
@@ -1968,8 +1922,6 @@ java.util.concurrent.ConcurrentSkipListMap$Values
java.util.concurrent.ConcurrentSkipListMap
java.util.concurrent.ConcurrentSkipListSet
java.util.concurrent.CopyOnWriteArrayList$$ExternalSyntheticLambda2
-java.util.concurrent.CopyOnWriteArrayList$COWIterator
-java.util.concurrent.CopyOnWriteArrayList
java.util.concurrent.CopyOnWriteArraySet
java.util.concurrent.CountDownLatch$Sync
java.util.concurrent.CountDownLatch
@@ -1981,8 +1933,6 @@ java.util.concurrent.Executor
java.util.concurrent.ExecutorService
java.util.concurrent.Executors$DefaultThreadFactory
java.util.concurrent.Executors$DelegatedExecutorService
-java.util.concurrent.Executors$DelegatedScheduledExecutorService
-java.util.concurrent.Executors$FinalizableDelegatedExecutorService
java.util.concurrent.Executors$RunnableAdapter
java.util.concurrent.Executors
java.util.concurrent.ForkJoinPool$1
@@ -2015,8 +1965,6 @@ java.util.concurrent.ScheduledExecutorService
java.util.concurrent.ScheduledFuture
java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue$Itr
java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue
-java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask
-java.util.concurrent.ScheduledThreadPoolExecutor
java.util.concurrent.Semaphore$FairSync
java.util.concurrent.Semaphore$NonfairSync
java.util.concurrent.Semaphore$Sync
@@ -2030,8 +1978,6 @@ java.util.concurrent.SynchronousQueue
java.util.concurrent.ThreadFactory
java.util.concurrent.ThreadPoolExecutor$AbortPolicy
java.util.concurrent.ThreadPoolExecutor$DiscardPolicy
-java.util.concurrent.ThreadPoolExecutor$Worker
-java.util.concurrent.ThreadPoolExecutor
java.util.concurrent.TimeUnit$1
java.util.concurrent.TimeUnit
java.util.concurrent.TimeoutException
@@ -2070,11 +2016,9 @@ java.util.concurrent.locks.ReentrantLock$Sync
java.util.concurrent.locks.ReentrantLock
java.util.concurrent.locks.ReentrantReadWriteLock$FairSync
java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync
-java.util.concurrent.locks.ReentrantReadWriteLock$ReadLock
java.util.concurrent.locks.ReentrantReadWriteLock$Sync$HoldCounter
java.util.concurrent.locks.ReentrantReadWriteLock$Sync$ThreadLocalHoldCounter
java.util.concurrent.locks.ReentrantReadWriteLock$Sync
-java.util.concurrent.locks.ReentrantReadWriteLock$WriteLock
java.util.concurrent.locks.ReentrantReadWriteLock
java.util.function.BiConsumer
java.util.function.BiFunction$$ExternalSyntheticLambda0
@@ -2090,8 +2034,8 @@ java.util.function.DoubleConsumer
java.util.function.DoubleSupplier
java.util.function.DoubleUnaryOperator$$ExternalSyntheticLambda0
java.util.function.DoubleUnaryOperator$$ExternalSyntheticLambda1
-java.util.function.DoubleUnaryOperator$$ExternalSyntheticLambda2
java.util.function.DoubleUnaryOperator
+java.util.function.Function$$ExternalSyntheticLambda0
java.util.function.Function$$ExternalSyntheticLambda1
java.util.function.Function$$ExternalSyntheticLambda2
java.util.function.Function
@@ -2136,6 +2080,7 @@ java.util.jar.Manifest
java.util.logging.ConsoleHandler
java.util.logging.ErrorManager
java.util.logging.FileHandler$1
+java.util.logging.FileHandler$InitializationErrorManager-IA
java.util.logging.FileHandler$InitializationErrorManager
java.util.logging.FileHandler$MeteredStream
java.util.logging.FileHandler
@@ -2177,10 +2122,13 @@ java.util.prefs.FileSystemPreferences
java.util.prefs.FileSystemPreferencesFactory
java.util.prefs.Preferences
java.util.prefs.PreferencesFactory
+java.util.random.RandomGenerator
+java.util.regex.ASCII
java.util.regex.MatchResult
java.util.regex.Matcher
java.util.regex.Pattern
java.util.regex.PatternSyntaxException
+java.util.stream.AbstractPipeline$$ExternalSyntheticLambda0
java.util.stream.AbstractPipeline$$ExternalSyntheticLambda2
java.util.stream.AbstractPipeline
java.util.stream.AbstractSpinedBuffer
@@ -2194,14 +2142,19 @@ java.util.stream.Collectors$$ExternalSyntheticLambda1
java.util.stream.Collectors$$ExternalSyntheticLambda20
java.util.stream.Collectors$$ExternalSyntheticLambda21
java.util.stream.Collectors$$ExternalSyntheticLambda22
+java.util.stream.Collectors$$ExternalSyntheticLambda23
java.util.stream.Collectors$$ExternalSyntheticLambda24
+java.util.stream.Collectors$$ExternalSyntheticLambda25
java.util.stream.Collectors$$ExternalSyntheticLambda26
+java.util.stream.Collectors$$ExternalSyntheticLambda30
java.util.stream.Collectors$$ExternalSyntheticLambda34
java.util.stream.Collectors$$ExternalSyntheticLambda37
java.util.stream.Collectors$$ExternalSyntheticLambda39
java.util.stream.Collectors$$ExternalSyntheticLambda41
java.util.stream.Collectors$$ExternalSyntheticLambda42
java.util.stream.Collectors$$ExternalSyntheticLambda45
+java.util.stream.Collectors$$ExternalSyntheticLambda47
+java.util.stream.Collectors$$ExternalSyntheticLambda48
java.util.stream.Collectors$$ExternalSyntheticLambda49
java.util.stream.Collectors$$ExternalSyntheticLambda4
java.util.stream.Collectors$$ExternalSyntheticLambda50
@@ -2211,14 +2164,20 @@ java.util.stream.Collectors$$ExternalSyntheticLambda53
java.util.stream.Collectors$$ExternalSyntheticLambda54
java.util.stream.Collectors$$ExternalSyntheticLambda56
java.util.stream.Collectors$$ExternalSyntheticLambda57
+java.util.stream.Collectors$$ExternalSyntheticLambda63
java.util.stream.Collectors$$ExternalSyntheticLambda64
java.util.stream.Collectors$$ExternalSyntheticLambda65
java.util.stream.Collectors$$ExternalSyntheticLambda66
+java.util.stream.Collectors$$ExternalSyntheticLambda68
+java.util.stream.Collectors$$ExternalSyntheticLambda69
+java.util.stream.Collectors$$ExternalSyntheticLambda72
+java.util.stream.Collectors$$ExternalSyntheticLambda73
java.util.stream.Collectors$$ExternalSyntheticLambda74
java.util.stream.Collectors$$ExternalSyntheticLambda75
java.util.stream.Collectors$$ExternalSyntheticLambda76
java.util.stream.Collectors$$ExternalSyntheticLambda77
java.util.stream.Collectors$$ExternalSyntheticLambda79
+java.util.stream.Collectors$$ExternalSyntheticLambda80
java.util.stream.Collectors$$ExternalSyntheticLambda82
java.util.stream.Collectors$$ExternalSyntheticLambda87
java.util.stream.Collectors$$ExternalSyntheticLambda94
@@ -2226,16 +2185,20 @@ java.util.stream.Collectors$CollectorImpl
java.util.stream.Collectors
java.util.stream.DistinctOps$1$1
java.util.stream.DistinctOps$1$2
-java.util.stream.DistinctOps$1
java.util.stream.DistinctOps
java.util.stream.DoublePipeline$$ExternalSyntheticLambda0
java.util.stream.DoublePipeline$$ExternalSyntheticLambda4
+java.util.stream.DoublePipeline$$ExternalSyntheticLambda7
java.util.stream.DoublePipeline$$ExternalSyntheticLambda9
java.util.stream.DoublePipeline$StatelessOp
java.util.stream.DoublePipeline
java.util.stream.DoubleStream
java.util.stream.FindOps$FindOp
+java.util.stream.FindOps$FindSink$OfInt$$ExternalSyntheticLambda0
+java.util.stream.FindOps$FindSink$OfInt$$ExternalSyntheticLambda1
java.util.stream.FindOps$FindSink$OfInt
+java.util.stream.FindOps$FindSink$OfRef$$ExternalSyntheticLambda0
+java.util.stream.FindOps$FindSink$OfRef$$ExternalSyntheticLambda1
java.util.stream.FindOps$FindSink$OfRef
java.util.stream.FindOps$FindSink
java.util.stream.FindOps
@@ -2244,19 +2207,23 @@ java.util.stream.ForEachOps$ForEachOp$OfRef
java.util.stream.ForEachOps$ForEachOp
java.util.stream.ForEachOps
java.util.stream.IntPipeline$$ExternalSyntheticLambda0
+java.util.stream.IntPipeline$$ExternalSyntheticLambda10
+java.util.stream.IntPipeline$$ExternalSyntheticLambda11
+java.util.stream.IntPipeline$$ExternalSyntheticLambda12
java.util.stream.IntPipeline$$ExternalSyntheticLambda1
+java.util.stream.IntPipeline$$ExternalSyntheticLambda5
java.util.stream.IntPipeline$$ExternalSyntheticLambda7
java.util.stream.IntPipeline$$ExternalSyntheticLambda8
+java.util.stream.IntPipeline$1$1
java.util.stream.IntPipeline$4$1
-java.util.stream.IntPipeline$4
java.util.stream.IntPipeline$9
-java.util.stream.IntPipeline$Head
java.util.stream.IntPipeline$StatelessOp
java.util.stream.IntPipeline
java.util.stream.IntStream
java.util.stream.LongPipeline$$ExternalSyntheticLambda3
java.util.stream.LongPipeline$$ExternalSyntheticLambda4
java.util.stream.LongPipeline$$ExternalSyntheticLambda7
+java.util.stream.LongPipeline$$ExternalSyntheticLambda9
java.util.stream.LongPipeline$StatelessOp
java.util.stream.LongPipeline
java.util.stream.LongStream
@@ -2288,14 +2255,19 @@ java.util.stream.Nodes$IntArrayNode
java.util.stream.Nodes$IntFixedNodeBuilder
java.util.stream.Nodes$IntSpinedNodeBuilder
java.util.stream.Nodes$SpinedNodeBuilder
+java.util.stream.Nodes$ToArrayTask$OfInt-IA
java.util.stream.Nodes$ToArrayTask$OfInt
+java.util.stream.Nodes$ToArrayTask$OfPrimitive-IA
java.util.stream.Nodes$ToArrayTask$OfPrimitive
+java.util.stream.Nodes$ToArrayTask$OfRef-IA
java.util.stream.Nodes$ToArrayTask$OfRef
java.util.stream.Nodes$ToArrayTask
java.util.stream.Nodes
java.util.stream.PipelineHelper
+java.util.stream.ReduceOps$10
java.util.stream.ReduceOps$12
java.util.stream.ReduceOps$12ReducingSink
+java.util.stream.ReduceOps$15
java.util.stream.ReduceOps$1
java.util.stream.ReduceOps$1ReducingSink
java.util.stream.ReduceOps$2
@@ -2304,26 +2276,24 @@ java.util.stream.ReduceOps$3
java.util.stream.ReduceOps$3ReducingSink
java.util.stream.ReduceOps$5
java.util.stream.ReduceOps$5ReducingSink
+java.util.stream.ReduceOps$6
java.util.stream.ReduceOps$8
java.util.stream.ReduceOps$8ReducingSink
java.util.stream.ReduceOps$AccumulatingSink
java.util.stream.ReduceOps$Box
java.util.stream.ReduceOps$ReduceOp
java.util.stream.ReduceOps
+java.util.stream.ReferencePipeline$$ExternalSyntheticLambda0
java.util.stream.ReferencePipeline$$ExternalSyntheticLambda1
java.util.stream.ReferencePipeline$2$1
-java.util.stream.ReferencePipeline$2
java.util.stream.ReferencePipeline$3$1
-java.util.stream.ReferencePipeline$3
java.util.stream.ReferencePipeline$4$1
-java.util.stream.ReferencePipeline$4
java.util.stream.ReferencePipeline$5$1
java.util.stream.ReferencePipeline$5
java.util.stream.ReferencePipeline$6$1
java.util.stream.ReferencePipeline$6
java.util.stream.ReferencePipeline$7$1
java.util.stream.ReferencePipeline$7
-java.util.stream.ReferencePipeline$Head
java.util.stream.ReferencePipeline$StatefulOp
java.util.stream.ReferencePipeline$StatelessOp
java.util.stream.ReferencePipeline
@@ -2337,7 +2307,6 @@ java.util.stream.SliceOps$1$1
java.util.stream.SliceOps$1
java.util.stream.SliceOps
java.util.stream.SortedOps$AbstractRefSortingSink
-java.util.stream.SortedOps$OfRef
java.util.stream.SortedOps$RefSortingSink$$ExternalSyntheticLambda0
java.util.stream.SortedOps$RefSortingSink
java.util.stream.SortedOps$SizedRefSortingSink
@@ -2358,11 +2327,11 @@ java.util.stream.StreamSpliterators$WrappingSpliterator
java.util.stream.StreamSupport
java.util.stream.Streams$1
java.util.stream.Streams$2
+java.util.stream.Streams$AbstractStreamBuilderImpl-IA
java.util.stream.Streams$AbstractStreamBuilderImpl
java.util.stream.Streams$ConcatSpliterator$OfRef
java.util.stream.Streams$ConcatSpliterator
java.util.stream.Streams$RangeIntSpliterator
-java.util.stream.Streams$StreamBuilderImpl
java.util.stream.Streams
java.util.stream.TerminalOp
java.util.stream.TerminalSink
@@ -2374,19 +2343,27 @@ java.util.zip.CheckedInputStream
java.util.zip.Checksum$1
java.util.zip.Checksum
java.util.zip.DataFormatException
+java.util.zip.Deflater$DeflaterZStreamRef
java.util.zip.Deflater
java.util.zip.DeflaterOutputStream
java.util.zip.GZIPInputStream$1
-java.util.zip.GZIPInputStream
java.util.zip.GZIPOutputStream
+java.util.zip.Inflater$InflaterZStreamRef-IA
+java.util.zip.Inflater$InflaterZStreamRef
java.util.zip.Inflater
java.util.zip.InflaterInputStream
-java.util.zip.ZStreamRef
+java.util.zip.ZipCoder$UTF8ZipCoder
java.util.zip.ZipCoder
java.util.zip.ZipConstants
java.util.zip.ZipEntry
java.util.zip.ZipError
java.util.zip.ZipException
+java.util.zip.ZipFile$CleanableResource
+java.util.zip.ZipFile$InflaterCleanupAction
+java.util.zip.ZipFile$Source$End-IA
+java.util.zip.ZipFile$Source$End
+java.util.zip.ZipFile$Source$Key
+java.util.zip.ZipFile$Source
java.util.zip.ZipFile$ZipEntryIterator
java.util.zip.ZipFile$ZipFileInflaterInputStream
java.util.zip.ZipFile$ZipFileInputStream
@@ -2396,7 +2373,6 @@ java.util.zip.ZipOutputStream
java.util.zip.ZipUtils
javax.crypto.AEADBadTagException
javax.crypto.BadPaddingException
-javax.crypto.Cipher$1
javax.crypto.Cipher$CipherSpiAndProvider
javax.crypto.Cipher$InitParams
javax.crypto.Cipher$InitType
@@ -2511,18 +2487,18 @@ javax.xml.parsers.DocumentBuilderFactory
javax.xml.parsers.ParserConfigurationException
javax.xml.parsers.SAXParser
javax.xml.parsers.SAXParserFactory
+jdk.internal.access.JavaIOFileDescriptorAccess
+jdk.internal.access.JavaObjectInputStreamAccess
+jdk.internal.access.JavaUtilCollectionAccess
+jdk.internal.access.SharedSecrets
jdk.internal.math.FDBigInteger
jdk.internal.math.FloatingDecimal$1
-jdk.internal.math.FloatingDecimal$ASCIIToBinaryBuffer
jdk.internal.math.FloatingDecimal$ASCIIToBinaryConverter
-jdk.internal.math.FloatingDecimal$BinaryToASCIIBuffer
jdk.internal.math.FloatingDecimal$BinaryToASCIIConverter
jdk.internal.math.FloatingDecimal$ExceptionalBinaryToASCIIBuffer
jdk.internal.math.FloatingDecimal$HexFloatPattern
-jdk.internal.math.FloatingDecimal$PreparedASCIIToBinaryBuffer
jdk.internal.math.FloatingDecimal
jdk.internal.math.FormattedFloatingDecimal$1
-jdk.internal.math.FormattedFloatingDecimal$2
jdk.internal.math.FormattedFloatingDecimal$Form
jdk.internal.math.FormattedFloatingDecimal
jdk.internal.misc.TerminatingThreadLocal$1
@@ -2530,16 +2506,21 @@ jdk.internal.misc.TerminatingThreadLocal
jdk.internal.misc.Unsafe
jdk.internal.misc.UnsafeConstants
jdk.internal.misc.VM
+jdk.internal.ref.CleanerFactory
jdk.internal.ref.CleanerImpl$PhantomCleanableRef
+jdk.internal.ref.CleanerImpl
jdk.internal.ref.PhantomCleanable
jdk.internal.reflect.Reflection
jdk.internal.util.ArraysSupport
+jdk.internal.util.NullableKeyValueHolder
jdk.internal.util.Preconditions
jdk.internal.util.StaticProperty
+jdk.internal.util.random.RandomSupport
libcore.content.type.MimeMap$$ExternalSyntheticLambda0
libcore.content.type.MimeMap$Builder$Element
libcore.content.type.MimeMap$Builder
libcore.content.type.MimeMap$MemoizingSupplier
+libcore.content.type.MimeMap-IA
libcore.content.type.MimeMap
libcore.icu.CollationKeyICU
libcore.icu.DateIntervalFormat
@@ -2552,7 +2533,6 @@ libcore.icu.TimeZoneNames$ZoneStringsCache
libcore.icu.TimeZoneNames
libcore.internal.StringPool
libcore.io.AsynchronousCloseMonitor
-libcore.io.BlockGuardOs
libcore.io.BufferIterator
libcore.io.ClassPathURLStreamHandler$ClassPathURLConnection$1
libcore.io.ClassPathURLStreamHandler$ClassPathURLConnection
@@ -2602,30 +2582,27 @@ libcore.util.FP16
libcore.util.HexEncoding
libcore.util.NativeAllocationRegistry$CleanerRunner
libcore.util.NativeAllocationRegistry$CleanerThunk
-libcore.util.NativeAllocationRegistry
libcore.util.Objects
libcore.util.SneakyThrow
libcore.util.XmlObjectFactory
-libcore.util.ZoneInfo
org.apache.harmony.dalvik.ddmc.Chunk
org.apache.harmony.dalvik.ddmc.ChunkHandler
org.apache.harmony.dalvik.ddmc.DdmServer
org.apache.harmony.dalvik.ddmc.DdmVmInternal
org.apache.harmony.xml.ExpatAttributes
org.apache.harmony.xml.ExpatException
+org.apache.harmony.xml.ExpatParser$CurrentAttributes-IA
org.apache.harmony.xml.ExpatParser$CurrentAttributes
+org.apache.harmony.xml.ExpatParser$ExpatLocator-IA
org.apache.harmony.xml.ExpatParser$ExpatLocator
org.apache.harmony.xml.ExpatParser$ParseException
org.apache.harmony.xml.ExpatParser
org.apache.harmony.xml.ExpatReader
-org.apache.harmony.xml.dom.AttrImpl
org.apache.harmony.xml.dom.CDATASectionImpl
org.apache.harmony.xml.dom.CharacterDataImpl
org.apache.harmony.xml.dom.CommentImpl
org.apache.harmony.xml.dom.DOMImplementationImpl
-org.apache.harmony.xml.dom.DocumentImpl
org.apache.harmony.xml.dom.DocumentTypeImpl
-org.apache.harmony.xml.dom.ElementImpl
org.apache.harmony.xml.dom.EntityReferenceImpl
org.apache.harmony.xml.dom.InnerNodeImpl
org.apache.harmony.xml.dom.LeafNodeImpl
@@ -2633,7 +2610,6 @@ org.apache.harmony.xml.dom.NodeImpl$1
org.apache.harmony.xml.dom.NodeImpl
org.apache.harmony.xml.dom.NodeListImpl
org.apache.harmony.xml.dom.ProcessingInstructionImpl
-org.apache.harmony.xml.dom.TextImpl
org.apache.harmony.xml.parsers.DocumentBuilderFactoryImpl
org.apache.harmony.xml.parsers.DocumentBuilderImpl
org.apache.harmony.xml.parsers.SAXParserFactoryImpl
@@ -2731,8 +2707,8 @@ sun.nio.ch.DatagramDispatcher
sun.nio.ch.DefaultSelectorProvider
sun.nio.ch.DirectBuffer
sun.nio.ch.FileChannelImpl$SimpleFileLockTable
+sun.nio.ch.FileChannelImpl$Unmapper-IA
sun.nio.ch.FileChannelImpl$Unmapper
-sun.nio.ch.FileChannelImpl
sun.nio.ch.FileDescriptorHolderSocketImpl
sun.nio.ch.FileDispatcher
sun.nio.ch.FileDispatcherImpl
@@ -2773,7 +2749,6 @@ sun.nio.ch.Util$BufferCache
sun.nio.ch.Util
sun.nio.cs.ArrayDecoder
sun.nio.cs.ArrayEncoder
-sun.nio.cs.StreamDecoder
sun.nio.cs.StreamEncoder
sun.nio.cs.ThreadLocalCoders$1
sun.nio.cs.ThreadLocalCoders$2
@@ -2785,7 +2760,6 @@ sun.nio.fs.AbstractPath
sun.nio.fs.DefaultFileSystemProvider
sun.nio.fs.DynamicFileAttributeView
sun.nio.fs.FileOwnerAttributeViewImpl
-sun.nio.fs.LinuxFileSystem
sun.nio.fs.LinuxFileSystemProvider
sun.nio.fs.NativeBuffer$Deallocator
sun.nio.fs.NativeBuffer
@@ -2808,7 +2782,6 @@ sun.nio.fs.UnixFileSystemProvider$3
sun.nio.fs.UnixFileSystemProvider
sun.nio.fs.UnixMountEntry
sun.nio.fs.UnixNativeDispatcher
-sun.nio.fs.UnixPath
sun.nio.fs.UnixSecureDirectoryStream
sun.nio.fs.Util
sun.reflect.Reflection
@@ -2816,6 +2789,7 @@ sun.reflect.misc.ReflectUtil
sun.security.action.GetBooleanAction
sun.security.action.GetIntegerAction
sun.security.action.GetPropertyAction
+sun.security.jca.GetInstance$Instance-IA
sun.security.jca.GetInstance$Instance
sun.security.jca.GetInstance
sun.security.jca.JCAUtil$CachedSecureRandomHolder
@@ -2853,19 +2827,19 @@ sun.security.provider.certpath.KeyChecker
sun.security.provider.certpath.OCSP$RevocationStatus$CertStatus
sun.security.provider.certpath.OCSP$RevocationStatus
sun.security.provider.certpath.OCSP
-sun.security.provider.certpath.OCSPResponse$1
sun.security.provider.certpath.OCSPResponse$ResponseStatus
+sun.security.provider.certpath.OCSPResponse$SingleResponse-IA
sun.security.provider.certpath.OCSPResponse$SingleResponse
sun.security.provider.certpath.OCSPResponse
sun.security.provider.certpath.PKIX$ValidatorParams
sun.security.provider.certpath.PKIX
-sun.security.provider.certpath.PKIXCertPathValidator
sun.security.provider.certpath.PKIXMasterCertPathValidator
sun.security.provider.certpath.PolicyChecker
sun.security.provider.certpath.PolicyNodeImpl
sun.security.provider.certpath.RevocationChecker$1
sun.security.provider.certpath.RevocationChecker$2
sun.security.provider.certpath.RevocationChecker$Mode
+sun.security.provider.certpath.RevocationChecker$RevocationProperties-IA
sun.security.provider.certpath.RevocationChecker$RevocationProperties
sun.security.provider.certpath.RevocationChecker
sun.security.timestamp.TimestampToken
@@ -2887,11 +2861,11 @@ sun.security.util.DerInputBuffer
sun.security.util.DerInputStream
sun.security.util.DerOutputStream
sun.security.util.DerValue
-sun.security.util.DisabledAlgorithmConstraints$1
sun.security.util.DisabledAlgorithmConstraints$Constraint$Operator
sun.security.util.DisabledAlgorithmConstraints$Constraint
sun.security.util.DisabledAlgorithmConstraints$Constraints
sun.security.util.DisabledAlgorithmConstraints$KeySizeConstraint
+sun.security.util.DisabledAlgorithmConstraints$jdkCAConstraint
sun.security.util.DisabledAlgorithmConstraints
sun.security.util.FilePaths
sun.security.util.KeyUtil
@@ -2995,9 +2969,12 @@ sun.util.calendar.JulianCalendar$Date
sun.util.calendar.JulianCalendar
sun.util.calendar.LocalGregorianCalendar
sun.util.locale.BaseLocale$Cache
+sun.util.locale.BaseLocale$Key-IA
sun.util.locale.BaseLocale$Key
+sun.util.locale.BaseLocale-IA
sun.util.locale.BaseLocale
sun.util.locale.Extension
+sun.util.locale.InternalLocaleBuilder$CaseInsensitiveChar-IA
sun.util.locale.InternalLocaleBuilder$CaseInsensitiveChar
sun.util.locale.InternalLocaleBuilder
sun.util.locale.LanguageTag
@@ -3068,6 +3045,7 @@ sun.util.logging.PlatformLogger
[Ljava.lang.Number;
[Ljava.lang.Object;
[Ljava.lang.Package;
+[Ljava.lang.ProcessBuilder$Redirect;
[Ljava.lang.Runnable;
[Ljava.lang.Short;
[Ljava.lang.StackTraceElement;
@@ -3135,6 +3113,7 @@ sun.util.logging.PlatformLogger
[Ljava.text.DateFormat$Field;
[Ljava.text.Format;
[Ljava.text.Normalizer$Form;
+[Ljava.text.NumberFormat$Style;
[Ljava.time.DayOfWeek;
[Ljava.time.LocalDateTime;
[Ljava.time.LocalTime;
@@ -3207,6 +3186,7 @@ sun.util.logging.PlatformLogger
[Lsun.security.provider.certpath.OCSP$RevocationStatus$CertStatus;
[Lsun.security.provider.certpath.OCSPResponse$ResponseStatus;
[Lsun.security.provider.certpath.RevocationChecker$Mode;
+[Lsun.security.util.DerEncoder;
[Lsun.security.util.DerOutputStream;
[Lsun.security.util.DerValue;
[Lsun.security.util.DisabledAlgorithmConstraints$Constraint$Operator;
@@ -3216,6 +3196,7 @@ sun.util.logging.PlatformLogger
[Lsun.security.x509.NetscapeCertTypeExtension$MapEntry;
[Lsun.security.x509.RDN;
[Lsun.util.calendar.Era;
+[Lsun.util.locale.BaseLocale;
[Lsun.util.logging.PlatformLogger$Level;
[S
[Z
diff --git a/compiler/optimizing/code_generator.h b/compiler/optimizing/code_generator.h
index 970da76c43..3ac4bd7dcc 100644
--- a/compiler/optimizing/code_generator.h
+++ b/compiler/optimizing/code_generator.h
@@ -461,11 +461,13 @@ class CodeGenerator : public DeletableArenaObject<kArenaAllocCodeGenerator> {
DataType::Type type2);
bool InstanceOfNeedsReadBarrier(HInstanceOf* instance_of) {
- // Used only for kExactCheck, kAbstractClassCheck, kClassHierarchyCheck and kArrayObjectCheck.
+ // Used only for `kExactCheck`, `kAbstractClassCheck`, `kClassHierarchyCheck`,
+ // `kArrayObjectCheck` and `kInterfaceCheck`.
DCHECK(instance_of->GetTypeCheckKind() == TypeCheckKind::kExactCheck ||
instance_of->GetTypeCheckKind() == TypeCheckKind::kAbstractClassCheck ||
instance_of->GetTypeCheckKind() == TypeCheckKind::kClassHierarchyCheck ||
- instance_of->GetTypeCheckKind() == TypeCheckKind::kArrayObjectCheck)
+ instance_of->GetTypeCheckKind() == TypeCheckKind::kArrayObjectCheck ||
+ instance_of->GetTypeCheckKind() == TypeCheckKind::kInterfaceCheck)
<< instance_of->GetTypeCheckKind();
// If the target class is in the boot or app image, it's non-moveable and it doesn't matter
// if we compare it with a from-space or to-space reference, the result is the same.
diff --git a/compiler/optimizing/code_generator_arm64.cc b/compiler/optimizing/code_generator_arm64.cc
index 8a4b069e19..cfa28eda25 100644
--- a/compiler/optimizing/code_generator_arm64.cc
+++ b/compiler/optimizing/code_generator_arm64.cc
@@ -4135,15 +4135,16 @@ void LocationsBuilderARM64::VisitInstanceOf(HInstanceOf* instruction) {
case TypeCheckKind::kExactCheck:
case TypeCheckKind::kAbstractClassCheck:
case TypeCheckKind::kClassHierarchyCheck:
- case TypeCheckKind::kArrayObjectCheck: {
+ case TypeCheckKind::kArrayObjectCheck:
+ case TypeCheckKind::kInterfaceCheck: {
bool needs_read_barrier = codegen_->InstanceOfNeedsReadBarrier(instruction);
call_kind = needs_read_barrier ? LocationSummary::kCallOnSlowPath : LocationSummary::kNoCall;
- baker_read_barrier_slow_path = kUseBakerReadBarrier && needs_read_barrier;
+ baker_read_barrier_slow_path = (kUseBakerReadBarrier && needs_read_barrier) &&
+ (type_check_kind != TypeCheckKind::kInterfaceCheck);
break;
}
case TypeCheckKind::kArrayCheck:
case TypeCheckKind::kUnresolvedCheck:
- case TypeCheckKind::kInterfaceCheck:
call_kind = LocationSummary::kCallOnSlowPath;
break;
case TypeCheckKind::kBitstringCheck:
@@ -4184,10 +4185,14 @@ void InstructionCodeGeneratorARM64::VisitInstanceOf(HInstanceOf* instruction) {
const size_t num_temps = NumberOfInstanceOfTemps(codegen_->EmitReadBarrier(), type_check_kind);
DCHECK_LE(num_temps, 1u);
Location maybe_temp_loc = (num_temps >= 1) ? locations->GetTemp(0) : Location::NoLocation();
- uint32_t class_offset = mirror::Object::ClassOffset().Int32Value();
- uint32_t super_offset = mirror::Class::SuperClassOffset().Int32Value();
- uint32_t component_offset = mirror::Class::ComponentTypeOffset().Int32Value();
- uint32_t primitive_offset = mirror::Class::PrimitiveTypeOffset().Int32Value();
+ const uint32_t class_offset = mirror::Object::ClassOffset().Int32Value();
+ const uint32_t super_offset = mirror::Class::SuperClassOffset().Int32Value();
+ const uint32_t component_offset = mirror::Class::ComponentTypeOffset().Int32Value();
+ const uint32_t primitive_offset = mirror::Class::PrimitiveTypeOffset().Int32Value();
+ const uint32_t iftable_offset = mirror::Class::IfTableOffset().Uint32Value();
+ const uint32_t array_length_offset = mirror::Array::LengthOffset().Uint32Value();
+ const uint32_t object_array_data_offset =
+ mirror::Array::DataOffset(kHeapReferenceSize).Uint32Value();
vixl::aarch64::Label done, zero;
SlowPathCodeARM64* slow_path = nullptr;
@@ -4334,11 +4339,54 @@ void InstructionCodeGeneratorARM64::VisitInstanceOf(HInstanceOf* instruction) {
break;
}
- case TypeCheckKind::kUnresolvedCheck:
case TypeCheckKind::kInterfaceCheck: {
+ if (codegen_->InstanceOfNeedsReadBarrier(instruction)) {
+ DCHECK(locations->OnlyCallsOnSlowPath());
+ slow_path = new (codegen_->GetScopedAllocator()) TypeCheckSlowPathARM64(
+ instruction, /* is_fatal= */ false);
+ codegen_->AddSlowPath(slow_path);
+ if (codegen_->EmitNonBakerReadBarrier()) {
+ __ B(slow_path->GetEntryLabel());
+ break;
+ }
+ // For Baker read barrier, take the slow path while marking.
+ __ Cbnz(mr, slow_path->GetEntryLabel());
+ }
+
+ // Fast-path without read barriers.
+ UseScratchRegisterScope temps(GetVIXLAssembler());
+ Register temp = temps.AcquireW();
+ Register temp2 = temps.AcquireW();
+ // /* HeapReference<Class> */ temp = obj->klass_
+ __ Ldr(temp, HeapOperand(obj, class_offset));
+ GetAssembler()->MaybeUnpoisonHeapReference(temp);
+ // /* HeapReference<Class> */ temp = temp->iftable_
+ __ Ldr(temp, HeapOperand(temp, iftable_offset));
+ GetAssembler()->MaybeUnpoisonHeapReference(temp);
+ // Load the size of the `IfTable`. The `Class::iftable_` is never null.
+ __ Ldr(out, HeapOperand(temp, array_length_offset));
+ // Loop through the `IfTable` and check if any class matches.
+ vixl::aarch64::Label loop;
+ __ Bind(&loop);
+ __ Cbz(out, &done); // If taken, the result in `out` is already 0 (false).
+ __ Ldr(temp2, HeapOperand(temp, object_array_data_offset));
+ GetAssembler()->MaybeUnpoisonHeapReference(temp2);
+ // Go to next interface.
+ __ Add(temp, temp, 2 * kHeapReferenceSize);
+ __ Sub(out, out, 2);
+ // Compare the classes and continue the loop if they do not match.
+ __ Cmp(cls, temp2);
+ __ B(ne, &loop);
+ __ Mov(out, 1);
+ if (zero.IsLinked()) {
+ __ B(&done);
+ }
+ break;
+ }
+
+ case TypeCheckKind::kUnresolvedCheck: {
// Note that we indeed only call on slow path, but we always go
- // into the slow path for the unresolved and interface check
- // cases.
+ // into the slow path for the unresolved check case.
//
// We cannot directly call the InstanceofNonTrivial runtime
// entry point without resorting to a type checking slow path
@@ -4581,7 +4629,7 @@ void InstructionCodeGeneratorARM64::VisitCheckCast(HCheckCast* instruction) {
iftable_offset,
maybe_temp2_loc,
kWithoutReadBarrier);
- // Iftable is never null.
+ // Load the size of the `IfTable`. The `Class::iftable_` is never null.
__ Ldr(WRegisterFrom(maybe_temp2_loc), HeapOperand(temp.W(), array_length_offset));
// Loop through the iftable and check if any class matches.
vixl::aarch64::Label start_loop;
diff --git a/compiler/optimizing/code_generator_arm_vixl.cc b/compiler/optimizing/code_generator_arm_vixl.cc
index eb5fbc4364..a7cc5a6d12 100644
--- a/compiler/optimizing/code_generator_arm_vixl.cc
+++ b/compiler/optimizing/code_generator_arm_vixl.cc
@@ -8061,6 +8061,9 @@ void InstructionCodeGeneratorARMVIXL::VisitThrow(HThrow* instruction) {
// Temp is used for read barrier.
static size_t NumberOfInstanceOfTemps(bool emit_read_barrier, TypeCheckKind type_check_kind) {
+ if (type_check_kind == TypeCheckKind::kInterfaceCheck) {
+ return 1;
+ }
if (emit_read_barrier &&
(kUseBakerReadBarrier ||
type_check_kind == TypeCheckKind::kAbstractClassCheck ||
@@ -8089,15 +8092,16 @@ void LocationsBuilderARMVIXL::VisitInstanceOf(HInstanceOf* instruction) {
case TypeCheckKind::kExactCheck:
case TypeCheckKind::kAbstractClassCheck:
case TypeCheckKind::kClassHierarchyCheck:
- case TypeCheckKind::kArrayObjectCheck: {
+ case TypeCheckKind::kArrayObjectCheck:
+ case TypeCheckKind::kInterfaceCheck: {
bool needs_read_barrier = codegen_->InstanceOfNeedsReadBarrier(instruction);
call_kind = needs_read_barrier ? LocationSummary::kCallOnSlowPath : LocationSummary::kNoCall;
- baker_read_barrier_slow_path = kUseBakerReadBarrier && needs_read_barrier;
+ baker_read_barrier_slow_path = (kUseBakerReadBarrier && needs_read_barrier) &&
+ (type_check_kind != TypeCheckKind::kInterfaceCheck);
break;
}
case TypeCheckKind::kArrayCheck:
case TypeCheckKind::kUnresolvedCheck:
- case TypeCheckKind::kInterfaceCheck:
call_kind = LocationSummary::kCallOnSlowPath;
break;
case TypeCheckKind::kBitstringCheck:
@@ -8137,10 +8141,14 @@ void InstructionCodeGeneratorARMVIXL::VisitInstanceOf(HInstanceOf* instruction)
const size_t num_temps = NumberOfInstanceOfTemps(codegen_->EmitReadBarrier(), type_check_kind);
DCHECK_LE(num_temps, 1u);
Location maybe_temp_loc = (num_temps >= 1) ? locations->GetTemp(0) : Location::NoLocation();
- uint32_t class_offset = mirror::Object::ClassOffset().Int32Value();
- uint32_t super_offset = mirror::Class::SuperClassOffset().Int32Value();
- uint32_t component_offset = mirror::Class::ComponentTypeOffset().Int32Value();
- uint32_t primitive_offset = mirror::Class::PrimitiveTypeOffset().Int32Value();
+ const uint32_t class_offset = mirror::Object::ClassOffset().Int32Value();
+ const uint32_t super_offset = mirror::Class::SuperClassOffset().Int32Value();
+ const uint32_t component_offset = mirror::Class::ComponentTypeOffset().Int32Value();
+ const uint32_t primitive_offset = mirror::Class::PrimitiveTypeOffset().Int32Value();
+ const uint32_t iftable_offset = mirror::Class::IfTableOffset().Uint32Value();
+ const uint32_t array_length_offset = mirror::Array::LengthOffset().Uint32Value();
+ const uint32_t object_array_data_offset =
+ mirror::Array::DataOffset(kHeapReferenceSize).Uint32Value();
vixl32::Label done;
vixl32::Label* const final_label = codegen_->GetFinalLabel(instruction, &done);
SlowPathCodeARMVIXL* slow_path = nullptr;
@@ -8344,11 +8352,52 @@ void InstructionCodeGeneratorARMVIXL::VisitInstanceOf(HInstanceOf* instruction)
break;
}
- case TypeCheckKind::kUnresolvedCheck:
case TypeCheckKind::kInterfaceCheck: {
+ if (codegen_->InstanceOfNeedsReadBarrier(instruction)) {
+ DCHECK(locations->OnlyCallsOnSlowPath());
+ slow_path = new (codegen_->GetScopedAllocator()) TypeCheckSlowPathARMVIXL(
+ instruction, /* is_fatal= */ false);
+ codegen_->AddSlowPath(slow_path);
+ if (codegen_->EmitNonBakerReadBarrier()) {
+ __ B(slow_path->GetEntryLabel());
+ break;
+ }
+ // For Baker read barrier, take the slow path while marking.
+ __ CompareAndBranchIfNonZero(mr, slow_path->GetEntryLabel());
+ }
+
+ // Fast-path without read barriers.
+ UseScratchRegisterScope temps(GetVIXLAssembler());
+ vixl32::Register temp = RegisterFrom(maybe_temp_loc);
+ vixl32::Register temp2 = temps.Acquire();
+ // /* HeapReference<Class> */ temp = obj->klass_
+ __ Ldr(temp, MemOperand(obj, class_offset));
+ GetAssembler()->MaybeUnpoisonHeapReference(temp);
+ // /* HeapReference<Class> */ temp = temp->iftable_
+ __ Ldr(temp, MemOperand(temp, iftable_offset));
+ GetAssembler()->MaybeUnpoisonHeapReference(temp);
+ // Load the size of the `IfTable`. The `Class::iftable_` is never null.
+ __ Ldr(out, MemOperand(temp, array_length_offset));
+ // Loop through the `IfTable` and check if any class matches.
+ vixl32::Label loop;
+ __ Bind(&loop);
+ // If taken, the result in `out` is already 0 (false).
+ __ CompareAndBranchIfZero(out, &done, /* is_far_target= */ false);
+ __ Ldr(temp2, MemOperand(temp, object_array_data_offset));
+ GetAssembler()->MaybeUnpoisonHeapReference(temp2);
+ // Go to next interface.
+ __ Add(temp, temp, static_cast<uint32_t>(2 * kHeapReferenceSize));
+ __ Sub(out, out, 2);
+ // Compare the classes and continue the loop if they do not match.
+ __ Cmp(cls, temp2);
+ __ B(ne, &loop);
+ __ Mov(out, 1);
+ break;
+ }
+
+ case TypeCheckKind::kUnresolvedCheck: {
// Note that we indeed only call on slow path, but we always go
- // into the slow path for the unresolved and interface check
- // cases.
+ // into the slow path for the unresolved check case.
//
// We cannot directly call the InstanceofNonTrivial runtime
// entry point without resorting to a type checking slow path
@@ -8593,7 +8642,7 @@ void InstructionCodeGeneratorARMVIXL::VisitCheckCast(HCheckCast* instruction) {
iftable_offset,
maybe_temp2_loc,
kWithoutReadBarrier);
- // Iftable is never null.
+ // Load the size of the `IfTable`. The `Class::iftable_` is never null.
__ Ldr(RegisterFrom(maybe_temp2_loc), MemOperand(temp, array_length_offset));
// Loop through the iftable and check if any class matches.
vixl32::Label start_loop;
diff --git a/compiler/optimizing/code_generator_x86.cc b/compiler/optimizing/code_generator_x86.cc
index 5460a1bb07..5ad818dd53 100644
--- a/compiler/optimizing/code_generator_x86.cc
+++ b/compiler/optimizing/code_generator_x86.cc
@@ -7666,6 +7666,9 @@ void InstructionCodeGeneratorX86::VisitThrow(HThrow* instruction) {
// Temp is used for read barrier.
static size_t NumberOfInstanceOfTemps(bool emit_read_barrier, TypeCheckKind type_check_kind) {
+ if (type_check_kind == TypeCheckKind::kInterfaceCheck) {
+ return 1;
+ }
if (emit_read_barrier &&
!kUseBakerReadBarrier &&
(type_check_kind == TypeCheckKind::kAbstractClassCheck ||
@@ -7680,9 +7683,6 @@ static size_t NumberOfInstanceOfTemps(bool emit_read_barrier, TypeCheckKind type
// interface pointer, the current interface is compared in memory.
// The other checks have one temp for loading the object's class.
static size_t NumberOfCheckCastTemps(bool emit_read_barrier, TypeCheckKind type_check_kind) {
- if (type_check_kind == TypeCheckKind::kInterfaceCheck) {
- return 2;
- }
return 1 + NumberOfInstanceOfTemps(emit_read_barrier, type_check_kind);
}
@@ -7694,15 +7694,16 @@ void LocationsBuilderX86::VisitInstanceOf(HInstanceOf* instruction) {
case TypeCheckKind::kExactCheck:
case TypeCheckKind::kAbstractClassCheck:
case TypeCheckKind::kClassHierarchyCheck:
- case TypeCheckKind::kArrayObjectCheck: {
+ case TypeCheckKind::kArrayObjectCheck:
+ case TypeCheckKind::kInterfaceCheck: {
bool needs_read_barrier = codegen_->InstanceOfNeedsReadBarrier(instruction);
call_kind = needs_read_barrier ? LocationSummary::kCallOnSlowPath : LocationSummary::kNoCall;
- baker_read_barrier_slow_path = kUseBakerReadBarrier && needs_read_barrier;
+ baker_read_barrier_slow_path = (kUseBakerReadBarrier && needs_read_barrier) &&
+ (type_check_kind != TypeCheckKind::kInterfaceCheck);
break;
}
case TypeCheckKind::kArrayCheck:
case TypeCheckKind::kUnresolvedCheck:
- case TypeCheckKind::kInterfaceCheck:
call_kind = LocationSummary::kCallOnSlowPath;
break;
case TypeCheckKind::kBitstringCheck:
@@ -7719,6 +7720,8 @@ void LocationsBuilderX86::VisitInstanceOf(HInstanceOf* instruction) {
locations->SetInAt(1, Location::ConstantLocation(instruction->InputAt(1)));
locations->SetInAt(2, Location::ConstantLocation(instruction->InputAt(2)));
locations->SetInAt(3, Location::ConstantLocation(instruction->InputAt(3)));
+ } else if (type_check_kind == TypeCheckKind::kInterfaceCheck) {
+ locations->SetInAt(1, Location::RequiresRegister());
} else {
locations->SetInAt(1, Location::Any());
}
@@ -7740,10 +7743,14 @@ void InstructionCodeGeneratorX86::VisitInstanceOf(HInstanceOf* instruction) {
const size_t num_temps = NumberOfInstanceOfTemps(codegen_->EmitReadBarrier(), type_check_kind);
DCHECK_LE(num_temps, 1u);
Location maybe_temp_loc = (num_temps >= 1) ? locations->GetTemp(0) : Location::NoLocation();
- uint32_t class_offset = mirror::Object::ClassOffset().Int32Value();
- uint32_t super_offset = mirror::Class::SuperClassOffset().Int32Value();
- uint32_t component_offset = mirror::Class::ComponentTypeOffset().Int32Value();
- uint32_t primitive_offset = mirror::Class::PrimitiveTypeOffset().Int32Value();
+ const uint32_t class_offset = mirror::Object::ClassOffset().Int32Value();
+ const uint32_t super_offset = mirror::Class::SuperClassOffset().Int32Value();
+ const uint32_t component_offset = mirror::Class::ComponentTypeOffset().Int32Value();
+ const uint32_t primitive_offset = mirror::Class::PrimitiveTypeOffset().Int32Value();
+ const uint32_t iftable_offset = mirror::Class::IfTableOffset().Uint32Value();
+ const uint32_t array_length_offset = mirror::Array::LengthOffset().Uint32Value();
+ const uint32_t object_array_data_offset =
+ mirror::Array::DataOffset(kHeapReferenceSize).Uint32Value();
SlowPathCode* slow_path = nullptr;
NearLabel done, zero;
@@ -7913,11 +7920,69 @@ void InstructionCodeGeneratorX86::VisitInstanceOf(HInstanceOf* instruction) {
break;
}
- case TypeCheckKind::kUnresolvedCheck:
case TypeCheckKind::kInterfaceCheck: {
+ if (codegen_->InstanceOfNeedsReadBarrier(instruction)) {
+ DCHECK(locations->OnlyCallsOnSlowPath());
+ slow_path = new (codegen_->GetScopedAllocator()) TypeCheckSlowPathX86(
+ instruction, /* is_fatal= */ false);
+ codegen_->AddSlowPath(slow_path);
+ if (codegen_->EmitNonBakerReadBarrier()) {
+ __ jmp(slow_path->GetEntryLabel());
+ break;
+ }
+ // For Baker read barrier, take the slow path while marking.
+ __ fs()->cmpl(Address::Absolute(Thread::IsGcMarkingOffset<kX86PointerSize>()),
+ Immediate(0));
+ __ j(kNotEqual, slow_path->GetEntryLabel());
+ }
+
+ // Fast-path without read barriers.
+ Register temp = maybe_temp_loc.AsRegister<Register>();
+ // /* HeapReference<Class> */ temp = obj->klass_
+ __ movl(temp, Address(obj, class_offset));
+ __ MaybeUnpoisonHeapReference(temp);
+ // /* HeapReference<Class> */ temp = temp->iftable_
+ __ movl(temp, Address(temp, iftable_offset));
+ __ MaybeUnpoisonHeapReference(temp);
+ // Load the size of the `IfTable`. The `Class::iftable_` is never null.
+ __ movl(out, Address(temp, array_length_offset));
+ // Maybe poison the `cls` for direct comparison with memory.
+ __ MaybePoisonHeapReference(cls.AsRegister<Register>());
+ // Loop through the iftable and check if any class matches.
+ NearLabel loop, end;
+ __ Bind(&loop);
+ // Check if we still have an entry to compare.
+ __ subl(out, Immediate(2));
+ __ j(kNegative, (zero.IsLinked() && !kPoisonHeapReferences) ? &zero : &end);
+ // Go to next interface if the classes do not match.
+ __ cmpl(cls.AsRegister<Register>(),
+ CodeGeneratorX86::ArrayAddress(temp, out_loc, TIMES_4, object_array_data_offset));
+ __ j(kNotEqual, &loop);
+ if (zero.IsLinked()) {
+ __ movl(out, Immediate(1));
+ // If `cls` was poisoned above, unpoison it.
+ __ MaybeUnpoisonHeapReference(cls.AsRegister<Register>());
+ __ jmp(&done);
+ if (kPoisonHeapReferences) {
+ // The false case needs to unpoison the class before jumping to `zero`.
+ __ Bind(&end);
+ __ UnpoisonHeapReference(cls.AsRegister<Register>());
+ __ jmp(&zero);
+ }
+ } else {
+ // To reduce branching, use the fact that the false case branches with a `-2` in `out`.
+ __ movl(out, Immediate(-1));
+ __ Bind(&end);
+ __ addl(out, Immediate(2));
+ // If `cls` was poisoned above, unpoison it.
+ __ MaybeUnpoisonHeapReference(cls.AsRegister<Register>());
+ }
+ break;
+ }
+
+ case TypeCheckKind::kUnresolvedCheck: {
// Note that we indeed only call on slow path, but we always go
- // into the slow path for the unresolved and interface check
- // cases.
+ // into the slow path for the unresolved check case.
//
// We cannot directly call the InstanceofNonTrivial runtime
// entry point without resorting to a type checking slow path
@@ -8180,14 +8245,14 @@ void InstructionCodeGeneratorX86::VisitCheckCast(HCheckCast* instruction) {
iftable_offset,
maybe_temp2_loc,
kWithoutReadBarrier);
- // Iftable is never null.
+ // Load the size of the `IfTable`. The `Class::iftable_` is never null.
__ movl(maybe_temp2_loc.AsRegister<Register>(), Address(temp, array_length_offset));
// Maybe poison the `cls` for direct comparison with memory.
__ MaybePoisonHeapReference(cls.AsRegister<Register>());
// Loop through the iftable and check if any class matches.
NearLabel start_loop;
__ Bind(&start_loop);
- // Need to subtract first to handle the empty array case.
+ // Check if we still have an entry to compare.
__ subl(maybe_temp2_loc.AsRegister<Register>(), Immediate(2));
__ j(kNegative, type_check_slow_path->GetEntryLabel());
// Go to next interface if the classes do not match.
diff --git a/compiler/optimizing/code_generator_x86_64.cc b/compiler/optimizing/code_generator_x86_64.cc
index c495d48406..4855b086ae 100644
--- a/compiler/optimizing/code_generator_x86_64.cc
+++ b/compiler/optimizing/code_generator_x86_64.cc
@@ -6267,8 +6267,9 @@ void CodeGeneratorX86_64::CheckGCCardIsValid(CpuRegister temp,
// assert (!clean || !self->is_gc_marking)
__ cmpb(Address(temp, card, TIMES_1, 0), Immediate(gc::accounting::CardTable::kCardClean));
__ j(kNotEqual, &done);
- __ gs()->cmpl(Address::Absolute(Thread::IsGcMarkingOffset<kX86_64PointerSize>(), true),
- Immediate(0));
+ __ gs()->cmpl(
+ Address::Absolute(Thread::IsGcMarkingOffset<kX86_64PointerSize>(), /* no_rip= */ true),
+ Immediate(0));
__ j(kEqual, &done);
__ int3();
__ Bind(&done);
@@ -7007,6 +7008,9 @@ void InstructionCodeGeneratorX86_64::VisitThrow(HThrow* instruction) {
// Temp is used for read barrier.
static size_t NumberOfInstanceOfTemps(bool emit_read_barrier, TypeCheckKind type_check_kind) {
+ if (type_check_kind == TypeCheckKind::kInterfaceCheck) {
+ return 1;
+ }
if (emit_read_barrier &&
!kUseBakerReadBarrier &&
(type_check_kind == TypeCheckKind::kAbstractClassCheck ||
@@ -7021,9 +7025,6 @@ static size_t NumberOfInstanceOfTemps(bool emit_read_barrier, TypeCheckKind type
// interface pointer, the current interface is compared in memory.
// The other checks have one temp for loading the object's class.
static size_t NumberOfCheckCastTemps(bool emit_read_barrier, TypeCheckKind type_check_kind) {
- if (type_check_kind == TypeCheckKind::kInterfaceCheck) {
- return 2;
- }
return 1 + NumberOfInstanceOfTemps(emit_read_barrier, type_check_kind);
}
@@ -7035,15 +7036,16 @@ void LocationsBuilderX86_64::VisitInstanceOf(HInstanceOf* instruction) {
case TypeCheckKind::kExactCheck:
case TypeCheckKind::kAbstractClassCheck:
case TypeCheckKind::kClassHierarchyCheck:
- case TypeCheckKind::kArrayObjectCheck: {
+ case TypeCheckKind::kArrayObjectCheck:
+ case TypeCheckKind::kInterfaceCheck: {
bool needs_read_barrier = codegen_->InstanceOfNeedsReadBarrier(instruction);
call_kind = needs_read_barrier ? LocationSummary::kCallOnSlowPath : LocationSummary::kNoCall;
- baker_read_barrier_slow_path = kUseBakerReadBarrier && needs_read_barrier;
+ baker_read_barrier_slow_path = (kUseBakerReadBarrier && needs_read_barrier) &&
+ (type_check_kind != TypeCheckKind::kInterfaceCheck);
break;
}
case TypeCheckKind::kArrayCheck:
case TypeCheckKind::kUnresolvedCheck:
- case TypeCheckKind::kInterfaceCheck:
call_kind = LocationSummary::kCallOnSlowPath;
break;
case TypeCheckKind::kBitstringCheck:
@@ -7060,6 +7062,8 @@ void LocationsBuilderX86_64::VisitInstanceOf(HInstanceOf* instruction) {
locations->SetInAt(1, Location::ConstantLocation(instruction->InputAt(1)));
locations->SetInAt(2, Location::ConstantLocation(instruction->InputAt(2)));
locations->SetInAt(3, Location::ConstantLocation(instruction->InputAt(3)));
+ } else if (type_check_kind == TypeCheckKind::kInterfaceCheck) {
+ locations->SetInAt(1, Location::RequiresRegister());
} else {
locations->SetInAt(1, Location::Any());
}
@@ -7080,10 +7084,14 @@ void InstructionCodeGeneratorX86_64::VisitInstanceOf(HInstanceOf* instruction) {
const size_t num_temps = NumberOfInstanceOfTemps(codegen_->EmitReadBarrier(), type_check_kind);
DCHECK_LE(num_temps, 1u);
Location maybe_temp_loc = (num_temps >= 1u) ? locations->GetTemp(0) : Location::NoLocation();
- uint32_t class_offset = mirror::Object::ClassOffset().Int32Value();
- uint32_t super_offset = mirror::Class::SuperClassOffset().Int32Value();
- uint32_t component_offset = mirror::Class::ComponentTypeOffset().Int32Value();
- uint32_t primitive_offset = mirror::Class::PrimitiveTypeOffset().Int32Value();
+ const uint32_t class_offset = mirror::Object::ClassOffset().Int32Value();
+ const uint32_t super_offset = mirror::Class::SuperClassOffset().Int32Value();
+ const uint32_t component_offset = mirror::Class::ComponentTypeOffset().Int32Value();
+ const uint32_t primitive_offset = mirror::Class::PrimitiveTypeOffset().Int32Value();
+ const uint32_t iftable_offset = mirror::Class::IfTableOffset().Uint32Value();
+ const uint32_t array_length_offset = mirror::Array::LengthOffset().Uint32Value();
+ const uint32_t object_array_data_offset =
+ mirror::Array::DataOffset(kHeapReferenceSize).Uint32Value();
SlowPathCode* slow_path = nullptr;
NearLabel done, zero;
@@ -7258,11 +7266,70 @@ void InstructionCodeGeneratorX86_64::VisitInstanceOf(HInstanceOf* instruction) {
break;
}
- case TypeCheckKind::kUnresolvedCheck:
case TypeCheckKind::kInterfaceCheck: {
+ if (codegen_->InstanceOfNeedsReadBarrier(instruction)) {
+ DCHECK(locations->OnlyCallsOnSlowPath());
+ slow_path = new (codegen_->GetScopedAllocator()) TypeCheckSlowPathX86_64(
+ instruction, /* is_fatal= */ false);
+ codegen_->AddSlowPath(slow_path);
+ if (codegen_->EmitNonBakerReadBarrier()) {
+ __ jmp(slow_path->GetEntryLabel());
+ break;
+ }
+ // For Baker read barrier, take the slow path while marking.
+ __ gs()->cmpl(
+ Address::Absolute(Thread::IsGcMarkingOffset<kX86_64PointerSize>(), /* no_rip= */ true),
+ Immediate(0));
+ __ j(kNotEqual, slow_path->GetEntryLabel());
+ }
+
+ // Fast-path without read barriers.
+ CpuRegister temp = maybe_temp_loc.AsRegister<CpuRegister>();
+ // /* HeapReference<Class> */ temp = obj->klass_
+ __ movl(temp, Address(obj, class_offset));
+ __ MaybeUnpoisonHeapReference(temp);
+ // /* HeapReference<Class> */ temp = temp->iftable_
+ __ movl(temp, Address(temp, iftable_offset));
+ __ MaybeUnpoisonHeapReference(temp);
+ // Load the size of the `IfTable`. The `Class::iftable_` is never null.
+ __ movl(out, Address(temp, array_length_offset));
+ // Maybe poison the `cls` for direct comparison with memory.
+ __ MaybePoisonHeapReference(cls.AsRegister<CpuRegister>());
+ // Loop through the iftable and check if any class matches.
+ NearLabel loop, end;
+ __ Bind(&loop);
+ // Check if we still have an entry to compare.
+ __ subl(out, Immediate(2));
+ __ j(kNegative, (zero.IsLinked() && !kPoisonHeapReferences) ? &zero : &end);
+ // Go to next interface if the classes do not match.
+ __ cmpl(cls.AsRegister<CpuRegister>(),
+ CodeGeneratorX86_64::ArrayAddress(temp, out_loc, TIMES_4, object_array_data_offset));
+ __ j(kNotEqual, &loop);
+ if (zero.IsLinked()) {
+ __ movl(out, Immediate(1));
+ // If `cls` was poisoned above, unpoison it.
+ __ MaybeUnpoisonHeapReference(cls.AsRegister<CpuRegister>());
+ __ jmp(&done);
+ if (kPoisonHeapReferences) {
+ // The false case needs to unpoison the class before jumping to `zero`.
+ __ Bind(&end);
+ __ UnpoisonHeapReference(cls.AsRegister<CpuRegister>());
+ __ jmp(&zero);
+ }
+ } else {
+ // To reduce branching, use the fact that the false case branches with a `-2` in `out`.
+ __ movl(out, Immediate(-1));
+ __ Bind(&end);
+ __ addl(out, Immediate(2));
+ // If `cls` was poisoned above, unpoison it.
+ __ MaybeUnpoisonHeapReference(cls.AsRegister<CpuRegister>());
+ }
+ break;
+ }
+
+ case TypeCheckKind::kUnresolvedCheck: {
// Note that we indeed only call on slow path, but we always go
- // into the slow path for the unresolved and interface check
- // cases.
+ // into the slow path for the unresolved check case.
//
// We cannot directly call the InstanceofNonTrivial runtime
// entry point without resorting to a type checking slow path
@@ -7532,14 +7599,14 @@ void InstructionCodeGeneratorX86_64::VisitCheckCast(HCheckCast* instruction) {
iftable_offset,
maybe_temp2_loc,
kWithoutReadBarrier);
- // Iftable is never null.
+ // Load the size of the `IfTable`. The `Class::iftable_` is never null.
__ movl(maybe_temp2_loc.AsRegister<CpuRegister>(), Address(temp, array_length_offset));
// Maybe poison the `cls` for direct comparison with memory.
__ MaybePoisonHeapReference(cls.AsRegister<CpuRegister>());
// Loop through the iftable and check if any class matches.
NearLabel start_loop;
__ Bind(&start_loop);
- // Need to subtract first to handle the empty array case.
+ // Check if we still have an entry to compare.
__ subl(maybe_temp2_loc.AsRegister<CpuRegister>(), Immediate(2));
__ j(kNegative, type_check_slow_path->GetEntryLabel());
// Go to next interface if the classes do not match.
diff --git a/libartservice/service/java/com/android/server/art/AidlUtils.java b/libartservice/service/java/com/android/server/art/AidlUtils.java
index 4a1b75eaab..d42a6539c4 100644
--- a/libartservice/service/java/com/android/server/art/AidlUtils.java
+++ b/libartservice/service/java/com/android/server/art/AidlUtils.java
@@ -34,16 +34,25 @@ public final class AidlUtils {
private AidlUtils() {}
@NonNull
- public static ArtifactsPath buildArtifactsPath(
- @NonNull String dexPath, @NonNull String isa, boolean isInDalvikCache) {
+ private static ArtifactsPath buildArtifactsPath(@NonNull String dexPath, @NonNull String isa,
+ boolean isInDalvikCache, boolean isPreReboot) {
var artifactsPath = new ArtifactsPath();
artifactsPath.dexPath = dexPath;
artifactsPath.isa = isa;
artifactsPath.isInDalvikCache = isInDalvikCache;
+ artifactsPath.isPreReboot = isPreReboot;
return artifactsPath;
}
@NonNull
+ public static ArtifactsPath buildArtifactsPathAsInput(
+ @NonNull String dexPath, @NonNull String isa, boolean isInDalvikCache) {
+ // The callers expect artifacts to be used as inputs, so we should always pick the
+ // non-Pre-reboot ones.
+ return buildArtifactsPath(dexPath, isa, isInDalvikCache, false /* isPreReboot */);
+ }
+
+ @NonNull
public static FsPermission buildFsPermission(
int uid, int gid, boolean isOtherReadable, boolean isOtherExecutable) {
var fsPermission = new FsPermission();
@@ -78,34 +87,41 @@ public final class AidlUtils {
@NonNull
public static OutputArtifacts buildOutputArtifacts(@NonNull String dexPath, @NonNull String isa,
- boolean isInDalvikCache, @NonNull PermissionSettings permissionSettings) {
+ boolean isInDalvikCache, @NonNull PermissionSettings permissionSettings,
+ boolean isPreReboot) {
var outputArtifacts = new OutputArtifacts();
- outputArtifacts.artifactsPath = buildArtifactsPath(dexPath, isa, isInDalvikCache);
+ outputArtifacts.artifactsPath =
+ buildArtifactsPath(dexPath, isa, isInDalvikCache, isPreReboot);
outputArtifacts.permissionSettings = permissionSettings;
return outputArtifacts;
}
@NonNull
- public static PrimaryRefProfilePath buildPrimaryRefProfilePath(
- @NonNull String packageName, @NonNull String profileName) {
+ private static PrimaryRefProfilePath buildPrimaryRefProfilePath(
+ @NonNull String packageName, @NonNull String profileName, boolean isPreReboot) {
var primaryRefProfilePath = new PrimaryRefProfilePath();
primaryRefProfilePath.packageName = packageName;
primaryRefProfilePath.profileName = profileName;
+ primaryRefProfilePath.isPreReboot = isPreReboot;
return primaryRefProfilePath;
}
@NonNull
- public static SecondaryRefProfilePath buildSecondaryRefProfilePath(@NonNull String dexPath) {
+ private static SecondaryRefProfilePath buildSecondaryRefProfilePath(
+ @NonNull String dexPath, boolean isPreReboot) {
var secondaryRefProfilePath = new SecondaryRefProfilePath();
secondaryRefProfilePath.dexPath = dexPath;
+ secondaryRefProfilePath.isPreReboot = isPreReboot;
return secondaryRefProfilePath;
}
@NonNull
- public static ProfilePath buildProfilePathForPrimaryRef(
+ public static ProfilePath buildProfilePathForPrimaryRefAsInput(
@NonNull String packageName, @NonNull String profileName) {
+ // The callers expect a profile to be used as an input, so we should always pick the
+ // non-Pre-reboot one.
return ProfilePath.primaryRefProfilePath(
- buildPrimaryRefProfilePath(packageName, profileName));
+ buildPrimaryRefProfilePath(packageName, profileName, false /* isPreReboot */));
}
@NonNull
@@ -131,8 +147,11 @@ public final class AidlUtils {
}
@NonNull
- public static ProfilePath buildProfilePathForSecondaryRef(@NonNull String dexPath) {
- return ProfilePath.secondaryRefProfilePath(buildSecondaryRefProfilePath(dexPath));
+ public static ProfilePath buildProfilePathForSecondaryRefAsInput(@NonNull String dexPath) {
+ // The callers expect a profile to be used as an input, so we should always pick the
+ // non-Pre-reboot one.
+ return ProfilePath.secondaryRefProfilePath(
+ buildSecondaryRefProfilePath(dexPath, false /* isPreReboot */));
}
@NonNull
@@ -156,18 +175,18 @@ public final class AidlUtils {
@NonNull
public static OutputProfile buildOutputProfileForPrimary(@NonNull String packageName,
- @NonNull String profileName, int uid, int gid, boolean isPublic) {
- return buildOutputProfile(WritableProfilePath.forPrimary(
- buildPrimaryRefProfilePath(packageName, profileName)),
+ @NonNull String profileName, int uid, int gid, boolean isPublic, boolean isPreReboot) {
+ return buildOutputProfile(WritableProfilePath.forPrimary(buildPrimaryRefProfilePath(
+ packageName, profileName, isPreReboot)),
uid, gid, isPublic);
}
@NonNull
public static OutputProfile buildOutputProfileForSecondary(
- @NonNull String dexPath, int uid, int gid, boolean isPublic) {
- return buildOutputProfile(
- WritableProfilePath.forSecondary(buildSecondaryRefProfilePath(dexPath)), uid, gid,
- isPublic);
+ @NonNull String dexPath, int uid, int gid, boolean isPublic, boolean isPreReboot) {
+ return buildOutputProfile(WritableProfilePath.forSecondary(
+ buildSecondaryRefProfilePath(dexPath, isPreReboot)),
+ uid, gid, isPublic);
}
@NonNull
@@ -190,13 +209,15 @@ public final class AidlUtils {
@NonNull
public static String toString(@NonNull PrimaryRefProfilePath profile) {
- return String.format("PrimaryRefProfilePath[packageName = %s, profileName = %s]",
- profile.packageName, profile.profileName);
+ return String.format(
+ "PrimaryRefProfilePath[packageName = %s, profileName = %s, isPreReboot = %b]",
+ profile.packageName, profile.profileName, profile.isPreReboot);
}
@NonNull
public static String toString(@NonNull SecondaryRefProfilePath profile) {
- return String.format("SecondaryRefProfilePath[dexPath = %s]", profile.dexPath);
+ return String.format("SecondaryRefProfilePath[dexPath = %s, isPreReboot = %b]",
+ profile.dexPath, profile.isPreReboot);
}
@NonNull
diff --git a/libartservice/service/java/com/android/server/art/ArtFileManager.java b/libartservice/service/java/com/android/server/art/ArtFileManager.java
index b46c8df9f2..234ca01f7c 100644
--- a/libartservice/service/java/com/android/server/art/ArtFileManager.java
+++ b/libartservice/service/java/com/android/server/art/ArtFileManager.java
@@ -111,7 +111,7 @@ public class ArtFileManager {
boolean isInDalvikCache = Utils.isInDalvikCache(pkgState, mInjector.getArtd());
for (PrimaryDexInfo dexInfo : PrimaryDexUtils.getDexInfo(pkg)) {
for (Abi abi : Utils.getAllAbis(pkgState)) {
- artifacts.add(AidlUtils.buildArtifactsPath(
+ artifacts.add(AidlUtils.buildArtifactsPathAsInput(
dexInfo.dexPath(), abi.isa(), isInDalvikCache));
// Runtime images are only generated for primary dex files.
runtimeArtifacts.add(AidlUtils.buildRuntimeArtifactsPath(
@@ -123,7 +123,7 @@ public class ArtFileManager {
if (options.forSecondaryDex()) {
for (SecondaryDexInfo dexInfo : getSecondaryDexInfo(pkgState, options)) {
for (Abi abi : Utils.getAllAbisForNames(dexInfo.abiNames(), pkgState)) {
- artifacts.add(AidlUtils.buildArtifactsPath(
+ artifacts.add(AidlUtils.buildArtifactsPathAsInput(
dexInfo.dexPath(), abi.isa(), false /* isInDalvikCache */));
}
}
@@ -153,8 +153,9 @@ public class ArtFileManager {
dexInfo.dexPath(), abi.isa(), dexInfo.classLoaderContext());
if (result.artifactsLocation == ArtifactsLocation.DALVIK_CACHE
|| result.artifactsLocation == ArtifactsLocation.NEXT_TO_DEX) {
- ArtifactsPath thisArtifacts = AidlUtils.buildArtifactsPath(dexInfo.dexPath(),
- abi.isa(), result.artifactsLocation == ArtifactsLocation.DALVIK_CACHE);
+ ArtifactsPath thisArtifacts =
+ AidlUtils.buildArtifactsPathAsInput(dexInfo.dexPath(), abi.isa(),
+ result.artifactsLocation == ArtifactsLocation.DALVIK_CACHE);
if (result.compilationReason.equals(ArtConstants.REASON_VDEX)) {
// Only the VDEX file is usable.
vdexFiles.add(VdexPath.artifactsPath(thisArtifacts));
@@ -190,7 +191,7 @@ public class ArtFileManager {
if (options.forPrimaryDex()) {
for (PrimaryDexInfo dexInfo : PrimaryDexUtils.getDexInfo(pkg)) {
- refProfiles.add(PrimaryDexUtils.buildRefProfilePath(pkgState, dexInfo));
+ refProfiles.add(PrimaryDexUtils.buildRefProfilePathAsInput(pkgState, dexInfo));
curProfiles.addAll(mInjector.isSystemOrRootOrShell()
? PrimaryDexUtils.getCurProfiles(
mInjector.getUserManager(), pkgState, dexInfo)
@@ -206,7 +207,8 @@ public class ArtFileManager {
&& !mInjector.getCallingUserHandle().equals(dexInfo.userHandle())) {
continue;
}
- refProfiles.add(AidlUtils.buildProfilePathForSecondaryRef(dexInfo.dexPath()));
+ refProfiles.add(
+ AidlUtils.buildProfilePathForSecondaryRefAsInput(dexInfo.dexPath()));
curProfiles.add(AidlUtils.buildProfilePathForSecondaryCur(dexInfo.dexPath()));
}
}
diff --git a/libartservice/service/java/com/android/server/art/ArtManagerLocal.java b/libartservice/service/java/com/android/server/art/ArtManagerLocal.java
index b548f9d83d..276e6eb7f5 100644
--- a/libartservice/service/java/com/android/server/art/ArtManagerLocal.java
+++ b/libartservice/service/java/com/android/server/art/ArtManagerLocal.java
@@ -169,7 +169,7 @@ public final class ArtManagerLocal {
public int handleShellCommand(@NonNull Binder target, @NonNull ParcelFileDescriptor in,
@NonNull ParcelFileDescriptor out, @NonNull ParcelFileDescriptor err,
@NonNull String[] args) {
- return new ArtShellCommand(this, mInjector.getPackageManagerLocal())
+ return new ArtShellCommand(this, mInjector.getPackageManagerLocal(), mInjector.getContext())
.exec(target, in.getFileDescriptor(), out.getFileDescriptor(),
err.getFileDescriptor(), args);
}
@@ -743,12 +743,14 @@ public final class ArtManagerLocal {
List<ProfilePath> profiles = new ArrayList<>();
+ // Doesn't support Pre-reboot.
InitProfileResult result = Utils.getOrInitReferenceProfile(mInjector.getArtd(),
- dexInfo.dexPath(), PrimaryDexUtils.buildRefProfilePath(pkgState, dexInfo),
+ dexInfo.dexPath(),
+ PrimaryDexUtils.buildRefProfilePathAsInput(pkgState, dexInfo),
PrimaryDexUtils.getExternalProfiles(dexInfo),
dmInfo.config().getEnableEmbeddedProfile(),
PrimaryDexUtils.buildOutputProfile(pkgState, dexInfo, Process.SYSTEM_UID,
- Process.SYSTEM_UID, false /* isPublic */));
+ Process.SYSTEM_UID, false /* isPublic */, false /* isPreReboot */));
if (!result.externalProfileErrors().isEmpty()) {
Log.e(TAG,
"Error occurred when initializing from external profiles: "
@@ -764,8 +766,10 @@ public final class ArtManagerLocal {
profiles.addAll(
PrimaryDexUtils.getCurProfiles(mInjector.getUserManager(), pkgState, dexInfo));
- OutputProfile output = PrimaryDexUtils.buildOutputProfile(pkgState, dexInfo,
- Process.SYSTEM_UID, Process.SYSTEM_UID, false /* isPublic */);
+ // Doesn't support Pre-reboot.
+ OutputProfile output =
+ PrimaryDexUtils.buildOutputProfile(pkgState, dexInfo, Process.SYSTEM_UID,
+ Process.SYSTEM_UID, false /* isPublic */, false /* isPreReboot */);
try {
return mergeProfilesAndGetFd(profiles, output, List.of(dexInfo.dexPath()), options);
@@ -805,7 +809,7 @@ public final class ArtManagerLocal {
List<ProfilePath> profiles = new ArrayList<>();
// System server profiles.
- profiles.add(AidlUtils.buildProfilePathForPrimaryRef(
+ profiles.add(AidlUtils.buildProfilePathForPrimaryRefAsInput(
Utils.PLATFORM_PACKAGE_NAME, PrimaryDexUtils.PROFILE_PRIMARY));
for (UserHandle handle :
mInjector.getUserManager().getUserHandles(true /* excludeDying */)) {
@@ -825,9 +829,10 @@ public final class ArtManagerLocal {
}
});
+ // Doesn't support Pre-reboot.
OutputProfile output = AidlUtils.buildOutputProfileForPrimary(Utils.PLATFORM_PACKAGE_NAME,
PrimaryDexUtils.PROFILE_PRIMARY, Process.SYSTEM_UID, Process.SYSTEM_UID,
- false /* isPublic */);
+ false /* isPublic */, false /* isPreReboot */);
List<String> dexPaths = Arrays.stream(CLASSPATHS_FOR_BOOT_IMAGE_PROFILE)
.map(envVar -> Constants.getenv(envVar))
diff --git a/libartservice/service/java/com/android/server/art/ArtShellCommand.java b/libartservice/service/java/com/android/server/art/ArtShellCommand.java
index 592f9cd36f..9203143abe 100644
--- a/libartservice/service/java/com/android/server/art/ArtShellCommand.java
+++ b/libartservice/service/java/com/android/server/art/ArtShellCommand.java
@@ -31,6 +31,7 @@ import static com.android.server.art.model.DexoptStatus.DexContainerFileDexoptSt
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.content.Context;
import android.os.Binder;
import android.os.Build;
import android.os.CancellationSignal;
@@ -45,12 +46,14 @@ import androidx.annotation.RequiresApi;
import com.android.internal.annotations.GuardedBy;
import com.android.modules.utils.BasicShellCommandHandler;
+import com.android.modules.utils.build.SdkLevel;
import com.android.server.art.model.ArtFlags;
import com.android.server.art.model.DeleteResult;
import com.android.server.art.model.DexoptParams;
import com.android.server.art.model.DexoptResult;
import com.android.server.art.model.DexoptStatus;
import com.android.server.art.model.OperationProgress;
+import com.android.server.art.prereboot.PreRebootDriver;
import com.android.server.pm.PackageManagerLocal;
import com.android.server.pm.pkg.AndroidPackage;
import com.android.server.pm.pkg.PackageState;
@@ -92,15 +95,17 @@ public final class ArtShellCommand extends BasicShellCommandHandler {
private final ArtManagerLocal mArtManagerLocal;
private final PackageManagerLocal mPackageManagerLocal;
+ private final Context mContext;
@GuardedBy("sCancellationSignalMap")
@NonNull
private static final Map<String, CancellationSignal> sCancellationSignalMap = new HashMap<>();
public ArtShellCommand(@NonNull ArtManagerLocal artManagerLocal,
- @NonNull PackageManagerLocal packageManagerLocal) {
+ @NonNull PackageManagerLocal packageManagerLocal, @NonNull Context context) {
mArtManagerLocal = artManagerLocal;
mPackageManagerLocal = packageManagerLocal;
+ mContext = context;
}
@Override
@@ -181,6 +186,10 @@ public final class ArtShellCommand extends BasicShellCommandHandler {
pw.println("Profiles cleared");
return 0;
}
+ case "pre-reboot-dexopt": {
+ // TODO(b/311377497): Remove this command once the development is done.
+ return handlePreRebootDexopt(pw);
+ }
default:
pw.printf("Error: Unknown 'art' sub-command '%s'\n", subcmd);
pw.println("See 'pm help' for help");
@@ -631,6 +640,33 @@ public final class ArtShellCommand extends BasicShellCommandHandler {
return 0;
}
+ private int handlePreRebootDexopt(@NonNull PrintWriter pw) {
+ if (!SdkLevel.isAtLeastV()) {
+ pw.println("Error: Unsupported command 'pre-reboot-dexopt'");
+ return 1;
+ }
+
+ String otaSlot = null;
+
+ String opt = getNextOption();
+ if ("--slot".equals(opt)) {
+ otaSlot = getNextArgRequired();
+ } else if (opt != null) {
+ pw.println("Error: Unknown option: " + opt);
+ return 1;
+ }
+
+ try (var signal = new WithCancellationSignal(pw, true /* verbose */)) {
+ if (new PreRebootDriver(mContext).run(otaSlot, signal.get())) {
+ pw.println("Job finished. See logs for details");
+ return 0;
+ } else {
+ pw.println("Job failed. See logs for details");
+ return 1;
+ }
+ }
+ }
+
@Override
public void onHelp() {
// No one should call this. The help text should be printed by the `onHelp` handler of `cmd
diff --git a/libartservice/service/java/com/android/server/art/BackgroundDexoptJobStatsReporter.java b/libartservice/service/java/com/android/server/art/BackgroundDexoptJobStatsReporter.java
index dc98914292..def1feb353 100644
--- a/libartservice/service/java/com/android/server/art/BackgroundDexoptJobStatsReporter.java
+++ b/libartservice/service/java/com/android/server/art/BackgroundDexoptJobStatsReporter.java
@@ -29,7 +29,7 @@ public class BackgroundDexoptJobStatsReporter {
// simplicity.
ArtStatsLog.write(ArtStatsLog.BACKGROUND_DEXOPT_JOB_ENDED,
ArtStatsLog.BACKGROUND_DEXOPT_JOB_ENDED__STATUS__STATUS_FATAL_ERROR,
- JobParameters.STOP_REASON_UNDEFINED, 0 /* durationMs */, 0 /* deprecated */,
+ JobParameters.STOP_REASON_UNDEFINED, 0L /* durationMs */, 0L /* deprecated */,
0 /* optimizedPackagesCount */, 0 /* packagesDependingOnBootClasspathCount */,
0 /* totalPackagesCount */,
ArtStatsLog.BACKGROUND_DEXOPT_JOB_ENDED__PASS__PASS_MAIN);
@@ -58,7 +58,7 @@ public class BackgroundDexoptJobStatsReporter {
ArtStatsLog.write(ArtStatsLog.BACKGROUND_DEXOPT_JOB_ENDED,
getStatusForStats(dexoptResult, stopReason), reportedStopReason, durationMs,
- 0 /* deprecated */, getDexoptedPackagesCount(packageDexoptResults),
+ 0L /* deprecated */, getDexoptedPackagesCount(packageDexoptResults),
getPackagesDependingOnBootClasspathCount(packageDexoptResults),
packageDexoptResults.size(), toStatsdPassEnum(pass));
}
diff --git a/libartservice/service/java/com/android/server/art/DexUseManagerLocal.java b/libartservice/service/java/com/android/server/art/DexUseManagerLocal.java
index 04414d0369..c6394d3bd6 100644
--- a/libartservice/service/java/com/android/server/art/DexUseManagerLocal.java
+++ b/libartservice/service/java/com/android/server/art/DexUseManagerLocal.java
@@ -168,6 +168,7 @@ public class DexUseManagerLocal {
/** Notifies dex use manager that {@link Context#registerReceiver} is ready for use. */
public void systemReady() {
+ Utils.check(!mInjector.isPreReboot());
// Save the data when the device is being shut down. The receiver is blocking, with a
// 10s timeout.
mInjector.getContext().registerReceiver(new BroadcastReceiver() {
@@ -528,6 +529,7 @@ public class DexUseManagerLocal {
}
private void save() {
+ Utils.check(!mInjector.isPreReboot());
var builder = DexUseProto.newBuilder();
int thisRevision;
synchronized (mLock) {
@@ -561,6 +563,7 @@ public class DexUseManagerLocal {
}
private void maybeSaveAsync() {
+ Utils.check(!mInjector.isPreReboot());
mDebouncer.maybeRunAsync(this::save);
}
@@ -1020,6 +1023,16 @@ public class DexUseManagerLocal {
var record = new SecondaryDexUseRecord();
record.fromProto(recordProto);
+
+ if (!Utils.isNativeAbi(record.mAbiName)) {
+ // The native ABI set has changed by an OTA since the ABI name was recorded.
+ Log.i(TAG,
+ String.format("Ignoring secondary dex use record with non-native ABI "
+ + "'%s' for '%s'",
+ record.mAbiName, proto.getDexFile()));
+ continue;
+ }
+
mRecordByLoader.put(
DexLoader.create(Utils.assertNonEmpty(recordProto.getLoadingPackageName()),
recordProto.getIsolatedProcess()),
@@ -1163,7 +1176,7 @@ public class DexUseManagerLocal {
mContext = context;
// Call the getters for various dependencies, to ensure correct initialization order.
- ArtModuleServiceInitializer.getArtModuleServiceManager();
+ GlobalInjector.getInstance().checkArtModuleServiceManager();
getPackageManagerLocal();
}
@@ -1199,6 +1212,10 @@ public class DexUseManagerLocal {
}
}
+ public boolean isPreReboot() {
+ return GlobalInjector.getInstance().isPreReboot();
+ }
+
@NonNull
private PackageManagerLocal getPackageManagerLocal() {
return Objects.requireNonNull(
diff --git a/libartservice/service/java/com/android/server/art/Dexopter.java b/libartservice/service/java/com/android/server/art/Dexopter.java
index d8d6b3d5c6..69b861527e 100644
--- a/libartservice/service/java/com/android/server/art/Dexopter.java
+++ b/libartservice/service/java/com/android/server/art/Dexopter.java
@@ -293,7 +293,9 @@ public abstract class Dexopter<DexInfoType extends DetailedDexInfo> {
profile = null;
}
}
- if (profileMerged) {
+ // We keep the current profiles in the Pre-reboot Dexopt case, to leave it to
+ // background dexopt.
+ if (profileMerged && !mInjector.isPreReboot()) {
// Note that this is just an optimization, to reduce the amount of data that
// the runtime writes on every profile save. The profile merge result on the
// next run won't change regardless of whether the cleanup is done or not
@@ -393,8 +395,8 @@ public abstract class Dexopter<DexInfoType extends DetailedDexInfo> {
private InitProfileResult getOrInitReferenceProfile(
@NonNull DexInfoType dexInfo, boolean enableEmbeddedProfile) throws RemoteException {
return Utils.getOrInitReferenceProfile(mInjector.getArtd(), dexInfo.dexPath(),
- buildRefProfilePath(dexInfo), getExternalProfiles(dexInfo), enableEmbeddedProfile,
- buildOutputProfile(dexInfo, true /* isPublic */));
+ buildRefProfilePathAsInput(dexInfo), getExternalProfiles(dexInfo),
+ enableEmbeddedProfile, buildOutputProfile(dexInfo, true /* isPublic */));
}
@Nullable
@@ -472,7 +474,7 @@ public abstract class Dexopter<DexInfoType extends DetailedDexInfo> {
dexoptTrigger |= DexoptTrigger.COMPILER_FILTER_IS_SAME;
}
- ArtifactsPath existingArtifactsPath = AidlUtils.buildArtifactsPath(
+ ArtifactsPath existingArtifactsPath = AidlUtils.buildArtifactsPathAsInput(
target.dexInfo().dexPath(), target.isa(), target.isInDalvikCache());
if (options.needsToBePublic()
@@ -493,8 +495,9 @@ public abstract class Dexopter<DexInfoType extends DetailedDexInfo> {
@NonNull PermissionSettings permissionSettings, @PriorityClass int priorityClass,
@NonNull DexoptOptions dexoptOptions, IArtdCancellationSignal artdCancellationSignal)
throws RemoteException {
- OutputArtifacts outputArtifacts = AidlUtils.buildOutputArtifacts(target.dexInfo().dexPath(),
- target.isa(), target.isInDalvikCache(), permissionSettings);
+ OutputArtifacts outputArtifacts =
+ AidlUtils.buildOutputArtifacts(target.dexInfo().dexPath(), target.isa(),
+ target.isInDalvikCache(), permissionSettings, mInjector.isPreReboot());
VdexPath inputVdex =
getInputVdex(getDexoptNeededResult, target.dexInfo().dexPath(), target.isa());
@@ -527,7 +530,9 @@ public abstract class Dexopter<DexInfoType extends DetailedDexInfo> {
// images are still usable, technically, they can still be used to improve runtime
// performance; if they are no longer usable, they will be deleted by the file GC during the
// daily background dexopt job anyway.
- if (!result.cancelled) {
+ // We keep the runtime artifacts in the Pre-reboot Dexopt case because they are still needed
+ // before the reboot.
+ if (!result.cancelled && !mInjector.isPreReboot()) {
mInjector.getArtd().deleteRuntimeArtifacts(AidlUtils.buildRuntimeArtifactsPath(
mPkgState.getPackageName(), target.dexInfo().dexPath(), target.isa()));
}
@@ -543,11 +548,11 @@ public abstract class Dexopter<DexInfoType extends DetailedDexInfo> {
}
switch (getDexoptNeededResult.artifactsLocation) {
case ArtifactsLocation.DALVIK_CACHE:
- return VdexPath.artifactsPath(
- AidlUtils.buildArtifactsPath(dexPath, isa, true /* isInDalvikCache */));
+ return VdexPath.artifactsPath(AidlUtils.buildArtifactsPathAsInput(
+ dexPath, isa, true /* isInDalvikCache */));
case ArtifactsLocation.NEXT_TO_DEX:
- return VdexPath.artifactsPath(
- AidlUtils.buildArtifactsPath(dexPath, isa, false /* isInDalvikCache */));
+ return VdexPath.artifactsPath(AidlUtils.buildArtifactsPathAsInput(
+ dexPath, isa, false /* isInDalvikCache */));
case ArtifactsLocation.DM:
// The DM file is passed to dex2oat as a separate flag whenever it exists.
return null;
@@ -635,7 +640,8 @@ public abstract class Dexopter<DexInfoType extends DetailedDexInfo> {
@NonNull protected abstract List<Abi> getAllAbis(@NonNull DexInfoType dexInfo);
/** Returns the path to the reference profile of the given dex file. */
- @NonNull protected abstract ProfilePath buildRefProfilePath(@NonNull DexInfoType dexInfo);
+ @NonNull
+ protected abstract ProfilePath buildRefProfilePathAsInput(@NonNull DexInfoType dexInfo);
/**
* Returns the data structure that represents the temporary profile to use during processing.
@@ -773,5 +779,9 @@ public abstract class Dexopter<DexInfoType extends DetailedDexInfo> {
public DexMetadataHelper getDexMetadataHelper() {
return new DexMetadataHelper();
}
+
+ public boolean isPreReboot() {
+ return GlobalInjector.getInstance().isPreReboot();
+ }
}
}
diff --git a/libartservice/service/java/com/android/server/art/PreRebootDexoptJob.java b/libartservice/service/java/com/android/server/art/PreRebootDexoptJob.java
index 1510bb4e84..b8a55af7e0 100644
--- a/libartservice/service/java/com/android/server/art/PreRebootDexoptJob.java
+++ b/libartservice/service/java/com/android/server/art/PreRebootDexoptJob.java
@@ -29,7 +29,13 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.server.art.model.ArtFlags;
import com.android.server.art.model.ArtServiceJobInterface;
-/** @hide */
+/**
+ * The Pre-reboot Dexopt job.
+ *
+ * During Pre-reboot Dexopt, the old version of this code is run.
+ *
+ * @hide
+ */
@RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
public class PreRebootDexoptJob implements ArtServiceJobInterface {
private static final String TAG = ArtManagerLocal.TAG;
diff --git a/libartservice/service/java/com/android/server/art/PrimaryDexUtils.java b/libartservice/service/java/com/android/server/art/PrimaryDexUtils.java
index 4615886625..c37fdbe6e3 100644
--- a/libartservice/service/java/com/android/server/art/PrimaryDexUtils.java
+++ b/libartservice/service/java/com/android/server/art/PrimaryDexUtils.java
@@ -312,18 +312,20 @@ public class PrimaryDexUtils {
}
@NonNull
- public static ProfilePath buildRefProfilePath(
+ public static ProfilePath buildRefProfilePathAsInput(
@NonNull PackageState pkgState, @NonNull PrimaryDexInfo dexInfo) {
String profileName = getProfileName(dexInfo.splitName());
- return AidlUtils.buildProfilePathForPrimaryRef(pkgState.getPackageName(), profileName);
+ return AidlUtils.buildProfilePathForPrimaryRefAsInput(
+ pkgState.getPackageName(), profileName);
}
@NonNull
public static OutputProfile buildOutputProfile(@NonNull PackageState pkgState,
- @NonNull PrimaryDexInfo dexInfo, int uid, int gid, boolean isPublic) {
+ @NonNull PrimaryDexInfo dexInfo, int uid, int gid, boolean isPublic,
+ boolean isPreReboot) {
String profileName = getProfileName(dexInfo.splitName());
return AidlUtils.buildOutputProfileForPrimary(
- pkgState.getPackageName(), profileName, uid, gid, isPublic);
+ pkgState.getPackageName(), profileName, uid, gid, isPublic, isPreReboot);
}
@NonNull
diff --git a/libartservice/service/java/com/android/server/art/PrimaryDexopter.java b/libartservice/service/java/com/android/server/art/PrimaryDexopter.java
index 38fca5f5f0..6ac7988f9e 100644
--- a/libartservice/service/java/com/android/server/art/PrimaryDexopter.java
+++ b/libartservice/service/java/com/android/server/art/PrimaryDexopter.java
@@ -148,16 +148,16 @@ public class PrimaryDexopter extends Dexopter<DetailedPrimaryDexInfo> {
@Override
@NonNull
- protected ProfilePath buildRefProfilePath(@NonNull DetailedPrimaryDexInfo dexInfo) {
- return PrimaryDexUtils.buildRefProfilePath(mPkgState, dexInfo);
+ protected ProfilePath buildRefProfilePathAsInput(@NonNull DetailedPrimaryDexInfo dexInfo) {
+ return PrimaryDexUtils.buildRefProfilePathAsInput(mPkgState, dexInfo);
}
@Override
@NonNull
protected OutputProfile buildOutputProfile(
@NonNull DetailedPrimaryDexInfo dexInfo, boolean isPublic) {
- return PrimaryDexUtils.buildOutputProfile(
- mPkgState, dexInfo, Process.SYSTEM_UID, mSharedGid, isPublic);
+ return PrimaryDexUtils.buildOutputProfile(mPkgState, dexInfo, Process.SYSTEM_UID,
+ mSharedGid, isPublic, mInjector.isPreReboot());
}
@Override
diff --git a/libartservice/service/java/com/android/server/art/ReasonMapping.java b/libartservice/service/java/com/android/server/art/ReasonMapping.java
index 0048ebcddf..90ea0d4b62 100644
--- a/libartservice/service/java/com/android/server/art/ReasonMapping.java
+++ b/libartservice/service/java/com/android/server/art/ReasonMapping.java
@@ -62,6 +62,8 @@ public class ReasonMapping {
public static final String REASON_CMDLINE = "cmdline";
/** Downgrading the compiler filter when an app is not used for a long time. */
public static final String REASON_INACTIVE = "inactive";
+ /** @hide */
+ public static final String REASON_PRE_REBOOT_DEXOPT = "ab-ota";
// Reasons for Play Install Hints (go/install-hints).
public static final String REASON_INSTALL_FAST = "install-fast";
@@ -78,8 +80,9 @@ public class ReasonMapping {
// Keep this in sync with `ArtShellCommand.printHelp`.
/** @hide */
- public static final Set<String> BATCH_DEXOPT_REASONS = Set.of(REASON_FIRST_BOOT,
- REASON_BOOT_AFTER_OTA, REASON_BOOT_AFTER_MAINLINE_UPDATE, REASON_BG_DEXOPT);
+ public static final Set<String> BATCH_DEXOPT_REASONS =
+ Set.of(REASON_FIRST_BOOT, REASON_BOOT_AFTER_OTA, REASON_BOOT_AFTER_MAINLINE_UPDATE,
+ REASON_BG_DEXOPT, REASON_PRE_REBOOT_DEXOPT);
/**
* Reasons for {@link ArtManagerLocal#dexoptPackages}.
@@ -92,6 +95,7 @@ public class ReasonMapping {
REASON_BOOT_AFTER_OTA,
REASON_BOOT_AFTER_MAINLINE_UPDATE,
REASON_BG_DEXOPT,
+ REASON_PRE_REBOOT_DEXOPT,
})
// clang-format on
@Retention(RetentionPolicy.SOURCE)
@@ -175,6 +179,7 @@ public class ReasonMapping {
case REASON_CMDLINE:
return ArtFlags.PRIORITY_INTERACTIVE;
case REASON_BG_DEXOPT:
+ case REASON_PRE_REBOOT_DEXOPT:
case REASON_INACTIVE:
case REASON_INSTALL_BULK:
case REASON_INSTALL_BULK_SECONDARY:
diff --git a/libartservice/service/java/com/android/server/art/SecondaryDexopter.java b/libartservice/service/java/com/android/server/art/SecondaryDexopter.java
index 2841ee278b..fe0cdb0091 100644
--- a/libartservice/service/java/com/android/server/art/SecondaryDexopter.java
+++ b/libartservice/service/java/com/android/server/art/SecondaryDexopter.java
@@ -116,8 +116,8 @@ public class SecondaryDexopter extends Dexopter<CheckedSecondaryDexInfo> {
@Override
@NonNull
- protected ProfilePath buildRefProfilePath(@NonNull CheckedSecondaryDexInfo dexInfo) {
- return AidlUtils.buildProfilePathForSecondaryRef(dexInfo.dexPath());
+ protected ProfilePath buildRefProfilePathAsInput(@NonNull CheckedSecondaryDexInfo dexInfo) {
+ return AidlUtils.buildProfilePathForSecondaryRefAsInput(dexInfo.dexPath());
}
@Override
@@ -125,7 +125,8 @@ public class SecondaryDexopter extends Dexopter<CheckedSecondaryDexInfo> {
protected OutputProfile buildOutputProfile(
@NonNull CheckedSecondaryDexInfo dexInfo, boolean isPublic) {
int uid = getUid(dexInfo);
- return AidlUtils.buildOutputProfileForSecondary(dexInfo.dexPath(), uid, uid, isPublic);
+ return AidlUtils.buildOutputProfileForSecondary(
+ dexInfo.dexPath(), uid, uid, isPublic, mInjector.isPreReboot());
}
@Override
diff --git a/libartservice/service/java/com/android/server/art/Utils.java b/libartservice/service/java/com/android/server/art/Utils.java
index e4032cf570..6c01bbcb40 100644
--- a/libartservice/service/java/com/android/server/art/Utils.java
+++ b/libartservice/service/java/com/android/server/art/Utils.java
@@ -112,7 +112,9 @@ public final class Utils {
if (pkgSecondaryCpuAbi != null) {
Utils.check(pkgState.getPrimaryCpuAbi() != null);
String isa = getTranslatedIsa(VMRuntime.getInstructionSet(pkgSecondaryCpuAbi));
- abis.add(Abi.create(nativeIsaToAbi(isa), isa, false /* isPrimaryAbi */));
+ if (isa != null) {
+ abis.add(Abi.create(nativeIsaToAbi(isa), isa, false /* isPrimaryAbi */));
+ }
}
// Primary and secondary ABIs should be guaranteed to have different ISAs.
if (abis.size() == 2 && abis.get(0).isa().equals(abis.get(1).isa())) {
@@ -145,10 +147,14 @@ public final class Utils {
String primaryCpuAbi = pkgState.getPrimaryCpuAbi();
if (primaryCpuAbi != null) {
String isa = getTranslatedIsa(VMRuntime.getInstructionSet(primaryCpuAbi));
- return Abi.create(nativeIsaToAbi(isa), isa, true /* isPrimaryAbi */);
+ // Fall through if there is no native bridge support.
+ if (isa != null) {
+ return Abi.create(nativeIsaToAbi(isa), isa, true /* isPrimaryAbi */);
+ }
}
- // This is the most common case. The package manager can't infer the ABIs, probably because
- // the package doesn't contain any native library. The app is launched with the device's
+ // This is the most common case. Either the package manager can't infer the ABIs, probably
+ // because the package doesn't contain any native library, or the primary ABI is a foreign
+ // one and there is no native bridge support. The app is launched with the device's
// preferred ABI.
String preferredAbi = Constants.getPreferredAbi();
Utils.check(isNativeAbi(preferredAbi));
@@ -158,10 +164,11 @@ public final class Utils {
/**
* If the given ISA isn't native to the device, returns the ISA that the native bridge
- * translates it to. Otherwise, returns the ISA as is. This is the ISA that the app is actually
- * launched with and therefore the ISA that should be used to compile the app.
+ * translates it to, or null if there is no native bridge support. Otherwise, returns the ISA as
+ * is. This is the ISA that the app is actually launched with and therefore the ISA that should
+ * be used to compile the app.
*/
- @NonNull
+ @Nullable
private static String getTranslatedIsa(@NonNull String isa) {
String abi64 = Constants.getNative64BitAbi();
String abi32 = Constants.getNative32BitAbi();
@@ -171,7 +178,7 @@ public final class Utils {
}
String translatedIsa = SystemProperties.get("ro.dalvik.vm.isa." + isa);
if (TextUtils.isEmpty(translatedIsa)) {
- throw new IllegalStateException(String.format("Unsupported isa '%s'", isa));
+ return null;
}
return translatedIsa;
}
@@ -189,7 +196,7 @@ public final class Utils {
throw new IllegalStateException(String.format("Non-native isa '%s'", isa));
}
- private static boolean isNativeAbi(@NonNull String abiName) {
+ public static boolean isNativeAbi(@NonNull String abiName) {
return abiName.equals(Constants.getNative64BitAbi())
|| abiName.equals(Constants.getNative32BitAbi());
}
@@ -462,6 +469,14 @@ public final class Utils {
return uid == Process.SYSTEM_UID || uid == Process.ROOT_UID || uid == Process.SHELL_UID;
}
+ public static void sleep(long millis) {
+ try {
+ Thread.sleep(millis);
+ } catch (InterruptedException e) {
+ Slog.wtf(TAG, "Sleep interrupted", e);
+ }
+ }
+
@AutoValue
public abstract static class Abi {
static @NonNull Abi create(
diff --git a/libartservice/service/java/com/android/server/art/prereboot/PreRebootDriver.java b/libartservice/service/java/com/android/server/art/prereboot/PreRebootDriver.java
new file mode 100644
index 0000000000..2e43383161
--- /dev/null
+++ b/libartservice/service/java/com/android/server/art/prereboot/PreRebootDriver.java
@@ -0,0 +1,167 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.art.prereboot;
+
+import static com.android.server.art.IDexoptChrootSetup.CHROOT_DIR;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.Context;
+import android.os.ArtModuleServiceManager;
+import android.os.Build;
+import android.os.CancellationSignal;
+import android.os.RemoteException;
+import android.os.ServiceSpecificException;
+import android.util.Log;
+import android.util.Slog;
+
+import androidx.annotation.RequiresApi;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.server.art.ArtManagerLocal;
+import com.android.server.art.ArtModuleServiceInitializer;
+import com.android.server.art.GlobalInjector;
+import com.android.server.art.IDexoptChrootSetup;
+import com.android.server.art.Utils;
+
+import dalvik.system.DelegateLastClassLoader;
+
+/**
+ * Drives Pre-reboot Dexopt, through reflection.
+ *
+ * During Pre-reboot Dexopt, the old version of this code is run.
+ *
+ * @hide
+ */
+@RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
+public class PreRebootDriver {
+ private static final String TAG = ArtManagerLocal.TAG;
+
+ @NonNull private final Injector mInjector;
+
+ public PreRebootDriver(@NonNull Context context) {
+ this(new Injector(context));
+ }
+
+ @VisibleForTesting
+ public PreRebootDriver(@NonNull Injector injector) {
+ mInjector = injector;
+ }
+
+ /**
+ * Runs Pre-reboot Dexopt and returns whether it is successful.
+ *
+ * @param otaSlot The slot that contains the OTA update, "_a" or "_b", or null for a Mainline
+ * update.
+ */
+ public boolean run(@Nullable String otaSlot, @NonNull CancellationSignal cancellationSignal) {
+ try {
+ setUp(otaSlot);
+ runFromChroot(cancellationSignal);
+ return true;
+ } catch (RemoteException e) {
+ Utils.logArtdException(e);
+ } catch (ServiceSpecificException e) {
+ Log.e(TAG, "Failed to set up chroot", e);
+ } catch (ReflectiveOperationException e) {
+ Log.e(TAG, "Failed to run pre-reboot dexopt", e);
+ } finally {
+ tearDown();
+ }
+ return false;
+ }
+
+ private void setUp(@Nullable String otaSlot) throws RemoteException {
+ mInjector.getDexoptChrootSetup().setUp(otaSlot);
+ }
+
+ private void tearDown() {
+ // In general, the teardown unmounts apexes and partitions, and open files can keep the
+ // mounts busy so that they cannot be unmounted. Therefore, two things can prevent the
+ // teardown from succeeding: a running Pre-reboot artd process and the new `service-art.jar`
+ // opened and mapped by system server. They are managed by the service manager and the
+ // runtime respectively. There aren't reliable APIs to kill the former or close the latter,
+ // so we have to do them by triggering GC and finalization, with sleep and retry mechanism.
+ for (int numRetries = 3; numRetries > 0;) {
+ try {
+ Runtime.getRuntime().gc();
+ Runtime.getRuntime().runFinalization();
+ // Wait for the service manager to shut down artd. The shutdown is asynchronous.
+ Utils.sleep(5000);
+ mInjector.getDexoptChrootSetup().tearDown();
+ return;
+ } catch (RemoteException e) {
+ Utils.logArtdException(e);
+ } catch (ServiceSpecificException e) {
+ Log.e(TAG, "Failed to tear down chroot", e);
+ } catch (IllegalStateException e) {
+ // Not expected, but we still want retries in such an extreme case.
+ Slog.wtf(TAG, "Unexpected exception", e);
+ }
+
+ if (--numRetries > 0) {
+ Log.i(TAG, "Retrying....");
+ Utils.sleep(30000);
+ }
+ }
+ }
+
+ private void runFromChroot(@NonNull CancellationSignal cancellationSignal)
+ throws ReflectiveOperationException {
+ String chrootArtDir = CHROOT_DIR + "/apex/com.android.art";
+ String dexPath = chrootArtDir + "/javalib/service-art.jar";
+ var classLoader =
+ new DelegateLastClassLoader(dexPath, this.getClass().getClassLoader() /* parent */);
+ Class<?> preRebootManagerClass =
+ classLoader.loadClass("com.android.server.art.prereboot.PreRebootManager");
+ // Check if the dex file is loaded successfully. Note that the constructor of
+ // `DelegateLastClassLoader` does not throw when the load fails.
+ if (preRebootManagerClass == PreRebootManager.class) {
+ throw new IllegalStateException(String.format("Failed to load %s", dexPath));
+ }
+ Object preRebootManager = preRebootManagerClass.getConstructor().newInstance();
+ preRebootManagerClass
+ .getMethod("run", ArtModuleServiceManager.class, Context.class,
+ CancellationSignal.class)
+ .invoke(preRebootManager, ArtModuleServiceInitializer.getArtModuleServiceManager(),
+ mInjector.getContext(), cancellationSignal);
+ }
+
+ /**
+ * Injector pattern for testing purpose.
+ *
+ * @hide
+ */
+ @VisibleForTesting
+ public static class Injector {
+ @NonNull private final Context mContext;
+
+ Injector(@NonNull Context context) {
+ mContext = context;
+ }
+
+ @NonNull
+ public Context getContext() {
+ return mContext;
+ }
+
+ @NonNull
+ public IDexoptChrootSetup getDexoptChrootSetup() {
+ return GlobalInjector.getInstance().getDexoptChrootSetup();
+ }
+ }
+}
diff --git a/libartservice/service/java/com/android/server/art/prereboot/PreRebootGlobalInjector.java b/libartservice/service/java/com/android/server/art/prereboot/PreRebootGlobalInjector.java
new file mode 100644
index 0000000000..6d808ae12c
--- /dev/null
+++ b/libartservice/service/java/com/android/server/art/prereboot/PreRebootGlobalInjector.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.art.prereboot;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.Context;
+import android.os.ArtModuleServiceManager;
+import android.os.Build;
+import android.os.RemoteException;
+
+import androidx.annotation.RequiresApi;
+
+import com.android.server.art.ArtdRefCache;
+import com.android.server.art.DexUseManagerLocal;
+import com.android.server.art.GlobalInjector;
+import com.android.server.art.IArtd;
+import com.android.server.art.IDexoptChrootSetup;
+
+import java.util.Objects;
+
+/**
+ * The implementation of the Global injector that is used when the code is running Pre-reboot
+ * Dexopt.
+ *
+ * During Pre-reboot Dexopt, the new version of this code is run.
+ *
+ * @hide
+ */
+@RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
+public class PreRebootGlobalInjector extends GlobalInjector {
+ @NonNull private ArtModuleServiceManager mArtModuleServiceManager;
+ @Nullable private DexUseManagerLocal mDexUseManager;
+
+ private PreRebootGlobalInjector(@NonNull ArtModuleServiceManager artModuleServiceManager) {
+ mArtModuleServiceManager = artModuleServiceManager;
+ }
+
+ public static void init(
+ @NonNull ArtModuleServiceManager artModuleServiceManager, @NonNull Context context) {
+ var instance = new PreRebootGlobalInjector(artModuleServiceManager);
+ GlobalInjector.setInstance(instance);
+ try (var pin = ArtdRefCache.getInstance().new Pin()) {
+ // Fail early if artd cannot be initialized.
+ ArtdRefCache.getInstance().getArtd();
+ instance.mDexUseManager = DexUseManagerLocal.createInstance(context);
+ }
+ }
+
+ @Override
+ public boolean isPreReboot() {
+ return true;
+ }
+
+ @Override
+ public void checkArtModuleServiceManager() {}
+
+ @Override
+ @NonNull
+ public IArtd getArtd() {
+ IArtd artd = IArtd.Stub.asInterface(
+ mArtModuleServiceManager.getArtdPreRebootServiceRegisterer().waitForService());
+ if (artd == null) {
+ throw new IllegalStateException("Unable to connect to artd for pre-reboot dexopt");
+ }
+ try {
+ artd.preRebootInit();
+ } catch (RemoteException e) {
+ throw new IllegalStateException("Unable to initialize artd for pre-reboot dexopt", e);
+ }
+ return artd;
+ }
+
+ @Override
+ @NonNull
+ public IDexoptChrootSetup getDexoptChrootSetup() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ @NonNull
+ public DexUseManagerLocal getDexUseManager() {
+ return Objects.requireNonNull(mDexUseManager);
+ }
+}
diff --git a/libartservice/service/java/com/android/server/art/prereboot/PreRebootManager.java b/libartservice/service/java/com/android/server/art/prereboot/PreRebootManager.java
new file mode 100644
index 0000000000..d6947ba156
--- /dev/null
+++ b/libartservice/service/java/com/android/server/art/prereboot/PreRebootManager.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.art.prereboot;
+
+import android.annotation.NonNull;
+import android.content.Context;
+import android.os.ArtModuleServiceManager;
+import android.os.Build;
+import android.os.CancellationSignal;
+
+import androidx.annotation.RequiresApi;
+
+import com.android.server.LocalManagerRegistry;
+import com.android.server.art.ArtManagerLocal;
+import com.android.server.art.ArtdRefCache;
+import com.android.server.art.ReasonMapping;
+import com.android.server.pm.PackageManagerLocal;
+
+import java.util.Objects;
+
+/**
+ * Implementation of {@link PreRebootManagerInterface}.
+ *
+ * DO NOT add a constructor with parameters! There can't be stability guarantees on constructors as
+ * they can't be checked against the interface.
+ *
+ * During Pre-reboot Dexopt, the new version of this code is run.
+ *
+ * @hide
+ */
+@RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
+public class PreRebootManager implements PreRebootManagerInterface {
+ public void run(@NonNull ArtModuleServiceManager artModuleServiceManager,
+ @NonNull Context context, @NonNull CancellationSignal cancellationSignal) {
+ try {
+ PreRebootGlobalInjector.init(artModuleServiceManager, context);
+ ArtManagerLocal artManagerLocal = new ArtManagerLocal(context);
+ PackageManagerLocal packageManagerLocal = Objects.requireNonNull(
+ LocalManagerRegistry.getManager(PackageManagerLocal.class));
+ try (var snapshot = packageManagerLocal.withFilteredSnapshot()) {
+ artManagerLocal.dexoptPackages(snapshot, ReasonMapping.REASON_PRE_REBOOT_DEXOPT,
+ cancellationSignal, null /* processCallbackExecutor */,
+ null /* processCallback */);
+ }
+ } finally {
+ ArtdRefCache.getInstance().reset();
+ }
+ }
+}
diff --git a/libartservice/service/java/com/android/server/art/prereboot/PreRebootManagerInterface.java b/libartservice/service/java/com/android/server/art/prereboot/PreRebootManagerInterface.java
new file mode 100644
index 0000000000..8422debdbc
--- /dev/null
+++ b/libartservice/service/java/com/android/server/art/prereboot/PreRebootManagerInterface.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.art.prereboot;
+
+import android.annotation.NonNull;
+import android.content.Context;
+import android.os.ArtModuleServiceManager;
+import android.os.Build;
+import android.os.CancellationSignal;
+
+import androidx.annotation.RequiresApi;
+
+/**
+ * The interface for the entry point of Pre-reboot Dexopt, called through reflection from an old
+ * version of the ART module. This interface must be kept stable from one version of the ART module
+ * to another. In principle, a method here should be kept as long as devices that receive Mainline
+ * updates call it from their old factory installed modules, unless there is a good reason to drop
+ * the Pre-reboot Dexopt support earlier for certain versions of the ART module.
+ *
+ * Dropping the support for certain versions will only make devices lose the opportunity to optimize
+ * apps before the reboot, but it won't cause severe results such as crashes because even the oldest
+ * version that uses this interface can elegantly handle reflection exceptions.
+ *
+ * During Pre-reboot Dexopt, the new version of this code is run.
+ *
+ * @hide
+ */
+@RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
+public interface PreRebootManagerInterface {
+ void run(@NonNull ArtModuleServiceManager artModuleServiceManager, @NonNull Context context,
+ @NonNull CancellationSignal cancellationSignal);
+}
diff --git a/libartservice/service/javatests/com/android/server/art/ArtManagerLocalTest.java b/libartservice/service/javatests/com/android/server/art/ArtManagerLocalTest.java
index b7d67eccc3..fa217ab89d 100644
--- a/libartservice/service/javatests/com/android/server/art/ArtManagerLocalTest.java
+++ b/libartservice/service/javatests/com/android/server/art/ArtManagerLocalTest.java
@@ -284,17 +284,17 @@ public class ArtManagerLocalTest {
assertThat(result.getFreedBytes())
.isEqualTo(6 * DEXOPT_ARTIFACTS_FREED + 4 * RUNTIME_ARTIFACTS_FREED);
- verify(mArtd).deleteArtifacts(deepEq(AidlUtils.buildArtifactsPath(
+ verify(mArtd).deleteArtifacts(deepEq(AidlUtils.buildArtifactsPathAsInput(
"/somewhere/app/foo/base.apk", "arm64", mIsInDalvikCache)));
- verify(mArtd).deleteArtifacts(deepEq(AidlUtils.buildArtifactsPath(
+ verify(mArtd).deleteArtifacts(deepEq(AidlUtils.buildArtifactsPathAsInput(
"/somewhere/app/foo/base.apk", "arm", mIsInDalvikCache)));
- verify(mArtd).deleteArtifacts(deepEq(AidlUtils.buildArtifactsPath(
+ verify(mArtd).deleteArtifacts(deepEq(AidlUtils.buildArtifactsPathAsInput(
"/somewhere/app/foo/split_0.apk", "arm64", mIsInDalvikCache)));
- verify(mArtd).deleteArtifacts(deepEq(AidlUtils.buildArtifactsPath(
+ verify(mArtd).deleteArtifacts(deepEq(AidlUtils.buildArtifactsPathAsInput(
"/somewhere/app/foo/split_0.apk", "arm", mIsInDalvikCache)));
- verify(mArtd).deleteArtifacts(deepEq(AidlUtils.buildArtifactsPath(
+ verify(mArtd).deleteArtifacts(deepEq(AidlUtils.buildArtifactsPathAsInput(
"/data/user/0/foo/1.apk", "arm64", false /* isInDalvikCache */)));
- verify(mArtd).deleteArtifacts(deepEq(AidlUtils.buildArtifactsPath(
+ verify(mArtd).deleteArtifacts(deepEq(AidlUtils.buildArtifactsPathAsInput(
"/data/user/0/foo/not_found.apk", "arm64", false /* isInDalvikCache */)));
verify(mArtd).deleteRuntimeArtifacts(deepEq(AidlUtils.buildRuntimeArtifactsPath(
@@ -331,13 +331,13 @@ public class ArtManagerLocalTest {
assertThat(result.getFreedBytes())
.isEqualTo(6 * DEXOPT_ARTIFACTS_FREED + 4 * RUNTIME_ARTIFACTS_FREED);
- verify(mArtd).deleteArtifacts(deepEq(AidlUtils.buildArtifactsPath(
+ verify(mArtd).deleteArtifacts(deepEq(AidlUtils.buildArtifactsPathAsInput(
"/somewhere/app/foo/base.apk", "x86_64", mIsInDalvikCache)));
- verify(mArtd).deleteArtifacts(deepEq(AidlUtils.buildArtifactsPath(
+ verify(mArtd).deleteArtifacts(deepEq(AidlUtils.buildArtifactsPathAsInput(
"/somewhere/app/foo/base.apk", "x86", mIsInDalvikCache)));
- verify(mArtd).deleteArtifacts(deepEq(AidlUtils.buildArtifactsPath(
+ verify(mArtd).deleteArtifacts(deepEq(AidlUtils.buildArtifactsPathAsInput(
"/somewhere/app/foo/split_0.apk", "x86_64", mIsInDalvikCache)));
- verify(mArtd).deleteArtifacts(deepEq(AidlUtils.buildArtifactsPath(
+ verify(mArtd).deleteArtifacts(deepEq(AidlUtils.buildArtifactsPathAsInput(
"/somewhere/app/foo/split_0.apk", "x86", mIsInDalvikCache)));
verify(mArtd).deleteRuntimeArtifacts(deepEq(AidlUtils.buildRuntimeArtifactsPath(
@@ -350,9 +350,9 @@ public class ArtManagerLocalTest {
PKG_NAME_1, "/somewhere/app/foo/split_0.apk", "x86")));
// We assume that the ISA got from `DexUseManagerLocal` is already the translated one.
- verify(mArtd).deleteArtifacts(deepEq(AidlUtils.buildArtifactsPath(
+ verify(mArtd).deleteArtifacts(deepEq(AidlUtils.buildArtifactsPathAsInput(
"/data/user/0/foo/1.apk", "x86_64", false /* isInDalvikCache */)));
- verify(mArtd).deleteArtifacts(deepEq(AidlUtils.buildArtifactsPath(
+ verify(mArtd).deleteArtifacts(deepEq(AidlUtils.buildArtifactsPathAsInput(
"/data/user/0/foo/not_found.apk", "x86_64", false /* isInDalvikCache */)));
// Verify that there are no more calls than the ones above.
@@ -462,19 +462,19 @@ public class ArtManagerLocalTest {
mArtManagerLocal.clearAppProfiles(mSnapshot, PKG_NAME_1);
verify(mArtd).deleteProfile(
- deepEq(AidlUtils.buildProfilePathForPrimaryRef(PKG_NAME_1, "primary")));
+ deepEq(AidlUtils.buildProfilePathForPrimaryRefAsInput(PKG_NAME_1, "primary")));
verify(mArtd).deleteProfile(deepEq(
AidlUtils.buildProfilePathForPrimaryCur(0 /* userId */, PKG_NAME_1, "primary")));
verify(mArtd).deleteProfile(deepEq(
AidlUtils.buildProfilePathForPrimaryCur(1 /* userId */, PKG_NAME_1, "primary")));
verify(mArtd).deleteProfile(
- deepEq(AidlUtils.buildProfilePathForSecondaryRef("/data/user/0/foo/1.apk")));
+ deepEq(AidlUtils.buildProfilePathForSecondaryRefAsInput("/data/user/0/foo/1.apk")));
verify(mArtd).deleteProfile(
deepEq(AidlUtils.buildProfilePathForSecondaryCur("/data/user/0/foo/1.apk")));
- verify(mArtd).deleteProfile(deepEq(
- AidlUtils.buildProfilePathForSecondaryRef("/data/user/0/foo/not_found.apk")));
+ verify(mArtd).deleteProfile(deepEq(AidlUtils.buildProfilePathForSecondaryRefAsInput(
+ "/data/user/0/foo/not_found.apk")));
verify(mArtd).deleteProfile(deepEq(
AidlUtils.buildProfilePathForSecondaryCur("/data/user/0/foo/not_found.apk")));
}
@@ -521,19 +521,19 @@ public class ArtManagerLocalTest {
.isSameInstanceAs(result);
verify(mArtd).deleteProfile(
- deepEq(AidlUtils.buildProfilePathForPrimaryRef(PKG_NAME_1, "primary")));
+ deepEq(AidlUtils.buildProfilePathForPrimaryRefAsInput(PKG_NAME_1, "primary")));
verify(mArtd).deleteProfile(deepEq(
AidlUtils.buildProfilePathForPrimaryCur(0 /* userId */, PKG_NAME_1, "primary")));
verify(mArtd).deleteProfile(deepEq(
AidlUtils.buildProfilePathForPrimaryCur(1 /* userId */, PKG_NAME_1, "primary")));
- verify(mArtd).deleteArtifacts(deepEq(AidlUtils.buildArtifactsPath(
+ verify(mArtd).deleteArtifacts(deepEq(AidlUtils.buildArtifactsPathAsInput(
"/somewhere/app/foo/base.apk", "arm64", mIsInDalvikCache)));
- verify(mArtd).deleteArtifacts(deepEq(AidlUtils.buildArtifactsPath(
+ verify(mArtd).deleteArtifacts(deepEq(AidlUtils.buildArtifactsPathAsInput(
"/somewhere/app/foo/base.apk", "arm", mIsInDalvikCache)));
- verify(mArtd).deleteArtifacts(deepEq(AidlUtils.buildArtifactsPath(
+ verify(mArtd).deleteArtifacts(deepEq(AidlUtils.buildArtifactsPathAsInput(
"/somewhere/app/foo/split_0.apk", "arm64", mIsInDalvikCache)));
- verify(mArtd).deleteArtifacts(deepEq(AidlUtils.buildArtifactsPath(
+ verify(mArtd).deleteArtifacts(deepEq(AidlUtils.buildArtifactsPathAsInput(
"/somewhere/app/foo/split_0.apk", "arm", mIsInDalvikCache)));
verify(mArtd).deleteRuntimeArtifacts(deepEq(AidlUtils.buildRuntimeArtifactsPath(
@@ -546,11 +546,11 @@ public class ArtManagerLocalTest {
PKG_NAME_1, "/somewhere/app/foo/split_0.apk", "arm")));
verify(mArtd).deleteProfile(
- deepEq(AidlUtils.buildProfilePathForSecondaryRef("/data/user/0/foo/1.apk")));
+ deepEq(AidlUtils.buildProfilePathForSecondaryRefAsInput("/data/user/0/foo/1.apk")));
verify(mArtd).deleteProfile(
deepEq(AidlUtils.buildProfilePathForSecondaryCur("/data/user/0/foo/1.apk")));
- verify(mArtd).deleteArtifacts(deepEq(AidlUtils.buildArtifactsPath(
+ verify(mArtd).deleteArtifacts(deepEq(AidlUtils.buildArtifactsPathAsInput(
"/data/user/0/foo/1.apk", "arm64", false /* isInDalvikCache */)));
}
@@ -836,7 +836,8 @@ public class ArtManagerLocalTest {
File tempFile = File.createTempFile("primary", ".prof");
tempFile.deleteOnExit();
- ProfilePath refProfile = AidlUtils.buildProfilePathForPrimaryRef(PKG_NAME_1, "primary");
+ ProfilePath refProfile =
+ AidlUtils.buildProfilePathForPrimaryRefAsInput(PKG_NAME_1, "primary");
String dexPath = "/somewhere/app/foo/base.apk";
when(mArtd.isProfileUsable(deepEq(refProfile), eq(dexPath))).thenReturn(true);
@@ -848,7 +849,8 @@ public class ArtManagerLocalTest {
1 /* userId */, PKG_NAME_1, "primary"))),
isNull(),
deepEq(AidlUtils.buildOutputProfileForPrimary(PKG_NAME_1, "primary",
- Process.SYSTEM_UID, Process.SYSTEM_UID, false /* isPublic */)),
+ Process.SYSTEM_UID, Process.SYSTEM_UID, false /* isPublic */,
+ false /* isPreReboot */)),
deepEq(List.of(dexPath)), deepEq(options)))
.thenAnswer(invocation -> {
try (var writer = new FileWriter(tempFile)) {
@@ -880,7 +882,8 @@ public class ArtManagerLocalTest {
File tempFileForSnapshot = File.createTempFile("primary", ".prof");
tempFileForSnapshot.deleteOnExit();
- ProfilePath refProfile = AidlUtils.buildProfilePathForPrimaryRef(PKG_NAME_1, "primary");
+ ProfilePath refProfile =
+ AidlUtils.buildProfilePathForPrimaryRefAsInput(PKG_NAME_1, "primary");
String dexPath = "/somewhere/app/foo/base.apk";
// Simulate that the reference profile doesn't exist.
@@ -920,7 +923,8 @@ public class ArtManagerLocalTest {
@Test
public void testSnapshotAppProfileFromEmbeddedProfile() throws Exception {
- ProfilePath refProfile = AidlUtils.buildProfilePathForPrimaryRef(PKG_NAME_1, "primary");
+ ProfilePath refProfile =
+ AidlUtils.buildProfilePathForPrimaryRefAsInput(PKG_NAME_1, "primary");
String dexPath = "/somewhere/app/foo/base.apk";
// Simulate that the reference profile doesn't exist.
@@ -937,7 +941,8 @@ public class ArtManagerLocalTest {
@Test
public void testSnapshotAppProfileDisableEmbeddedProfile() throws Exception {
- ProfilePath refProfile = AidlUtils.buildProfilePathForPrimaryRef(PKG_NAME_1, "primary");
+ ProfilePath refProfile =
+ AidlUtils.buildProfilePathForPrimaryRefAsInput(PKG_NAME_1, "primary");
String dexPath = "/somewhere/app/foo/base.apk";
// Simulate that the reference profile doesn't exist.
@@ -959,7 +964,7 @@ public class ArtManagerLocalTest {
@Test
public void testSnapshotAppProfileSplit() throws Exception {
ProfilePath refProfile =
- AidlUtils.buildProfilePathForPrimaryRef(PKG_NAME_1, "split_0.split");
+ AidlUtils.buildProfilePathForPrimaryRefAsInput(PKG_NAME_1, "split_0.split");
String dexPath = "/somewhere/app/foo/split_0.apk";
when(mArtd.isProfileUsable(deepEq(refProfile), eq(dexPath))).thenReturn(true);
@@ -971,7 +976,8 @@ public class ArtManagerLocalTest {
1 /* userId */, PKG_NAME_1, "split_0.split"))),
isNull(),
deepEq(AidlUtils.buildOutputProfileForPrimary(PKG_NAME_1, "split_0.split",
- Process.SYSTEM_UID, Process.SYSTEM_UID, false /* isPublic */)),
+ Process.SYSTEM_UID, Process.SYSTEM_UID, false /* isPublic */,
+ false /* isPreReboot */)),
deepEq(List.of(dexPath)), any()))
.thenReturn(false);
@@ -1049,27 +1055,28 @@ public class ArtManagerLocalTest {
when(mArtd.mergeProfiles(
inAnyOrderDeepEquals(
- AidlUtils.buildProfilePathForPrimaryRef("android", "primary"),
+ AidlUtils.buildProfilePathForPrimaryRefAsInput("android", "primary"),
AidlUtils.buildProfilePathForPrimaryCur(
0 /* userId */, "android", "primary"),
AidlUtils.buildProfilePathForPrimaryCur(
1 /* userId */, "android", "primary"),
- AidlUtils.buildProfilePathForPrimaryRef(PKG_NAME_1, "primary"),
+ AidlUtils.buildProfilePathForPrimaryRefAsInput(PKG_NAME_1, "primary"),
AidlUtils.buildProfilePathForPrimaryCur(
0 /* userId */, PKG_NAME_1, "primary"),
AidlUtils.buildProfilePathForPrimaryCur(
1 /* userId */, PKG_NAME_1, "primary"),
- AidlUtils.buildProfilePathForPrimaryRef(PKG_NAME_1, "split_0.split"),
+ AidlUtils.buildProfilePathForPrimaryRefAsInput(
+ PKG_NAME_1, "split_0.split"),
AidlUtils.buildProfilePathForPrimaryCur(
0 /* userId */, PKG_NAME_1, "split_0.split"),
AidlUtils.buildProfilePathForPrimaryCur(
1 /* userId */, PKG_NAME_1, "split_0.split"),
- AidlUtils.buildProfilePathForPrimaryRef(PKG_NAME_2, "primary"),
+ AidlUtils.buildProfilePathForPrimaryRefAsInput(PKG_NAME_2, "primary"),
AidlUtils.buildProfilePathForPrimaryCur(
0 /* userId */, PKG_NAME_2, "primary"),
AidlUtils.buildProfilePathForPrimaryCur(
1 /* userId */, PKG_NAME_2, "primary"),
- AidlUtils.buildProfilePathForPrimaryRef(
+ AidlUtils.buildProfilePathForPrimaryRefAsInput(
PKG_NAME_HIBERNATING, "primary"),
AidlUtils.buildProfilePathForPrimaryCur(
0 /* userId */, PKG_NAME_HIBERNATING, "primary"),
@@ -1077,7 +1084,8 @@ public class ArtManagerLocalTest {
1 /* userId */, PKG_NAME_HIBERNATING, "primary")),
isNull(),
deepEq(AidlUtils.buildOutputProfileForPrimary("android", "primary",
- Process.SYSTEM_UID, Process.SYSTEM_UID, false /* isPublic */)),
+ Process.SYSTEM_UID, Process.SYSTEM_UID, false /* isPublic */,
+ false /* isPreReboot */)),
deepEq(List.of("bcp0", "bcp1", "sscp0", "sscp1", "sssj0", "sssj1")),
deepEq(options)))
.thenReturn(false); // A non-empty merge is tested in `testSnapshotAppProfile`.
@@ -1144,25 +1152,27 @@ public class ArtManagerLocalTest {
mArtManagerLocal.cleanup(mSnapshot);
verify(mArtd).cleanup(
- inAnyOrderDeepEquals(AidlUtils.buildProfilePathForPrimaryRef(PKG_NAME_1, "primary"),
+ inAnyOrderDeepEquals(
+ AidlUtils.buildProfilePathForPrimaryRefAsInput(PKG_NAME_1, "primary"),
AidlUtils.buildProfilePathForPrimaryCur(
0 /* userId */, PKG_NAME_1, "primary"),
AidlUtils.buildProfilePathForPrimaryCur(
1 /* userId */, PKG_NAME_1, "primary"),
- AidlUtils.buildProfilePathForPrimaryRef(PKG_NAME_1, "split_0.split"),
+ AidlUtils.buildProfilePathForPrimaryRefAsInput(PKG_NAME_1, "split_0.split"),
AidlUtils.buildProfilePathForPrimaryCur(
0 /* userId */, PKG_NAME_1, "split_0.split"),
AidlUtils.buildProfilePathForPrimaryCur(
1 /* userId */, PKG_NAME_1, "split_0.split"),
- AidlUtils.buildProfilePathForSecondaryRef("/data/user/0/foo/1.apk"),
+ AidlUtils.buildProfilePathForSecondaryRefAsInput("/data/user/0/foo/1.apk"),
AidlUtils.buildProfilePathForSecondaryCur("/data/user/0/foo/1.apk")),
- inAnyOrderDeepEquals(AidlUtils.buildArtifactsPath("/somewhere/app/foo/base.apk",
- "arm64", false /* isInDalvikCache */),
- AidlUtils.buildArtifactsPath(
+ inAnyOrderDeepEquals(
+ AidlUtils.buildArtifactsPathAsInput("/somewhere/app/foo/base.apk", "arm64",
+ false /* isInDalvikCache */),
+ AidlUtils.buildArtifactsPathAsInput(
"/data/user/0/foo/1.apk", "arm64", false /* isInDalvikCache */),
- AidlUtils.buildArtifactsPath("/somewhere/app/foo/split_0.apk", "arm64",
- true /* isInDalvikCache */)),
- inAnyOrderDeepEquals(VdexPath.artifactsPath(AidlUtils.buildArtifactsPath(
+ AidlUtils.buildArtifactsPathAsInput("/somewhere/app/foo/split_0.apk",
+ "arm64", true /* isInDalvikCache */)),
+ inAnyOrderDeepEquals(VdexPath.artifactsPath(AidlUtils.buildArtifactsPathAsInput(
"/somewhere/app/foo/split_0.apk", "arm", false /* isInDalvikCache */))),
inAnyOrderDeepEquals(AidlUtils.buildRuntimeArtifactsPath(
PKG_NAME_1, "/somewhere/app/foo/split_0.apk", "arm64"),
@@ -1227,14 +1237,14 @@ public class ArtManagerLocalTest {
.getDexoptStatus(eq("/somewhere/app/foo/base.apk"), eq("arm"), any());
// These are counted as TYPE_DEXOPT_ARTIFACT.
- doReturn(1l << 0).when(mArtd).getArtifactsSize(deepEq(AidlUtils.buildArtifactsPath(
+ doReturn(1l << 0).when(mArtd).getArtifactsSize(deepEq(AidlUtils.buildArtifactsPathAsInput(
"/somewhere/app/foo/base.apk", "arm64", false /* isInDalvikCache */)));
- doReturn(1l << 1).when(mArtd).getArtifactsSize(deepEq(AidlUtils.buildArtifactsPath(
+ doReturn(1l << 1).when(mArtd).getArtifactsSize(deepEq(AidlUtils.buildArtifactsPathAsInput(
"/data/user/0/foo/1.apk", "arm64", false /* isInDalvikCache */)));
- doReturn(1l << 2).when(mArtd).getArtifactsSize(deepEq(AidlUtils.buildArtifactsPath(
+ doReturn(1l << 2).when(mArtd).getArtifactsSize(deepEq(AidlUtils.buildArtifactsPathAsInput(
"/somewhere/app/foo/split_0.apk", "arm64", true /* isInDalvikCache */)));
doReturn(1l << 3).when(mArtd).getVdexFileSize(
- deepEq(VdexPath.artifactsPath(AidlUtils.buildArtifactsPath(
+ deepEq(VdexPath.artifactsPath(AidlUtils.buildArtifactsPathAsInput(
"/somewhere/app/foo/split_0.apk", "arm", false /* isInDalvikCache */))));
doReturn(1l << 4).when(mArtd).getRuntimeArtifactsSize(
deepEq(AidlUtils.buildRuntimeArtifactsPath(
@@ -1250,11 +1260,11 @@ public class ArtManagerLocalTest {
// These are counted as TYPE_REF_PROFILE.
doReturn(1l << 6).when(mArtd).getProfileSize(
- deepEq(AidlUtils.buildProfilePathForPrimaryRef(PKG_NAME_1, "primary")));
- doReturn(1l << 7).when(mArtd).getProfileSize(
- deepEq(AidlUtils.buildProfilePathForPrimaryRef(PKG_NAME_1, "split_0.split")));
+ deepEq(AidlUtils.buildProfilePathForPrimaryRefAsInput(PKG_NAME_1, "primary")));
+ doReturn(1l << 7).when(mArtd).getProfileSize(deepEq(
+ AidlUtils.buildProfilePathForPrimaryRefAsInput(PKG_NAME_1, "split_0.split")));
doReturn(1l << 8).when(mArtd).getProfileSize(
- deepEq(AidlUtils.buildProfilePathForSecondaryRef("/data/user/0/foo/1.apk")));
+ deepEq(AidlUtils.buildProfilePathForSecondaryRefAsInput("/data/user/0/foo/1.apk")));
long expectedRefProfileSize = (1l << 6) + (1l << 7) + (1l << 8);
int expectedGetProfileSizeCalls = 3;
@@ -1278,15 +1288,16 @@ public class ArtManagerLocalTest {
// These are counted as TYPE_DEXOPT_ARTIFACT.
// Dexopt artifacts of secondary dex files.
- doReturn(1l << 12).when(mArtd).getArtifactsSize(deepEq(AidlUtils.buildArtifactsPath(
- "/data/user/1/foo/1.apk", "arm64", false /* isInDalvikCache */)));
+ doReturn(1l << 12).when(mArtd).getArtifactsSize(
+ deepEq(AidlUtils.buildArtifactsPathAsInput(
+ "/data/user/1/foo/1.apk", "arm64", false /* isInDalvikCache */)));
expectedDexoptArtifactSize += (1l << 12);
expectedGetArtifactsSizeCalls += 1;
// These are counted as TYPE_REF_PROFILE.
// Reference profiles of secondary dex files.
- doReturn(1l << 13).when(mArtd).getProfileSize(
- deepEq(AidlUtils.buildProfilePathForSecondaryRef("/data/user/1/foo/1.apk")));
+ doReturn(1l << 13).when(mArtd).getProfileSize(deepEq(
+ AidlUtils.buildProfilePathForSecondaryRefAsInput("/data/user/1/foo/1.apk")));
expectedRefProfileSize += (1l << 13);
expectedGetProfileSizeCalls += 1;
diff --git a/libartservice/service/javatests/com/android/server/art/DexUseManagerTest.java b/libartservice/service/javatests/com/android/server/art/DexUseManagerTest.java
index 5662090aeb..11810dfb35 100644
--- a/libartservice/service/javatests/com/android/server/art/DexUseManagerTest.java
+++ b/libartservice/service/javatests/com/android/server/art/DexUseManagerTest.java
@@ -166,6 +166,7 @@ public class DexUseManagerTest {
.thenAnswer(invocation -> mMockClock.createScheduledExecutor());
lenient().when(mInjector.getContext()).thenReturn(mContext);
lenient().when(mInjector.getAllPackageNames()).thenReturn(mPackageStates.keySet());
+ lenient().when(mInjector.isPreReboot()).thenReturn(false);
mDexUseManager = new DexUseManagerLocal(mInjector);
mDexUseManager.systemReady();
@@ -397,6 +398,38 @@ public class DexUseManagerTest {
assertThat(dexInfoList.get(0).classLoaderContext()).isNull();
}
+ @Test
+ public void testSecondaryDexNativeAbiSetChange() {
+ when(mInjector.getCurrentTimeMillis()).thenReturn(1000l);
+
+ mDexUseManager.notifyDexContainersLoaded(
+ mSnapshot, OWNING_PKG_NAME, Map.of(mCeDir + "/foo.apk", "CLC"));
+ mDexUseManager.notifyDexContainersLoaded(
+ mSnapshot, LOADING_PKG_NAME, Map.of(mCeDir + "/foo.apk", "CLC2"));
+
+ // Initially, both loaders are recorded.
+ assertThat(mDexUseManager.getSecondaryDexInfo(OWNING_PKG_NAME).get(0).loaders()).hasSize(2);
+
+ // Save the file.
+ mMockClock.advanceTime(DexUseManagerLocal.INTERVAL_MS);
+
+ // Simulate that 32 bit is no longer supported.
+ when(Constants.getNative32BitAbi()).thenReturn(null);
+
+ // Reload the file.
+ mDexUseManager = new DexUseManagerLocal(mInjector);
+
+ // The info about `LOADING_PKG_NAME` should be filtered out. There should be one loader
+ // left.
+ List<? extends SecondaryDexInfo> dexInfoList =
+ mDexUseManager.getSecondaryDexInfo(OWNING_PKG_NAME);
+ assertThat(dexInfoList)
+ .containsExactly(CheckedSecondaryDexInfo.create(mCeDir + "/foo.apk", mUserHandle,
+ "CLC", Set.of("arm64-v8a"),
+ Set.of(DexLoader.create(OWNING_PKG_NAME, false /* isolatedProcess */)),
+ false /* isUsedByOtherApps */, FileVisibility.OTHER_READABLE));
+ }
+
/** Checks that it ignores and dedups things correctly. */
@Test
public void testSecondaryDexMultipleEntries() throws Exception {
@@ -611,7 +644,7 @@ public class DexUseManagerTest {
}
@Test
- public void testCleanup() throws Exception {
+ public void testCleanupDeletedPackage() throws Exception {
PackageState pkgState = createPackageState(
"com.example.deletedpackage", "arm64-v8a", true /* hasPackage */);
addPackage("com.example.deletedpackage", pkgState);
@@ -632,6 +665,11 @@ public class DexUseManagerTest {
// Simulate that the package is then deleted.
removePackage("com.example.deletedpackage");
+ verifyCleanup();
+ }
+
+ @Test
+ public void testCleanupDeletedPrimaryDex() throws Exception {
// Simulate that a primary dex file is loaded and then deleted.
lenient()
.when(mArtd.getDexFileVisibility(SPLIT_APK))
@@ -642,6 +680,11 @@ public class DexUseManagerTest {
mSnapshot, LOADING_PKG_NAME, Map.of(SPLIT_APK, "CLC"));
lenient().when(mArtd.getDexFileVisibility(SPLIT_APK)).thenReturn(FileVisibility.NOT_FOUND);
+ verifyCleanup();
+ }
+
+ @Test
+ public void testCleanupDeletedSecondaryDex() throws Exception {
// Simulate that a secondary dex file is loaded and then deleted.
lenient()
.when(mArtd.getDexFileVisibility(mCeDir + "/foo.apk"))
@@ -654,13 +697,11 @@ public class DexUseManagerTest {
.when(mArtd.getDexFileVisibility(mCeDir + "/foo.apk"))
.thenReturn(FileVisibility.NOT_FOUND);
- // Create an entry that should be kept.
- lenient()
- .when(mArtd.getDexFileVisibility(mCeDir + "/bar.apk"))
- .thenReturn(FileVisibility.NOT_OTHER_READABLE);
- mDexUseManager.notifyDexContainersLoaded(
- mSnapshot, OWNING_PKG_NAME, Map.of(mCeDir + "/bar.apk", "CLC"));
+ verifyCleanup();
+ }
+ @Test
+ public void testCleanupPrivateSecondaryDex() throws Exception {
// Simulate that a secondary dex file is loaded by another package and then made private.
lenient()
.when(mArtd.getDexFileVisibility(mCeDir + "/baz.apk"))
@@ -671,6 +712,11 @@ public class DexUseManagerTest {
.when(mArtd.getDexFileVisibility(mCeDir + "/baz.apk"))
.thenReturn(FileVisibility.NOT_OTHER_READABLE);
+ verifyCleanup();
+ }
+
+ @Test
+ public void testCleanupDeletedAllDex() throws Exception {
// Simulate that all the files of a package are deleted. The whole container entry of the
// package should be cleaned up, though the package still exists.
lenient()
@@ -684,6 +730,17 @@ public class DexUseManagerTest {
"/somewhere/app/" + LOADING_PKG_NAME + "/base.apk"))
.thenReturn(FileVisibility.NOT_FOUND);
+ verifyCleanup();
+ }
+
+ private void verifyCleanup() throws Exception {
+ // Create an entry that should be kept.
+ lenient()
+ .when(mArtd.getDexFileVisibility(mCeDir + "/bar.apk"))
+ .thenReturn(FileVisibility.NOT_OTHER_READABLE);
+ mDexUseManager.notifyDexContainersLoaded(
+ mSnapshot, OWNING_PKG_NAME, Map.of(mCeDir + "/bar.apk", "CLC"));
+
// Run cleanup.
mDexUseManager.cleanup();
@@ -774,6 +831,13 @@ public class DexUseManagerTest {
true /* isUsedByOtherApps */, mDefaultFileVisibility));
}
+ @Test(expected = IllegalStateException.class)
+ public void testPreRebootNoUpdate() throws Exception {
+ when(mInjector.isPreReboot()).thenReturn(true);
+ mDexUseManager.notifyDexContainersLoaded(
+ mSnapshot, OWNING_PKG_NAME, Map.of(BASE_APK, "CLC"));
+ }
+
private AndroidPackage createPackage(String packageName) {
AndroidPackage pkg = mock(AndroidPackage.class);
lenient().when(pkg.getStorageUuid()).thenReturn(StorageManager.UUID_DEFAULT);
diff --git a/libartservice/service/javatests/com/android/server/art/PrimaryDexopterParameterizedTest.java b/libartservice/service/javatests/com/android/server/art/PrimaryDexopterParameterizedTest.java
index 8f7befb957..30595aafd2 100644
--- a/libartservice/service/javatests/com/android/server/art/PrimaryDexopterParameterizedTest.java
+++ b/libartservice/service/javatests/com/android/server/art/PrimaryDexopterParameterizedTest.java
@@ -195,6 +195,12 @@ public class PrimaryDexopterParameterizedTest extends PrimaryDexopterTestBase {
params.mExpectedCompilerFilter = "verify";
list.add(params);
+ params = new Params();
+ params.mIsPreReboot = true;
+ params.mExpectedOutputIsPreReboot = true;
+ params.mExpectedDeletesRuntimeArtifacts = false;
+ list.add(params);
+
return list;
}
@@ -204,6 +210,7 @@ public class PrimaryDexopterParameterizedTest extends PrimaryDexopterTestBase {
lenient().when(mInjector.isSystemUiPackage(any())).thenReturn(mParams.mIsSystemUi);
lenient().when(mInjector.isLauncherPackage(any())).thenReturn(mParams.mIsLauncher);
+ lenient().when(mInjector.isPreReboot()).thenReturn(mParams.mIsPreReboot);
lenient()
.when(SystemProperties.getBoolean(eq("dalvik.vm.always_debuggable"), anyBoolean()))
@@ -285,7 +292,8 @@ public class PrimaryDexopterParameterizedTest extends PrimaryDexopterTestBase {
400 /* cpuTimeMs */, 30000 /* sizeBytes */, 32000 /* sizeBeforeBytes */))
.when(mArtd)
.dexopt(deepEq(buildOutputArtifacts("/somewhere/app/foo/base.apk", "arm64",
- mParams.mIsInDalvikCache, permissionSettings)),
+ mParams.mIsInDalvikCache, permissionSettings,
+ mParams.mExpectedOutputIsPreReboot)),
eq("/somewhere/app/foo/base.apk"), eq("arm64"), eq("PCL[]"),
eq(mParams.mExpectedCompilerFilter), any() /* profile */,
isNull() /* inputVdex */, isNull() /* dmFile */,
@@ -299,7 +307,8 @@ public class PrimaryDexopterParameterizedTest extends PrimaryDexopterTestBase {
doThrow(ServiceSpecificException.class)
.when(mArtd)
.dexopt(deepEq(buildOutputArtifacts("/somewhere/app/foo/base.apk", "arm",
- mParams.mIsInDalvikCache, permissionSettings)),
+ mParams.mIsInDalvikCache, permissionSettings,
+ mParams.mExpectedOutputIsPreReboot)),
eq("/somewhere/app/foo/base.apk"), eq("arm"), eq("PCL[]"),
eq(mParams.mExpectedCompilerFilter), any() /* profile */,
isNull() /* inputVdex */, isNull() /* dmFile */,
@@ -320,18 +329,23 @@ public class PrimaryDexopterParameterizedTest extends PrimaryDexopterTestBase {
200 /* cpuTimeMs */, 10000 /* sizeBytes */, 0 /* sizeBeforeBytes */))
.when(mArtd)
.dexopt(deepEq(buildOutputArtifacts("/somewhere/app/foo/split_0.apk", "arm",
- mParams.mIsInDalvikCache, permissionSettings)),
+ mParams.mIsInDalvikCache, permissionSettings,
+ mParams.mExpectedOutputIsPreReboot)),
eq("/somewhere/app/foo/split_0.apk"), eq("arm"), eq("PCL[base.apk]"),
eq(mParams.mExpectedCompilerFilter), any() /* profile */,
isNull() /* inputVdex */, isNull() /* dmFile */,
eq(PriorityClass.INTERACTIVE), argThat(dexoptOptionsMatcher), any());
- // Only delete runtime artifacts for successful dexopt operations, namely the first one and
- // the fourth one.
- doReturn(1l).when(mArtd).deleteRuntimeArtifacts(deepEq(AidlUtils.buildRuntimeArtifactsPath(
- PKG_NAME, "/somewhere/app/foo/base.apk", "arm64")));
- doReturn(1l).when(mArtd).deleteRuntimeArtifacts(deepEq(AidlUtils.buildRuntimeArtifactsPath(
- PKG_NAME, "/somewhere/app/foo/split_0.apk", "arm")));
+ if (mParams.mExpectedDeletesRuntimeArtifacts) {
+ // Only delete runtime artifacts for successful dexopt operations, namely the first one
+ // and the fourth one.
+ doReturn(1l).when(mArtd).deleteRuntimeArtifacts(
+ deepEq(AidlUtils.buildRuntimeArtifactsPath(
+ PKG_NAME, "/somewhere/app/foo/base.apk", "arm64")));
+ doReturn(1l).when(mArtd).deleteRuntimeArtifacts(
+ deepEq(AidlUtils.buildRuntimeArtifactsPath(
+ PKG_NAME, "/somewhere/app/foo/split_0.apk", "arm")));
+ }
assertThat(mPrimaryDexopter.dexopt())
.comparingElementsUsing(TestingUtils.<DexContainerFileDexoptResult>deepEquality())
@@ -360,6 +374,10 @@ public class PrimaryDexopterParameterizedTest extends PrimaryDexopterTestBase {
verify(mArtd, times(3))
.dexopt(any(), any(), any(), any(), any(), any(), any(), any(), anyInt(), any(),
any());
+
+ if (!mParams.mExpectedDeletesRuntimeArtifacts) {
+ verify(mArtd, times(0)).deleteRuntimeArtifacts(any());
+ }
}
private static class Params {
@@ -379,6 +397,7 @@ public class PrimaryDexopterParameterizedTest extends PrimaryDexopterTestBase {
public boolean mShouldDowngrade = false;
public boolean mSkipIfStorageLow = false;
public boolean mIgnoreProfile = false;
+ public boolean mIsPreReboot = false;
// System properties.
public boolean mAlwaysDebuggable = false;
@@ -390,6 +409,8 @@ public class PrimaryDexopterParameterizedTest extends PrimaryDexopterTestBase {
| DexoptTrigger.PRIMARY_BOOT_IMAGE_BECOMES_USABLE | DexoptTrigger.NEED_EXTRACTION;
public boolean mExpectedIsDebuggable = false;
public boolean mExpectedIsHiddenApiPolicyEnabled = true;
+ public boolean mExpectedOutputIsPreReboot = false;
+ public boolean mExpectedDeletesRuntimeArtifacts = true;
public String toString() {
return String.format("isInDalvikCache=%b,"
@@ -405,19 +426,24 @@ public class PrimaryDexopterParameterizedTest extends PrimaryDexopterTestBase {
+ "shouldDowngrade=%b,"
+ "skipIfStorageLow=%b,"
+ "ignoreProfile=%b,"
+ + "isPreReboot=%b,"
+ "alwaysDebuggable=%b"
+ " => "
+ "expectedCallbackInputCompilerFilter=%s,"
+ "expectedCompilerFilter=%s,"
+ "expectedDexoptTrigger=%d,"
+ "expectedIsDebuggable=%b,"
- + "expectedIsHiddenApiPolicyEnabled=%b",
+ + "expectedIsHiddenApiPolicyEnabled=%b,"
+ + "expectedOutputIsPreReboot=%b,"
+ + "expectedDeleteRuntimeArtifacts=%b",
mIsInDalvikCache, mHiddenApiEnforcementPolicy, mIsVmSafeMode, mIsDebuggable,
mIsSystemUi, mIsLauncher, mIsUseEmbeddedDex, mRequestedCompilerFilter,
mCallbackReturnedCompilerFilter, mForce, mShouldDowngrade, mSkipIfStorageLow,
- mIgnoreProfile, mAlwaysDebuggable, mExpectedCallbackInputCompilerFilter,
- mExpectedCompilerFilter, mExpectedDexoptTrigger, mExpectedIsDebuggable,
- mExpectedIsHiddenApiPolicyEnabled);
+ mIgnoreProfile, mIsPreReboot, mAlwaysDebuggable,
+ mExpectedCallbackInputCompilerFilter, mExpectedCompilerFilter,
+ mExpectedDexoptTrigger, mExpectedIsDebuggable,
+ mExpectedIsHiddenApiPolicyEnabled, mExpectedOutputIsPreReboot,
+ mExpectedDeletesRuntimeArtifacts);
}
}
}
diff --git a/libartservice/service/javatests/com/android/server/art/PrimaryDexopterTest.java b/libartservice/service/javatests/com/android/server/art/PrimaryDexopterTest.java
index a58add5f30..beb8c1eaf4 100644
--- a/libartservice/service/javatests/com/android/server/art/PrimaryDexopterTest.java
+++ b/libartservice/service/javatests/com/android/server/art/PrimaryDexopterTest.java
@@ -71,18 +71,20 @@ public class PrimaryDexopterTest extends PrimaryDexopterTestBase {
private final String mDexPath = "/somewhere/app/foo/base.apk";
private final String mDmPath = "/somewhere/app/foo/base.dm";
private final ProfilePath mRefProfile =
- AidlUtils.buildProfilePathForPrimaryRef(PKG_NAME, "primary");
+ AidlUtils.buildProfilePathForPrimaryRefAsInput(PKG_NAME, "primary");
private final ProfilePath mPrebuiltProfile = AidlUtils.buildProfilePathForPrebuilt(mDexPath);
private final ProfilePath mDmProfile = AidlUtils.buildProfilePathForDm(mDexPath);
private final DexMetadataPath mDmFile = AidlUtils.buildDexMetadataPath(mDexPath);
- private final OutputProfile mPublicOutputProfile = AidlUtils.buildOutputProfileForPrimary(
- PKG_NAME, "primary", Process.SYSTEM_UID, SHARED_GID, true /* isOtherReadable */);
- private final OutputProfile mPrivateOutputProfile = AidlUtils.buildOutputProfileForPrimary(
- PKG_NAME, "primary", Process.SYSTEM_UID, SHARED_GID, false /* isOtherReadable */);
+ private final OutputProfile mPublicOutputProfile =
+ AidlUtils.buildOutputProfileForPrimary(PKG_NAME, "primary", Process.SYSTEM_UID,
+ SHARED_GID, true /* isOtherReadable */, false /* isPreReboot */);
+ private final OutputProfile mPrivateOutputProfile =
+ AidlUtils.buildOutputProfileForPrimary(PKG_NAME, "primary", Process.SYSTEM_UID,
+ SHARED_GID, false /* isOtherReadable */, false /* isPreReboot */);
private final String mSplit0DexPath = "/somewhere/app/foo/split_0.apk";
private final ProfilePath mSplit0RefProfile =
- AidlUtils.buildProfilePathForPrimaryRef(PKG_NAME, "split_0.split");
+ AidlUtils.buildProfilePathForPrimaryRefAsInput(PKG_NAME, "split_0.split");
private final int mDefaultDexoptTrigger = DexoptTrigger.COMPILER_FILTER_IS_BETTER
| DexoptTrigger.PRIMARY_BOOT_IMAGE_BECOMES_USABLE | DexoptTrigger.NEED_EXTRACTION;
@@ -163,7 +165,7 @@ public class PrimaryDexopterTest extends PrimaryDexopterTestBase {
doReturn(mArtdDexoptResult)
.when(mArtd)
.dexopt(any(), eq(mDexPath), eq("arm"), any(), any(), any(),
- deepEq(VdexPath.artifactsPath(AidlUtils.buildArtifactsPath(
+ deepEq(VdexPath.artifactsPath(AidlUtils.buildArtifactsPathAsInput(
mDexPath, "arm", true /* isInDalvikCache */))),
any(), anyInt(), any(), any());
@@ -174,7 +176,7 @@ public class PrimaryDexopterTest extends PrimaryDexopterTestBase {
doReturn(mArtdDexoptResult)
.when(mArtd)
.dexopt(any(), eq(mSplit0DexPath), eq("arm64"), any(), any(), any(),
- deepEq(VdexPath.artifactsPath(AidlUtils.buildArtifactsPath(
+ deepEq(VdexPath.artifactsPath(AidlUtils.buildArtifactsPathAsInput(
mSplit0DexPath, "arm64", false /* isInDalvikCache */))),
any(), anyInt(), any(), any());
@@ -303,8 +305,7 @@ public class PrimaryDexopterTest extends PrimaryDexopterTestBase {
verifyEmbeddedProfileNotUsed(mDexPath);
}
- @Test
- public void testDexoptMergesProfiles() throws Exception {
+ private void checkDexoptMergesProfiles() throws Exception {
setPackageInstalledForUserIds(0, 2);
when(mArtd.mergeProfiles(any(), any(), any(), any(), any())).thenReturn(true);
@@ -340,14 +341,30 @@ public class PrimaryDexopterTest extends PrimaryDexopterTestBase {
false /* isOtherReadable */);
inOrder.verify(mArtd).commitTmpProfile(deepEq(mPrivateOutputProfile.profilePath));
+ }
- inOrder.verify(mArtd).deleteProfile(deepEq(
+ @Test
+ public void testDexoptMergesProfiles() throws Exception {
+ checkDexoptMergesProfiles();
+
+ verify(mArtd).deleteProfile(deepEq(
AidlUtils.buildProfilePathForPrimaryCur(0 /* userId */, PKG_NAME, "primary")));
- inOrder.verify(mArtd).deleteProfile(deepEq(
+ verify(mArtd).deleteProfile(deepEq(
AidlUtils.buildProfilePathForPrimaryCur(2 /* userId */, PKG_NAME, "primary")));
}
@Test
+ public void testDexoptMergesProfilesPreReboot() throws Exception {
+ when(mInjector.isPreReboot()).thenReturn(true);
+ mPublicOutputProfile.profilePath.finalPath.getForPrimary().isPreReboot = true;
+ mPrivateOutputProfile.profilePath.finalPath.getForPrimary().isPreReboot = true;
+
+ checkDexoptMergesProfiles();
+
+ verify(mArtd, never()).deleteProfile(any());
+ }
+
+ @Test
public void testDexoptMergesProfilesMergeFailed() throws Exception {
setPackageInstalledForUserIds(0, 2);
@@ -397,8 +414,7 @@ public class PrimaryDexopterTest extends PrimaryDexopterTestBase {
mPrimaryDexopter.dexopt();
}
- @Test
- public void testDexoptUsesDmProfile() throws Exception {
+ private void checkDexoptUsesDmProfile() throws Exception {
makeProfileUsable(mDmProfile);
makeEmbeddedProfileUsable(mDexPath);
@@ -420,6 +436,20 @@ public class PrimaryDexopterTest extends PrimaryDexopterTestBase {
verifyEmbeddedProfileNotUsed(mDexPath);
}
+ @Test
+ public void testDexoptUsesDmProfile() throws Exception {
+ checkDexoptUsesDmProfile();
+ }
+
+ @Test
+ public void testDexoptUsesDmProfilePreReboot() throws Exception {
+ when(mInjector.isPreReboot()).thenReturn(true);
+ mPublicOutputProfile.profilePath.finalPath.getForPrimary().isPreReboot = true;
+ mPrivateOutputProfile.profilePath.finalPath.getForPrimary().isPreReboot = true;
+
+ checkDexoptUsesDmProfile();
+ }
+
private void checkDexoptUsesEmbeddedProfile() throws Exception {
makeEmbeddedProfileUsable(mDexPath);
@@ -501,6 +531,15 @@ public class PrimaryDexopterTest extends PrimaryDexopterTestBase {
}
@Test
+ public void testDexoptUsesEmbeddedProfilePreReboot() throws Exception {
+ when(mInjector.isPreReboot()).thenReturn(true);
+ mPublicOutputProfile.profilePath.finalPath.getForPrimary().isPreReboot = true;
+ mPrivateOutputProfile.profilePath.finalPath.getForPrimary().isPreReboot = true;
+
+ checkDexoptUsesEmbeddedProfile();
+ }
+
+ @Test
public void testDexoptExternalProfileErrors() throws Exception {
// Having no profile should not be reported.
// Having a bad profile should be reported.
diff --git a/libartservice/service/javatests/com/android/server/art/PrimaryDexopterTestBase.java b/libartservice/service/javatests/com/android/server/art/PrimaryDexopterTestBase.java
index 5e26835da2..3105e4e51b 100644
--- a/libartservice/service/javatests/com/android/server/art/PrimaryDexopterTestBase.java
+++ b/libartservice/service/javatests/com/android/server/art/PrimaryDexopterTestBase.java
@@ -92,6 +92,7 @@ public class PrimaryDexopterTestBase {
lenient().when(mInjector.getArtVersion()).thenReturn(ART_VERSION);
lenient().when(mInjector.getConfig()).thenReturn(mConfig);
lenient().when(mInjector.getDexMetadataHelper()).thenReturn(mDexMetadataHelper);
+ lenient().when(mInjector.isPreReboot()).thenReturn(false);
lenient()
.when(SystemProperties.get("dalvik.vm.systemuicompilerfilter"))
diff --git a/libartservice/service/javatests/com/android/server/art/SecondaryDexopterTest.java b/libartservice/service/javatests/com/android/server/art/SecondaryDexopterTest.java
index 13ff28a908..07dd07dae7 100644
--- a/libartservice/service/javatests/com/android/server/art/SecondaryDexopterTest.java
+++ b/libartservice/service/javatests/com/android/server/art/SecondaryDexopterTest.java
@@ -81,12 +81,16 @@ public class SecondaryDexopterTest {
.setFlags(ArtFlags.FLAG_FOR_PRIMARY_DEX | ArtFlags.FLAG_FOR_SECONDARY_DEX)
.build();
- private final ProfilePath mDex1RefProfile = AidlUtils.buildProfilePathForSecondaryRef(DEX_1);
+ private final ProfilePath mDex1RefProfile =
+ AidlUtils.buildProfilePathForSecondaryRefAsInput(DEX_1);
private final ProfilePath mDex1CurProfile = AidlUtils.buildProfilePathForSecondaryCur(DEX_1);
- private final ProfilePath mDex2RefProfile = AidlUtils.buildProfilePathForSecondaryRef(DEX_2);
- private final ProfilePath mDex3RefProfile = AidlUtils.buildProfilePathForSecondaryRef(DEX_3);
+ private final ProfilePath mDex2RefProfile =
+ AidlUtils.buildProfilePathForSecondaryRefAsInput(DEX_2);
+ private final ProfilePath mDex3RefProfile =
+ AidlUtils.buildProfilePathForSecondaryRefAsInput(DEX_3);
private final OutputProfile mDex1PrivateOutputProfile =
- AidlUtils.buildOutputProfileForSecondary(DEX_1, UID, UID, false /* isOtherReadable */);
+ AidlUtils.buildOutputProfileForSecondary(
+ DEX_1, UID, UID, false /* isOtherReadable */, false /* isPreReboot */);
private final int mDefaultDexoptTrigger = DexoptTrigger.COMPILER_FILTER_IS_BETTER
| DexoptTrigger.PRIMARY_BOOT_IMAGE_BECOMES_USABLE | DexoptTrigger.NEED_EXTRACTION;
@@ -322,8 +326,8 @@ public class SecondaryDexopterTest {
private void checkDexoptWithPrivateProfile(IArtd artd, String dexPath, String isa,
ProfilePath profile, String classLoaderContext) throws Exception {
PermissionSettings permissionSettings = buildPermissionSettings(false /* isPublic */);
- OutputArtifacts outputArtifacts = AidlUtils.buildOutputArtifacts(
- dexPath, isa, false /* isInDalvikCache */, permissionSettings);
+ OutputArtifacts outputArtifacts = AidlUtils.buildOutputArtifacts(dexPath, isa,
+ false /* isInDalvikCache */, permissionSettings, false /* isPreReboot */);
artd.dexopt(deepEq(outputArtifacts), eq(dexPath), eq(isa), eq(classLoaderContext),
eq("speed-profile"), deepEq(profile), any(), isNull() /* dmFile */, anyInt(),
argThat(dexoptOptions -> dexoptOptions.generateAppImage == true), any());
@@ -332,8 +336,8 @@ public class SecondaryDexopterTest {
private void checkDexoptWithNoProfile(IArtd artd, String dexPath, String isa,
String compilerFilter, String classLoaderContext, boolean isPublic) throws Exception {
PermissionSettings permissionSettings = buildPermissionSettings(isPublic);
- OutputArtifacts outputArtifacts = AidlUtils.buildOutputArtifacts(
- dexPath, isa, false /* isInDalvikCache */, permissionSettings);
+ OutputArtifacts outputArtifacts = AidlUtils.buildOutputArtifacts(dexPath, isa,
+ false /* isInDalvikCache */, permissionSettings, false /* isPreReboot */);
artd.dexopt(deepEq(outputArtifacts), eq(dexPath), eq(isa), eq(classLoaderContext),
eq(compilerFilter), isNull(), any(), isNull() /* dmFile */, anyInt(),
argThat(dexoptOptions -> dexoptOptions.generateAppImage == false), any());
diff --git a/libartservice/service/javatests/com/android/server/art/UtilsTest.java b/libartservice/service/javatests/com/android/server/art/UtilsTest.java
index bc6ed1611b..95fd747fbb 100644
--- a/libartservice/service/javatests/com/android/server/art/UtilsTest.java
+++ b/libartservice/service/javatests/com/android/server/art/UtilsTest.java
@@ -151,15 +151,18 @@ public class UtilsTest {
Utils.getAllAbis(pkgState);
}
- @Test(expected = IllegalStateException.class)
+ @Test
public void testGetAllAbisUnsupportedTranslation() {
lenient().when(SystemProperties.get(eq("ro.dalvik.vm.isa.x86_64"))).thenReturn("");
+ lenient().when(SystemProperties.get(eq("ro.dalvik.vm.isa.x86"))).thenReturn("");
var pkgState = mock(PackageState.class);
when(pkgState.getPrimaryCpuAbi()).thenReturn("x86_64");
- when(pkgState.getSecondaryCpuAbi()).thenReturn(null);
+ when(pkgState.getSecondaryCpuAbi()).thenReturn("x86");
- Utils.getAllAbis(pkgState);
+ when(Constants.getPreferredAbi()).thenReturn("armeabi-v7a");
+ assertThat(Utils.getAllAbis(pkgState))
+ .containsExactly(Utils.Abi.create("armeabi-v7a", "arm", true /* isPrimaryAbi */));
}
@Test
diff --git a/libartservice/service/proguard.flags b/libartservice/service/proguard.flags
index 8ef413f3a3..3203cb6b56 100644
--- a/libartservice/service/proguard.flags
+++ b/libartservice/service/proguard.flags
@@ -8,3 +8,6 @@
# A job service is referenced by the framework through reflection.
-keep class * extends android.app.job.JobService { *; }
+
+# PreRebootManager is called through reflection.
+-keep class com.android.server.art.prereboot.PreRebootManager { *; }
diff --git a/oatdump/oatdump.cc b/oatdump/oatdump.cc
index 5e41982bd3..2c17845417 100644
--- a/oatdump/oatdump.cc
+++ b/oatdump/oatdump.cc
@@ -550,7 +550,8 @@ class OatDumper {
oat_dex_file->GetTypeBssMapping(),
oat_dex_file->GetPublicTypeBssMapping(),
oat_dex_file->GetPackageTypeBssMapping(),
- oat_dex_file->GetStringBssMapping());
+ oat_dex_file->GetStringBssMapping(),
+ oat_dex_file->GetMethodTypeBssMapping());
}
}
@@ -574,7 +575,8 @@ class OatDumper {
oat_file_.bcp_bss_info_[i].type_bss_mapping,
oat_file_.bcp_bss_info_[i].public_type_bss_mapping,
oat_file_.bcp_bss_info_[i].package_type_bss_mapping,
- oat_file_.bcp_bss_info_[i].string_bss_mapping);
+ oat_file_.bcp_bss_info_[i].string_bss_mapping,
+ oat_file_.bcp_bss_info_[i].method_type_bss_mapping);
}
} else {
// We don't have a runtime, just dump the offsets
@@ -585,6 +587,7 @@ class OatDumper {
DumpBssOffsets(os, "Public Class", oat_file_.bcp_bss_info_[i].public_type_bss_mapping);
DumpBssOffsets(os, "Package Class", oat_file_.bcp_bss_info_[i].package_type_bss_mapping);
DumpBssOffsets(os, "String", oat_file_.bcp_bss_info_[i].string_bss_mapping);
+ DumpBssOffsets(os, "MethodType", oat_file_.bcp_bss_info_[i].method_type_bss_mapping);
}
}
}
@@ -1741,7 +1744,8 @@ class OatDumper {
const IndexBssMapping* type_bss_mapping,
const IndexBssMapping* public_type_bss_mapping,
const IndexBssMapping* package_type_bss_mapping,
- const IndexBssMapping* string_bss_mapping) {
+ const IndexBssMapping* string_bss_mapping,
+ const IndexBssMapping* method_type_bss_mapping) {
DumpBssEntries(os,
"ArtMethod",
method_bss_mapping,
@@ -1773,6 +1777,15 @@ class OatDumper {
dex_file->NumStringIds(),
sizeof(GcRoot<mirror::Class>),
[=](uint32_t index) { return dex_file->GetStringData(dex::StringIndex(index)); });
+ DumpBssEntries(os,
+ "MethodType",
+ method_type_bss_mapping,
+ dex_file->NumProtoIds(),
+ sizeof(GcRoot<mirror::MethodType>),
+ [=](uint32_t index) {
+ const dex::ProtoId& proto_id = dex_file->GetProtoId(dex::ProtoIndex(index));
+ return dex_file->GetProtoSignature(proto_id).ToString();
+ });
}
void DumpBssOffsets(std::ostream& os, const char* slot_type, const IndexBssMapping* mapping) {
diff --git a/openjdkjvmti/ti_redefine.cc b/openjdkjvmti/ti_redefine.cc
index 60e8193f5d..d0ce6a1f49 100644
--- a/openjdkjvmti/ti_redefine.cc
+++ b/openjdkjvmti/ti_redefine.cc
@@ -2550,6 +2550,9 @@ void Redefiner::ClassRedefinition::UpdateMethods(art::ObjPtr<art::mirror::Class>
const art::DexFile& old_dex_file = mclass->GetDexFile();
// Update methods.
for (art::ArtMethod& method : mclass->GetDeclaredMethods(image_pointer_size)) {
+ // Reinitialize the method by calling `CopyFrom`. This ensures for example
+ // the entrypoint and the hotness are reset.
+ method.CopyFrom(&method, image_pointer_size);
const art::dex::StringId* new_name_id = dex_file_->FindStringId(method.GetName());
art::dex::TypeIndex method_return_idx =
dex_file_->GetIndexForTypeId(*dex_file_->FindTypeId(method.GetReturnTypeDescriptor()));
diff --git a/runtime/art_method.cc b/runtime/art_method.cc
index c8b16990b2..0b6b883bab 100644
--- a/runtime/art_method.cc
+++ b/runtime/art_method.cc
@@ -795,16 +795,18 @@ void ArtMethod::CopyFrom(ArtMethod* src, PointerSize image_pointer_size) {
const void* entry_point = GetEntryPointFromQuickCompiledCodePtrSize(image_pointer_size);
if (runtime->UseJitCompilation()) {
if (runtime->GetJit()->GetCodeCache()->ContainsPc(entry_point)) {
- SetEntryPointFromQuickCompiledCodePtrSize(
- src->IsNative() ? GetQuickGenericJniStub() : GetQuickToInterpreterBridge(),
- image_pointer_size);
+ SetNativePointer(EntryPointFromQuickCompiledCodeOffset(image_pointer_size),
+ src->IsNative() ? GetQuickGenericJniStub() : GetQuickToInterpreterBridge(),
+ image_pointer_size);
}
}
ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
if (interpreter::IsNterpSupported() && class_linker->IsNterpEntryPoint(entry_point)) {
// If the entrypoint is nterp, it's too early to check if the new method
// will support it. So for simplicity, use the interpreter bridge.
- SetEntryPointFromQuickCompiledCodePtrSize(GetQuickToInterpreterBridge(), image_pointer_size);
+ SetNativePointer(EntryPointFromQuickCompiledCodeOffset(image_pointer_size),
+ GetQuickToInterpreterBridge(),
+ image_pointer_size);
}
// Clear the data pointer, it will be set if needed by the caller.
@@ -922,4 +924,20 @@ ALWAYS_INLINE static inline void DoGetAccessFlagsHelper(ArtMethod* method)
method->GetDeclaringClass<kReadBarrierOption>()->IsErroneous());
}
+void ArtMethod::SetEntryPointFromQuickCompiledCodePtrSize(
+ const void* entry_point_from_quick_compiled_code, PointerSize pointer_size) {
+ const void* current_entry_point = GetEntryPointFromQuickCompiledCodePtrSize(pointer_size);
+ if (current_entry_point == entry_point_from_quick_compiled_code) {
+ return;
+ }
+ jit::Jit* jit = Runtime::Current()->GetJit();
+ SetNativePointer(EntryPointFromQuickCompiledCodeOffset(pointer_size),
+ entry_point_from_quick_compiled_code,
+ pointer_size);
+ if (jit != nullptr &&
+ jit->GetCodeCache()->ContainsPc(current_entry_point)) {
+ jit->GetCodeCache()->AddZombieCode(this, current_entry_point);
+ }
+}
+
} // namespace art
diff --git a/runtime/art_method.h b/runtime/art_method.h
index a612c81b75..97e1e6fa25 100644
--- a/runtime/art_method.h
+++ b/runtime/art_method.h
@@ -766,11 +766,7 @@ class EXPORT ArtMethod final {
}
ALWAYS_INLINE void SetEntryPointFromQuickCompiledCodePtrSize(
const void* entry_point_from_quick_compiled_code, PointerSize pointer_size)
- REQUIRES_SHARED(Locks::mutator_lock_) {
- SetNativePointer(EntryPointFromQuickCompiledCodeOffset(pointer_size),
- entry_point_from_quick_compiled_code,
- pointer_size);
- }
+ REQUIRES_SHARED(Locks::mutator_lock_);
static constexpr MemberOffset DataOffset(PointerSize pointer_size) {
return MemberOffset(PtrSizedFieldsOffset(pointer_size) + OFFSETOF_MEMBER(
@@ -1190,6 +1186,8 @@ class EXPORT ArtMethod final {
// Used by GetName and GetNameView to share common code.
const char* GetRuntimeMethodName() REQUIRES_SHARED(Locks::mutator_lock_);
+ friend class RuntimeImageHelper; // For SetNativePointer.
+
DISALLOW_COPY_AND_ASSIGN(ArtMethod); // Need to use CopyFrom to deal with 32 vs 64 bits.
};
diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc
index 050896041b..5b00a87217 100644
--- a/runtime/class_linker.cc
+++ b/runtime/class_linker.cc
@@ -6627,8 +6627,15 @@ static ObjPtr<mirror::Class> GetImtOwner(ObjPtr<mirror::Class> klass)
DCHECK(imt != nullptr);
while (klass->HasSuperClass()) {
ObjPtr<mirror::Class> super_class = klass->GetSuperClass();
- if (super_class->ShouldHaveImt() && imt != super_class->GetImt(kRuntimePointerSize)) {
+ // Abstract classes cannot have IMTs, so we skip them.
+ while (super_class->IsAbstract()) {
+ DCHECK(super_class->HasSuperClass());
+ super_class = super_class->GetSuperClass();
+ }
+ DCHECK(super_class->ShouldHaveImt());
+ if (imt != super_class->GetImt(kRuntimePointerSize)) {
// IMT not shared with the super class, return the current class.
+ DCHECK_EQ(klass->GetImt(kRuntimePointerSize), imt) << klass->PrettyClass();
return klass;
}
klass = super_class;
@@ -6651,6 +6658,10 @@ ArtMethod* ClassLinker::AddMethodToConflictTable(ObjPtr<mirror::Class> klass,
DCHECK(imt_owner != nullptr);
LinearAlloc* linear_alloc = GetAllocatorForClassLoader(imt_owner->GetClassLoader());
+ // If the imt owner is in an image, the imt is also there and not in the
+ // linear alloc.
+ DCHECK_IMPLIES(runtime->GetHeap()->FindSpaceFromObject(imt_owner, /*fail_ok=*/true) == nullptr,
+ linear_alloc->Contains(klass->GetImt(kRuntimePointerSize)));
// Create a new entry if the existing one is the shared conflict method.
ArtMethod* new_conflict_method = (conflict_method == runtime->GetImtConflictMethod())
diff --git a/runtime/gc/space/image_space.cc b/runtime/gc/space/image_space.cc
index 7f1bde2426..852039a206 100644
--- a/runtime/gc/space/image_space.cc
+++ b/runtime/gc/space/image_space.cc
@@ -995,24 +995,34 @@ class ImageSpace::Loader {
/*out*/std::string* error_msg)
REQUIRES_SHARED(Locks::mutator_lock_) {
TimingLogger::ScopedTiming timing("MapImageFile", logger);
- std::string temp_error_msg;
+
+ // The runtime might not be available at this point if we're running dex2oat or oatdump, in
+ // which case we just truncate the madvise optimization limit completely.
+ Runtime* runtime = Runtime::Current();
+ const size_t madvise_size_limit = runtime ? runtime->GetMadviseWillNeedSizeArt() : 0;
+
const bool is_compressed = image_header.HasCompressedBlock();
if (!is_compressed && allow_direct_mapping) {
uint8_t* address = (image_reservation != nullptr) ? image_reservation->Begin() : nullptr;
// The reserved memory size is aligned up to kElfSegmentAlignment to ensure
// that the next reserved area will be aligned to the value.
- return MemMap::MapFileAtAddress(address,
- CondRoundUp<kPageSizeAgnostic>(image_header.GetImageSize(),
- kElfSegmentAlignment),
- PROT_READ | PROT_WRITE,
- MAP_PRIVATE,
- fd,
- /*start=*/ 0,
- /*low_4gb=*/ true,
- image_filename,
- /*reuse=*/ false,
- image_reservation,
- error_msg);
+ MemMap map = MemMap::MapFileAtAddress(
+ address,
+ CondRoundUp<kPageSizeAgnostic>(image_header.GetImageSize(), kElfSegmentAlignment),
+ PROT_READ | PROT_WRITE,
+ MAP_PRIVATE,
+ fd,
+ /*start=*/0,
+ /*low_4gb=*/true,
+ image_filename,
+ /*reuse=*/false,
+ image_reservation,
+ error_msg);
+ if (map.IsValid()) {
+ Runtime::MadviseFileForRange(
+ madvise_size_limit, map.Size(), map.Begin(), map.End(), image_filename);
+ }
+ return map;
}
// Reserve output and copy/decompress into it.
@@ -1040,17 +1050,8 @@ class ImageSpace::Loader {
return MemMap::Invalid();
}
- Runtime* runtime = Runtime::Current();
- // The runtime might not be available at this point if we're running
- // dex2oat or oatdump.
- if (runtime != nullptr) {
- size_t madvise_size_limit = runtime->GetMadviseWillNeedSizeArt();
- Runtime::MadviseFileForRange(madvise_size_limit,
- temp_map.Size(),
- temp_map.Begin(),
- temp_map.End(),
- image_filename);
- }
+ Runtime::MadviseFileForRange(
+ madvise_size_limit, temp_map.Size(), temp_map.Begin(), temp_map.End(), image_filename);
if (is_compressed) {
memcpy(map.Begin(), &image_header, sizeof(ImageHeader));
diff --git a/runtime/interpreter/mterp/nterp.cc b/runtime/interpreter/mterp/nterp.cc
index bcc59a4032..d8ce2bcaed 100644
--- a/runtime/interpreter/mterp/nterp.cc
+++ b/runtime/interpreter/mterp/nterp.cc
@@ -118,8 +118,9 @@ void CheckNterpAsmConstants() {
inline void UpdateHotness(ArtMethod* method) REQUIRES_SHARED(Locks::mutator_lock_) {
// The hotness we will add to a method when we perform a
// field/method/class/string lookup.
- constexpr uint16_t kNterpHotnessLookup = 0xff;
- method->UpdateCounter(kNterpHotnessLookup);
+ bool increase_hotness_for_ui = Runtime::Current()->InJankPerceptibleProcessState() &&
+ Thread::Current()->IsJitSensitiveThread();
+ method->UpdateCounter(increase_hotness_for_ui ? 0x6ff : 0xf);
}
template<typename T>
diff --git a/runtime/jit/jit_code_cache.cc b/runtime/jit/jit_code_cache.cc
index 7ea9efb0f9..378e6cba97 100644
--- a/runtime/jit/jit_code_cache.cc
+++ b/runtime/jit/jit_code_cache.cc
@@ -342,6 +342,8 @@ const void* JitCodeCache::GetSavedEntryPointOfPreCompiledMethod(ArtMethod* metho
auto it = saved_compiled_methods_map_.find(method);
if (it != saved_compiled_methods_map_.end()) {
code_ptr = it->second;
+ // Now that we're using the saved entrypoint, remove it from the saved map.
+ saved_compiled_methods_map_.erase(it);
}
}
if (code_ptr != nullptr) {
@@ -489,33 +491,40 @@ void JitCodeCache::FreeAllMethodHeaders(
->RemoveDependentsWithMethodHeaders(method_headers);
}
- ScopedCodeCacheWrite scc(private_region_);
- for (const OatQuickMethodHeader* method_header : method_headers) {
- FreeCodeAndData(method_header->GetCode());
- }
+ {
+ MutexLock mu(Thread::Current(), *Locks::jit_lock_);
+ ScopedCodeCacheWrite scc(private_region_);
+ for (const OatQuickMethodHeader* method_header : method_headers) {
+ FreeCodeAndData(method_header->GetCode());
+ }
- // We have potentially removed a lot of debug info. Do maintenance pass to save space.
- RepackNativeDebugInfoForJit();
+ // We have potentially removed a lot of debug info. Do maintenance pass to save space.
+ RepackNativeDebugInfoForJit();
+ }
// Check that the set of compiled methods exactly matches native debug information.
// Does not check zygote methods since they can change concurrently.
if (kIsDebugBuild && !Runtime::Current()->IsZygote()) {
std::map<const void*, ArtMethod*> compiled_methods;
- VisitAllMethods([&](const void* addr, ArtMethod* method) {
- if (!IsInZygoteExecSpace(addr)) {
- CHECK(addr != nullptr && method != nullptr);
- compiled_methods.emplace(addr, method);
- }
- });
std::set<const void*> debug_info;
- ForEachNativeDebugSymbol([&](const void* addr, size_t, const char* name) {
- addr = AlignDown(addr, GetInstructionSetInstructionAlignment(kRuntimeISA)); // Thumb-bit.
- CHECK(debug_info.emplace(addr).second) << "Duplicate debug info: " << addr << " " << name;
- CHECK_EQ(compiled_methods.count(addr), 1u) << "Extra debug info: " << addr << " " << name;
- });
+ {
+ MutexLock mu(Thread::Current(), *Locks::jit_lock_);
+ VisitAllMethods([&](const void* addr, ArtMethod* method) {
+ if (!IsInZygoteExecSpace(addr)) {
+ CHECK(addr != nullptr && method != nullptr);
+ compiled_methods.emplace(addr, method);
+ }
+ });
+ ForEachNativeDebugSymbol([&](const void* addr, size_t, const char* name) {
+ addr = AlignDown(addr, GetInstructionSetInstructionAlignment(kRuntimeISA)); // Thumb-bit.
+ bool res = debug_info.emplace(addr).second;
+ CHECK(res) << "Duplicate debug info: " << addr << " " << name;
+ CHECK_EQ(compiled_methods.count(addr), 1u) << "Extra debug info: " << addr << " " << name;
+ });
+ }
if (!debug_info.empty()) { // If debug-info generation is enabled.
for (auto it : compiled_methods) {
- CHECK_EQ(debug_info.count(it.first), 1u) << "No debug info: " << it.second->PrettyMethod();
+ CHECK_EQ(debug_info.count(it.first), 1u) << "Missing debug info";
}
CHECK_EQ(compiled_methods.size(), debug_info.size());
}
@@ -546,17 +555,34 @@ void JitCodeCache::RemoveMethodsIn(Thread* self, const LinearAlloc& alloc) {
++it;
}
}
+ for (auto it = zombie_jni_code_.begin(); it != zombie_jni_code_.end();) {
+ if (alloc.ContainsUnsafe(*it)) {
+ it = zombie_jni_code_.erase(it);
+ } else {
+ ++it;
+ }
+ }
+ for (auto it = processed_zombie_jni_code_.begin(); it != processed_zombie_jni_code_.end();) {
+ if (alloc.ContainsUnsafe(*it)) {
+ it = processed_zombie_jni_code_.erase(it);
+ } else {
+ ++it;
+ }
+ }
for (auto it = method_code_map_.begin(); it != method_code_map_.end();) {
if (alloc.ContainsUnsafe(it->second)) {
method_headers.insert(OatQuickMethodHeader::FromCodePointer(it->first));
VLOG(jit) << "JIT removed " << it->second->PrettyMethod() << ": " << it->first;
it = method_code_map_.erase(it);
+ zombie_code_.erase(it->first);
+ processed_zombie_code_.erase(it->first);
} else {
++it;
}
}
}
for (auto it = osr_code_map_.begin(); it != osr_code_map_.end();) {
+ DCHECK(!ContainsElement(zombie_code_, it->second));
if (alloc.ContainsUnsafe(it->first)) {
// Note that the code has already been pushed to method_headers in the loop
// above and is going to be removed in FreeCode() below.
@@ -574,8 +600,8 @@ void JitCodeCache::RemoveMethodsIn(Thread* self, const LinearAlloc& alloc) {
++it;
}
}
- FreeAllMethodHeaders(method_headers);
}
+ FreeAllMethodHeaders(method_headers);
}
bool JitCodeCache::IsWeakAccessEnabled(Thread* self) const {
@@ -641,18 +667,6 @@ static void ClearMethodCounter(ArtMethod* method, bool was_warm)
method->UpdateCounter(/* new_samples= */ 1);
}
-void JitCodeCache::WaitForPotentialCollectionToCompleteRunnable(Thread* self) {
- while (collection_in_progress_) {
- Locks::jit_lock_->Unlock(self);
- {
- ScopedThreadSuspension sts(self, ThreadState::kSuspended);
- MutexLock mu(self, *Locks::jit_lock_);
- WaitForPotentialCollectionToComplete(self);
- }
- Locks::jit_lock_->Lock(self);
- }
-}
-
bool JitCodeCache::Commit(Thread* self,
JitMemoryRegion* region,
ArtMethod* method,
@@ -680,9 +694,6 @@ bool JitCodeCache::Commit(Thread* self,
OatQuickMethodHeader* method_header = nullptr;
{
MutexLock mu(self, *Locks::jit_lock_);
- // We need to make sure that there will be no jit-gcs going on and wait for any ongoing one to
- // finish.
- WaitForPotentialCollectionToCompleteRunnable(self);
const uint8_t* code_ptr = region->CommitCode(reserved_code, code, stack_map_data);
if (code_ptr == nullptr) {
return false;
@@ -782,11 +793,6 @@ bool JitCodeCache::Commit(Thread* self,
method, method_header->GetEntryPoint());
}
}
- if (collection_in_progress_) {
- // We need to update the live bitmap if there is a GC to ensure it sees this new
- // code.
- GetLiveBitmap()->AtomicTestAndSet(FromCodeToAllocation(code_ptr));
- }
VLOG(jit)
<< "JIT added (kind=" << compilation_kind << ") "
<< ArtMethod::PrettyMethod(method) << "@" << method
@@ -855,6 +861,7 @@ bool JitCodeCache::RemoveMethodLocked(ArtMethod* method, bool release_memory) {
FreeCodeAndData(it->second.GetCode());
}
jni_stubs_map_.erase(it);
+ zombie_jni_code_.erase(method);
} else {
it->first.UpdateShorty(it->second.GetMethods().front());
}
@@ -985,7 +992,6 @@ bool JitCodeCache::Reserve(Thread* self,
{
ScopedThreadSuspension sts(self, ThreadState::kSuspended);
MutexLock mu(self, *Locks::jit_lock_);
- WaitForPotentialCollectionToComplete(self);
ScopedCodeCacheWrite ccw(*region);
code = region->AllocateCode(code_size);
data = region->AllocateData(data_size);
@@ -1002,8 +1008,8 @@ bool JitCodeCache::Reserve(Thread* self,
<< PrettySize(data_size);
return false;
}
- // Run a code cache collection and try again.
- GarbageCollectCache(self);
+ // Increase the capacity and try again.
+ IncreaseCodeCacheCapacity(self);
}
*reserved_code = ArrayRef<const uint8_t>(code, code_size);
@@ -1081,11 +1087,6 @@ class MarkCodeClosure final : public Closure {
Barrier* const barrier_;
};
-void JitCodeCache::NotifyCollectionDone(Thread* self) {
- collection_in_progress_ = false;
- lock_cond_.Broadcast(self);
-}
-
void JitCodeCache::MarkCompiledCodeOnThreadStacks(Thread* self) {
Barrier barrier(0);
size_t threads_running_checkpoint = 0;
@@ -1103,86 +1104,114 @@ bool JitCodeCache::IsAtMaxCapacity() const {
return private_region_.GetCurrentCapacity() == private_region_.GetMaxCapacity();
}
-void JitCodeCache::GarbageCollectCache(Thread* self) {
- ScopedTrace trace(__FUNCTION__);
- // Wait for an existing collection, or let everyone know we are starting one.
- {
- ScopedThreadSuspension sts(self, ThreadState::kSuspended);
- MutexLock mu(self, *Locks::jit_lock_);
- if (!garbage_collect_code_) {
- private_region_.IncreaseCodeCacheCapacity();
- return;
- } else if (WaitForPotentialCollectionToComplete(self)) {
- return;
- } else {
- number_of_collections_++;
- live_bitmap_.reset(CodeCacheBitmap::Create(
- "code-cache-bitmap",
- reinterpret_cast<uintptr_t>(private_region_.GetExecPages()->Begin()),
- reinterpret_cast<uintptr_t>(
- private_region_.GetExecPages()->Begin() + private_region_.GetCurrentCapacity() / 2)));
- collection_in_progress_ = true;
- }
- }
-
- TimingLogger logger("JIT code cache timing logger", true, VLOG_IS_ON(jit));
- {
- TimingLogger::ScopedTiming st("Code cache collection", &logger);
-
- VLOG(jit) << "Do code cache collection, code="
- << PrettySize(CodeCacheSize())
- << ", data=" << PrettySize(DataCacheSize());
-
- DoCollection(self);
-
- VLOG(jit) << "After code cache collection, code="
- << PrettySize(CodeCacheSize())
- << ", data=" << PrettySize(DataCacheSize());
-
- {
- MutexLock mu(self, *Locks::jit_lock_);
- private_region_.IncreaseCodeCacheCapacity();
- live_bitmap_.reset(nullptr);
- NotifyCollectionDone(self);
- }
- }
- Runtime::Current()->GetJit()->AddTimingLogger(logger);
+void JitCodeCache::IncreaseCodeCacheCapacity(Thread* self) {
+ MutexLock mu(self, *Locks::jit_lock_);
+ private_region_.IncreaseCodeCacheCapacity();
}
void JitCodeCache::RemoveUnmarkedCode(Thread* self) {
ScopedTrace trace(__FUNCTION__);
- ScopedDebugDisallowReadBarriers sddrb(self);
std::unordered_set<OatQuickMethodHeader*> method_headers;
+ ScopedDebugDisallowReadBarriers sddrb(self);
{
MutexLock mu(self, *Locks::jit_lock_);
- // Iterate over all compiled code and remove entries that are not marked.
- for (auto it = jni_stubs_map_.begin(); it != jni_stubs_map_.end();) {
- JniStubData* data = &it->second;
- if (IsInZygoteExecSpace(data->GetCode()) ||
- !data->IsCompiled() ||
- GetLiveBitmap()->Test(FromCodeToAllocation(data->GetCode()))) {
- ++it;
- } else {
- method_headers.insert(OatQuickMethodHeader::FromCodePointer(data->GetCode()));
- for (ArtMethod* method : data->GetMethods()) {
- VLOG(jit) << "JIT removed (JNI) " << method->PrettyMethod() << ": " << data->GetCode();
- }
- it = jni_stubs_map_.erase(it);
- }
- }
- for (auto it = method_code_map_.begin(); it != method_code_map_.end();) {
- const void* code_ptr = it->first;
+ // Iterate over all zombie code and remove entries that are not marked.
+ for (auto it = processed_zombie_code_.begin(); it != processed_zombie_code_.end();) {
+ const void* code_ptr = *it;
uintptr_t allocation = FromCodeToAllocation(code_ptr);
- if (IsInZygoteExecSpace(code_ptr) || GetLiveBitmap()->Test(allocation)) {
+ DCHECK(!IsInZygoteExecSpace(code_ptr));
+ if (GetLiveBitmap()->Test(allocation)) {
++it;
} else {
OatQuickMethodHeader* header = OatQuickMethodHeader::FromCodePointer(code_ptr);
method_headers.insert(header);
- VLOG(jit) << "JIT removed " << it->second->PrettyMethod() << ": " << it->first;
- it = method_code_map_.erase(it);
+ method_code_map_.erase(header->GetCode());
+ VLOG(jit) << "JIT removed " << *it;
+ it = processed_zombie_code_.erase(it);
+ }
+ }
+ for (auto it = processed_zombie_jni_code_.begin(); it != processed_zombie_jni_code_.end();) {
+ ArtMethod* method = *it;
+ auto stub = jni_stubs_map_.find(JniStubKey(method));
+ if (stub == jni_stubs_map_.end()) {
+ it = processed_zombie_jni_code_.erase(it);
+ continue;
+ }
+ JniStubData& data = stub->second;
+ if (!data.IsCompiled() || !ContainsElement(data.GetMethods(), method)) {
+ it = processed_zombie_jni_code_.erase(it);
+ } else if (method->GetEntryPointFromQuickCompiledCode() ==
+ OatQuickMethodHeader::FromCodePointer(data.GetCode())->GetEntryPoint()) {
+ // The stub got reused for this method, remove ourselves from the zombie
+ // list.
+ it = processed_zombie_jni_code_.erase(it);
+ } else if (!GetLiveBitmap()->Test(FromCodeToAllocation(data.GetCode()))) {
+ data.RemoveMethod(method);
+ if (data.GetMethods().empty()) {
+ OatQuickMethodHeader* header = OatQuickMethodHeader::FromCodePointer(data.GetCode());
+ method_headers.insert(header);
+ CHECK(ContainsPc(header));
+ VLOG(jit) << "JIT removed native code of" << method->PrettyMethod();
+ jni_stubs_map_.erase(stub);
+ } else {
+ stub->first.UpdateShorty(stub->second.GetMethods().front());
+ }
+ it = processed_zombie_jni_code_.erase(it);
+ } else {
+ ++it;
}
}
- FreeAllMethodHeaders(method_headers);
+ }
+
+ FreeAllMethodHeaders(method_headers);
+}
+
+void JitCodeCache::AddZombieCode(ArtMethod* method, const void* entry_point) {
+ CHECK(ContainsPc(entry_point));
+ CHECK(method->IsNative() || (method->GetEntryPointFromQuickCompiledCode() != entry_point));
+ const void* code_ptr = OatQuickMethodHeader::FromEntryPoint(entry_point)->GetCode();
+ if (!IsInZygoteExecSpace(code_ptr)) {
+ Thread* self = Thread::Current();
+ if (Locks::jit_lock_->IsExclusiveHeld(self)) {
+ AddZombieCodeInternal(method, code_ptr);
+ } else {
+ MutexLock mu(Thread::Current(), *Locks::jit_lock_);
+ AddZombieCodeInternal(method, code_ptr);
+ }
+ }
+}
+
+
+class JitGcTask final : public Task {
+ public:
+ JitGcTask() {}
+
+ void Run(Thread* self) override {
+ Runtime::Current()->GetJit()->GetCodeCache()->DoCollection(self);
+ }
+
+ void Finalize() override {
+ delete this;
+ }
+};
+
+void JitCodeCache::AddZombieCodeInternal(ArtMethod* method, const void* code_ptr) {
+ if (method->IsNative()) {
+ CHECK(jni_stubs_map_.find(JniStubKey(method)) != jni_stubs_map_.end());
+ zombie_jni_code_.insert(method);
+ } else {
+ zombie_code_.insert(code_ptr);
+ }
+ // Arbitrary threshold of number of zombie code before doing a GC.
+ static constexpr size_t kNumberOfZombieCodeThreshold = kIsDebugBuild ? 1 : 1000;
+ size_t number_of_code_to_delete =
+ zombie_code_.size() + zombie_jni_code_.size() + osr_code_map_.size();
+ if (number_of_code_to_delete >= kNumberOfZombieCodeThreshold) {
+ JitThreadPool* pool = Runtime::Current()->GetJit()->GetThreadPool();
+ if (pool != nullptr && !gc_task_scheduled_) {
+ gc_task_scheduled_ = true;
+ pool->AddTask(Thread::Current(), new JitGcTask());
+ }
}
}
@@ -1234,51 +1263,58 @@ void JitCodeCache::ResetHotnessCounter(ArtMethod* method, Thread* self) {
void JitCodeCache::DoCollection(Thread* self) {
ScopedTrace trace(__FUNCTION__);
+
{
ScopedDebugDisallowReadBarriers sddrb(self);
MutexLock mu(self, *Locks::jit_lock_);
- // Mark compiled code that are entrypoints of ArtMethods. Compiled code that is not
- // an entry point is either:
- // - an osr compiled code, that will be removed if not in a thread call stack.
- // - discarded compiled code, that will be removed if not in a thread call stack.
- for (const auto& entry : jni_stubs_map_) {
- const JniStubData& data = entry.second;
- const void* code_ptr = data.GetCode();
- if (IsInZygoteExecSpace(code_ptr)) {
- continue;
- }
- const OatQuickMethodHeader* method_header = OatQuickMethodHeader::FromCodePointer(code_ptr);
- for (ArtMethod* method : data.GetMethods()) {
- if (method_header->GetEntryPoint() == method->GetEntryPointFromQuickCompiledCode()) {
- GetLiveBitmap()->AtomicTestAndSet(FromCodeToAllocation(code_ptr));
- break;
- }
- }
- }
- for (const auto& it : method_code_map_) {
- ArtMethod* method = it.second;
- const void* code_ptr = it.first;
- if (IsInZygoteExecSpace(code_ptr)) {
- continue;
- }
- const OatQuickMethodHeader* method_header = OatQuickMethodHeader::FromCodePointer(code_ptr);
- if (method_header->GetEntryPoint() == method->GetEntryPointFromQuickCompiledCode()) {
- GetLiveBitmap()->AtomicTestAndSet(FromCodeToAllocation(code_ptr));
- }
+ if (!garbage_collect_code_) {
+ return;
+ } else if (WaitForPotentialCollectionToComplete(self)) {
+ return;
}
-
+ collection_in_progress_ = true;
+ number_of_collections_++;
+ live_bitmap_.reset(CodeCacheBitmap::Create(
+ "code-cache-bitmap",
+ reinterpret_cast<uintptr_t>(private_region_.GetExecPages()->Begin()),
+ reinterpret_cast<uintptr_t>(
+ private_region_.GetExecPages()->Begin() + private_region_.GetCurrentCapacity() / 2)));
+ processed_zombie_code_.insert(zombie_code_.begin(), zombie_code_.end());
+ zombie_code_.clear();
+ processed_zombie_jni_code_.insert(zombie_jni_code_.begin(), zombie_jni_code_.end());
+ zombie_jni_code_.clear();
// Empty osr method map, as osr compiled code will be deleted (except the ones
// on thread stacks).
+ for (auto it = osr_code_map_.begin(); it != osr_code_map_.end(); ++it) {
+ processed_zombie_code_.insert(it->second);
+ }
osr_code_map_.clear();
}
+ TimingLogger logger("JIT code cache timing logger", true, VLOG_IS_ON(jit));
+ {
+ TimingLogger::ScopedTiming st("Code cache collection", &logger);
+
+ {
+ ScopedObjectAccess soa(self);
+ // Run a checkpoint on all threads to mark the JIT compiled code they are running.
+ MarkCompiledCodeOnThreadStacks(self);
- // Run a checkpoint on all threads to mark the JIT compiled code they are running.
- MarkCompiledCodeOnThreadStacks(self);
+ // Remove zombie code which hasn't been marked.
+ RemoveUnmarkedCode(self);
+ }
+
+ MutexLock mu(self, *Locks::jit_lock_);
+ live_bitmap_.reset(nullptr);
+ NotifyCollectionDone(self);
+ }
- // At this point, mutator threads are still running, and entrypoints of methods can
- // change. We do know they cannot change to a code cache entry that is not marked,
- // therefore we can safely remove those entries.
- RemoveUnmarkedCode(self);
+ Runtime::Current()->GetJit()->AddTimingLogger(logger);
+}
+
+void JitCodeCache::NotifyCollectionDone(Thread* self) {
+ collection_in_progress_ = false;
+ gc_task_scheduled_ = false;
+ lock_cond_.Broadcast(self);
}
OatQuickMethodHeader* JitCodeCache::LookupMethodHeader(uintptr_t pc, ArtMethod* method) {
@@ -1382,7 +1418,7 @@ ProfilingInfo* JitCodeCache::AddProfilingInfo(Thread* self,
}
if (info == nullptr) {
- GarbageCollectCache(self);
+ IncreaseCodeCacheCapacity(self);
MutexLock mu(self, *Locks::jit_lock_);
info = AddProfilingInfoInternal(self, method, inline_cache_entries, branch_cache_entries);
}
@@ -1610,11 +1646,6 @@ bool JitCodeCache::NotifyCompilationOf(ArtMethod* method,
// as well change them back as this stub shall not be collected anyway and this
// can avoid a few expensive GenericJNI calls.
data->UpdateEntryPoints(entrypoint);
- if (collection_in_progress_) {
- if (!IsInZygoteExecSpace(data->GetCode())) {
- GetLiveBitmap()->AtomicTestAndSet(FromCodeToAllocation(data->GetCode()));
- }
- }
}
return new_compilation;
} else {
diff --git a/runtime/jit/jit_code_cache.h b/runtime/jit/jit_code_cache.h
index 96fc7e2706..5202c2c37e 100644
--- a/runtime/jit/jit_code_cache.h
+++ b/runtime/jit/jit_code_cache.h
@@ -285,11 +285,9 @@ class JitCodeCache {
REQUIRES_SHARED(Locks::mutator_lock_)
REQUIRES(!Locks::jit_lock_);
void FreeLocked(JitMemoryRegion* region, const uint8_t* code, const uint8_t* data)
- REQUIRES_SHARED(Locks::mutator_lock_)
REQUIRES(Locks::jit_lock_);
- // Perform a collection on the code cache.
- EXPORT void GarbageCollectCache(Thread* self)
+ void IncreaseCodeCacheCapacity(Thread* self)
REQUIRES(!Locks::jit_lock_)
REQUIRES_SHARED(Locks::mutator_lock_);
@@ -423,9 +421,20 @@ class JitCodeCache {
Thread* self)
REQUIRES_SHARED(Locks::mutator_lock_);
+ // NO_THREAD_SAFETY_ANALYSIS because we may be called with the JIT lock held
+ // or not. The implementation of this method handles the two cases.
+ void AddZombieCode(ArtMethod* method, const void* code_ptr) NO_THREAD_SAFETY_ANALYSIS;
+
+ EXPORT void DoCollection(Thread* self)
+ REQUIRES(!Locks::jit_lock_);
+
private:
JitCodeCache();
+ void AddZombieCodeInternal(ArtMethod* method, const void* code_ptr)
+ REQUIRES(Locks::jit_lock_)
+ REQUIRES_SHARED(Locks::mutator_lock_);
+
ProfilingInfo* AddProfilingInfoInternal(Thread* self,
ArtMethod* method,
const std::vector<uint32_t>& inline_cache_entries,
@@ -433,21 +442,16 @@ class JitCodeCache {
REQUIRES(Locks::jit_lock_)
REQUIRES_SHARED(Locks::mutator_lock_);
- // If a collection is in progress, wait for it to finish. Must be called with the mutator lock.
- // The non-mutator lock version should be used if possible. This method will release then
- // re-acquire the mutator lock.
- void WaitForPotentialCollectionToCompleteRunnable(Thread* self)
- REQUIRES(Locks::jit_lock_, !Roles::uninterruptible_) REQUIRES_SHARED(Locks::mutator_lock_);
-
// If a collection is in progress, wait for it to finish. Return
// whether the thread actually waited.
bool WaitForPotentialCollectionToComplete(Thread* self)
- REQUIRES(Locks::jit_lock_) REQUIRES(!Locks::mutator_lock_);
+ REQUIRES(Locks::jit_lock_) REQUIRES_SHARED(!Locks::mutator_lock_);
+
+ // Notify all waiting threads that a collection is done.
+ void NotifyCollectionDone(Thread* self) REQUIRES(Locks::jit_lock_);
// Remove CHA dependents and underlying allocations for entries in `method_headers`.
void FreeAllMethodHeaders(const std::unordered_set<OatQuickMethodHeader*>& method_headers)
- REQUIRES_SHARED(Locks::mutator_lock_)
- REQUIRES(Locks::jit_lock_)
REQUIRES(!Locks::cha_lock_);
// Removes method from the cache. The caller must ensure that all threads
@@ -462,8 +466,7 @@ class JitCodeCache {
// Free code and data allocations for `code_ptr`.
void FreeCodeAndData(const void* code_ptr)
- REQUIRES(Locks::jit_lock_)
- REQUIRES_SHARED(Locks::mutator_lock_);
+ REQUIRES(Locks::jit_lock_);
// Number of bytes allocated in the code cache.
size_t CodeCacheSize() REQUIRES(!Locks::jit_lock_);
@@ -477,16 +480,9 @@ class JitCodeCache {
// Number of bytes allocated in the data cache.
size_t DataCacheSizeLocked() REQUIRES(Locks::jit_lock_);
- // Notify all waiting threads that a collection is done.
- void NotifyCollectionDone(Thread* self) REQUIRES(Locks::jit_lock_);
-
// Return whether the code cache's capacity is at its maximum.
bool IsAtMaxCapacity() const REQUIRES(Locks::jit_lock_);
- void DoCollection(Thread* self)
- REQUIRES(!Locks::jit_lock_)
- REQUIRES_SHARED(Locks::mutator_lock_);
-
void RemoveUnmarkedCode(Thread* self)
REQUIRES(!Locks::jit_lock_)
REQUIRES_SHARED(Locks::mutator_lock_);
@@ -563,18 +559,28 @@ class JitCodeCache {
// ProfilingInfo objects we have allocated.
SafeMap<ArtMethod*, ProfilingInfo*> profiling_infos_ GUARDED_BY(Locks::jit_lock_);
+ // Zombie code and JNI methods to consider for collection.
+ std::set<const void*> zombie_code_ GUARDED_BY(Locks::jit_lock_);
+ std::set<ArtMethod*> zombie_jni_code_ GUARDED_BY(Locks::jit_lock_);
+
+ std::set<const void*> processed_zombie_code_ GUARDED_BY(Locks::jit_lock_);
+ std::set<ArtMethod*> processed_zombie_jni_code_ GUARDED_BY(Locks::jit_lock_);
+
// Methods that the zygote has compiled and can be shared across processes
// forked from the zygote.
ZygoteMap zygote_map_;
// -------------- JIT GC related data structures ----------------------- //
- // Condition to wait on during collection.
+ // Condition to wait on during collection and for accessing weak references in inline caches.
ConditionVariable lock_cond_ GUARDED_BY(Locks::jit_lock_);
// Whether there is a code cache collection in progress.
bool collection_in_progress_ GUARDED_BY(Locks::jit_lock_);
+ // Whether a GC task is already scheduled.
+ bool gc_task_scheduled_ GUARDED_BY(Locks::jit_lock_);
+
// Bitmap for collecting code and data.
std::unique_ptr<CodeCacheBitmap> live_bitmap_;
diff --git a/runtime/jit/jit_options.cc b/runtime/jit/jit_options.cc
index 3c31d1dfcd..b68d14e427 100644
--- a/runtime/jit/jit_options.cc
+++ b/runtime/jit/jit_options.cc
@@ -31,7 +31,7 @@ static constexpr uint32_t kJitStressDefaultOptimizeThreshold = kJitDefaultOptimi
static constexpr uint32_t kJitSlowStressDefaultOptimizeThreshold =
kJitStressDefaultOptimizeThreshold / 2;
-static constexpr uint32_t kJitDefaultWarmupThreshold = 0x3fff;
+static constexpr uint32_t kJitDefaultWarmupThreshold = 0xffff;
// Different warm-up threshold constants. These default to the equivalent warmup thresholds divided
// by 2, but can be overridden at the command-line.
static constexpr uint32_t kJitStressDefaultWarmupThreshold = kJitDefaultWarmupThreshold / 2;
diff --git a/runtime/oat/oat_file.cc b/runtime/oat/oat_file.cc
index b013afd378..889b78f015 100644
--- a/runtime/oat/oat_file.cc
+++ b/runtime/oat/oat_file.cc
@@ -195,11 +195,18 @@ class OatFileBase : public OatFile {
private:
std::string ErrorPrintf(const char* fmt, ...) __attribute__((__format__(__printf__, 2, 3)));
bool ReadIndexBssMapping(/*inout*/const uint8_t** oat,
+ const char* container_tag,
size_t dex_file_index,
const std::string& dex_file_location,
- const char* tag,
+ const char* entry_tag,
/*out*/const IndexBssMapping** mapping,
std::string* error_msg);
+ bool ReadBssMappingInfo(/*inout*/const uint8_t** oat,
+ const char* container_tag,
+ size_t dex_file_index,
+ const std::string& dex_file_location,
+ /*out*/BssMappingInfo* bss_mapping_info,
+ std::string* error_msg);
DISALLOW_COPY_AND_ASSIGN(OatFileBase);
};
@@ -434,17 +441,19 @@ std::string OatFileBase::ErrorPrintf(const char* fmt, ...) {
}
bool OatFileBase::ReadIndexBssMapping(/*inout*/const uint8_t** oat,
+ const char* container_tag,
size_t dex_file_index,
const std::string& dex_file_location,
- const char* tag,
+ const char* entry_tag,
/*out*/const IndexBssMapping** mapping,
std::string* error_msg) {
uint32_t index_bss_mapping_offset;
if (UNLIKELY(!ReadOatDexFileData(*this, oat, &index_bss_mapping_offset))) {
- *error_msg = ErrorPrintf("OatDexFile #%zd for '%s' truncated after %s bss mapping offset",
+ *error_msg = ErrorPrintf("%s #%zd for '%s' truncated, missing %s bss mapping offset",
+ container_tag,
dex_file_index,
dex_file_location.c_str(),
- tag);
+ entry_tag);
return false;
}
const bool readable_index_bss_mapping_size =
@@ -460,11 +469,12 @@ bool OatFileBase::ReadIndexBssMapping(/*inout*/const uint8_t** oat,
UNLIKELY(index_bss_mapping->size() == 0u) ||
UNLIKELY(Size() - index_bss_mapping_offset <
IndexBssMapping::ComputeSize(index_bss_mapping->size())))) {
- *error_msg = ErrorPrintf("OatDexFile #%zu for '%s' with unaligned or "
+ *error_msg = ErrorPrintf("%s #%zu for '%s' with unaligned or "
"truncated %s bss mapping, offset %u of %zu, length %zu",
+ container_tag,
dex_file_index,
dex_file_location.c_str(),
- tag,
+ entry_tag,
index_bss_mapping_offset,
Size(),
index_bss_mapping != nullptr ? index_bss_mapping->size() : 0u);
@@ -475,6 +485,24 @@ bool OatFileBase::ReadIndexBssMapping(/*inout*/const uint8_t** oat,
return true;
}
+bool OatFileBase::ReadBssMappingInfo(/*inout*/const uint8_t** oat,
+ const char* container_tag,
+ size_t dex_file_index,
+ const std::string& dex_file_location,
+ /*out*/BssMappingInfo* bss_mapping_info,
+ std::string* error_msg) {
+ auto read_index_bss_mapping = [&](const char* tag, /*out*/const IndexBssMapping** mapping) {
+ return ReadIndexBssMapping(
+ oat, container_tag, dex_file_index, dex_file_location, tag, mapping, error_msg);
+ };
+ return read_index_bss_mapping("method", &bss_mapping_info->method_bss_mapping) &&
+ read_index_bss_mapping("type", &bss_mapping_info->type_bss_mapping) &&
+ read_index_bss_mapping("public type", &bss_mapping_info->public_type_bss_mapping) &&
+ read_index_bss_mapping("package type", &bss_mapping_info->package_type_bss_mapping) &&
+ read_index_bss_mapping("string", &bss_mapping_info->string_bss_mapping) &&
+ read_index_bss_mapping("method type", &bss_mapping_info->method_type_bss_mapping);
+}
+
static bool ComputeAndCheckTypeLookupTableData(const DexFile::Header& header,
const uint8_t* type_lookup_table_start,
const VdexFile* vdex_file,
@@ -970,21 +998,9 @@ bool OatFileBase::Setup(int zip_fd,
? reinterpret_cast<const DexLayoutSections*>(Begin() + dex_layout_sections_offset)
: nullptr;
- const IndexBssMapping* method_bss_mapping;
- const IndexBssMapping* type_bss_mapping;
- const IndexBssMapping* public_type_bss_mapping;
- const IndexBssMapping* package_type_bss_mapping;
- const IndexBssMapping* string_bss_mapping;
- const IndexBssMapping* method_type_bss_mapping = nullptr;
- auto read_index_bss_mapping = [&](const char* tag, /*out*/const IndexBssMapping** mapping) {
- return ReadIndexBssMapping(&oat, i, dex_file_location, tag, mapping, error_msg);
- };
- if (!read_index_bss_mapping("method", &method_bss_mapping) ||
- !read_index_bss_mapping("type", &type_bss_mapping) ||
- !read_index_bss_mapping("public type", &public_type_bss_mapping) ||
- !read_index_bss_mapping("package type", &package_type_bss_mapping) ||
- !read_index_bss_mapping("string", &string_bss_mapping) ||
- !read_index_bss_mapping("method type", &method_type_bss_mapping)) {
+ BssMappingInfo bss_mapping_info;
+ if (!ReadBssMappingInfo(
+ &oat, "OatDexFile", i, dex_file_location, &bss_mapping_info, error_msg)) {
return false;
}
@@ -999,12 +1015,7 @@ bool OatFileBase::Setup(int zip_fd,
dex_file_container,
dex_file_pointer,
lookup_table_data,
- method_bss_mapping,
- type_bss_mapping,
- public_type_bss_mapping,
- package_type_bss_mapping,
- string_bss_mapping,
- method_type_bss_mapping,
+ bss_mapping_info,
class_offsets_pointer,
dex_layout_sections);
oat_dex_files_storage_.push_back(oat_dex_file);
@@ -1053,17 +1064,11 @@ bool OatFileBase::Setup(int zip_fd,
// At runtime, there might be more DexFiles added to the BCP that we didn't compile with.
// We only care about the ones in [0..number_of_bcp_dexfiles).
for (size_t i = 0, size = number_of_bcp_dexfiles; i != size; ++i) {
- const std::string& dex_file_location = linker != nullptr ?
- linker->GetBootClassPath()[i]->GetLocation() :
- "No runtime/linker therefore no DexFile location";
- auto read_index_bss_mapping = [&](const char* tag, /*out*/const IndexBssMapping** mapping) {
- return ReadIndexBssMapping(&bcp_info_begin, i, dex_file_location, tag, mapping, error_msg);
- };
- if (!read_index_bss_mapping("method", &bcp_bss_info_[i].method_bss_mapping) ||
- !read_index_bss_mapping("type", &bcp_bss_info_[i].type_bss_mapping) ||
- !read_index_bss_mapping("public type", &bcp_bss_info_[i].public_type_bss_mapping) ||
- !read_index_bss_mapping("package type", &bcp_bss_info_[i].package_type_bss_mapping) ||
- !read_index_bss_mapping("string", &bcp_bss_info_[i].string_bss_mapping)) {
+ const std::string& dex_file_location = linker != nullptr
+ ? linker->GetBootClassPath()[i]->GetLocation()
+ : "No runtime/linker therefore no DexFile location";
+ if (!ReadBssMappingInfo(
+ &bcp_info_begin, "BcpBssInfo", i, dex_file_location, &bcp_bss_info_[i], error_msg)) {
return false;
}
}
@@ -2142,12 +2147,7 @@ OatDexFile::OatDexFile(const OatFile* oat_file,
const std::shared_ptr<DexFileContainer>& dex_file_container,
const uint8_t* dex_file_pointer,
const uint8_t* lookup_table_data,
- const IndexBssMapping* method_bss_mapping_data,
- const IndexBssMapping* type_bss_mapping_data,
- const IndexBssMapping* public_type_bss_mapping_data,
- const IndexBssMapping* package_type_bss_mapping_data,
- const IndexBssMapping* string_bss_mapping_data,
- const IndexBssMapping* method_type_bss_mapping_data,
+ const OatFile::BssMappingInfo& bss_mapping_info,
const uint32_t* oat_class_offsets_pointer,
const DexLayoutSections* dex_layout_sections)
: oat_file_(oat_file),
@@ -2159,12 +2159,7 @@ OatDexFile::OatDexFile(const OatFile* oat_file,
dex_file_container_(dex_file_container),
dex_file_pointer_(dex_file_pointer),
lookup_table_data_(lookup_table_data),
- method_bss_mapping_(method_bss_mapping_data),
- type_bss_mapping_(type_bss_mapping_data),
- public_type_bss_mapping_(public_type_bss_mapping_data),
- package_type_bss_mapping_(package_type_bss_mapping_data),
- string_bss_mapping_(string_bss_mapping_data),
- method_type_bss_mapping_(method_type_bss_mapping_data),
+ bss_mapping_info_(bss_mapping_info),
oat_class_offsets_pointer_(oat_class_offsets_pointer),
lookup_table_(),
dex_layout_sections_(dex_layout_sections) {
diff --git a/runtime/oat/oat_file.h b/runtime/oat/oat_file.h
index 5c29a8d439..e17f4c43ff 100644
--- a/runtime/oat/oat_file.h
+++ b/runtime/oat/oat_file.h
@@ -555,27 +555,27 @@ class OatDexFile final {
}
const IndexBssMapping* GetMethodBssMapping() const {
- return method_bss_mapping_;
+ return bss_mapping_info_.method_bss_mapping;
}
const IndexBssMapping* GetTypeBssMapping() const {
- return type_bss_mapping_;
+ return bss_mapping_info_.type_bss_mapping;
}
const IndexBssMapping* GetPublicTypeBssMapping() const {
- return public_type_bss_mapping_;
+ return bss_mapping_info_.public_type_bss_mapping;
}
const IndexBssMapping* GetPackageTypeBssMapping() const {
- return package_type_bss_mapping_;
+ return bss_mapping_info_.package_type_bss_mapping;
}
const IndexBssMapping* GetStringBssMapping() const {
- return string_bss_mapping_;
+ return bss_mapping_info_.string_bss_mapping;
}
const IndexBssMapping* GetMethodTypeBssMapping() const {
- return method_type_bss_mapping_;
+ return bss_mapping_info_.method_type_bss_mapping;
}
const uint8_t* GetDexFilePointer() const {
@@ -612,12 +612,7 @@ class OatDexFile final {
const std::shared_ptr<DexFileContainer>& dex_file_container_,
const uint8_t* dex_file_pointer,
const uint8_t* lookup_table_data,
- const IndexBssMapping* method_bss_mapping,
- const IndexBssMapping* type_bss_mapping,
- const IndexBssMapping* public_type_bss_mapping,
- const IndexBssMapping* package_type_bss_mapping,
- const IndexBssMapping* string_bss_mapping,
- const IndexBssMapping* method_type_bss_mapping,
+ const OatFile::BssMappingInfo& bss_mapping_info,
const uint32_t* oat_class_offsets_pointer,
const DexLayoutSections* dex_layout_sections);
@@ -647,12 +642,7 @@ class OatDexFile final {
const std::shared_ptr<DexFileContainer> dex_file_container_;
const uint8_t* const dex_file_pointer_ = nullptr;
const uint8_t* const lookup_table_data_ = nullptr;
- const IndexBssMapping* const method_bss_mapping_ = nullptr;
- const IndexBssMapping* const type_bss_mapping_ = nullptr;
- const IndexBssMapping* const public_type_bss_mapping_ = nullptr;
- const IndexBssMapping* const package_type_bss_mapping_ = nullptr;
- const IndexBssMapping* const string_bss_mapping_ = nullptr;
- const IndexBssMapping* const method_type_bss_mapping_ = nullptr;
+ const OatFile::BssMappingInfo bss_mapping_info_;
const uint32_t* const oat_class_offsets_pointer_ = nullptr;
TypeLookupTable lookup_table_;
const DexLayoutSections* const dex_layout_sections_ = nullptr;
diff --git a/runtime/runtime_image.cc b/runtime/runtime_image.cc
index 997ea2fde6..b134c79286 100644
--- a/runtime/runtime_image.cc
+++ b/runtime/runtime_image.cc
@@ -964,7 +964,9 @@ class RuntimeImageHelper {
entrypoint = boot_jni_stub;
}
}
- copy->SetEntryPointFromQuickCompiledCode(entrypoint);
+ copy->SetNativePointer(ArtMethod::EntryPointFromQuickCompiledCodeOffset(kRuntimePointerSize),
+ entrypoint,
+ kRuntimePointerSize);
if (method->IsNative()) {
StubType stub_type = method->IsCriticalNative()
diff --git a/runtime/trace.cc b/runtime/trace.cc
index 1f97f155dd..e2fbd65bbe 100644
--- a/runtime/trace.cc
+++ b/runtime/trace.cc
@@ -367,6 +367,17 @@ bool UseWallClock(TraceClockSource clock_source) {
return (clock_source == TraceClockSource::kWall) || (clock_source == TraceClockSource::kDual);
}
+bool UseFastTraceListeners(TraceClockSource clock_source) {
+ // Thread cpu clocks needs a kernel call, so we don't directly support them in JITed code.
+ bool is_fast_trace = !UseThreadCpuClock(clock_source);
+#if defined(__arm__)
+ // On ARM 32 bit, we don't always have access to the timestamp counters from
+ // user space. See comment in GetTimestamp for more details.
+ is_fast_trace = false;
+#endif
+ return is_fast_trace;
+}
+
void Trace::MeasureClockOverhead() {
if (UseThreadCpuClock(clock_source_)) {
Thread::Current()->GetCpuMicroTime();
@@ -695,14 +706,6 @@ void Trace::Start(std::unique_ptr<File>&& trace_file_in,
runtime->GetInstrumentation()->UpdateEntrypointsForDebuggable();
runtime->DeoptimizeBootImage();
}
- // For thread cpu clocks, we need to make a kernel call and hence we call into c++ to
- // support them.
- bool is_fast_trace = !UseThreadCpuClock(the_trace_->GetClockSource());
-#if defined(__arm__)
- // On ARM 32 bit, we don't always have access to the timestamp counters from
- // user space. Seem comment in GetTimestamp for more details.
- is_fast_trace = false;
-#endif
// Add ClassLoadCallback to record methods on class load.
runtime->GetRuntimeCallbacks()->AddClassLoadCallback(the_trace_);
runtime->GetInstrumentation()->AddListener(
@@ -710,7 +713,7 @@ void Trace::Start(std::unique_ptr<File>&& trace_file_in,
instrumentation::Instrumentation::kMethodEntered |
instrumentation::Instrumentation::kMethodExited |
instrumentation::Instrumentation::kMethodUnwind,
- is_fast_trace);
+ UseFastTraceListeners(the_trace_->GetClockSource()));
runtime->GetInstrumentation()->EnableMethodTracing(kTracerInstrumentationKey,
the_trace_,
/*needs_interpreter=*/false);
@@ -762,21 +765,13 @@ void Trace::StopTracing(bool flush_entries) {
MutexLock mu(self, *Locks::thread_list_lock_);
runtime->GetThreadList()->ForEach(ClearThreadStackTraceAndClockBase, nullptr);
} else {
- // For thread cpu clocks, we need to make a kernel call and hence we call into c++ to support
- // them.
- bool is_fast_trace = !UseThreadCpuClock(the_trace_->GetClockSource());
-#if defined(__arm__)
- // On ARM 32 bit, we don't always have access to the timestamp counters from
- // user space. Seem comment in GetTimestamp for more details.
- is_fast_trace = false;
-#endif
runtime->GetRuntimeCallbacks()->RemoveClassLoadCallback(the_trace_);
runtime->GetInstrumentation()->RemoveListener(
the_trace,
instrumentation::Instrumentation::kMethodEntered |
instrumentation::Instrumentation::kMethodExited |
instrumentation::Instrumentation::kMethodUnwind,
- is_fast_trace);
+ UseFastTraceListeners(the_trace_->GetClockSource()));
runtime->GetInstrumentation()->DisableMethodTracing(kTracerInstrumentationKey);
}
@@ -816,6 +811,21 @@ void Trace::StopTracing(bool flush_entries) {
}
}
+void Trace::RemoveListeners() {
+ Thread* self = Thread::Current();
+ // This is expected to be called in SuspendAll scope.
+ DCHECK(Locks::mutator_lock_->IsExclusiveHeld(self));
+ MutexLock mu(self, *Locks::trace_lock_);
+ Runtime* runtime = Runtime::Current();
+ runtime->GetRuntimeCallbacks()->RemoveClassLoadCallback(the_trace_);
+ runtime->GetInstrumentation()->RemoveListener(
+ the_trace_,
+ instrumentation::Instrumentation::kMethodEntered |
+ instrumentation::Instrumentation::kMethodExited |
+ instrumentation::Instrumentation::kMethodUnwind,
+ UseFastTraceListeners(the_trace_->GetClockSource()));
+}
+
void Trace::FlushThreadBuffer(Thread* self) {
MutexLock mu(self, *Locks::trace_lock_);
// Check if we still need to flush inside the trace_lock_. If we are stopping tracing it is
@@ -1346,16 +1356,19 @@ void TraceWriter::RecordMethodInfo(const std::string& method_info_line, uint64_t
void TraceWriter::FlushAllThreadBuffers() {
ScopedThreadStateChange stsc(Thread::Current(), ThreadState::kSuspended);
ScopedSuspendAll ssa(__FUNCTION__);
- MutexLock mu(Thread::Current(), *Locks::thread_list_lock_);
- for (Thread* thread : Runtime::Current()->GetThreadList()->GetList()) {
- if (thread->GetMethodTraceBuffer() != nullptr) {
- FlushBuffer(thread, /* is_sync= */ true, /* free_buffer= */ false);
- // We cannot flush anynore data, so just return.
- if (overflow_) {
- return;
+ {
+ MutexLock mu(Thread::Current(), *Locks::thread_list_lock_);
+ for (Thread* thread : Runtime::Current()->GetThreadList()->GetList()) {
+ if (thread->GetMethodTraceBuffer() != nullptr) {
+ FlushBuffer(thread, /* is_sync= */ true, /* free_buffer= */ false);
+ // We cannot flush anynore data, so just break.
+ if (overflow_) {
+ break;
+ }
}
}
}
+ Trace::RemoveListeners();
return;
}
diff --git a/runtime/trace.h b/runtime/trace.h
index baa8e20259..b2012ed8e6 100644
--- a/runtime/trace.h
+++ b/runtime/trace.h
@@ -422,6 +422,11 @@ class Trace final : public instrumentation::InstrumentationListener, public Clas
static void FlushThreadBuffer(Thread* thread) REQUIRES_SHARED(Locks::mutator_lock_)
REQUIRES(!Locks::trace_lock_) NO_THREAD_SAFETY_ANALYSIS;
+ // Removes any listeners installed for method tracing. This is used in non-streaming case
+ // when we no longer record any events once the buffer is full. In other cases listeners are
+ // removed only when tracing stops. This is expected to be called in SuspendAll scope.
+ static void RemoveListeners() REQUIRES(Locks::mutator_lock_);
+
void MeasureClockOverhead();
uint32_t GetClockOverheadNanoSeconds();
diff --git a/test/141-class-unload/src-ex/AbstractClass.java b/test/141-class-unload/src-ex/AbstractClass.java
new file mode 100644
index 0000000000..de4dccf5db
--- /dev/null
+++ b/test/141-class-unload/src-ex/AbstractClass.java
@@ -0,0 +1,18 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+public abstract class AbstractClass extends ConflictSuper {
+}
diff --git a/test/141-class-unload/src-ex/ConflictImpl2.java b/test/141-class-unload/src-ex/ConflictImpl2.java
new file mode 100644
index 0000000000..40f986797a
--- /dev/null
+++ b/test/141-class-unload/src-ex/ConflictImpl2.java
@@ -0,0 +1,18 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+public class ConflictImpl2 extends AbstractClass {
+}
diff --git a/test/141-class-unload/src/Main.java b/test/141-class-unload/src/Main.java
index 7b7ffa2ea7..5e07430e11 100644
--- a/test/141-class-unload/src/Main.java
+++ b/test/141-class-unload/src/Main.java
@@ -20,8 +20,10 @@ import java.io.FileReader;
import java.lang.ref.WeakReference;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
+import java.nio.ByteBuffer;
import java.util.Arrays;
import java.util.function.Consumer;
+import java.util.Base64;
public class Main {
static final String DEX_FILE = System.getenv("DEX_LOCATION") + "/141-class-unload-ex.jar";
@@ -61,6 +63,7 @@ public class Main {
testCopiedAppImageMethodInStackTrace();
// Test that the runtime uses the right allocator when creating conflict methods.
testConflictMethod(constructor);
+ testConflictMethod2(constructor);
} catch (Exception e) {
e.printStackTrace(System.out);
}
@@ -330,6 +333,35 @@ public class Main {
$noinline$callAllMethods(iface);
}
+ private static void $noinline$invokeConflictMethod2(Constructor<?> constructor)
+ throws Exception {
+ // We need three class loaders to expose the issue: the main one with the top super class,
+ // then a second one with the abstract class which we used to wrongly return as an IMT
+ // owner, and the concrete class in a different class loader.
+ Class<?> cls = Class.forName("dalvik.system.InMemoryDexClassLoader");
+ Constructor<?> inMemoryConstructor =
+ cls.getDeclaredConstructor(ByteBuffer.class, ClassLoader.class);
+ ClassLoader inMemoryLoader = (ClassLoader) inMemoryConstructor.newInstance(
+ ByteBuffer.wrap(DEX_BYTES), ClassLoader.getSystemClassLoader());
+ ClassLoader loader = (ClassLoader) constructor.newInstance(
+ DEX_FILE, LIBRARY_SEARCH_PATH, inMemoryLoader);
+ Class<?> impl = loader.loadClass("ConflictImpl2");
+ ConflictIface iface = (ConflictIface) impl.newInstance();
+ $noinline$callAllMethods(iface);
+ }
+
+ private static void testConflictMethod2(Constructor<?> constructor) throws Exception {
+ // Load and unload a few class loaders to force re-use of the native memory where we
+ // used to allocate the conflict table.
+ for (int i = 0; i < 2; i++) {
+ $noinline$invokeConflictMethod2(constructor);
+ doUnloading();
+ }
+ Class<?> impl = Class.forName("ConflictSuper");
+ ConflictIface iface = (ConflictIface) impl.newInstance();
+ $noinline$callAllMethods(iface);
+ }
+
private static void testCopiedMethodInStackTrace(Constructor<?> constructor) throws Exception {
Throwable t = $noinline$createStackTraceWithCopiedMethod(constructor);
doUnloading();
@@ -431,4 +463,23 @@ public class Main {
public static native void stopJit();
public static native void startJit();
+
+
+ /* Corresponds to:
+ *
+ * public abstract class AbstractClass extends ConflictSuper { }
+ *
+ */
+ private static final byte[] DEX_BYTES = Base64.getDecoder().decode(
+ "ZGV4CjAzNQAOZ0WGvUad/2dEp77oyy9K2tx8txklUZ1wAgAAcAAAAHhWNBIAAAAAAAAAANwBAAAG" +
+ "AAAAcAAAAAMAAACIAAAAAQAAAJQAAAAAAAAAAAAAAAIAAACgAAAAAQAAALAAAACgAQAA0AAAAOwA" +
+ "AAD0AAAACAEAABkBAAAqAQAALQEAAAIAAAADAAAABAAAAAQAAAACAAAAAAAAAAAAAAAAAAAAAQAA" +
+ "AAAAAAAAAAAAAQQAAAEAAAAAAAAAAQAAAAAAAADLAQAAAAAAAAEAAQABAAAA6AAAAAQAAABwEAEA" +
+ "AAAOABEADgAGPGluaXQ+ABJBYnN0cmFjdENsYXNzLmphdmEAD0xBYnN0cmFjdENsYXNzOwAPTENv" +
+ "bmZsaWN0U3VwZXI7AAFWAJsBfn5EOHsiYmFja2VuZCI6ImRleCIsImNvbXBpbGF0aW9uLW1vZGUi" +
+ "OiJkZWJ1ZyIsImhhcy1jaGVja3N1bXMiOmZhbHNlLCJtaW4tYXBpIjoxLCJzaGEtMSI6ImI3MmIx" +
+ "NWJjODQ2N2Y0M2FhNTdlYjk5ZDAyMjU0Nzg5ODYwZjRlOWEiLCJ2ZXJzaW9uIjoiOC41LjEtZGV2" +
+ "In0AAAABAACBgATQAQAAAAAAAAAMAAAAAAAAAAEAAAAAAAAAAQAAAAYAAABwAAAAAgAAAAMAAACI" +
+ "AAAAAwAAAAEAAACUAAAABQAAAAIAAACgAAAABgAAAAEAAACwAAAAASAAAAEAAADQAAAAAyAAAAEA" +
+ "AADoAAAAAiAAAAYAAADsAAAAACAAAAEAAADLAQAAAxAAAAEAAADYAQAAABAAAAEAAADcAQAA");
}
diff --git a/test/667-jit-jni-stub/jit_jni_stub_test.cc b/test/667-jit-jni-stub/jit_jni_stub_test.cc
index 2b8e14c03d..b7946f39ed 100644
--- a/test/667-jit-jni-stub/jit_jni_stub_test.cc
+++ b/test/667-jit-jni-stub/jit_jni_stub_test.cc
@@ -39,9 +39,11 @@ extern "C" JNIEXPORT
void Java_Main_jitGc(JNIEnv*, jclass) {
CHECK(Runtime::Current()->GetJit() != nullptr);
jit::JitCodeCache* cache = Runtime::Current()->GetJit()->GetCodeCache();
- ScopedObjectAccess soa(Thread::Current());
- cache->InvalidateAllCompiledCode();
- cache->GarbageCollectCache(Thread::Current());
+ {
+ ScopedObjectAccess soa(Thread::Current());
+ cache->InvalidateAllCompiledCode();
+ }
+ cache->DoCollection(Thread::Current());
}
extern "C" JNIEXPORT
diff --git a/test/667-jit-jni-stub/src/Main.java b/test/667-jit-jni-stub/src/Main.java
index c0829b5100..05039670d1 100644
--- a/test/667-jit-jni-stub/src/Main.java
+++ b/test/667-jit-jni-stub/src/Main.java
@@ -67,9 +67,6 @@ public class Main {
assertFalse(hasJitCompiledEntrypoint(Main.class, "callThrough"));
assertFalse(hasJitCompiledCode(Main.class, "callThrough"));
callThrough(Main.class, "testMixedFramesOnStackStage2");
- // We have just returned through the JIT-compiled JNI stub, so it must still
- // be compiled (though not necessarily with the entrypoint pointing to it).
- assertTrue(hasJitCompiledCode(Main.class, "callThrough"));
// Though the callThrough() is on the stack, that frame is using the GenericJNI
// and does not prevent the collection of the JNI stub.
testStubCanBeCollected();
@@ -94,10 +91,6 @@ public class Main {
}
public static void testStubCanBeCollected() {
- assertTrue(hasJitCompiledCode(Main.class, "callThrough"));
- doJitGcsUntilFullJitGcIsScheduled();
- assertFalse(hasJitCompiledEntrypoint(Main.class, "callThrough"));
- assertTrue(hasJitCompiledCode(Main.class, "callThrough"));
jitGc(); // JIT GC without callThrough() on the stack should collect the callThrough() stub.
assertFalse(hasJitCompiledEntrypoint(Main.class, "callThrough"));
assertFalse(hasJitCompiledCode(Main.class, "callThrough"));
diff --git a/test/knownfailures.json b/test/knownfailures.json
index ea124d0218..89b5196d84 100644
--- a/test/knownfailures.json
+++ b/test/knownfailures.json
@@ -1503,7 +1503,11 @@
"623-checker-loop-regressions",
"639-checker-code-sinking",
"640-checker-integer-valueof",
- "732-checker-app-image"],
+ "640-checker-simd",
+ "645-checker-abs-simd",
+ "660-checker-simd-sad",
+ "732-checker-app-image",
+ "2256-checker-vector-replacement"],
"variant": "optimizing & no-image",
"description": ["Expected failures when compiling without a boot image"]
},