iorap: Toggle dex related file in iorap prefetching. am: deff0e26ce

Original change: https://android-review.googlesource.com/c/platform/system/iorap/+/1645911

Change-Id: Iafe2a667ccabd6bab023e398b132ad5e36f51192
diff --git a/src/common/property.h b/src/common/property.h
index 214ba3c..d910193 100644
--- a/src/common/property.h
+++ b/src/common/property.h
@@ -38,6 +38,10 @@
       ::android::base::GetProperty("iorapd.readahead.enable", default_value)) == "true";
 }
 
+inline bool ExcludeDexFiles(bool default_value) {
+  return ::android::base::GetBoolProperty("iorapd.exclude_dex_files", default_value);
+}
+
 }  // namespace iorap::common
 
 #endif  // IORAP_UTILS_PROPERTY_H_
diff --git a/src/compiler/main.cc b/src/compiler/main.cc
index 1ecfaed..4b47232 100644
--- a/src/compiler/main.cc
+++ b/src/compiler/main.cc
@@ -37,7 +37,8 @@
   std::cerr << "" << std::endl;
   std::cerr << "  Optional flags:" << std::endl;
   std::cerr << "    --help,-h                  Print this Usage." << std::endl;
-  std::cerr << "    --blacklist-filter,-bf     Specify regex acting as a blacklist filter." << std::endl;
+  std::cerr << "    --denylist-filter,-df     Specify regex acting as a denylist filter."
+            << std::endl;
   std::cerr << "                               Filepaths matching this regex are removed from the output file." << std::endl;
   std::cerr << "    --output-text,-ot          Output ascii text instead of protobuf (default off)." << std::endl;
   std::cerr << "    --output-proto $,-op $     TraceFile tracebuffer output file (default stdout)." << std::endl;
@@ -95,9 +96,9 @@
       }
       arg_inode_textcache = arg_next;
       ++arg;
-    } else if (argstr == "--blacklist-filter" || argstr == "-bf") {
+    } else if (argstr == "--denylist-filter" || argstr == "-df") {
       if (!has_arg_next) {
-        std::cerr << "Missing --blacklist-filter <value>" << std::endl;
+        std::cerr << "Missing --denylist-filter <value>" << std::endl;
         return 1;
       }
       arg_blacklist_filter = arg_next;
diff --git a/src/maintenance/controller.cc b/src/maintenance/controller.cc
index daaf08f..8f2013f 100644
--- a/src/maintenance/controller.cc
+++ b/src/maintenance/controller.cc
@@ -44,6 +44,7 @@
 
 const constexpr int64_t kCompilerCheckIntervalMs = 10;
 static constexpr size_t kMinTracesForCompilation = 1;
+const constexpr char* kDenyListFilterDexFiles = "[.](art|oat|odex|vdex|dex)$";
 
 struct LastJobInfo {
   time_t last_run_ns_{0};
@@ -123,6 +124,10 @@
       argv.push_back("--verbose");
     }
 
+    if (controller_params.exclude_dex_files) {
+      common::AppendArgs(argv, "--denylist-filter", kDenyListFilterDexFiles);
+    }
+
     return argv;
 }
 
diff --git a/src/maintenance/controller.h b/src/maintenance/controller.h
index dbe6df9..750d0b4 100644
--- a/src/maintenance/controller.h
+++ b/src/maintenance/controller.h
@@ -54,19 +54,22 @@
   bool recompile;
   uint64_t min_traces;
   std::shared_ptr<IExec> exec;
+  bool exclude_dex_files;
 
   ControllerParameters(bool output_text,
                        std::optional<std::string> inode_textcache,
                        bool verbose,
                        bool recompile,
                        uint64_t min_traces,
-                       std::shared_ptr<IExec> exec) :
+                       std::shared_ptr<IExec> exec,
+                       bool exclude_dex_files) :
     output_text(output_text),
     inode_textcache(inode_textcache),
     verbose(verbose),
     recompile(recompile),
     min_traces(min_traces),
-    exec(exec) {
+    exec(exec),
+    exclude_dex_files(exclude_dex_files) {
   }
 };
 
