1 #ifndef COM_ANDROID_ART_H 2 #define COM_ANDROID_ART_H 3 4 #include <array> 5 #include <map> 6 #include <optional> 7 #include <string> 8 #include <vector> 9 #include <sstream> 10 #include <iostream> 11 12 #if __has_include(<tinyxml2.h>) 13 #include <tinyxml2.h> 14 #else 15 #error Require libtinyxml2 library. Please add libtinyxml2 to shared_libs or static_libs 16 #endif 17 18 #include "com_android_art_enums.h" 19 20 namespace com { 21 namespace android { 22 namespace art { 23 class KeyValuePairList; 24 class KeyValuePair; 25 class ModuleInfoList; 26 class ModuleInfo; 27 class Classpath; 28 class Component; 29 class SystemServerComponents; 30 class SystemServerComponent; 31 class CacheInfo; 32 std::optional<CacheInfo> read(const char* configFile); 33 34 std::optional<CacheInfo> parse(const char* xml); 35 36 void write(std::ostream& _out, const CacheInfo& cacheInfo); 37 38 class KeyValuePairList { 39 private: 40 const std::vector<KeyValuePair> item_; 41 public: 42 explicit KeyValuePairList(std::vector<KeyValuePair> item); 43 const std::vector<KeyValuePair>& getItem() const; 44 bool hasItem() const; 45 const KeyValuePair* getFirstItem() const; 46 static KeyValuePairList read(tinyxml2::XMLElement *root); 47 void write(std::ostream& _out, const std::string& _name) const; 48 }; 49 50 class KeyValuePair { 51 private: 52 const std::string k_; 53 const std::string v_; 54 public: 55 KeyValuePair(std::string k, std::string v); 56 const std::string& getK() const; 57 bool hasK() const; 58 const std::string& getV() const; 59 bool hasV() const; 60 static KeyValuePair read(tinyxml2::XMLElement *root); 61 void write(std::ostream& _out, const std::string& _name) const; 62 }; 63 64 class ModuleInfoList { 65 private: 66 const std::vector<ModuleInfo> moduleInfo_; 67 public: 68 explicit ModuleInfoList(std::vector<ModuleInfo> moduleInfo); 69 const std::vector<ModuleInfo>& getModuleInfo() const; 70 bool hasModuleInfo() const; 71 const ModuleInfo* getFirstModuleInfo() const; 72 static ModuleInfoList read(tinyxml2::XMLElement *root); 73 void write(std::ostream& _out, const std::string& _name) const; 74 }; 75 76 class ModuleInfo { 77 private: 78 const std::string name_; 79 const int64_t versionCode_; 80 const std::string versionName_; 81 const int64_t lastUpdateMillis_; 82 public: 83 ModuleInfo(std::string name, int64_t versionCode, std::string versionName, int64_t lastUpdateMillis); 84 const std::string& getName() const; 85 bool hasName() const; 86 const int64_t& getVersionCode() const; 87 bool hasVersionCode() const; 88 const std::string& getVersionName() const; 89 bool hasVersionName() const; 90 const int64_t& getLastUpdateMillis() const; 91 bool hasLastUpdateMillis() const; 92 static ModuleInfo read(tinyxml2::XMLElement *root); 93 void write(std::ostream& _out, const std::string& _name) const; 94 }; 95 96 class Classpath { 97 private: 98 const std::vector<Component> component_; 99 public: 100 explicit Classpath(std::vector<Component> component); 101 const std::vector<Component>& getComponent() const; 102 bool hasComponent() const; 103 const Component* getFirstComponent() const; 104 static Classpath read(tinyxml2::XMLElement *root); 105 void write(std::ostream& _out, const std::string& _name) const; 106 }; 107 108 class Component { 109 private: 110 const std::string file_; 111 const uint64_t size_; 112 const std::string checksums_; 113 public: 114 Component(std::string file, uint64_t size, std::string checksums); 115 const std::string& getFile() const; 116 bool hasFile() const; 117 const uint64_t& getSize() const; 118 bool hasSize() const; 119 const std::string& getChecksums() const; 120 bool hasChecksums() const; 121 static Component read(tinyxml2::XMLElement *root); 122 void write(std::ostream& _out, const std::string& _name) const; 123 }; 124 125 class SystemServerComponents { 126 private: 127 const std::vector<SystemServerComponent> component_; 128 public: 129 explicit SystemServerComponents(std::vector<SystemServerComponent> component); 130 const std::vector<SystemServerComponent>& getComponent() const; 131 bool hasComponent() const; 132 const SystemServerComponent* getFirstComponent() const; 133 static SystemServerComponents read(tinyxml2::XMLElement *root); 134 void write(std::ostream& _out, const std::string& _name) const; 135 }; 136 137 class SystemServerComponent : public Component { 138 private: 139 const bool isInClasspath_; 140 public: 141 SystemServerComponent(std::string file, uint64_t size, std::string checksums, bool isInClasspath); 142 const bool& getIsInClasspath() const; 143 bool hasIsInClasspath() const; 144 static SystemServerComponent read(tinyxml2::XMLElement *root); 145 void write(std::ostream& _out, const std::string& _name) const; 146 }; 147 148 class CacheInfo { 149 private: 150 const std::vector<KeyValuePairList> systemProperties_; 151 const std::vector<ModuleInfo> artModuleInfo_; 152 const std::vector<ModuleInfoList> moduleInfoList_; 153 const std::vector<Classpath> bootClasspath_; 154 const std::vector<Classpath> dex2oatBootClasspath_; 155 const std::vector<SystemServerComponents> systemServerComponents_; 156 const std::optional<bool> compilationOsMode_; 157 public: 158 CacheInfo(std::vector<KeyValuePairList> systemProperties, std::vector<ModuleInfo> artModuleInfo, std::vector<ModuleInfoList> moduleInfoList, std::vector<Classpath> bootClasspath, std::vector<Classpath> dex2oatBootClasspath, std::vector<SystemServerComponents> systemServerComponents, std::optional<bool> compilationOsMode); 159 const std::vector<KeyValuePairList>& getSystemProperties() const; 160 bool hasSystemProperties() const; 161 const KeyValuePairList* getFirstSystemProperties() const; 162 const std::vector<ModuleInfo>& getArtModuleInfo() const; 163 bool hasArtModuleInfo() const; 164 const ModuleInfo* getFirstArtModuleInfo() const; 165 const std::vector<ModuleInfoList>& getModuleInfoList() const; 166 bool hasModuleInfoList() const; 167 const ModuleInfoList* getFirstModuleInfoList() const; 168 const std::vector<Classpath>& getBootClasspath() const; 169 bool hasBootClasspath() const; 170 const Classpath* getFirstBootClasspath() const; 171 const std::vector<Classpath>& getDex2oatBootClasspath() const; 172 bool hasDex2oatBootClasspath() const; 173 const Classpath* getFirstDex2oatBootClasspath() const; 174 const std::vector<SystemServerComponents>& getSystemServerComponents() const; 175 bool hasSystemServerComponents() const; 176 const SystemServerComponents* getFirstSystemServerComponents() const; 177 const bool& getCompilationOsMode() const; 178 bool hasCompilationOsMode() const; 179 static CacheInfo read(tinyxml2::XMLElement *root); 180 void write(std::ostream& _out, const std::string& _name) const; 181 }; 182 183 } // art 184 } // android 185 } // com 186 #endif // COM_ANDROID_ART_H 187