blob: ce1be6f63e2bcb9b802fae8abee0cb07b47eb6b1 [file] [log] [blame]
Fyodor Kupolovca348512018-01-10 18:05:53 -08001/*
2 * Copyright (C) 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License
15 */
16
17package com.android.server;
18
Fyodor Kupolovcf0fe2d2018-05-22 18:50:04 -070019import android.app.AppGlobals;
20import android.content.pm.PackageInfo;
21import android.content.pm.PackageManager;
Fyodor Kupolovca348512018-01-10 18:05:53 -080022import android.os.Binder;
Fyodor Kupolovcf0fe2d2018-05-22 18:50:04 -070023import android.os.RemoteException;
Fyodor Kupolovca348512018-01-10 18:05:53 -080024import android.os.ServiceManager;
25import android.os.SystemProperties;
Fyodor Kupolovcf0fe2d2018-05-22 18:50:04 -070026import android.os.UserHandle;
Fyodor Kupolovca348512018-01-10 18:05:53 -080027import android.util.Slog;
28
29import com.android.internal.os.BinderCallsStats;
30
31import java.io.FileDescriptor;
32import java.io.PrintWriter;
Fyodor Kupolovcf0fe2d2018-05-22 18:50:04 -070033import java.util.HashMap;
34import java.util.List;
35import java.util.Map;
Fyodor Kupolovca348512018-01-10 18:05:53 -080036
37public class BinderCallsStatsService extends Binder {
38
39 private static final String TAG = "BinderCallsStatsService";
40
Fyodor Kupolov3f3af612018-04-18 17:26:43 -070041 private static final String PERSIST_SYS_BINDER_CALLS_DETAILED_TRACKING
42 = "persist.sys.binder_calls_detailed_tracking";
Fyodor Kupolovca348512018-01-10 18:05:53 -080043
44 public static void start() {
45 BinderCallsStatsService service = new BinderCallsStatsService();
46 ServiceManager.addService("binder_calls_stats", service);
Fyodor Kupolov3f3af612018-04-18 17:26:43 -070047 boolean detailedTrackingEnabled = SystemProperties.getBoolean(
48 PERSIST_SYS_BINDER_CALLS_DETAILED_TRACKING, false);
Fyodor Kupolovca348512018-01-10 18:05:53 -080049
Fyodor Kupolov3f3af612018-04-18 17:26:43 -070050 if (detailedTrackingEnabled) {
Fyodor Kupolovca348512018-01-10 18:05:53 -080051 Slog.i(TAG, "Enabled CPU usage tracking for binder calls. Controlled by "
Fyodor Kupolov3f3af612018-04-18 17:26:43 -070052 + PERSIST_SYS_BINDER_CALLS_DETAILED_TRACKING
53 + " or via dumpsys binder_calls_stats --enable-detailed-tracking");
54 BinderCallsStats.getInstance().setDetailedTracking(true);
Fyodor Kupolovca348512018-01-10 18:05:53 -080055 }
56 }
57
Fyodor Kupolov3f3af612018-04-18 17:26:43 -070058 public static void reset() {
59 Slog.i(TAG, "Resetting stats");
60 BinderCallsStats.getInstance().reset();
61 }
62
Fyodor Kupolovca348512018-01-10 18:05:53 -080063 @Override
64 protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
Fyodor Kupolovcf0fe2d2018-05-22 18:50:04 -070065 boolean verbose = false;
Fyodor Kupolov3f3af612018-04-18 17:26:43 -070066 if (args != null) {
67 for (final String arg : args) {
Fyodor Kupolov32a71122018-04-25 10:41:01 -070068 if ("-a".equals(arg)) {
Fyodor Kupolovcf0fe2d2018-05-22 18:50:04 -070069 verbose = true;
Fyodor Kupolov32a71122018-04-25 10:41:01 -070070 } else if ("--reset".equals(arg)) {
Fyodor Kupolov3f3af612018-04-18 17:26:43 -070071 reset();
72 pw.println("binder_calls_stats reset.");
73 return;
74 } else if ("--enable-detailed-tracking".equals(arg)) {
75 SystemProperties.set(PERSIST_SYS_BINDER_CALLS_DETAILED_TRACKING, "1");
76 BinderCallsStats.getInstance().setDetailedTracking(true);
77 pw.println("Detailed tracking enabled");
78 return;
79 } else if ("--disable-detailed-tracking".equals(arg)) {
80 SystemProperties.set(PERSIST_SYS_BINDER_CALLS_DETAILED_TRACKING, "");
81 BinderCallsStats.getInstance().setDetailedTracking(false);
82 pw.println("Detailed tracking disabled");
83 return;
84 } else if ("-h".equals(arg)) {
85 pw.println("binder_calls_stats commands:");
86 pw.println(" --reset: Reset stats");
87 pw.println(" --enable-detailed-tracking: Enables detailed tracking");
88 pw.println(" --disable-detailed-tracking: Disables detailed tracking");
89 return;
90 } else {
91 pw.println("Unknown option: " + arg);
Fyodor Kupolov3f3af612018-04-18 17:26:43 -070092 }
93 }
94 }
Fyodor Kupolovcf0fe2d2018-05-22 18:50:04 -070095 BinderCallsStats.getInstance().dump(pw, getAppIdToPackagesMap(), verbose);
Fyodor Kupolovca348512018-01-10 18:05:53 -080096 }
Fyodor Kupolovcf0fe2d2018-05-22 18:50:04 -070097
98 private Map<Integer, String> getAppIdToPackagesMap() {
99 List<PackageInfo> packages;
100 try {
101 packages = AppGlobals.getPackageManager()
102 .getInstalledPackages(PackageManager.MATCH_UNINSTALLED_PACKAGES,
103 UserHandle.USER_SYSTEM).getList();
104 } catch (RemoteException e) {
105 throw e.rethrowFromSystemServer();
106 }
107 Map<Integer,String> map = new HashMap<>();
108 for (PackageInfo pkg : packages) {
109 map.put(pkg.applicationInfo.uid, pkg.packageName);
110 }
111 return map;
112 }
113
Fyodor Kupolovca348512018-01-10 18:05:53 -0800114}