Покрытие Native Code с системой сборки Android Soong
Я пытаюсь создать отчет о покрытии кода для своих нативных компонентов с помощью исходного кода AOSP, используя систему сборки soong.
Я расширил aosp vhal, но примеры модульных тестов такие же, как в ссылке ниже. http://androidxref.com/8.1.0_r33/xref/hardware/interfaces/automotive/vehicle/2.0/default/tests/
Попробовал добавить ниже в cc_test, cc_binary в Android.bp
native_coverage : true,
cflags: [
"-g",
"-O0",
"-fprofile-arcs",
"-ftest-coverage",
],
ldflags : [
"-fprofile-arcs",
"-ftest-coverage",
],
В out / target / product генерируется нативное двоичное покрытие unit-tests, но я не могу найти промежуточные звенья gcno для этого.
Запуск команды ниже дает мне *.gcda файлы для каждого тестового файла.
adb shell \
GCOV_PREFIX=/data/local/tmp \
GCOV_PREFIX_STRIP=`echo $ANDROID_BUILD_TOP | grep -o / | wc -l` \
/data/local/tmp/unit-tests-coverage
Я пробовал ссылки ниже, но не уверен, как действовать:(
http://logan.tw/posts/2015/04/28/check-code-coverage-with-clang-and-lcov/ https://android.googlesource.com/platform/bionic.git/+/master-soong https://android.googlesource.com/platform/build/soong/+/581341d%5E%21/ https://android.googlesource.com/platform/external/e2fsprogs/+/fedfb27%5E%21/ https://android.googlesource.com/platform/development/+/master/scripts/acov http://androidxref.com/9.0.0_r3/xref/bionic/README.md#293
Я не уверен, можно ли здесь использовать vts Framework от Google для генерации нативного покрытия кода. https://codelabs.developers.google.com/codelabs/android-vts-8/
" gcnodir " генерируется, но не уверен, как его использовать. /coverage/data/nativetest64/vehicle-unit-tests-coverage/unit-tests-coverage.gcnodir
1 ответ
Размещение ответа на мой вопрос для других пользователей на SO.
Установите инструмент покрытия:
sudo apt-get install lcov
(Это должно установить lcov-1.12)sudo apt-get install gcc-4.6
(Clang генерирует.gcno, приблизительно равный gcc 4.2, который не совместим с gcov-4.8. Установка gcc-4.6 для получения gcov-4.6 и запуск lcov с помощью '--gcov-tool /usr/bin/gcov-4.6')- Загрузите LLVM 3.8 для работы llvm-cov: http://releases.llvm.org/download.html
Все собственные тестовые примеры, т. Е. Инструментированные двоичные файлы, должны выполняться на цели. Построить и создать профилирование на основе инструментальных средств Clang. Пример: http://androidxref.com/9.0.0_r3/xref/hardware/interfaces/automotive/vehicle/2.0/default/Android.bp#82 (переименован в Vehicle-Manager-unit-test для более короткого имени)
- export NATIVE_COVERAGE = true
- добавлять
native_coverage: true
протестировать модуль в Android.bp - Перейти к: имя модуля / тест
- Используйте команду mm или make для создания собственного двоичного файла
- Пример: Для аппаратного обеспечения / интерфейсов / автомобильного / транспортного средства / 2.0 / по умолчанию / тесты /: mma или make-manager-manager-unit-test -j32
- Копировать включенный инструментированный двоичный файл в целевой
adb push out/target/product/product_name/data/nativetest64/vendor/vehicle-manager-unit-test /data/nativetest64/vehicle-manager-unit-test adb shell chmod +x /data/nativetest64/vehicle-manager-unit-test
Запустите тестовые случаи и сгенерируйте.gcda файлы
adb shell \ GCOV_PREFIX=/data/local/tmp \ GCOV_PREFIX_STRIP=echo $ANDROID_BUILD_TOP | grep -o / | wc -l \ /data/nativetest64/vehicle-manager-unit-test
adb shell find -iname *.gcda
adb pull /data/local/tmp/proc/self/cwd/out/soong/.intermediates/hardware/interfaces/automotive/vehicle/2.0/default/vehicle-manager-unit-test/android_x86_64_silvermont_vendor_cov/obj/hardware/interfaces/automotive/vehicle/2.0/default/tests/ .(Destination folder)
Извлеките файлы GCNO из GCNODIR (архивный файл, созданный в out/overage/data/nativetest64/vendor/vehicle-manager-unit-test) в одну папку с файлами GCDA
llvm-cov gcov -f -b *.gcda
( https://llvm.org/docs/CommandGuide/llvm-cov.html)lcov --directory . --base-directory . --gcov-tool /usr/bin/gcov-4.6 --capture -o cov.info
( http://ltp.sourceforge.net/coverage/lcov.php)genhtml cov.info -o output
Вот скрипт, который оборачивает все эти команды: https://gist.github.com/pankajgangwar/f070b8b54e83543f8e3638dcd2cae1b8
здесь объясняется, как создавать отчеты о покрытии, для которых требуется GTest:
Эти флаги позволяют генерировать тестовое покрытие: -fprofile-arcs -ftest-coverage
тогда нужно использовать gcov: gcov main_test.cpp
который затем может быть передан в lcov (для справки):
$ lcov --coverage --directory . --output-file main_coverage.info
из которого можно генерировать lcov
отчет о покрытии в HTML
формат:
$ genhtml main_coverage.info --output-directory out
эти .gcda файлы в .gcnodir
являются gcov
Дата файлы. gcov
также имеет выходной вариант --json-format
, что может пригодиться при желании использовать данные покрытия с веб-сервисом.
один из примеров по ссылкам, которые вы предоставили, может быть использован для генерации всего проекта:
Соберите код покрытия результатов:
$ lcov --directory . \
--base-directory . \
--gcov-tool gcov.sh \
--capture -o cov.info
Создать HTML-файлы:
$ genhtml cov.info -o output
где единственное отличие состоит в том, что сценарий оболочки должен быть настроен для вызова gcov
, вероятно, можно было бы даже опустить упаковщик, переданный с параметром --gcov-tool
, так как он должен быть вызван напрямую.
так как можно подготовить отчет о покрытии только путем добавления флагов компилятора, gcov
а также lcov
Команды должны быть настроены как сценарий после сборки, чтобы они автоматически генерировали отчет.