Повысьте безопасность и качество кода вашего приложения для Android

Как разработчик приложений для Android, вы всегда должны стремиться реализовать наилучший код. Кроме того, ваше приложение должно быть максимально безопасным.

Качество кода очень важно для любого программного обеспечения, и вы всегда должны пытаться оптимизировать свою реализацию. В этой статье показаны и объясняются различные инструменты качества, которые будут объединены в Android software-quality-chain для достижения лучшего качества кода, более безопасного приложения и улучшенной ремонтопригодности.

TL;DR: Клонируйте этот репозиторий GitHub в папку проекта Android и выполните всю цепочку с помощью: sh software-quality-chain.sh. После этого откройте URL-адрес, который будет использоваться для входа в консоль. Войдите в систему с помощью admin:admin12345 и просмотрите отчет о своем проекте Android.

Предпосылки

Докер

Для запуска скрипта в вашей операционной системе должен быть установлен Docker.

Docker — это широко используемая платформа для разработки, доставки и запуска всех видов приложений. Это позволяет вам отделить инфраструктуру от ваших приложений, чтобы быстро доставлять программное обеспечение с одной машины на другую.

Внедрение программного обеспечения при использовании Docker часто сводит на нет проблемы с инфраструктурой, такие как распространенная проблема «работает на моей машине»:

Чтобы установить Docker в вашей системе, следуйте официальному руководству на docker.com. Если вы используете Windows и вам не разрешено устанавливать Docker Desktop, вы можете следовать этому руководству:



Детект

Detekt — это инструмент статического анализа кода для языка программирования Kotlin. Он работает с абстрактным синтаксическим деревом, предоставляемым компилятором Kotlin.

Он может быть реализован в любом Android-приложении на основе Kotlin и может использоваться с самоопределяемым набором правил для проверки приложения. Detekt является обязательным условием для выполнения скрипта и должен быть установлен в вашем приложении для Android. К счастью, эта процедура очень проста и может быть выполнена в четыре простых шага:

1. Добавить Detekt в проектbuild.gradle

2. Создайте файл detekt.yml с определенным набором правил.
Загрузите пример файла здесь и сохраните его в project_folder/detekt/detekt.yml

3. Примените плагин detekt в приложении build.gradle

4. Добавить блокировку обнаружения в приложение build.gradle

Другие используемые инструменты

МобСФ

Mobile Security Framework (MobSF) — это автоматизированное универсальное мобильное приложение (Android/iOS/Windows) для проверки на проникновение, анализа вредоносных программ и оценки безопасности, способное выполнять статический и динамический анализ.

Прежде чем продолжить, необходимо понять мобильную безопасность и как создать приложение для Android безопасным способом. К счастью, OWASP (Открытый проект безопасности веб-приложений), популярная некоммерческая организация, известная проектами программного обеспечения с открытым исходным кодом под руководством сообщества и улучшением безопасности программного обеспечения, создала десятку лучших мобильных приложений OWASP для повышения безопасности мобильных устройств.

К ним относятся наиболее важные проблемы безопасности, которых следует избегать в любом приложении для Android:

К счастью, MobSF может помочь вам автоматически определить многие возможные проблемы безопасности в вашем приложении для Android. Структура безопасности лучше всего подходит для:

  • местная среда
  • выполнение быстрого теста безопасности
  • реализовано в CI/CD с помощью mobsfscan (будет использоваться здесь)

Чтобы протестировать MobSF, вы можете перейти на https://mobsf.live и загрузить любой Android APK, который затем будет проанализирован на наличие общих проблем безопасности.

Мой совет: всем разработчикам следует использовать MobSF для выявления множества уязвимостей безопасности во время разработки путем статического анализа кода. Этот анализ проверит исходный код без запуска приложения. Его можно использовать при разработке мобильных приложений, и его следует проводить регулярно. Обычно его следует выполнять перед каждым выпуском приложения, обновлением и отправкой запроса на слияние.

Имейте в виду, что использование MobSF для статического анализа кода не гарантирует безопасность вашего мобильного приложения! Но это поможет выявить наиболее очевидные недостатки безопасности.

СонарКьюб

SonarQube — это платформа с открытым исходным кодом, разработанная SonarSource для непрерывной проверки качества кода для выполнения автоматических обзоров со статическим анализом кода для обнаружения ошибок, запахов кода и уязвимостей безопасности на более чем 20 языках программирования.

Для ваших проектов SonarQube анализирует исходный код (не только приложений Android/Kotlin), оценивает качество и генерирует отчеты. Он позволяет осуществлять непрерывный мониторинг качества во времени и сочетает в себе статические и динамические аналитические методы. SonarQube проверяет и оценивает все, что влияет на нашу кодовую базу, от неприметных решений по стилю до серьезных недостатков дизайна.

