// Verify that the output of dexoptanalyzer for the given arguments is the same // as the output of OatFileAssistant::GetDexOptNeeded. void Verify(const std::string& dex_file,
CompilerFilter::Filter compiler_filter,
ProfileAnalysisResult profile_analysis_result =
ProfileAnalysisResult::kDontOptimizeSmallDelta, bool downgrade = false, constchar* class_loader_context = "PCL[]") {
std::unique_ptr<ClassLoaderContext> context = class_loader_context == nullptr
? nullptr
: ClassLoaderContext::Create(class_loader_context); if (context != nullptr) {
std::vector<int> context_fds;
ASSERT_TRUE(context->OpenDexFiles("", context_fds, /*only_read_checksums*/ true));
}
// The tests below exercise the same test case from oat_file_assistant_test.cc.
// Case: We have a DEX file, but no ODEX file for it.
TEST_F(DexoptAnalyzerTest, DexNoOat) {
std::string dex_location = GetScratchDir() + "/DexNoOat.jar";
Copy(GetDexSrc1(), dex_location);
// Case: We have a DEX file, verify odex file for it, and we ask if it's up to date // when the profiles are empty or full.
TEST_F(DexoptAnalyzerTest, VerifyAndEmptyProfiles) {
std::string dex_location = GetScratchDir() + "/VerifyAndEmptyProfiles.jar";
std::string odex_location = GetOdexDir() + "/VerifyAndEmptyProfiles.odex";
Copy(GetDexSrc1(), dex_location);
// If we want to speed-profile something that was verified, do it even if // the profile analysis returns kDontOptimizeSmallDelta (it means that we do have profile data, // so a transition verify -> speed-profile is still worth).
ASSERT_EQ( static_cast<int>(ReturnCode::kDex2OatForFilterOdex),
Analyze(dex_location, CompilerFilter::kSpeedProfile,
ProfileAnalysisResult::kDontOptimizeSmallDelta, "PCL[]")); // If we want to speed-profile something that was verified but the profiles are empty, // don't do it - there will be no gain.
ASSERT_EQ( static_cast<int>(ReturnCode::kNoDexOptNeeded),
Analyze(dex_location, CompilerFilter::kSpeedProfile,
ProfileAnalysisResult::kDontOptimizeEmptyProfiles, "PCL[]")); // Standard case where we need to re-compile a speed-profile because of sufficient new // information in the profile.
ASSERT_EQ( static_cast<int>(ReturnCode::kDex2OatForFilterOdex),
Analyze(dex_location, CompilerFilter::kSpeedProfile,
ProfileAnalysisResult::kOptimize, "PCL[]"));
}
// Case: We have a MultiDEX file and up-to-date ODEX file for it.
TEST_F(DexoptAnalyzerTest, MultiDexOatUpToDate) {
std::string dex_location = GetScratchDir() + "/MultiDexOatUpToDate.jar";
std::string odex_location = GetOdexDir() + "/MultiDexOatUpToDate.odex";
// Case: We have a MultiDEX file where the secondary dex file is out of date.
TEST_F(DexoptAnalyzerTest, MultiDexSecondaryOutOfDate) {
std::string dex_location = GetScratchDir() + "/MultiDexSecondaryOutOfDate.jar";
std::string odex_location = GetOdexDir() + "/MultiDexSecondaryOutOfDate.odex";
// Compile code for GetMultiDexSrc1.
Copy(GetMultiDexSrc1(), dex_location);
GenerateOdexForTest(dex_location, odex_location, CompilerFilter::kSpeed);
// Now overwrite the dex file with GetMultiDexSrc2 so the secondary checksum // is out of date.
Copy(GetMultiDexSrc2(), dex_location);
// Case: We have a DEX file and an ODEX file out of date with respect to the // dex checksum.
TEST_F(DexoptAnalyzerTest, OatDexOutOfDate) {
std::string dex_location = GetScratchDir() + "/OatDexOutOfDate.jar";
std::string odex_location = GetOdexDir() + "/OatDexOutOfDate.odex";
// We create a dex, generate an oat for it, then overwrite the dex with a // different dex to make the oat out of date.
Copy(GetDexSrc1(), dex_location);
GenerateOdexForTest(dex_location, odex_location, CompilerFilter::kSpeed);
Copy(GetDexSrc2(), dex_location);
Verify(dex_location, CompilerFilter::kSpeed);
}
// Case: We have a DEX file and an ODEX file out of date with respect to the // boot image.
TEST_F(DexoptAnalyzerTest, OatImageOutOfDate) {
std::string dex_location = GetScratchDir() + "/OatImageOutOfDate.jar";
std::string odex_location = GetOdexDir() + "/OatImageOutOfDate.odex";
// Case: We have a DEX file and an ODEX file, but no OAT file.
TEST_F(DexoptAnalyzerTest, DexOdexNoOat) {
std::string dex_location = GetScratchDir() + "/DexOdexNoOat.jar";
std::string odex_location = GetOdexDir() + "/DexOdexNoOat.odex";
// Case: We have a stripped (or resource-only) DEX file, no ODEX file and no // OAT file. Expect: The status is kNoDexOptNeeded.
TEST_F(DexoptAnalyzerTest, ResourceOnlyDex) {
std::string dex_location = GetScratchDir() + "/ResourceOnlyDex.jar";
// Case: We have a DEX file and up-to-date OAT file for it, and we check with // a class loader context.
TEST_F(DexoptAnalyzerTest, ClassLoaderContext) {
std::string dex_location1 = GetScratchDir() + "/DexToAnalyze.jar";
std::string odex_location1 = GetOdexDir() + "/DexToAnalyze.odex";
std::string dex_location2 = GetScratchDir() + "/DexInContext.jar";
Copy(GetDexSrc1(), dex_location1);
Copy(GetDexSrc2(), dex_location2);
// Generate the odex to get the class loader context also open the dex files.
GenerateOdexForTest(dex_location1, odex_location1, CompilerFilter::kSpeed, /* compilation_reason= */ nullptr, /* extra_args= */ { class_loader_context_option });
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.