Adds support for restore dexopt flag

This change adds support for a restore dexopt flag that modifies
installd to start dex2oat with a custom cpu set.

Bug: 135202722
Test: manual;adb install --install-reason 2 <apk>
Change-Id: If9ff54277d02d54c7b2dbb2659b708de6eecd500
Merged-In: If9ff54277d02d54c7b2dbb2659b708de6eecd500
(cherry picked from commit 00d3f4f8d2)
This commit is contained in:
Patrick Baumann 2020-04-14 17:03:00 -07:00
parent 7d1604dc3d
commit 2271b3e8ed
4 changed files with 45 additions and 10 deletions

View file

@ -262,6 +262,17 @@ static std::string MapPropertyToArg(const std::string& property,
return "";
}
static std::string MapPropertyToArgWithBackup(const std::string& property,
const std::string& backupProperty,
const std::string& format,
const std::string& default_value = "") {
std::string value = GetProperty(property, default_value);
if (!value.empty()) {
return StringPrintf(format.c_str(), value.c_str());
}
return MapPropertyToArg(backupProperty, format, default_value);
}
// Determines which binary we should use for execution (the debug or non-debug version).
// e.g. dex2oatd vs dex2oat
static const char* select_execution_binary(const char* binary, const char* debug_binary,
@ -321,6 +332,7 @@ class RunDex2Oat : public ExecVHelper {
const char* compiler_filter,
bool debuggable,
bool post_bootcomplete,
bool for_restore,
bool background_job_compile,
int profile_fd,
const char* class_loader_context,
@ -336,14 +348,24 @@ class RunDex2Oat : public ExecVHelper {
std::string dex2oat_Xms_arg = MapPropertyToArg("dalvik.vm.dex2oat-Xms", "-Xms%s");
std::string dex2oat_Xmx_arg = MapPropertyToArg("dalvik.vm.dex2oat-Xmx", "-Xmx%s");
const char* threads_property = post_bootcomplete
? "dalvik.vm.dex2oat-threads"
: "dalvik.vm.boot-dex2oat-threads";
std::string dex2oat_threads_arg = MapPropertyToArg(threads_property, "-j%s");
const char* cpu_set_property = post_bootcomplete
? "dalvik.vm.dex2oat-cpu-set"
: "dalvik.vm.boot-dex2oat-cpu-set";
std::string dex2oat_cpu_set_arg = MapPropertyToArg(cpu_set_property, "--cpu-set=%s");
std::string threads_format = "-j%s";
std::string dex2oat_threads_arg = post_bootcomplete
? (for_restore
? MapPropertyToArgWithBackup(
"dalvik.vm.restore-dex2oat-threads",
"dalvik.vm.dex2oat-threads",
threads_format)
: MapPropertyToArg("dalvik.vm.dex2oat-threads", threads_format))
: MapPropertyToArg("dalvik.vm.boot-dex2oat-threads", threads_format);
std::string cpu_set_format = "--cpu-set=%s";
std::string dex2oat_cpu_set_arg = post_bootcomplete
? (for_restore
? MapPropertyToArgWithBackup(
"dalvik.vm.restore-dex2oat-cpu-set",
"dalvik.vm.dex2oat-cpu-set",
cpu_set_format)
: MapPropertyToArg("dalvik.vm.dex2oat-cpu-set", cpu_set_format))
: MapPropertyToArg("dalvik.vm.boot-dex2oat-cpu-set", cpu_set_format);
std::string bootclasspath;
char* dex2oat_bootclasspath = getenv("DEX2OATBOOTCLASSPATH");
@ -2075,6 +2097,7 @@ int dexopt(const char* dex_path, uid_t uid, const char* pkgname, const char* ins
bool enable_hidden_api_checks = (dexopt_flags & DEXOPT_ENABLE_HIDDEN_API_CHECKS) != 0;
bool generate_compact_dex = (dexopt_flags & DEXOPT_GENERATE_COMPACT_DEX) != 0;
bool generate_app_image = (dexopt_flags & DEXOPT_GENERATE_APP_IMAGE) != 0;
bool for_restore = (dexopt_flags & DEXOPT_FOR_RESTORE) != 0;
// Check if we're dealing with a secondary dex file and if we need to compile it.
std::string oat_dir_str;
@ -2191,6 +2214,7 @@ int dexopt(const char* dex_path, uid_t uid, const char* pkgname, const char* ins
compiler_filter,
debuggable,
boot_complete,
for_restore,
background_job_compile,
reference_profile_fd.get(),
class_loader_context,

View file

@ -55,6 +55,7 @@ constexpr int DEXOPT_IDLE_BACKGROUND_JOB = 1 << 9;
constexpr int DEXOPT_ENABLE_HIDDEN_API_CHECKS = 1 << 10;
constexpr int DEXOPT_GENERATE_COMPACT_DEX = 1 << 11;
constexpr int DEXOPT_GENERATE_APP_IMAGE = 1 << 12;
constexpr int DEXOPT_FOR_RESTORE = 1 << 13; // TODO(b/135202722): remove
/* all known values for dexopt flags */
constexpr int DEXOPT_MASK =
@ -69,7 +70,8 @@ constexpr int DEXOPT_MASK =
| DEXOPT_IDLE_BACKGROUND_JOB
| DEXOPT_ENABLE_HIDDEN_API_CHECKS
| DEXOPT_GENERATE_COMPACT_DEX
| DEXOPT_GENERATE_APP_IMAGE;
| DEXOPT_GENERATE_APP_IMAGE
| DEXOPT_FOR_RESTORE;
// NOTE: keep in sync with StorageManager
constexpr int FLAG_STORAGE_DE = 1 << 0;

View file

@ -83,7 +83,7 @@ static_assert(DEXOPT_ENABLE_HIDDEN_API_CHECKS == 1 << 10,
static_assert(DEXOPT_GENERATE_COMPACT_DEX == 1 << 11, "DEXOPT_GENERATE_COMPACT_DEX unexpected");
static_assert(DEXOPT_GENERATE_APP_IMAGE == 1 << 12, "DEXOPT_GENERATE_APP_IMAGE unexpected");
static_assert(DEXOPT_MASK == (0x1dfe | DEXOPT_IDLE_BACKGROUND_JOB),
static_assert(DEXOPT_MASK == (0x3dfe | DEXOPT_IDLE_BACKGROUND_JOB),
"DEXOPT_MASK unexpected.");

View file

@ -643,6 +643,15 @@ TEST_F(DexoptTest, DexoptPrimaryPublicCreateOatDir) {
DEX2OAT_FROM_SCRATCH);
}
TEST_F(DexoptTest, DexoptPrimaryPublicRestore) {
LOG(INFO) << "DexoptPrimaryPublicRestore";
CompilePrimaryDexOk("verify",
DEXOPT_FOR_RESTORE | DEXOPT_BOOTCOMPLETE | DEXOPT_PUBLIC,
app_oat_dir_.c_str(),
kTestAppGid,
DEX2OAT_FROM_SCRATCH);
}
TEST_F(DexoptTest, DexoptPrimaryFailedInvalidFilter) {
LOG(INFO) << "DexoptPrimaryFailedInvalidFilter";
binder::Status status;