Loading cmds/installd/dexopt.h +5 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ #define DEXOPT_H_ #include "installd_constants.h" #include "unique_file.h" #include <sys/types.h> Loading Loading @@ -156,6 +157,10 @@ const char* select_execution_binary( // artifacts. int get_odex_visibility(const char* apk_path, const char* instruction_set, const char* oat_dir); UniqueFile maybe_open_reference_profile(const std::string& pkgname, const std::string& dex_path, const char* profile_name, bool profile_guided, bool is_public, int uid, bool is_secondary_dex); } // namespace installd } // namespace android Loading cmds/installd/otapreopt.cpp +40 −6 Original line number Diff line number Diff line Loading @@ -14,20 +14,21 @@ ** limitations under the License. */ #include <algorithm> #include <inttypes.h> #include <limits> #include <random> #include <regex> #include <selinux/android.h> #include <selinux/avc.h> #include <stdlib.h> #include <string.h> #include <sys/capability.h> #include <sys/mman.h> #include <sys/prctl.h> #include <sys/stat.h> #include <sys/mman.h> #include <sys/wait.h> #include <algorithm> #include <iterator> #include <limits> #include <random> #include <regex> #include <android-base/logging.h> #include <android-base/macros.h> Loading @@ -47,6 +48,7 @@ #include "otapreopt_parameters.h" #include "otapreopt_utils.h" #include "system_properties.h" #include "unique_file.h" #include "utils.h" #ifndef LOG_TAG Loading Loading @@ -87,6 +89,9 @@ static_assert(DEXOPT_GENERATE_APP_IMAGE == 1 << 12, "DEXOPT_GENERATE_APP_IMAGE u static_assert(DEXOPT_MASK == (0x3dfe | DEXOPT_IDLE_BACKGROUND_JOB), "DEXOPT_MASK unexpected."); constexpr const char* kAotCompilerFilters[]{ "space-profile", "space", "speed-profile", "speed", "everything-profile", "everything", }; template<typename T> static constexpr bool IsPowerOfTwo(T x) { Loading Loading @@ -415,6 +420,32 @@ private: return (strcmp(arg, "!") == 0) ? nullptr : arg; } bool IsAotCompilation() const { if (std::find(std::begin(kAotCompilerFilters), std::end(kAotCompilerFilters), parameters_.compiler_filter) == std::end(kAotCompilerFilters)) { return false; } int dexopt_flags = parameters_.dexopt_flags; bool profile_guided = (dexopt_flags & DEXOPT_PROFILE_GUIDED) != 0; bool is_secondary_dex = (dexopt_flags & DEXOPT_SECONDARY_DEX) != 0; bool is_public = (dexopt_flags & DEXOPT_PUBLIC) != 0; if (profile_guided) { UniqueFile reference_profile = maybe_open_reference_profile(parameters_.pkgName, parameters_.apk_path, parameters_.profile_name, profile_guided, is_public, parameters_.uid, is_secondary_dex); struct stat sbuf; if (reference_profile.fd() == -1 || (fstat(reference_profile.fd(), &sbuf) != -1 && sbuf.st_size == 0)) { return false; } } return true; } bool ShouldSkipPreopt() const { // There's one thing we have to be careful about: we may/will be asked to compile an app // living in the system image. This may be a valid request - if the app wasn't compiled, Loading @@ -439,9 +470,12 @@ private: // (This is ugly as it's the only thing where we need to understand the contents // of parameters_, but it beats postponing the decision or using the call- // backs to do weird things.) // In addition, no need to preopt for "verify". The existing vdex files in the OTA package // and the /data partition will still be usable after the OTA update is applied. const char* apk_path = parameters_.apk_path; CHECK(apk_path != nullptr); if (StartsWith(apk_path, android_root_)) { if (StartsWith(apk_path, android_root_) || !IsAotCompilation()) { const char* last_slash = strrchr(apk_path, '/'); if (last_slash != nullptr) { std::string path(apk_path, last_slash - apk_path + 1); Loading Loading
cmds/installd/dexopt.h +5 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ #define DEXOPT_H_ #include "installd_constants.h" #include "unique_file.h" #include <sys/types.h> Loading Loading @@ -156,6 +157,10 @@ const char* select_execution_binary( // artifacts. int get_odex_visibility(const char* apk_path, const char* instruction_set, const char* oat_dir); UniqueFile maybe_open_reference_profile(const std::string& pkgname, const std::string& dex_path, const char* profile_name, bool profile_guided, bool is_public, int uid, bool is_secondary_dex); } // namespace installd } // namespace android Loading
cmds/installd/otapreopt.cpp +40 −6 Original line number Diff line number Diff line Loading @@ -14,20 +14,21 @@ ** limitations under the License. */ #include <algorithm> #include <inttypes.h> #include <limits> #include <random> #include <regex> #include <selinux/android.h> #include <selinux/avc.h> #include <stdlib.h> #include <string.h> #include <sys/capability.h> #include <sys/mman.h> #include <sys/prctl.h> #include <sys/stat.h> #include <sys/mman.h> #include <sys/wait.h> #include <algorithm> #include <iterator> #include <limits> #include <random> #include <regex> #include <android-base/logging.h> #include <android-base/macros.h> Loading @@ -47,6 +48,7 @@ #include "otapreopt_parameters.h" #include "otapreopt_utils.h" #include "system_properties.h" #include "unique_file.h" #include "utils.h" #ifndef LOG_TAG Loading Loading @@ -87,6 +89,9 @@ static_assert(DEXOPT_GENERATE_APP_IMAGE == 1 << 12, "DEXOPT_GENERATE_APP_IMAGE u static_assert(DEXOPT_MASK == (0x3dfe | DEXOPT_IDLE_BACKGROUND_JOB), "DEXOPT_MASK unexpected."); constexpr const char* kAotCompilerFilters[]{ "space-profile", "space", "speed-profile", "speed", "everything-profile", "everything", }; template<typename T> static constexpr bool IsPowerOfTwo(T x) { Loading Loading @@ -415,6 +420,32 @@ private: return (strcmp(arg, "!") == 0) ? nullptr : arg; } bool IsAotCompilation() const { if (std::find(std::begin(kAotCompilerFilters), std::end(kAotCompilerFilters), parameters_.compiler_filter) == std::end(kAotCompilerFilters)) { return false; } int dexopt_flags = parameters_.dexopt_flags; bool profile_guided = (dexopt_flags & DEXOPT_PROFILE_GUIDED) != 0; bool is_secondary_dex = (dexopt_flags & DEXOPT_SECONDARY_DEX) != 0; bool is_public = (dexopt_flags & DEXOPT_PUBLIC) != 0; if (profile_guided) { UniqueFile reference_profile = maybe_open_reference_profile(parameters_.pkgName, parameters_.apk_path, parameters_.profile_name, profile_guided, is_public, parameters_.uid, is_secondary_dex); struct stat sbuf; if (reference_profile.fd() == -1 || (fstat(reference_profile.fd(), &sbuf) != -1 && sbuf.st_size == 0)) { return false; } } return true; } bool ShouldSkipPreopt() const { // There's one thing we have to be careful about: we may/will be asked to compile an app // living in the system image. This may be a valid request - if the app wasn't compiled, Loading @@ -439,9 +470,12 @@ private: // (This is ugly as it's the only thing where we need to understand the contents // of parameters_, but it beats postponing the decision or using the call- // backs to do weird things.) // In addition, no need to preopt for "verify". The existing vdex files in the OTA package // and the /data partition will still be usable after the OTA update is applied. const char* apk_path = parameters_.apk_path; CHECK(apk_path != nullptr); if (StartsWith(apk_path, android_root_)) { if (StartsWith(apk_path, android_root_) || !IsAotCompilation()) { const char* last_slash = strrchr(apk_path, '/'); if (last_slash != nullptr) { std::string path(apk_path, last_slash - apk_path + 1); Loading