В результате разработчики могут получать доступ и отслеживать информацию анализа кода обо всем, от ошибок стиля, потенциальных ошибок и дефектов кода до неэффективности дизайна, дублирования кода, неадекватного охвата тестами и чрезмерной сложности. Платформа Sonar исследует исходный код с разных сторон; в результате он копается в вашем коде слой за слоем, переходя от уровня модуля к уровню класса.

Кроме того, он генерирует метрики и данные на каждом уровне, выделяя проблемные области в источнике, которые необходимо изучить или улучшить. Он автоматически определяет, какой тип программного обеспечения вы используете в своем Android-приложении на базе Kotlin.

Другие функции

SonarQube делает больше, чем просто выделяет проблемы. Он также предоставляет инструменты управления качеством, которые заранее помогают вам вносить исправления.

  • SonarQube предоставляет информацию на панели инструментов о стандартах кода, тестовом покрытии, дублировании, документации API, сложности и архитектуре в дополнение к проблемам.
  • Он предоставляет вам текущий моментальный снимок качества кода вашего приложения для Android, а также тенденции в ведомых (что ранее было не так) и опережающих (что, скорее всего, пойдет не так в будущем) индикаторах качества.
  • Он предлагает измерения, которые помогут вам сделать лучший выбор для вашего приложения для Android.

СонарСканер

SonarScanner CLI — это сканер, который можно использовать каждый раз, если для вашей системы сборки нет специального сканера.

Это простой инструмент командной строки, который сканирует предоставленную папку (папку приложения Android) с помощью ролей, специфичных для SonarQube. После успешного анализа он загружает все данные на сервер SonarQube, где можно просмотреть результаты.

Подготовьте файлы Docker

Теперь, после объяснения предварительных условий и инструментов, они будут объединены в файлы Docker Compose, чтобы затем использоваться в одном сценарии bash, который приведет к созданию файла software-quality-chain.

Файл компоновки Docker SonarQube/mobsfscan

Как описано ранее, SonarQube и mobsfscan будут использоваться в Android software-quality-chain. Чтобы их можно было использовать, они будут развернуты вместе с Docker Compose в качестве службы в вашей операционной системе.

Следующий файл Compose содержит сервер SonarQube, базу данных PostgreSQL для SonarQube и контейнер mobsfscan для сканирования вашего приложения Android:

В этом файле определены три службы: SonarQube, PostgreSQL и mobsfscan. В то время как SonarQube и PostgreSQL будут просто использовать стандартизированную службу Docker, которая запускается, mobsfscan будет связывать корень проекта как том. Он будет иметь перезаписанную точку входа, которая выполняется сразу после того, как контейнер SonarQube будет правильно запущен и помечен как работоспособный (см. Healthcheck).

SonarScanner Создать файл

К счастью, утилита SonarScanner также доступна в виде образа Docker, и ее можно использовать и настраивать в файле Compose:

Комбинирование инструментов

Теперь все Dockerfiles будут объединены в bash-скрипт под названием software-quality-chain, который состоит из следующих шагов:

  1. Увеличение количества кучи среды Docker
  2. Установка, настройка и запуск SonarQube и mobsfscan
  3. Ожидание завершения анализа mobsfscan
  4. Выполнение полных проверок Gradle
  5. Импорт чистой базы данных PostgreSQL.
  6. Выполнение SonarScanner и объединение результатов перед загрузкой в ​​SonarQube

Этот скрипт bash содержит окончательное решение, которое выполнит все шаги:

Увеличение количества кучи среды Docker

Чтобы запустить сервер SonarQube без каких-либо проблем, вам необходимо увеличить max_map_count операционной системы, на которой работает контейнер Docker, поскольку значения по умолчанию недостаточно.

Вы можете прочитать об этом в документации SonarQube.

Установите, настройте и запустите SonarQube и mobsfscan

Поскольку файлы Docker Compose уже содержат все важные настройки, единственная команда, которая должна быть выполнена здесь, — это запуск файла Compose в фоновом режиме.

Ожидание завершения анализа mobsfscan

К сожалению, служба Docker Compose для mobsfscan запускается только при запуске файла Compose, после чего выполняется анализ. Из-за этого скрипт должен блокироваться до тех пор, пока не завершится анализ mobsfscan и не будет успешно создан файл результатов. Эта «блокировка» выполняется в строках 16–21, где скрипт ждет, пока не будет создан файл result.json, а затем перемещает его в выходную папку.

Выполнение полных проверок Gradle Detekt

