Files
frameworks_base/tools/dump-coverage/README.md
Kavi Gupta 2d84ae7640 Add JVMTI agent to dump/reset JaCoCo coverage information
This agent can be attached to an arbitrary Android process with
arguments that cause it to either reset or dump the JaCoCo information
to a provided directory.

Test: manual, used examples in README to test whether it works on a
userdebug_coverage build on cuttlefish

Change-Id: If6cee20046f790676b8085e1ca84652c063295fa
2019-06-27 15:12:48 -07:00

1.6 KiB

dumpcoverage

libdumpcoverage.so is a JVMTI agent designed to dump coverage information for a process, where the binaries have been instrumented by JaCoCo. JaCoCo automatically starts recording data on process start, and we need a way to trigger the resetting or dumping of this data.

The JVMTI agent is used to make the calls to JaCoCo in its process.

Usage

Note that these examples assume you have an instrumented build (userdebug_coverage). Here is, for example, how to dump coverage information regarding the default clock app. First some setup is necessary:

adb root # necessary to copy files in/out of the /data/data/{package} folder
adb shell 'mkdir /data/data/com.android.deskclock/folder-to-use'

Then we can run the command to dump the data:

adb shell 'am attach-agent com.android.deskclock /system/lib/libdumpcoverage.so=dump:/data/data/com.android.deskclock/folder-to-use'

We can also reset the coverage information with

adb shell 'am attach-agent com.android.deskclock /system/lib/libdumpcoverage.so=reset'

then perform more actions, then dump the data again. To get the files, we can get

adb pull /data/data/com.android.deskclock/folder-to-use ~/path-on-your-computer

And you should have timestamped .exec files on your machine under the folder ~/path-on-your-computer

Details

In dump mode, the agent makes JNI calls equivalent to

Agent.getInstance().getExecutionData(/*reset = */ false);

and then saves the result to a file specified by the passed in directory

In reset mode, it makes a JNI call equivalent to

Agent.getInstance().reset();