summaryrefslogtreecommitdiffstats
path: root/tools/profiler/docs/instrumenting-android.rst
diff options
context:
space:
mode:
Diffstat (limited to 'tools/profiler/docs/instrumenting-android.rst')
-rw-r--r--tools/profiler/docs/instrumenting-android.rst102
1 files changed, 102 insertions, 0 deletions
diff --git a/tools/profiler/docs/instrumenting-android.rst b/tools/profiler/docs/instrumenting-android.rst
new file mode 100644
index 0000000000..fdd96613b4
--- /dev/null
+++ b/tools/profiler/docs/instrumenting-android.rst
@@ -0,0 +1,102 @@
+Instrumenting Android
+========================
+
+There are multiple ways to use the profiler with Android. There is the "Java"
+profiler feature (via about:profiling), which enables profiling for JVM code.
+This is most likely turned on already for the preset if you are profiling an
+Android device.
+
+In addition to sampling, markers can be created to specifically mark an instant
+in time, or a duration. This can be helpful to make sense of a particular piece
+of the front-end, or record events that normally wouldn't show up in samples.
+
+.. note::
+ This guide explains Android markers in depth. To learn more about how to add a
+ marker in C++, JavaScript or Rust, please take a look at their documentation
+ in :doc:`markers-guide`, :doc:`instrumenting-javascript` or
+ :doc:`instrumenting-rust` respectively.
+
+Markers in the GeckoView Java codebase
+**************************************
+
+If you are in the GeckoView codebase, then you should have access to ``GeckoRuntime``.
+``GeckoRuntime`` has a ``getProfilerController`` method to get the ``ProfilerController``.
+See the `ProfilerController Java file`_ (`javadoc`_) to find which methods you can use to
+instrument your source code.
+
+Here's an example:
+
+.. code-block:: java
+
+ // Simple marker
+ sGeckoRuntime.getProfilerController().addMarker("Marker Name");
+
+ // Simple marker with additional information
+ sGeckoRuntime.getProfilerController().addMarker("Marker Name", "info");
+
+ // Duration marker
+ Double startTime = sGeckoRuntime.getProfilerController().getProfilerTime();
+ // ...some code you want to measure...
+ sGeckoRuntime.getProfilerController().addMarker("Marker Name", startTime);
+
+ // Duration marker with additional information
+ sGeckoRuntime.getProfilerController().addMarker("Marker Name", startTime, "info");
+
+There are various overloads of ``addMarker`` you can choose depending on your need.
+
+If you need to compute some information before adding it to a marker, it's
+recommended to wrap that code with a `isProfilerActive` if check to make sure
+that it's only executed while the profiler is active. Here's an example:
+
+.. code-block:: java
+
+ ProfilerController profilerController = runtime.getProfilerController();
+ if (profilerController.isProfilerActive()) {
+ // Compute the information you want to include.
+ String info = ...
+ sGeckoRuntime.getProfilerController().addMarker("Marker Name", info);
+ }
+
+Markers in the Fenix codebase
+*****************************
+
+If you are in the Fenix codebase, then you should have access to the Android
+components. The Android components includes a `Profiler interface here`_, with
+its corresponding `implementation here`_. You should be able to do everything
+you can do with the ``ProfilerController``. Here's an example on how to call them:
+
+.. code-block:: kotlin
+
+ // Simple marker
+ components.core.engine.profiler?.addMarker("Marker Name");
+
+ // Simple marker with additional information
+ components.core.engine.profiler?.addMarker("Marker Name", "info");
+
+ // Duration marker
+ val startTime = components.core.engine.profiler?.getProfilerTime()
+ // ...some code you want to measure...
+ components.core.engine.profiler?.addMarker("Marker Name", startTime, "additional info")
+
+ // Duration marker with additional information
+ components.core.engine.profiler?.addMarker("Marker Name", startTime, "info");
+
+Similarly, there are various overloads of ``addMarker`` you can choose depending on your needs.
+
+Like for the GeckoView example above, if you need to compute some information
+before adding it to a marker, it's recommended to wrap that code with a
+`isProfilerActive` if check to make sure that it's only executed while the
+profiler is active. Here's an example:
+
+.. code-block:: kotlin
+
+ if (components.core.engine.profiler?.isProfilerActive() == true) {
+ // Compute the information you want to include.
+ var info = ...
+ components.core.engine.profiler?.addMarker("Marker Name", info)
+ }
+
+.. _ProfilerController Java file: https://searchfox.org/mozilla-central/source/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/ProfilerController.java
+.. _javadoc: https://mozilla.github.io/geckoview/javadoc/mozilla-central/org/mozilla/geckoview/ProfilerController.html
+.. _Profiler interface here: https://searchfox.org/mozilla-central/source/mobile/android/android-components/components/concept/base/src/main/java/mozilla/components/concept/base/profiler/Profiler.kt
+.. _implementation here: https://searchfox.org/mozilla-central/source/mobile/android/android-components/components/browser/engine-gecko/src/main/java/mozilla/components/browser/engine/gecko/profiler/Profiler.kt