xref: /aosp_15_r20/art/runtime/app_info.cc (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2021 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker #include <app_info.h>
18*795d594fSAndroid Build Coastguard Worker 
19*795d594fSAndroid Build Coastguard Worker #include "base/logging.h"
20*795d594fSAndroid Build Coastguard Worker #include "base/mutex.h"
21*795d594fSAndroid Build Coastguard Worker #include "base/safe_map.h"
22*795d594fSAndroid Build Coastguard Worker #include "thread-inl.h"
23*795d594fSAndroid Build Coastguard Worker 
24*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN {
25*795d594fSAndroid Build Coastguard Worker 
26*795d594fSAndroid Build Coastguard Worker static constexpr const char* kUnknownValue = "unknown";
27*795d594fSAndroid Build Coastguard Worker 
AppInfo()28*795d594fSAndroid Build Coastguard Worker AppInfo::AppInfo()
29*795d594fSAndroid Build Coastguard Worker     : update_mutex_("app_info_update_mutex", LockLevel::kGenericBottomLock) {}
30*795d594fSAndroid Build Coastguard Worker 
31*795d594fSAndroid Build Coastguard Worker // Converts VMRuntime.java constants to a CodeType.
FromVMRuntimeConstants(uint32_t code_type)32*795d594fSAndroid Build Coastguard Worker AppInfo::CodeType AppInfo::FromVMRuntimeConstants(uint32_t code_type) {
33*795d594fSAndroid Build Coastguard Worker   switch (code_type) {
34*795d594fSAndroid Build Coastguard Worker     case kVMRuntimePrimaryApk : return CodeType::kPrimaryApk;
35*795d594fSAndroid Build Coastguard Worker     case kVMRuntimeSplitApk : return CodeType::kSplitApk;
36*795d594fSAndroid Build Coastguard Worker     case kVMRuntimeSecondaryDex : return CodeType::kSecondaryDex;
37*795d594fSAndroid Build Coastguard Worker     default:
38*795d594fSAndroid Build Coastguard Worker       LOG(WARNING) << "Unknown code type: " << code_type;
39*795d594fSAndroid Build Coastguard Worker       return CodeType::kUnknown;
40*795d594fSAndroid Build Coastguard Worker   }
41*795d594fSAndroid Build Coastguard Worker }
42*795d594fSAndroid Build Coastguard Worker 
CodeTypeName(AppInfo::CodeType code_type)43*795d594fSAndroid Build Coastguard Worker static const char* CodeTypeName(AppInfo::CodeType code_type) {
44*795d594fSAndroid Build Coastguard Worker   switch (code_type) {
45*795d594fSAndroid Build Coastguard Worker     case AppInfo::CodeType::kPrimaryApk : return "primary-apk";
46*795d594fSAndroid Build Coastguard Worker     case AppInfo::CodeType::kSplitApk : return "split-apk";
47*795d594fSAndroid Build Coastguard Worker     case AppInfo::CodeType::kSecondaryDex : return "secondary-dex";
48*795d594fSAndroid Build Coastguard Worker     case AppInfo::CodeType::kUnknown : return "unknown";
49*795d594fSAndroid Build Coastguard Worker   }
50*795d594fSAndroid Build Coastguard Worker }
51*795d594fSAndroid Build Coastguard Worker 
RegisterAppInfo(const std::string & package_name,const std::vector<std::string> & code_paths,const std::string & cur_profile_path,const std::string & ref_profile_path,AppInfo::CodeType code_type)52*795d594fSAndroid Build Coastguard Worker void AppInfo::RegisterAppInfo(const std::string& package_name,
53*795d594fSAndroid Build Coastguard Worker                               const std::vector<std::string>& code_paths,
54*795d594fSAndroid Build Coastguard Worker                               const std::string& cur_profile_path,
55*795d594fSAndroid Build Coastguard Worker                               const std::string& ref_profile_path,
56*795d594fSAndroid Build Coastguard Worker                               AppInfo::CodeType code_type) {
57*795d594fSAndroid Build Coastguard Worker   MutexLock mu(Thread::Current(), update_mutex_);
58*795d594fSAndroid Build Coastguard Worker 
59*795d594fSAndroid Build Coastguard Worker   package_name_ = package_name;
60*795d594fSAndroid Build Coastguard Worker 
61*795d594fSAndroid Build Coastguard Worker   for (const std::string& code_path : code_paths) {
62*795d594fSAndroid Build Coastguard Worker     CodeLocationInfo& cli = registered_code_locations_.GetOrCreate(
63*795d594fSAndroid Build Coastguard Worker         code_path, []() { return CodeLocationInfo(); });
64*795d594fSAndroid Build Coastguard Worker     cli.cur_profile_path = cur_profile_path;
65*795d594fSAndroid Build Coastguard Worker     cli.ref_profile_path = ref_profile_path;
66*795d594fSAndroid Build Coastguard Worker     cli.code_type = code_type;
67*795d594fSAndroid Build Coastguard Worker 
68*795d594fSAndroid Build Coastguard Worker     VLOG(startup) << "Registering code path. "
69*795d594fSAndroid Build Coastguard Worker         << "\npackage_name=" << package_name
70*795d594fSAndroid Build Coastguard Worker         << "\ncode_path=" << code_path
71*795d594fSAndroid Build Coastguard Worker         << "\ncode_type=" << CodeTypeName(code_type)
72*795d594fSAndroid Build Coastguard Worker         << "\ncur_profile=" << cur_profile_path
73*795d594fSAndroid Build Coastguard Worker         << "\nref_profile=" << ref_profile_path;
74*795d594fSAndroid Build Coastguard Worker   }
75*795d594fSAndroid Build Coastguard Worker }
76*795d594fSAndroid Build Coastguard Worker 
RegisterOdexStatus(const std::string & code_path,const std::string & compiler_filter,const std::string & compilation_reason,const std::string & odex_status)77*795d594fSAndroid Build Coastguard Worker void AppInfo::RegisterOdexStatus(const std::string& code_path,
78*795d594fSAndroid Build Coastguard Worker                                  const std::string& compiler_filter,
79*795d594fSAndroid Build Coastguard Worker                                  const std::string& compilation_reason,
80*795d594fSAndroid Build Coastguard Worker                                  const std::string& odex_status) {
81*795d594fSAndroid Build Coastguard Worker   MutexLock mu(Thread::Current(), update_mutex_);
82*795d594fSAndroid Build Coastguard Worker 
83*795d594fSAndroid Build Coastguard Worker   CodeLocationInfo& cli = registered_code_locations_.GetOrCreate(
84*795d594fSAndroid Build Coastguard Worker       code_path, []() { return CodeLocationInfo(); });
85*795d594fSAndroid Build Coastguard Worker   cli.compiler_filter = compiler_filter;
86*795d594fSAndroid Build Coastguard Worker   cli.compilation_reason = compilation_reason;
87*795d594fSAndroid Build Coastguard Worker   cli.odex_status = odex_status;
88*795d594fSAndroid Build Coastguard Worker 
89*795d594fSAndroid Build Coastguard Worker   VLOG(startup) << "Registering odex status. "
90*795d594fSAndroid Build Coastguard Worker         << "\ncode_path=" << code_path
91*795d594fSAndroid Build Coastguard Worker         << "\ncompiler_filter=" << compiler_filter
92*795d594fSAndroid Build Coastguard Worker         << "\ncompilation_reason=" << compilation_reason
93*795d594fSAndroid Build Coastguard Worker         << "\nodex_status=" << odex_status;
94*795d594fSAndroid Build Coastguard Worker }
95*795d594fSAndroid Build Coastguard Worker 
HasRegisteredAppInfo()96*795d594fSAndroid Build Coastguard Worker bool AppInfo::HasRegisteredAppInfo() {
97*795d594fSAndroid Build Coastguard Worker   MutexLock mu(Thread::Current(), update_mutex_);
98*795d594fSAndroid Build Coastguard Worker 
99*795d594fSAndroid Build Coastguard Worker   return package_name_.has_value();
100*795d594fSAndroid Build Coastguard Worker }
101*795d594fSAndroid Build Coastguard Worker 
GetPrimaryApkOptimizationStatus(std::string * out_compiler_filter,std::string * out_compilation_reason)102*795d594fSAndroid Build Coastguard Worker void AppInfo::GetPrimaryApkOptimizationStatus(
103*795d594fSAndroid Build Coastguard Worker     std::string* out_compiler_filter,
104*795d594fSAndroid Build Coastguard Worker     std::string* out_compilation_reason) {
105*795d594fSAndroid Build Coastguard Worker   MutexLock mu(Thread::Current(), update_mutex_);
106*795d594fSAndroid Build Coastguard Worker 
107*795d594fSAndroid Build Coastguard Worker   for (const auto& it : registered_code_locations_) {
108*795d594fSAndroid Build Coastguard Worker     const CodeLocationInfo& cli = it.second;
109*795d594fSAndroid Build Coastguard Worker     if (cli.code_type == CodeType::kPrimaryApk) {
110*795d594fSAndroid Build Coastguard Worker       *out_compiler_filter = cli.compiler_filter.value_or(kUnknownValue);
111*795d594fSAndroid Build Coastguard Worker       *out_compilation_reason = cli.compilation_reason.value_or(kUnknownValue);
112*795d594fSAndroid Build Coastguard Worker       return;
113*795d594fSAndroid Build Coastguard Worker     }
114*795d594fSAndroid Build Coastguard Worker   }
115*795d594fSAndroid Build Coastguard Worker   *out_compiler_filter = kUnknownValue;
116*795d594fSAndroid Build Coastguard Worker   *out_compilation_reason = kUnknownValue;
117*795d594fSAndroid Build Coastguard Worker }
118*795d594fSAndroid Build Coastguard Worker 
GetRegisteredCodeType(const std::string & code_path)119*795d594fSAndroid Build Coastguard Worker AppInfo::CodeType AppInfo::GetRegisteredCodeType(const std::string& code_path) {
120*795d594fSAndroid Build Coastguard Worker   MutexLock mu(Thread::Current(), update_mutex_);
121*795d594fSAndroid Build Coastguard Worker 
122*795d594fSAndroid Build Coastguard Worker   const auto it = registered_code_locations_.find(code_path);
123*795d594fSAndroid Build Coastguard Worker   return it != registered_code_locations_.end() ? it->second.code_type : CodeType::kUnknown;
124*795d594fSAndroid Build Coastguard Worker }
125*795d594fSAndroid Build Coastguard Worker 
operator <<(std::ostream & os,AppInfo & rhs)126*795d594fSAndroid Build Coastguard Worker std::ostream& operator<<(std::ostream& os, AppInfo& rhs) {
127*795d594fSAndroid Build Coastguard Worker   MutexLock mu(Thread::Current(), rhs.update_mutex_);
128*795d594fSAndroid Build Coastguard Worker 
129*795d594fSAndroid Build Coastguard Worker   os << "AppInfo for package_name=" << rhs.package_name_.value_or(kUnknownValue) << "\n";
130*795d594fSAndroid Build Coastguard Worker   for (const auto& it : rhs.registered_code_locations_) {
131*795d594fSAndroid Build Coastguard Worker     const std::string code_path = it.first;
132*795d594fSAndroid Build Coastguard Worker     const AppInfo::CodeLocationInfo& cli = it.second;
133*795d594fSAndroid Build Coastguard Worker 
134*795d594fSAndroid Build Coastguard Worker     os << "\ncode_path=" << code_path
135*795d594fSAndroid Build Coastguard Worker         << "\ncode_type=" << CodeTypeName(cli.code_type)
136*795d594fSAndroid Build Coastguard Worker         << "\ncompiler_filter=" << cli.compiler_filter.value_or(kUnknownValue)
137*795d594fSAndroid Build Coastguard Worker         << "\ncompilation_reason=" << cli.compilation_reason.value_or(kUnknownValue)
138*795d594fSAndroid Build Coastguard Worker         << "\nodex_status=" << cli.odex_status.value_or(kUnknownValue)
139*795d594fSAndroid Build Coastguard Worker         << "\ncur_profile=" << cli.cur_profile_path.value_or(kUnknownValue)
140*795d594fSAndroid Build Coastguard Worker         << "\nref_profile=" << cli.ref_profile_path.value_or(kUnknownValue)
141*795d594fSAndroid Build Coastguard Worker         << "\n";
142*795d594fSAndroid Build Coastguard Worker   }
143*795d594fSAndroid Build Coastguard Worker   return os;
144*795d594fSAndroid Build Coastguard Worker }
145*795d594fSAndroid Build Coastguard Worker 
GetPrimaryApkReferenceProfile()146*795d594fSAndroid Build Coastguard Worker std::string AppInfo::GetPrimaryApkReferenceProfile() {
147*795d594fSAndroid Build Coastguard Worker   MutexLock mu(Thread::Current(), update_mutex_);
148*795d594fSAndroid Build Coastguard Worker 
149*795d594fSAndroid Build Coastguard Worker   for (const auto& it : registered_code_locations_) {
150*795d594fSAndroid Build Coastguard Worker     const CodeLocationInfo& cli = it.second;
151*795d594fSAndroid Build Coastguard Worker     if (cli.code_type == CodeType::kPrimaryApk) {
152*795d594fSAndroid Build Coastguard Worker       return cli.ref_profile_path.value_or("");
153*795d594fSAndroid Build Coastguard Worker     }
154*795d594fSAndroid Build Coastguard Worker   }
155*795d594fSAndroid Build Coastguard Worker   return "";
156*795d594fSAndroid Build Coastguard Worker }
157*795d594fSAndroid Build Coastguard Worker 
GetPrimaryApkPath()158*795d594fSAndroid Build Coastguard Worker std::string AppInfo::GetPrimaryApkPath() {
159*795d594fSAndroid Build Coastguard Worker   MutexLock mu(Thread::Current(), update_mutex_);
160*795d594fSAndroid Build Coastguard Worker 
161*795d594fSAndroid Build Coastguard Worker   for (const auto& it : registered_code_locations_) {
162*795d594fSAndroid Build Coastguard Worker     const CodeLocationInfo& cli = it.second;
163*795d594fSAndroid Build Coastguard Worker     if (cli.code_type == CodeType::kPrimaryApk) {
164*795d594fSAndroid Build Coastguard Worker       return it.first;
165*795d594fSAndroid Build Coastguard Worker     }
166*795d594fSAndroid Build Coastguard Worker   }
167*795d594fSAndroid Build Coastguard Worker   return kUnknownValue;
168*795d594fSAndroid Build Coastguard Worker }
169*795d594fSAndroid Build Coastguard Worker 
170*795d594fSAndroid Build Coastguard Worker 
171*795d594fSAndroid Build Coastguard Worker }  // namespace art
172