Следующим шагом является выполнение полной задачи Gradle Detekt. Он называется завершенным, потому что иногда разработчики используют файл baseline.xml в своей конфигурации detekt, чтобы пометить устаревший код как «игнорируемый». На этом этапе файл baseline.xml будет удален путем комментирования его с помощью sed и последующего запуска задачи gradle detekt. После этого отчет detekt будет скопирован в выходную папку, и использование файла baseline.xml будет восстановлено.

Подготовка файлов для импорта в SonarQube

Есть две небольшие ошибки при объединении утилиты mobsfscan и SonarQube при создании и импорте result.json.

  1. mobsfscan также находит в проекте проблемы, которые не подходят для определенных исходных файлов. К сожалению, эти задачи нельзя корректно импортировать в SonarQube, потому что SonarQube всегда нужен файл для добавления задачи. К счастью, эти проблемы легко определить, потому что все они имеют filePath=null.
  2. mobsfscan перечисляет все пути к файлам из папки приложения, а SonarQube перечисляет все файлы из папки проекта.

Обе проблемы будут исправлены в строках 35 и 36, где sed используется для замены неправильных записей правильными. Вот как это выглядит:

  • Строка 35: src/main -> app/src/main
  • Строка 36: filePath=null -> filePath="app/src/main/AndroidManifest.xml"

Импорт чистой базы данных PostgreSQL

Перед запуском SonarScanner для анализа исходного кода и загрузки результатов в экземпляр SonarQube чистая резервная копия базы данных PostgreSQL будет импортирована в экземпляр SonarQube (строка 39). Это необходимо сделать, поскольку только что установленный экземпляр SonarQube не содержит токена пользователя, который можно использовать для загрузки данных. Предоставленная резервная копия PostgreSQL содержит пользователя (admin:admin12345) и токен пользователя, которые уже установлены в переменных среды SonarScanner.

Без этого шага вам пришлось бы переключиться на свой экземпляр SonarQube и войти в систему с пользователем по умолчанию (admin:admin). Затем вам нужно переключиться на конфигурацию своей учетной записи и создать новый токен пользователя, который можно использовать для анализа.

Выполнение SonarScanner и объединение результатов перед загрузкой в ​​SonarQube

Последним шагом будет выполнение файла Compose для SonarScanner (строка 42) и открытие журналов Docker для этого экземпляра, чтобы получить уведомление о завершении анализа.

После этого вы получите URL-адрес в терминале, который вы можете открыть в браузере, войти в систему с помощью admin:admin12345 и увидеть результаты выполненного анализа.

Запустить цепочку

Теперь, когда все настроено и объяснено, можно начинать software-quality-chain. Если вы не создавали каждый файл вручную, вы можете клонировать этот репозиторий GitHub в корень вашего Android-проекта. Затем вы можете запустить его, выполнив следующее:

sh software-quality-chain.sh

Возьмите кофе и подождите, пока цепочка не закончится. В CLI будет URL-адрес, который вы можете скопировать, чтобы открыть экземпляр SonarQube. Войдите в систему с помощью admin:admin12345 и начните проверять свои улучшения, проблемы с безопасностью и другие вещи.

Возможные ошибки

Если вы используете этот software-quality-chain, вы можете столкнуться с некоторыми ошибками, которые можно легко исправить!

SonarQube не запускается

Как упоминалось ранее, для запуска SonarQube вам необходимо увеличить max_map_count. Обычно это делается с помощью команды в строке 8. Если вы работаете с Windows или у вас нет необходимых прав, вам необходимо обновить команду:

Для Windows:

wsl sysctl -w vm.max_map_count=262144

Не удалось из-за разрешений:

sudo sysctl -w vm.max_map_count=262144

Не удается запустить docker-compose (Windows)

Если у вас нет Docker Desktop (или Rancher Desktop), может случиться так, что docker-compose не сможет быть запущен с вашего терминала.

Иногда это происходит из-за того, что вам нужно добавить wsl перед каждой командой docker-compose (сравните со строкой 11):

DOCKER_BUILDKIT=1 wsl docker-compose -f docker-compose.sq.yml up -d

Не удается импортировать резервную копию PostgreSQL (Windows)

Если вы попытаетесь запустить software-quality-chain в Powershell или Git-bash во время работы с Windows, вы обычно столкнетесь с ошибкой, когда скрипт попытается восстановить базу данных PostgreSQL.

