diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2024-04-30 23:00:28 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2024-04-30 23:00:28 +0000 |
commit | 9c8e0eac59e55eb7ec0b1cff2d3507f23c54eaea (patch) | |
tree | a5cfd270a529a6d55fe2549c8d60b7dcdae24a0e | |
parent | 02d260d6eb050a09efec8ca3c887257aefc22948 (diff) | |
parent | 89e4ca0ccf8424c8f4ac170504c55f5ee767b95c (diff) | |
download | art-9c8e0eac59e55eb7ec0b1cff2d3507f23c54eaea.tar.gz |
Snap for 11785460 from 89e4ca0ccf8424c8f4ac170504c55f5ee767b95c to sdk-release
Change-Id: I07d4a007ed94e25b638652437c2871661b931b11
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"] }, |