From e90db937c008f365f47e7199d6d86f9eb13bed1e Mon Sep 17 00:00:00 2001 From: Ajay Panicker Date: Tue, 8 Mar 2016 19:54:18 -0800 Subject: [PATCH] Add scan results to scan stats Ex: GATT Client Map Entries: 1 no.nordicsemi.android.mcp LE scans (started/stopped) : 3 / 3 Scan time in ms (min/max/avg/total): 3050 / 6901 / 4815 / 14447 Total number of results : 338 Last 3 scans : 1970/01/01 08:20:06 - 6901ms 0 results 1970/01/01 08:20:13 - 4496ms 171 results 1970/01/01 08:20:39 - 3050ms 167 results Bug: 27294154 Change-Id: I32fd6da035f2c37302a105733ac6a9817547b7a3 --- src/com/android/bluetooth/gatt/AppScanStats.java | 25 ++++++++++++--- src/com/android/bluetooth/gatt/ContextMap.java | 39 +++++++----------------- src/com/android/bluetooth/gatt/GattService.java | 33 ++++++++++++++++++-- 3 files changed, 63 insertions(+), 34 deletions(-) diff --git a/src/com/android/bluetooth/gatt/AppScanStats.java b/src/com/android/bluetooth/gatt/AppScanStats.java index a65e8030..a6257f44 100644 --- a/src/com/android/bluetooth/gatt/AppScanStats.java +++ b/src/com/android/bluetooth/gatt/AppScanStats.java @@ -35,11 +35,15 @@ import com.android.bluetooth.btservice.BluetoothProto; /* ContextMap here is needed to grab Apps and Connections */ ContextMap contextMap; + /* GattService is needed to add scan event protos to be dumped later */ + GattService gattService; + class LastScan { long duration; long timestamp; boolean opportunistic; boolean background; + int results; public LastScan(long timestamp, long duration, boolean opportunistic, boolean background) { @@ -47,6 +51,7 @@ import com.android.bluetooth.btservice.BluetoothProto; this.timestamp = timestamp; this.opportunistic = opportunistic; this.background = background; + this.results = 0; } } @@ -63,10 +68,19 @@ import com.android.bluetooth.btservice.BluetoothProto; List lastScans = new ArrayList(NUM_SCAN_DURATIONS_KEPT + 1); long startTime = 0; long stopTime = 0; + int results = 0; - public AppScanStats(String name, ContextMap map) { + public AppScanStats(String name, ContextMap map, GattService service) { appName = name; contextMap = map; + gattService = service; + } + + synchronized void addResult() { + if (!lastScans.isEmpty()) + lastScans.get(lastScans.size() - 1).results++; + + results++; } synchronized void recordScanStart(ScanSettings settings) { @@ -89,7 +103,7 @@ import com.android.bluetooth.btservice.BluetoothProto; scanEvent.setScanTechnologyType(BluetoothProto.ScanEvent.SCAN_TECH_TYPE_LE); scanEvent.setInitiator(appName); scanEvent.setEventTimeMillis(System.currentTimeMillis()); - contextMap.addScanEvent(scanEvent); + gattService.addScanEvent(scanEvent); } synchronized void recordScanStop() { @@ -117,7 +131,7 @@ import com.android.bluetooth.btservice.BluetoothProto; scanEvent.setScanTechnologyType(BluetoothProto.ScanEvent.SCAN_TECH_TYPE_LE); scanEvent.setInitiator(appName); scanEvent.setEventTimeMillis(System.currentTimeMillis()); - contextMap.addScanEvent(scanEvent); + gattService.addScanEvent(scanEvent); } synchronized void dumpToString(StringBuilder sb) { @@ -159,6 +173,8 @@ import com.android.bluetooth.btservice.BluetoothProto; maxScan + " / " + avgScan + " / " + totalScanTime + "\n"); + sb.append(" Total number of results : " + + results + "\n"); if (lastScans.size() != 0) { int lastScansSize = scansStopped < NUM_SCAN_DURATIONS_KEPT ? @@ -172,7 +188,8 @@ import com.android.bluetooth.btservice.BluetoothProto; sb.append(" " + dateFormat.format(timestamp) + " - "); sb.append(scan.duration + "ms "); if (scan.opportunistic) sb.append("Opp "); - if (scan.background) sb.append("Back"); + if (scan.background) sb.append("Back "); + sb.append(scan.results + " results"); sb.append("\n"); } } diff --git a/src/com/android/bluetooth/gatt/ContextMap.java b/src/com/android/bluetooth/gatt/ContextMap.java index 41b34e3e..6f9025d6 100644 --- a/src/com/android/bluetooth/gatt/ContextMap.java +++ b/src/com/android/bluetooth/gatt/ContextMap.java @@ -40,7 +40,6 @@ import com.android.bluetooth.btservice.BluetoothProto; */ /*package*/ class ContextMap { private static final String TAG = GattServiceConfig.TAG_PREFIX + "ContextMap"; - static final int NUM_SCAN_EVENTS_KEPT = 20; /** * Connection class helps map connection IDs to device addresses. @@ -72,6 +71,9 @@ import com.android.bluetooth.btservice.BluetoothProto; /** The package name of the application */ String name; + /** Statistics for this app */ + AppScanStats appScanStats; + /** Application callbacks */ T callback; @@ -87,10 +89,11 @@ import com.android.bluetooth.btservice.BluetoothProto; /** * Creates a new app context. */ - App(UUID uuid, T callback, String name) { + App(UUID uuid, T callback, String name, AppScanStats appScanStats) { this.uuid = uuid; this.callback = callback; this.name = name; + this.appScanStats = appScanStats; } /** @@ -136,28 +139,24 @@ import com.android.bluetooth.btservice.BluetoothProto; /** Internal map to keep track of logging information by app name */ HashMap mAppScanStats = new HashMap(); - /** Internal list of scan events to use with the proto */ - ArrayList mScanEvents = - new ArrayList(NUM_SCAN_EVENTS_KEPT); - /** Internal list of connected devices **/ Set mConnections = new HashSet(); /** * Add an entry to the application context list. */ - void add(UUID uuid, T callback, Context context) { - String appName = context.getPackageManager().getNameForUid( + void add(UUID uuid, T callback, GattService service) { + String appName = service.getPackageManager().getNameForUid( Binder.getCallingUid()); if (appName == null) { // Assign an app name if one isn't found appName = "Unknown App (UID: " + Binder.getCallingUid() + ")"; } synchronized (mApps) { - mApps.add(new App(uuid, callback, appName)); AppScanStats appScanStats = mAppScanStats.get(appName); + mApps.add(new App(uuid, callback, appName, appScanStats)); if (appScanStats == null) { - appScanStats = new AppScanStats(appName, this); + appScanStats = new AppScanStats(appName, this, service); mAppScanStats.put(appName, appScanStats); } appScanStats.isRegistered = true; @@ -174,7 +173,7 @@ import com.android.bluetooth.btservice.BluetoothProto; App entry = i.next(); if (entry.uuid.equals(uuid)) { entry.unlinkToDeath(); - mAppScanStats.get(entry.name).isRegistered = false; + entry.appScanStats.isRegistered = false; i.remove(); break; } @@ -273,7 +272,7 @@ import com.android.bluetooth.btservice.BluetoothProto; AppScanStats getAppScanStatsById(int id) { App temp = getById(id); if (temp != null) { - return mAppScanStats.get(temp.name); + return temp.appScanStats; } return null; } @@ -380,14 +379,6 @@ import com.android.bluetooth.btservice.BluetoothProto; return connectedmap; } - void addScanEvent(BluetoothProto.ScanEvent event) { - synchronized(mScanEvents) { - if (mScanEvents.size() == NUM_SCAN_EVENTS_KEPT) - mScanEvents.remove(0); - mScanEvents.add(event); - } - } - /** * Logs debug information. */ @@ -403,12 +394,4 @@ import com.android.bluetooth.btservice.BluetoothProto; appScanStats.dumpToString(sb); } } - - void dumpProto(BluetoothProto.BluetoothLog proto) { - synchronized(mScanEvents) { - for (BluetoothProto.ScanEvent event : mScanEvents) { - proto.addScanEvent(event); - } - } - } } diff --git a/src/com/android/bluetooth/gatt/GattService.java b/src/com/android/bluetooth/gatt/GattService.java index 60d5e3fd..7aea6ec5 100644 --- a/src/com/android/bluetooth/gatt/GattService.java +++ b/src/com/android/bluetooth/gatt/GattService.java @@ -128,6 +128,13 @@ public class GattService extends ProfileService { private Map> gattClientDatabases = new HashMap>(); + static final int NUM_SCAN_EVENTS_KEPT = 20; + /** + * Internal list of scan events to use with the proto + */ + ArrayList mScanEvents = + new ArrayList(NUM_SCAN_EVENTS_KEPT); + private ServiceDeclaration addDeclaration() { synchronized (mServiceDeclarations) { mServiceDeclarations.add(new ServiceDeclaration()); @@ -592,6 +599,8 @@ public class GattService extends ProfileService { if (VDBG) Log.d(TAG, "onScanResult() - address=" + address + ", rssi=" + rssi); List remoteUuids = parseUuids(adv_data); + addScanResult(); + for (ScanClient client : mScanManager.getRegularScanQueue()) { if (client.uuids.length > 0) { int matches = 0; @@ -621,6 +630,7 @@ public class GattService extends ProfileService { ScanSettings settings = client.settings; if ((settings.getCallbackType() & ScanSettings.CALLBACK_TYPE_ALL_MATCHES) != 0) { + app.appScanStats.addResult(); app.callback.onScanResult(result); } } catch (RemoteException e) { @@ -2228,10 +2238,29 @@ public class GattService extends ProfileService { mHandleMap.dump(sb); } + void addScanResult() { + if (mScanEvents.isEmpty()) + return; + + BluetoothProto.ScanEvent curr = mScanEvents.get(mScanEvents.size() - 1); + curr.setNumberResults(curr.getNumberResults() + 1); + } + + void addScanEvent(BluetoothProto.ScanEvent event) { + synchronized(mScanEvents) { + if (mScanEvents.size() == NUM_SCAN_EVENTS_KEPT) + mScanEvents.remove(0); + mScanEvents.add(event); + } + } + @Override public void dumpProto(BluetoothProto.BluetoothLog proto) { - mClientMap.dumpProto(proto); - mServerMap.dumpProto(proto); + synchronized(mScanEvents) { + for (BluetoothProto.ScanEvent event : mScanEvents) { + proto.addScanEvent(event); + } + } } /************************************************************************** -- 2.11.0