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