tree: 7f038c73c4f9ebd5e6242663636856b3e5dbbfae [path history] [tgz]
  1. binder/
  2. res/
  3. tests/
  4. .clang-format
  5. Android.bp
  6. AndroidTest.xml
  7. bugreport-format.md
  8. DumpPool.cpp
  9. DumpPool.h
  10. dumpstate.cpp
  11. dumpstate.h
  12. dumpstate.rc
  13. dumpstate_smoke_test.xml
  14. dumpstate_test.xml
  15. DumpstateInternal.cpp
  16. DumpstateInternal.h
  17. DumpstateService.cpp
  18. DumpstateService.h
  19. DumpstateUtil.cpp
  20. DumpstateUtil.h
  21. main.cpp
  22. OWNERS
  23. README.md
  24. TaskQueue.cpp
  25. TaskQueue.h
  26. TEST_MAPPING
cmds/dumpstate/README.md

dumpstate development tips

To build dumpstate

Do a full build first:

m -j dumpstate

Then incremental ones:

mmm -j frameworks/native/cmds/dumpstate

If you're working on device-specific code, you might need to build them as well. Example:

mmm -j frameworks/native/cmds/dumpstate device/acme/secret_device/dumpstate/ hardware/interfaces/dumpstate

Dumpstate philosophy: exec not link

Never link code directly into dumpstate. Dumpstate should execute many binaries and collect the results. In general, code should fail hard fail fast, but dumpstate is the last to solve many Android bugs. Oftentimes, failures in core Android infrastructure or tools are issues that cause problems in bugreport directly, so bugreport should not rely on these tools working. We want dumpstate to have as minimal of code loaded in process so that only that core subset needs to be bugfree for bugreport to work. Even if many pieces of Android break, that should not prevent dumpstate from working.

To build, deploy, and take a bugreport

mmm -j frameworks/native/cmds/dumpstate && adb push ${OUT}/system/bin/dumpstate system/bin && adb push ${OUT}/system/lib64/*dumpstate*.so /system/lib64/ && adb shell am bug-report

Make sure that the device is remounted before running the above command. * If you're working with userdebug variant, you may need to run the following to remount your device:

  adb root && adb remount -R && adb wait-for-device && adb root && adb remount
  • If you're working with eng variant, you may need to run the following to remount your device:

    adb root && adb remount
    

To build, deploy, and run unit tests

First create /data/nativetest64:

adb shell mkdir /data/nativetest64

Then run:

mmm -j frameworks/native/cmds/dumpstate/ && adb push ${OUT}/data/nativetest64/dumpstate_* /data/nativetest64 && adb shell /data/nativetest64/dumpstate_test/dumpstate_test

And to run just one test (for example, DumpstateTest.RunCommandNoArgs):

mmm -j frameworks/native/cmds/dumpstate/ && adb push ${OUT}/data/nativetest64/dumpstate_test* /data/nativetest64 && adb shell /data/nativetest64/dumpstate_test/dumpstate_test --gtest_filter=DumpstateTest.RunCommandNoArgs

To take quick bugreports

adb shell setprop dumpstate.dry_run true

To emulate a device with user build

adb shell setprop dumpstate.unroot true

To change the dumpstate version

adb shell setprop dumpstate.version VERSION_NAME

Example:

adb shell setprop dumpstate.version split-dumpsys && adb shell dumpstate -v

Then to restore the default version:

adb shell setprop dumpstate.version default

To set Bugreport API workflow for bugreport

adb shell setprop settings_call_bugreport_api true

Code style and formatting

Use the style defined at the Google C++ Style Guide and make sure to run the following command prior to repo upload:

git clang-format --style=file HEAD~

Useful Bash tricks

export BR_DIR=/bugreports

alias br='adb shell cmd activity bug-report'
alias ls_bugs='adb shell ls -l ${BR_DIR}/'

unzip_bug() {
  adb pull ${BR_DIR}/$1 && emacs $1 && mv $1 /tmp
}

less_bug() {
  adb pull ${BR_DIR}/$1 && less $1 && mv $1 /tmp
}

rm_bugs() {
 if [ -z "${BR_DIR}" ] ; then echo "Variable BR_DIR not set"; else adb shell rm -rf ${BR_DIR}/*; fi
}