Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Отладка Android CMake плана по-взрослому

Anna | 24.06.2014 | нет комментариев

Позже перевода наших планов на CMake, встал вопрос об отладке нативной части Android. Так как инструменты NDK стали неактуальны, пришлось забраться в заросли и обучить Eclipse запускать удалённую отладку CDT-плана, что именуется, вручную. В идеале, Дабы это выполнялось в один клик.

Если вам не чужда разработка с применением Android NDK, и вы хотите познать некоторые тонкости отладки, велкам под кат.

В одной из наших студий было принято решение о переводе кроссплатформенных планов на CMake, что дозволило ускорить их разработку, но также внесло свои коррективы в некоторые этапы. CMake всецело заменил систему сборки ndk-build, и «инструменты отладки» ndk-stack, ndk-gdb стали недостижимы. Помедитировав над Eclipse и CDT в частности, возникла мысль о том, что отладку нативного кода CMake Android-плана дозволено сделать комфортной, стремительной и доступной.

CMake Android-план

В этой статье мы разглядим нашу задачу в слегка уменьшенном масштабе — на примере Teapot из состава Android NDK. Его сборка была переведена с ndk-build скриптов на CMake. Нужно пояснить, что CMake не заточен всецело под Android, как и под всякую иную платформу. Добавочный функционал необходимо писать самому, что и было сделано в данном случае, следственно не изумляйтесь, если видите какую-то переменную либо функцию, о которых в документации CMake ни слова. Балённо.

  • Запуск отладчика нативного кода.

Наша задача — объединить это всё в один клик.

Challenge accepted

Сборка .so

Сборка отладочных версий библиотек не представляет трудностей (CMake всё делает за нас), впрочем нюанс поджидает в совместимости форматов отладочной информации. Мы используем для сборки своих планов arm тулчейн gcc-4.8, в котором отчего-то применяется gdb, не совместимый из коробки с генерируемым форматом dwarf. Для нахождения всеобщего языка, компилятору необходимо указать определенный формат dwarf.

Для этого прописываем флаги в CMake:

if (PLATFORM_ANDROID)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -gdwarf-2")
  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -gdwarf-2")
endif()
Помещение отладочной информации в обособленный файл

Размер библиотеки с отладочными данными может добиваться нескольких сотен мегабайт, что отрицательно влияет на размер APK и, как следствие, скорость загрузки на устройство. Для решения этой задачи исполняем strip отладочной информации в обособленный файл:

# Separate debug information and runnable binary
add_custom_command(TARGET ${target} POST_BUILD
	# Rename .so file to .so.debug file
	COMMAND ${CMAKE_COMMAND} -E rename $<TARGET_FILE:${target}> $<TARGET_FILE:${target}>.debug
	# Strip .so.debug file to only runnable part and put it into .so file
	COMMAND ${CMAKE_STRIP} --strip-debug --strip-unneeded $<TARGET_FILE:${target}>.debug -o $<TARGET_FILE:${target}>
	# Add link to debuggable .so.debug file to .so file
	COMMAND ${CMAKE_OBJCOPY} --add-gnu-debuglink=$<TARGET_FILE:${target}>.debug $<TARGET_FILE:${target}>)

Позже сборки, полная версия .so переименовывается в .so.debug, и на её основе создаётся .so с убранной информацией об отладке и ссылкой на .so.debug файл.
Данный код находится в функции set_ndk_gdbserver_compatible(target) в файлеCMake/auto_included/android_helpers.cmake. Помимо выполнения стрипа позже сборки, он также исполняет другие значимые шаги, о которых ниже.

Удаленный отладчик a.k.a. gdbserver

Удаленный отладчик gdbserver по умолчанию отсутствует на устройстве, но поставляется с Android NDK в папке <android-ndk>/prebuilt/android-arm/gdbserver. Для того Дабы разместить его на устройство, применяется маленький трюк: gdbserver копируется в папку <android_project>/libs/<arch> Android-плана и попадает совместно с библиотеками в папку /data/<package_name>/lib.

Копирование gdbserver в папку <android_project>/libs/<arch> выполняется механически при сборке плана. Это происходит в set_ndk_gdbserver_compatible(target). Операция будет исполнена только в том случае, если применяемая CMake конфигурация находится в глобальном проперти DEBUG_CONFIGURATIONS (по умолчанию туда включена Debug конфигурация, остальные добавляются через вызовset_debug_configuration(config)).

При сборке не отладочной конфигурации файл gdbserver будет удаляться.

Скрипт ndk-gdb.py

Для настройки устройства и локальной машины применяется переработанная версия скрипта ndk-gdb.py из Android NDK.

В его задачи входит:

  1. Проверка наличия флага android:debuggable="true" в AndroidManifest.xml.
  2. Приобретение идентификатора package из AndroidManifest.xml.
  3. Подключение к девайсу и поиск PID запущенного инстанса по идентификатору package.
  4. Запуск gdbserver, пробрасывание порта.
  5. Копирование дополнительных файлов для отладчика на локальную машину.
  6. Создание файла gdb.setup для отладчика на локальной машине.

Данный скрипт создаётся на основе образца CMake/auto_included/stuff/ndk-gdb.py.in в момент вызоваset_ndk_gdbserver_compatible(target). В процессе запуска отладки скрипт должен запускаться позже старта APK.

Настройка Eclipse для запуска ndk-gdb.py

Тут и дальше, параллельно изложению, будет идти мануал по нбычно выручает.

Также в предложенном примере применяется ndk-gdb.py скрипт, рассчитанный на то, что его будут запускать только на Linux x86, Mac OS X x64 либо Windows x64. Если ваша конфигурация отличается, то вам придётся его подкрутить.

Завершение

Всё это дозволило гораздо упростить отладку всякого Android CMake-плана, и мы этому несказанно рады. Безусловно, есть простор для совершенствований и оптимизаций: в идеале хочется сделать что-то, что могло бы настроить все эти шаги в Eclipse механически, потому как всякий новейший проект/ветка требует такой настройки.

Если у вас возникли вопросы либо предложения по улучшению/упрощению схемы, я буду рад их услышать!

 

Источник: programmingmaster.ru

 

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB