/* * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef ART_ODREFRESH_ODREFRESH_H_ #define ART_ODREFRESH_ODREFRESH_H_ #include #include #include #include #include #include #include #include #include "android-base/result.h" #include "com_android_apex.h" #include "com_android_art.h" #include "exec_utils.h" #include "odr_artifacts.h" #include "odr_config.h" #include "odr_metrics.h" #include "odrefresh/odrefresh.h" namespace art { namespace odrefresh { struct CompilationOptions { // If not empty, compile the bootclasspath jars for ISAs in the list. std::vector compile_boot_classpath_for_isas; // If not empty, compile the system server jars in the list. std::set system_server_jars_to_compile; }; class OnDeviceRefresh final { public: explicit OnDeviceRefresh(const OdrConfig& config); // Constructor with injections. For testing and internal use only. OnDeviceRefresh(const OdrConfig& config, const std::string& cache_info_filename, std::unique_ptr exec_utils); // Returns the exit code and specifies what should be compiled in `compilation_options`. WARN_UNUSED ExitCode CheckArtifactsAreUpToDate(OdrMetrics& metrics, /*out*/ CompilationOptions* compilation_options) const; WARN_UNUSED ExitCode Compile(OdrMetrics& metrics, const CompilationOptions& compilation_options) const; WARN_UNUSED bool RemoveArtifactsDirectory() const; // Returns a set of all system server jars. std::set AllSystemServerJars() const { return {all_systemserver_jars_.begin(), all_systemserver_jars_.end()}; } private: time_t GetExecutionTimeUsed() const; time_t GetExecutionTimeRemaining() const; time_t GetSubprocessTimeout() const; // Gets the `ApexInfo` for active APEXes. std::optional> GetApexInfoList() const; // Reads the ART APEX cache information (if any) found in the output artifact directory. std::optional ReadCacheInfo() const; // Writes ART APEX cache information to `kOnDeviceRefreshOdrefreshArtifactDirectory`. android::base::Result WriteCacheInfo() const; std::vector GenerateBootClasspathComponents() const; std::vector GenerateBootClasspathCompilableComponents() const; std::vector GenerateSystemServerComponents() const; // Returns the symbolic boot image location (without ISA). If `minimal` is true, returns the // symbolic location of the minimal boot image. std::string GetBootImage(bool on_system, bool minimal) const; // Returns the real boot image location (with ISA). If `minimal` is true, returns the // symbolic location of the minimal boot image. std::string GetBootImagePath(bool on_system, bool minimal, const InstructionSet isa) const; // Returns the symbolic boot image extension location (without ISA). Note that this only applies // to boot images on /system. std::string GetSystemBootImageExtension() const; // Returns the real boot image location extension (with ISA). Note that this only applies to boot // images on /system. std::string GetSystemBootImageExtensionPath(const InstructionSet isa) const; std::string GetSystemServerImagePath(bool on_system, const std::string& jar_path) const; // Removes files that are not in the list. android::base::Result CleanupArtifactDirectory( const std::vector& artifacts_to_keep) const; // Loads artifacts to memory and writes them back. This is a workaround for old versions of // odsign, which encounters "file exists" error when it adds existing artifacts to fs-verity. This // function essentially removes existing artifacts from fs-verity to avoid the error. android::base::Result RefreshExistingArtifacts() const; // Checks whether all boot classpath artifacts are present. Returns true if all are present, false // otherwise. // If `minimal` is true, checks the minimal boot image. // If `checked_artifacts` is present, adds checked artifacts to `checked_artifacts`. WARN_UNUSED bool BootClasspathArtifactsExist( bool on_system, bool minimal, const InstructionSet isa, /*out*/ std::string* error_msg, /*out*/ std::vector* checked_artifacts = nullptr) const; // Checks whether all system_server artifacts are present. The artifacts are checked in their // order of compilation. Returns true if all are present, false otherwise. // Adds the paths to the jars that are missing artifacts in `jars_with_missing_artifacts`. // If `checked_artifacts` is present, adds checked artifacts to `checked_artifacts`. WARN_UNUSED bool SystemServerArtifactsExist( bool on_system, /*out*/ std::string* error_msg, /*out*/ std::set* jars_missing_artifacts, /*out*/ std::vector* checked_artifacts = nullptr) const; // Returns true if all of the system properties listed in `kSystemProperties` are set to the // default values. This function is usually called when cache-info.xml does not exist (i.e., // compilation has not been done before). WARN_UNUSED bool CheckSystemPropertiesAreDefault() const; // Returns true if none of the system properties listed in `kSystemProperties` has changed since // the last compilation. This function is usually called when cache-info.xml exists. WARN_UNUSED bool CheckSystemPropertiesHaveNotChanged( const com::android::art::CacheInfo& cache_info) const; // Returns true if boot classpath artifacts on /system are usable if they exist. Note that this // function does not check file existence. WARN_UNUSED bool BootClasspathArtifactsOnSystemUsable( const com::android::apex::ApexInfo& art_apex_info) const; // Returns true if system_server artifacts on /system are usable if they exist. Note that this // function does not check file existence. WARN_UNUSED bool SystemServerArtifactsOnSystemUsable( const std::vector& apex_info_list) const; // Checks whether all boot classpath artifacts are up to date. Returns true if all are present, // false otherwise. // If `checked_artifacts` is present, adds checked artifacts to `checked_artifacts`. WARN_UNUSED bool CheckBootClasspathArtifactsAreUpToDate( OdrMetrics& metrics, const InstructionSet isa, const com::android::apex::ApexInfo& art_apex_info, const std::optional& cache_info, /*out*/ std::vector* checked_artifacts) const; // Checks whether all system_server artifacts are up to date. The artifacts are checked in their // order of compilation. Returns true if all are present, false otherwise. // Adds the paths to the jars that needs to be compiled in `jars_to_compile`. // If `checked_artifacts` is present, adds checked artifacts to `checked_artifacts`. bool CheckSystemServerArtifactsAreUpToDate( OdrMetrics& metrics, const std::vector& apex_info_list, const std::optional& cache_info, /*out*/ std::set* jars_to_compile, /*out*/ std::vector* checked_artifacts) const; // Compiles boot classpath. If `minimal` is true, only compiles the jars in the ART module. WARN_UNUSED bool CompileBootClasspathArtifacts(const InstructionSet isa, const std::string& staging_dir, OdrMetrics& metrics, const std::function& on_dex2oat_success, bool minimal, std::string* error_msg) const; WARN_UNUSED bool CompileSystemServerArtifacts( const std::string& staging_dir, OdrMetrics& metrics, const std::set& system_server_jars_to_compile, const std::function& on_dex2oat_success, std::string* error_msg) const; // Configuration to use. const OdrConfig& config_; // Path to cache information file that is used to speed up artifact checking. const std::string cache_info_filename_; // List of boot classpath components that should be compiled. std::vector boot_classpath_compilable_jars_; // Set of system_server components in SYSTEMSERVERCLASSPATH that should be compiled. std::unordered_set systemserver_classpath_jars_; // List of all boot classpath components. Used as the dependencies for compiling the // system_server. std::vector boot_classpath_jars_; // List of all system_server components, including those in SYSTEMSERVERCLASSPATH and those in // STANDALONE_SYSTEMSERVER_JARS (jars that system_server loads dynamically using separate // classloaders). std::vector all_systemserver_jars_; const time_t start_time_; std::unique_ptr exec_utils_; DISALLOW_COPY_AND_ASSIGN(OnDeviceRefresh); }; } // namespace odrefresh } // namespace art #endif // ART_ODREFRESH_ODREFRESH_H_