Это происходит из-за проблемы с кодировкой файла используемого дампа PostgreSQL. Чтобы решить эту проблему, подключитесь к своему WSL и перезапустите software-quality-chain. Кроме того, вы можете войти в работающий экземпляр SonarQube с пользователем по умолчанию admin:admin, переключиться на настройки учетных записей и создать новый токен пользователя. Затем вы можете обновить файл sq.env, чтобы использовать этот новый токен пользователя. Если вы сделаете это, вам придется удалить часть из software-quality-chain, куда будет вставлена ​​резервная копия PostgreSQL.

Улучшения/изменения цепочки качества программного обеспечения

Поскольку эта цепочка в основном подходит для разработчиков, которые хотят провести быстрое полное тестирование своих приложений для Android на своем компьютере, эту цепочку также можно несколько изменить.

Важной особенностью описанной цепочки является то, что она будет работать на ЛЮБОМ устройстве, на котором запущен Docker, потому что она автоматически вставляет базу данных во время выполнения. Это означает, что каждый раз, когда вы запускаете эту цепочку, у вас будет только что установленный SonarQube, который содержит только результаты выполненного анализа.

Но если вы хотите иметь кривую, на которой можно увидеть улучшения при разработке, вам необходимо сохранять данные каждого последующего анализа. Кроме того, вы можете работать с несколькими участниками над одним и тем же экземпляром SonarQube и использовать эту цепочку в конвейере CI/CD для автоматической проверки после объединения запроса на вытягивание с вашей веткой релиза.

В следующих главах рассматриваются изменения, которые необходимо внести, чтобы использовать цепочку любым из этих способов.

Сохранение данных анализа

Чтобы сохранить данные между последовательными анализами, вам просто нужно настроить software-quality-chain после первого запуска.

После первого успешного запуска цепочки переключитесь на строки 38 и 39, где происходит импорт базы данных.

Вам все еще нужен первый запуск, потому что он заполнит базу данных, чтобы иметь рабочий токен пользователя и пользователя для входа в систему admin:admin12345.

Используйте другой экземпляр SonarQube

Если вы используете другой экземпляр SonarQube в software-quality-chain, вам необходимо настроить два файла:

docker-compose.sq.yml: Удалите контейнер SonarQube и PostgreSQL и оставьте только mobsfscan. Файл Compose будет выглядеть так:

sq.env: замените URL-адрес URL-адресом вашего экземпляра SonarQube и обновите токен до своего пользовательского токена.

Также удалите резервную копию базы данных PostgreSQL (строка 38/39).

Используйте его в цепочке CI/CD

Чтобы использовать этот скрипт в цепочке CI/CD, вы должны объединить предыдущие разделы. Удалите экземпляр SonarQube, отредактировав файл Compose, изменив URL/токен sq.env и удалив резервную копию PostgreSQL.

Дополнительные инструменты

Чтобы еще больше улучшить качество приложений для Android, вы можете улучшить свой Android-проект с помощью двух дополнительных дополнительных инструментов/команд, которые хорошо работают в сочетании с файлом software-quality-chain.

Плагин SonarLint для Android

Плагин SonarLint можно загрузить и установить вручную с торговой площадки JetBrains или вы можете легко установить его из Android Studio, открыв Настройки -> Плагины и установив его.

Хук Pre-Push для выполнения Gradle Detekt

Чтобы гарантировать, что все отправленные файлы не содержат ошибок, которые будут обнаружены с помощью Gradle, вы можете установить pre-push hook в свою папку .git. Для этого откройте .git/hooks, создайте новый файл с именем pre-push, сделайте его исполняемым (chmod +x) и вставьте следующее содержимое:

Заключительные примечания

Я надеюсь, что вам понравилось читать эту статью, и теперь вы будете использовать мой software-quality-chain, чтобы значительно улучшить качество вашего кода и сделать ваше приложение более безопасным. Имейте в виду, что программное обеспечение высокого качества легче поддерживать и улучшать!

Все файлы, описанные в этом руководстве, можно найти в этом репозитории GitHub. Загрузите всю папку, поместите ее в корень вашего проекта Android и запустите Android software-quality-chain с помощью следующей команды:

sh software-quality-chain.sh

Имейте в виду, что в Windows вы должны быть подключены к WSL!

Это конец этого урока. Надеюсь, теперь вы можете использовать мой Android software-quality-chain. Если у вас все еще есть вопросы о чем-то, что не полностью описано, вы можете просто задать их в разделе комментариев. Кроме того, если вам понравилось читать эту статью, рассмотрите возможность комментирования с вашими ценными мыслями! Я хотел бы услышать ваши отзывы о моей разработанной цепи.

Эта статья была первоначально опубликована в моем личном блоге по адресу https://www.paulsblog.dev/optimize-android-app-development-with-docker-sonarqube-detekt-and-mobsf/.

Want to Connect?
Feel free to connect with me on LinkedIn and Twitter.