| This directory contains code that accesses Android (hw)binder interfaces and is | |
| dynamically loaded and used by traced_probes / perfetto command line client. | |
| The code in this directory is built as a separate .so library and can depend on | |
| on Android internals. | |
| Block diagram: | |
| ``` | |
| +---------------+ +---------------------------------+ | |
| | traced_probes |- - -> | libperfetto_android_internal.so | | |
| +---------------+ ^ +---------------+-----------------+ | |
| | | | |
| | | [ Non-NDK libraries ] | |
| | +-> libbase.so | |
| | +-> libutils.so | |
| | +-> libhidltransport.so | |
| | +-> libhwbinder.so | |
| | +-> android.hardware.xxx@2.0 | |
| | | |
| + dynamically loaded on first use via dlopen() | |
| ``` | |
| The major reason for using a separate .so() and introducing the shared library | |
| layer is avoiding the cost of linker relocations (~150 KB private dirty) | |
| required for loading the graph of binder-related libraries. | |
| The general structure and rules for code in this directory is as-follows: | |
| - Targets herein defined must be leaf targets. Dependencies to perfetto targets | |
| (e.g. base) are not allowed, as doing that would create ODR violations. | |
| - Headers (e.g. health_hal.h) must have a plain old C interface (to avoid | |
| dealing with name mangling) and should not expose neither android internal | |
| structure/types nor struct/types defined in perfetto headers outside of this | |
| directory. | |
| - Dependencies to Android internal headers are allowed only in .cc files, not | |
| in headers. |