While working on performance problems on Uber's Android apps, we often found that existing tools were lacking. Namely:

  • Systrace didn't provide enough information.
  • Traceview distorted system performance so heavily its results were useless.
  • Profilo and other sampling approaches, while much better than traceview, still had too much overhead to give definitive results in a small number of runs.
  • Custom application layer tracing solutions, like PerfSDK, are unable to sample OS methods.

So we built and opened sourced Nanoscope. Nanoscope was announced publicly in a recruiting talk I gave and later discussed in a an engineering blog post.