blob: 72d2761826e794e8234aaba40acdaec22c2c25a7 [file] [log] [blame]
// Copyright (C) 2022 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Begin Websocket ////////////////////////////////////////////////////////
export const WEBSOCKET_UNABLE_TO_CONNECT =
'Unable to connect to device via websocket.';
// https://www.rfc-editor.org/rfc/rfc6455#section-7.4.1
export const WEBSOCKET_CLOSED_ABNORMALLY_CODE = 1006;
// The messages read by the adb server have their length prepended in hex.
// This method adds the length at the beginning of the message.
// Example: 'host:track-devices' -> '0012host:track-devices'
// go/codesearch/aosp-android11/system/core/adb/SERVICES.TXT
export function buildAbdWebsocketCommand(cmd: string) {
const hdr = cmd.length.toString(16).padStart(4, '0');
return hdr + cmd;
}
// Sample user agent for Chrome on Mac OS:
// 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36
// (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36'
export function isMacOs(userAgent: string) {
return userAgent.toLowerCase().includes(' mac os ');
}
// Sample user agent for Chrome on Linux:
// Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko)
// Chrome/105.0.0.0 Safari/537.36
export function isLinux(userAgent: string) {
return userAgent.toLowerCase().includes(' linux ');
}
// Sample user agent for Chrome on Chrome OS:
// "Mozilla/5.0 (X11; CrOS x86_64 14816.99.0) AppleWebKit/537.36
// (KHTML, like Gecko) Chrome/103.0.5060.114 Safari/537.36"
// This condition is wider, in the unlikely possibility of different casing,
export function isCrOS(userAgent: string) {
return userAgent.toLowerCase().includes(' cros ');
}
// End Websocket //////////////////////////////////////////////////////////
// Begin Adb //////////////////////////////////////////////////////////////
export const BINARY_PUSH_FAILURE = 'BinaryPushFailure';
export const BINARY_PUSH_UNKNOWN_RESPONSE = 'BinaryPushUnknownResponse';
// In case the device doesn't have the tracebox, we upload the latest version
// to this path.
export const TRACEBOX_DEVICE_PATH = '/data/local/tmp/tracebox';
// Experimentally, this takes 900ms on the first fetch and 20-30ms after
// because of caching.
export const TRACEBOX_FETCH_TIMEOUT = 30000;
// Message shown to the user when they need to allow authentication on the
// device in order to connect.
export const ALLOW_USB_DEBUGGING =
'Please allow USB debugging on device and try again.';
// If the Android device has the tracing service on it (from API version 29),
// then we can connect to this consumer socket.
export const DEFAULT_TRACED_CONSUMER_SOCKET_PATH =
'localfilesystem:/dev/socket/traced_consumer';
// If the Android device does not have the tracing service on it (before API
// version 29), we will have to push the tracebox on the device. Then, we
// can connect to this consumer socket (using it does not require system admin
// privileges).
export const CUSTOM_TRACED_CONSUMER_SOCKET_PATH =
'localabstract:traced_consumer';
// End Adb /////////////////////////////////////////////////////////////////
// Begin Webusb ///////////////////////////////////////////////////////////
export const NO_DEVICE_SELECTED = 'No device selected.';
export interface UsbInterfaceAndEndpoint {
readonly configurationValue: number;
readonly usbInterfaceNumber: number;
readonly endpoints: USBEndpoint[];
}
export const ADB_DEVICE_FILTER = {
classCode: 255, // USB vendor specific code
subclassCode: 66, // Android vendor specific subclass
protocolCode: 1, // Adb protocol
};
export function findInterfaceAndEndpoint(device: USBDevice):
UsbInterfaceAndEndpoint|undefined {
const adbDeviceFilter = ADB_DEVICE_FILTER;
for (const config of device.configurations) {
for (const interface_ of config.interfaces) {
for (const alt of interface_.alternates) {
if (alt.interfaceClass === adbDeviceFilter.classCode &&
alt.interfaceSubclass === adbDeviceFilter.subclassCode &&
alt.interfaceProtocol === adbDeviceFilter.protocolCode) {
return {
configurationValue: config.configurationValue,
usbInterfaceNumber: interface_.interfaceNumber,
endpoints: alt.endpoints,
};
} // if (alternate)
} // for (interface.alternates)
} // for (configuration.interfaces)
} // for (configurations)
return undefined;
}
// End Webusb //////////////////////////////////////////////////////////////
// Begin Chrome ///////////////////////////////////////////////////////////
export const EXTENSION_ID = 'lfmkphfpdbjijhpomgecfikhfohaoine';
export const EXTENSION_URL =
`https://chrome.google.com/webstore/detail/perfetto-ui/${EXTENSION_ID}`;
export const EXTENSION_NAME = 'Chrome extension';
export const EXTENSION_NOT_INSTALLED =
`To trace Chrome from the Perfetto UI, you need to install our
${EXTENSION_URL} and then reload this page.`;
export const MALFORMED_EXTENSION_MESSAGE = 'Malformed extension message.';
export const BUFFER_USAGE_NOT_ACCESSIBLE = 'Buffer usage not accessible';
export const BUFFER_USAGE_INCORRECT_FORMAT =
'The buffer usage data has am incorrect format';
// End Chrome /////////////////////////////////////////////////////////////
// Begin Traced //////////////////////////////////////////////////////////
export const RECORDING_IN_PROGRESS = 'Recording in progress';
export const PARSING_UNKNWON_REQUEST_ID = 'Unknown request id';
export const PARSING_UNABLE_TO_DECODE_METHOD = 'Unable to decode method';
export const PARSING_UNRECOGNIZED_PORT = 'Unrecognized consumer port response';
export const PARSING_UNRECOGNIZED_MESSAGE = 'Unrecognized frame message';
// End Traced ///////////////////////////////////////////////////////////