Android Performance Profiler

Measure the performance of any Android app, even in production, via a Flipper plugin or directly via CLI.

prod-profiler.mp4

Table of Contents

Getting started with the automated profiler

  1. Install the profiler
yarn add --dev @perf-profiler/e2e
  1. Write a test

For instance, here we’ll be testing the start up performance of the app for 10 iterations:

import { execSync } from "child_process";
import { TestCase, PerformanceTester } from "@perf-profiler/e2e";

const bundleId = "com.reactnativefeed";
const appActivity = `${bundleId}.MainActivity`;

const stopApp = () => execSync(`adb shell am force-stop ${bundleId}`);
const startApp = () =>
  execSync(`adb shell am start ${bundleId}/${appActivity}`);

const startTestCase: TestCase = {
  duration: 15000,
  beforeTest: () => {
    stopApp();
  },
  run: () => {
    startApp();
  },
};

const test = async () => {
  const performanceTester = new PerformanceTester(bundleId);
  await performanceTester.iterate(startTestCase, 10);
  performanceTester.writeResults();
};

test();
  1. Open the JSON file generated in the web profiler:

yarn add --dev @perf-profiler/web-reporter
yarn generate results.json

Flipper Plugin

Install

Search for android-performance-profiler in the Flipper marketplaceimage

CLI

Multiple commands are also available in the standalone package android-performance-profiler.

⚠️ they will be subject to breaking changes

For instance:

import {
  detectCurrentAppBundleId,
  getAverageCpuUsage,
  getPidId,
  Measure,
  pollPerformanceMeasures,
} from "@perf-profiler/profiler";

const bundleId = detectCurrentAppBundleId();
const pid = getPidId(bundleId);

const measures: Measure[] = [];

const polling = pollPerformanceMeasures(pid, (measure) => {
  measures.push(measure);
  console.log(`JS Thread CPU Usage: ${measure.perName["(mqt_js)"]}%`);
});

setTimeout(() => {
  polling.stop();
  const averageCpuUsage = getAverageCpuUsage(measures);
  console.log(`Average CPU Usage: ${averageCpuUsage}%`);
}, 10000);

Contributing

web-reporter

At the root of the repo:

yarn
yarn tsc --build --w

and run in another terminal:

yarn workspace @perf-profiler/web-reporter start

Then in packages/web-reporter/src/App.tsx, uncomment the lines to add your own measures:

// Uncomment with when locally testing
// eslint-disable-next-line @typescript-eslint/no-var-requires
testCaseResults = [
  require("../measures.json"),
];

You should now be able to open the local server

Run yarn jest Plugin -u after modifications.

GitHub

View Github