diff --git a/src/maintenance/main.cc b/src/maintenance/main.cc
index 16b2a35..8b66069 100644
--- a/src/maintenance/main.cc
+++ b/src/maintenance/main.cc
@@ -44,8 +44,9 @@
   std::cerr << "    --purge-package,-pp        Purge all files associated with a package." << std::endl;
   std::cerr << "    --verbose,-v               Set verbosity (default off)." << std::endl;
   std::cerr << "    --output-text,-ot          Output ascii text instead of protobuf (default off)." << std::endl;
-  std::cerr << "    --min_traces,-mt           The min number of perfetto traces needed for compilation (default 1)."
-            << std::endl;
+  std::cerr << "    --min_traces,-mt           The min number of perfetto traces needed "
+            << "for compilation (default 1)." << std::endl;
+  std::cerr << "    --exclude-dex-files,-edf   Set of exclude dex files" << std::endl;
   exit(1);
 }
 
@@ -69,6 +70,7 @@
   bool enable_verbose = false;
   bool arg_output_text = false;
   uint64_t arg_min_traces = 1;
+  bool exclude_dex_files = false;
 
   for (int arg = 1; arg < argc; ++arg) {
     std::string argstr = argv[arg];
@@ -117,8 +119,7 @@
       }
       arg_purge_package = arg_next;
       ++arg;
-    }
-    else if (argstr == "--verbose" || argstr == "-v") {
+    } else if (argstr == "--verbose" || argstr == "-v") {
       enable_verbose = true;
     } else if (argstr == "--recompile" || argstr == "-r") {
       recompile = true;
@@ -131,6 +132,8 @@
       }
       arg_min_traces = std::stoul(arg_next);
       ++arg;
+    } else if (argstr == "--exclude-dex-files" || argstr == "-edf") {
+      exclude_dex_files = true;
     } else {
       arg_input_filenames.push_back(argstr);
     }
@@ -167,7 +170,8 @@
     enable_verbose,
     recompile,
     arg_min_traces,
-    std::make_shared<Exec>()};
+    std::make_shared<Exec>(),
+    exclude_dex_files};
 
   int ret_code = 0;
   if (arg_package && arg_activity) {
diff --git a/src/manager/event_manager.cc b/src/manager/event_manager.cc
index 3ea7b12..6034271 100644
--- a/src/manager/event_manager.cc
+++ b/src/manager/event_manager.cc
@@ -63,6 +63,8 @@
 
 using db::AppComponentName;
 
+const constexpr bool kExcludeDexFilesDefault = true;
+
 static std::atomic<bool> s_tracing_allowed{false};
 static std::atomic<bool> s_readahead_allowed{false};
 static std::atomic<uint64_t> s_min_traces{3};
@@ -1013,7 +1015,11 @@
                  << event.package_name
                  << ")";
 
-    return PurgePackage(event.package_name);
+    if (common::ExcludeDexFiles(kExcludeDexFilesDefault)) {
+      return PurgePackage(event.package_name);
+    }
+
+    return true;
   }
 
   bool OnJobScheduledEvent(RequestId request_id,
@@ -1126,7 +1132,8 @@
         verbose,
         recompile,
         min_traces,
-        std::make_shared<maintenance::Exec>()};
+        std::make_shared<maintenance::Exec>(),
+        common::ExcludeDexFiles(kExcludeDexFilesDefault)};
 
       LOG(DEBUG) << "StartMaintenance: min_traces=" << min_traces;
       maintenance::CompileAppsOnDevice(db, params);
@@ -1240,6 +1247,9 @@
     uint64_t min_traces = s_min_traces;
     printer.printFormatLine("iorapd.maintenance.min_traces = %" PRIu64, min_traces);
 
+    printer.printFormatLine("iorapd.exclude_dex_files = %s",
+                            common::ExcludeDexFiles(kExcludeDexFilesDefault) ? "true" : "false");
+
     package_blacklister_ = PackageBlacklister{
         /* Colon-separated string list of blacklisted packages, e.g.
          * "foo.bar.baz;com.fake.name" would blacklist {"foo.bar.baz", "com.fake.name"} packages.
@@ -1280,7 +1290,8 @@
       WOULD_LOG(VERBOSE),
       /*recompile*/false,
       s_min_traces,
-      std::make_shared<maintenance::Exec>()};
+      std::make_shared<maintenance::Exec>(),
+      common::ExcludeDexFiles(kExcludeDexFilesDefault)};
 
     db::DbHandle db{db::SchemaModel::GetSingleton()};
     bool res = maintenance::CompileSingleAppOnDevice(db, std::move(params), package_name);
