summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Martin Stjernholm <mast@google.com> 2023-05-11 20:57:47 +0100
committer Martin Stjernholm <mast@google.com> 2023-05-26 18:23:16 +0000
commitef6ac1d5293920559feaebcaeb6413a6864dbb70 (patch)
tree5cf8003066ced5722420b63a3caac6593ea6afd2
parent066a89ed8f30008509631a225ddf2587c6495715 (diff)
Recompile packages with cdex in vdex'es in background dexopt when the
disable cdex experiment is enabled. Test: adb install out/dist/com.google.android.art.apex adb reboot && adb wait-for-device m AppUsedByOtherApp adb install-multiple out/target/product/vsoc_x86_64/testcases/AppUsedByOtherApp/x86_64/AppUsedByOtherApp.apk AppUsedByOtherApp.dm # where AppUsedByOtherApp.dm is created from a non-empty profile adb root && adb wait-for-device adb shell pm bg-dexopt-job adb shell find data/app data/dalvik-cache -name \*.vdex \ \| xargs grep cdex001 # -> matches are found, e.g. in system apps adb shell pm compile -f -m speed-profile \ android.compilation.cts.appusedbyotherapp adb shell grep cdex001 \ /data/app/\*/android.compilation.cts.appusedbyotherapp-\*/oat/x86_64/base.vdex # -> check that a match is found adb shell setprop \ persist.device_config.runtime_native_boot.disable_compact_dex \ true adb shell pm bg-dexopt-job adb shell find data/app data/dalvik-cache -name \*.vdex \ \| xargs grep cdex001 # -> check that no matches are found on SC, TM and UDC platform images Bug: 256664509 Bug: 282137215 Change-Id: I720ffc5861768dc43f70789c0dfbad7ceedc5c9a (cherry picked from commit 35ea7e066db64f4c9c740894d2c428707015a8c0) Merged-In: I720ffc5861768dc43f70789c0dfbad7ceedc5c9a
-rw-r--r--runtime/oat_file_assistant.cc25
-rw-r--r--runtime/oat_file_assistant.h5
-rw-r--r--runtime/vdex_file.cc6
-rw-r--r--runtime/vdex_file.h4
4 files changed, 40 insertions, 0 deletions
diff --git a/runtime/oat_file_assistant.cc b/runtime/oat_file_assistant.cc
index 1b0f0bc7e9..9e16e49e40 100644
--- a/runtime/oat_file_assistant.cc
+++ b/runtime/oat_file_assistant.cc
@@ -25,6 +25,7 @@
#include "android-base/file.h"
#include "android-base/logging.h"
+#include "android-base/properties.h"
#include "android-base/stringprintf.h"
#include "android-base/strings.h"
#include "arch/instruction_set.h"
@@ -309,6 +310,9 @@ int OatFileAssistant::GetDexOptNeeded(CompilerFilter::Filter target_compiler_fil
bool profile_changed,
bool downgrade) {
OatFileInfo& info = GetBestInfo();
+ if (info.CheckDisableCompactDexExperiment()) { // TODO(b/256664509): Clean this up.
+ return kDex2OatFromScratch;
+ }
DexOptNeeded dexopt_needed = info.GetDexOptNeeded(
target_compiler_filter, GetDexOptTrigger(target_compiler_filter, profile_changed, downgrade));
if (dexopt_needed != kNoDexOptNeeded && (&info == &dm_for_oat_ || &info == &dm_for_odex_)) {
@@ -327,6 +331,10 @@ bool OatFileAssistant::GetDexOptNeeded(CompilerFilter::Filter target_compiler_fi
DexOptTrigger dexopt_trigger,
/*out*/ DexOptStatus* dexopt_status) {
OatFileInfo& info = GetBestInfo();
+ if (info.CheckDisableCompactDexExperiment()) { // TODO(b/256664509): Clean this up.
+ dexopt_status->location_ = kLocationNoneOrError;
+ return true;
+ }
DexOptNeeded dexopt_needed = info.GetDexOptNeeded(target_compiler_filter, dexopt_trigger);
if (info.IsUseable()) {
if (&info == &dm_for_oat_ || &info == &dm_for_odex_) {
@@ -1262,6 +1270,23 @@ std::unique_ptr<OatFile> OatFileAssistant::OatFileInfo::ReleaseFileForUse() {
return std::unique_ptr<OatFile>();
}
+// Check if we should reject vdex containing cdex code as part of the
+// disable_cdex experiment.
+// TODO(b/256664509): Clean this up.
+bool OatFileAssistant::OatFileInfo::CheckDisableCompactDexExperiment() {
+ std::string ph_disable_compact_dex = android::base::GetProperty(kPhDisableCompactDex, "false");
+ if (ph_disable_compact_dex != "true") {
+ return false;
+ }
+ const OatFile* oat_file = GetFile();
+ if (oat_file == nullptr) {
+ return false;
+ }
+ const VdexFile* vdex_file = oat_file->GetVdexFile();
+ return vdex_file != nullptr && vdex_file->HasDexSection() &&
+ !vdex_file->HasOnlyStandardDexFiles();
+}
+
// TODO(calin): we could provide a more refined status here
// (e.g. run from uncompressed apk, run with vdex but not oat etc). It will allow us to
// track more experiments but adds extra complexity.
diff --git a/runtime/oat_file_assistant.h b/runtime/oat_file_assistant.h
index 2b6bb70d31..54287eb5f1 100644
--- a/runtime/oat_file_assistant.h
+++ b/runtime/oat_file_assistant.h
@@ -434,6 +434,11 @@ class OatFileAssistant {
// the OatFileInfo object.
std::unique_ptr<OatFile> ReleaseFileForUse();
+ // Check if we should reject vdex containing cdex code as part of the
+ // disable_cdex experiment.
+ // TODO(b/256664509): Clean this up.
+ bool CheckDisableCompactDexExperiment();
+
private:
// Returns true if the oat file is usable but at least one dexopt trigger is matched. This
// function should only be called if the oat file is usable.
diff --git a/runtime/vdex_file.cc b/runtime/vdex_file.cc
index d55876da2f..5a5d3bc68d 100644
--- a/runtime/vdex_file.cc
+++ b/runtime/vdex_file.cc
@@ -384,6 +384,12 @@ bool VdexFile::MatchesDexFileChecksums(const std::vector<const DexFile::Header*>
return true;
}
+bool VdexFile::HasOnlyStandardDexFiles() const {
+ // All are the same so it's enough to check the first one.
+ const uint8_t* dex_file_start = GetNextDexFileData(nullptr, 0);
+ return dex_file_start == nullptr || StandardDexFile::IsMagicValid(dex_file_start);
+}
+
static ObjPtr<mirror::Class> FindClassAndClearException(ClassLinker* class_linker,
Thread* self,
const char* name,
diff --git a/runtime/vdex_file.h b/runtime/vdex_file.h
index a35d720f71..fe65c07bac 100644
--- a/runtime/vdex_file.h
+++ b/runtime/vdex_file.h
@@ -296,6 +296,10 @@ class VdexFile {
// order must match too.
bool MatchesDexFileChecksums(const std::vector<const DexFile::Header*>& dex_headers) const;
+ // Returns true if all dex files are standard dex rather than compact dex.
+ // Also returns true if there are no dex files at all.
+ bool HasOnlyStandardDexFiles() const;
+
ClassStatus ComputeClassStatus(Thread* self, Handle<mirror::Class> cls) const
REQUIRES_SHARED(Locks::mutator_lock_);