diff --git a/tests/src/compiler/compiler_test.cc b/tests/src/compiler/compiler_test.cc
index fb3e70b..b198b52 100644
--- a/tests/src/compiler/compiler_test.cc
+++ b/tests/src/compiler/compiler_test.cc
@@ -142,7 +142,7 @@
   std::string blacklist_filter = "[.](art|oat|odex|vdex|dex)$";
 
   // iorap.cmd.compiler -op output.pb -it common_textcache -ot
-  //                    --blacklist-filter "[.](art|oat|odex|vdex|dex)$" common_perfetto_trace.pb
+  //                    --denylist-filter "[.](art|oat|odex|vdex|dex)$" common_perfetto_trace.pb
 
   std::vector<CompilationInput> perfetto_traces =
       MakeCompilationInputs(input_file_names, /* timestamp_limit_ns= */{});
diff --git a/tests/src/maintenance/controller_test.cc b/tests/src/maintenance/controller_test.cc
index d2ce19f..4b92cf7 100644
--- a/tests/src/maintenance/controller_test.cc
+++ b/tests/src/maintenance/controller_test.cc
@@ -102,12 +102,40 @@
       "--timestamp_limit_ns", "2",
       "--timestamp_limit_ns", "18446744073709551615",
       "--timestamp_limit_ns", "8",
+       "--pid",
+       "1",
+       "--pid",
+       "3",
+       "--pid",
+       "4",
       "--output-text",
       "--output-proto", compiled_trace_path,
       "--verbose" };
   return arg == expect;
 }
 
+MATCHER_P(AreArgsExpectedNoDex, compiled_trace_path, "") {
+  std::vector<std::string> expect =
+    { "1.txt",
+      "3.txt",
+      "4.txt",
+      "--timestamp_limit_ns", "2",
+      "--timestamp_limit_ns", "18446744073709551615",
+      "--timestamp_limit_ns", "8",
+       "--pid",
+       "1",
+       "--pid",
+       "3",
+       "--pid",
+       "4",
+      "--output-text",
+      "--output-proto", compiled_trace_path,
+      "--verbose",
+      "--denylist-filter",
+      "[.](art|oat|odex|vdex|dex)$"};
+  return arg == expect;
+}
+
 TEST_F(ControllerTest, CompilationController) {
   auto mock_exec = std::make_shared<MockExec>();
   iorap::db::SchemaModel db_schema = db::SchemaModel::GetOrCreate(db_path);
@@ -124,7 +152,8 @@
     /*verbose=*/true,
     /*recompile=*/false,
     /*min_traces=*/3,
-    mock_exec};
+    mock_exec,
+    /*exclude_dex_files=*/false};
 
   ON_CALL(*mock_exec, Fork())
       .WillByDefault(Return(-2));
@@ -144,7 +173,8 @@
     /*verbose=*/true,
     /*recompile=*/true,
     /*min_traces=*/3,
-    mock_exec};
+    mock_exec,
+    /*exclude_dex_files=*/false};
 
   // Create a fake compiled trace file to test recompile.
   std::ofstream tmp_file;
@@ -152,6 +182,24 @@
   tmp_file.close();
 
   CompileAppsOnDevice(db, params2);
+
+  // Recompile
+  ControllerParameters params3{
+    /*output_text=*/true,
+    /*inode_textcache=*/std::nullopt,
+    /*verbose=*/true,
+    /*recompile=*/true,
+    /*min_traces=*/3,
+    mock_exec,
+    /*exclude_dex_files=*/true};
+
+  EXPECT_CALL(*mock_exec,
+              Execve("/system/bin/iorap.cmd.compiler",
+                     AreArgsExpectedNoDex(compiled_trace_path),
+                     nullptr))
+      .Times(1);
+
+  CompileAppsOnDevice(db, params3);
 }
 
 }  // namespace iorap::maintenance
diff --git a/tests/src/maintenance/testdata/test_sqlite.db b/tests/src/maintenance/testdata/test_sqlite.db
index 8e823f2..001bfad 100644
--- a/tests/src/maintenance/testdata/test_sqlite.db
+++ b/tests/src/maintenance/testdata/test_sqlite.db
Binary files differ