Андроид

Андроид

Dmitry

Содержание статьи

Мы обновляем нашу рубрику для фанатов Android. Весь июнь мы выбирали интересный гик-софт, искали новые инструменты реверса APK, читали и анализировали вайтпейперы, статьи по безопасности и разработке. А сейчас готовы поделиться с тобой самым ценным. Если ты пишешь софт, занимаешься анализом защищенности приложений или просто Android-гик, загляни. Тут много интересного.

В этой статье: лаунчер в стиле командной строки Linux, приложение для подмены уведомлений, исчерпывающий каталог информации о возможных уязвимостях в приложениях для Android и примеры эксплоитов, несколько инструментов анализа APK. А также множество статей для программистов, откуда ты узнаешь, как бороться с утечками памяти, писать эффективный код на Kotlin, как защитить свое приложение от чужих глаз и запретить его запуск в виртуальных окружениях. И конечно же, набор первоклассных библиотек.

 


Софт

 


T-UI — лаунчер в стиле командной строки Linux

Казалось бы, необычным лаунчером сегодня уже никого не удивишь. Google Play битком набит реализациями рабочих столов во всех мыслимых и немыслимых стилях. Здесь можно найти лаунчер, мимикрирующий под iOS, Windows Phone 7, 8 и 10, прошивки от различных производителей и множество концептуальных лаунчеров вроде Aviate. Но есть и нечто действительно особенное.

 

T-UI Launcher — это лаунчер в стиле командной строки Linux. Причем не просто «в стиле», это и есть командная строка, позволяющая перемещаться по каталогам, редактировать файлы, запускать приложения и делать множество других вещей с помощью команд, которые придется вбивать с клавиатуры.

Во время первого запуска тебе покажут несколько примеров
Во время первого запуска тебе покажут несколько примеров

Во время первого запуска тебе покажут несколько примеровДля запуска приложения достаточно начать набирать его имя, и T-UI подскажет тебе возможные варианты. Любое приложение можно удалить с помощью команды uninstall имя_приложения, также можно просмотреть список установленных приложений с помощью команды apps.

Управлять воспроизведением музыки также можно из самого лаунчера. Команда tracksпокажет имеющиеся композиции, track — включит нужную композицию, управление плей-листом: previous и next.

У T-UI есть настройки. И конечно же, они хранятся в конфигурационном файле, который придется править руками. Команда tuisettings откроет этот файл во встроенном редакторе tuixt. Выйти из него, кстати, не намного проще, чем из Vim, так что все канонично (спойлер: надо набрать команду exit).

Список композиций и файл настроек
Список композиций и файл настроек

Список композиций и файл настроекЗвонить и отправлять SMS также можно, не покидая T-UI, для этого есть команды call и sms. Список контактов можно посмотреть, запустив любую из них без аргументов. Если же тебя самого уже достали звонками, то можно включить режим полета: airplaine. Команды wifi и data включают/отключают Wi-Fi и передачу данных по мобильной сети.

T-UI — шуточное приложение. Но, как ни странно, оно может быть очень удобным. Благодаря автодополнению для запуска нужной функции или приложения достаточно вбить всего один-два символа. Это гораздо быстрее, чем рыться в меню приложений или запускать телефон, тапать по окну поиска и вбивать имя контакта.

Кроме того, для более быстрого запуска на любую команду можно повесить alias. Плюс здесь есть команда search, которая позволяет искать в Google, Play Store, YouTube и на карте памяти.

 


Apktool X — анализ и модификация приложений прямо на смартфоне

Утилита Apktool хорошо известна всем, кто когда-либо модифицировал, переводил или просто изучал приложения для Android. С ее помощью пакет APK можно разобрать на составные части, декомпилировать байт-код, декомпрессировать XML-файлы, а после внесения изменений собрать APK обратно. Официальная версия этой утилиты для Android уже долгое время заброшена, но недавно появился новый порт.

Apktool X — это версия Apktool для Android, сделанная разработчиком Andro Black. Она прекрасно работает на последних версиях Android и способна распаковывать приложения, собранные с помощью самой свежей версии Android Studio.

Пользоваться Apktool X очень просто. Сразу после запуска ты увидишь на экране файловый менеджер. Тап по пакету APK откроет диалоговое окно, с помощью которого можно выбрать, что конкретно ты хочешь извлечь из пакета. Вариантов масса: декомпиляция кода приложения (Decompile dex), декомпиляция ресурсов, включая строки для перевода (Decompile res), подпись приложения (Sign, необходима после сборки приложения), а также инсталляция, удаление и несколько других вариантов.

Выбираем пакет для разборки
Выбираем пакет для разборки

Выбираем пакет для разборкиЧтобы разобрать все приложение целиком, выбирай Decompile all. Через несколько секунд (или минут, в зависимости от размера приложения) в той же папке появится папка с именем имя_приложения_src. Она содержит все, что Apktool сумел извлечь. Сам Apktool X не имеет средств для анализа и просмотра этих файлов, так что при попытке их открыть он попросит выбрать текстовый редактор или просмотрщик приложений (для файлов ресурсов).

Распакованное приложение и содержимое файла AndroidManifest.xml
Распакованное приложение и содержимое файла AndroidManifest.xml

Распакованное приложение и содержимое файла AndroidManifest.xmlЧто делать со всеми этими файлами? Да что угодно. Например, ты можешь взломать приложение, сделав его бесплатным. Ну или изменить его интерфейс и перевести на русский язык.

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

 


Custom Navigation Bar — кастомизируем наэкранные кнопки навигации без root

Одна из полезных функций Android O — возможность настроить экранные кнопки навигации. Их можно менять местами, сдвигать в разные стороны и делать другие интересные вещи. Однако, как выяснилось, скрытый механизм, предоставляющий такие возможности, есть даже в Android 7. Не хватает только графического интерфейса, который позволил бы им управлять. Приложение Custom Navigation Bar устраняет этот недостаток.

Custom Navigation Bar — крайне простая, но полезная программа. С ее помощью экранные кнопки можно расположить по своему вкусу, например сдвинуть влево или вправо для управления одной рукой, сдвинуть в центр, поменять кнопки «Назад» и «Обзор» местами.

Главный экран и меню быстрой настройки кнопок
Главный экран и меню быстрой настройки кнопок

Главный экран и меню быстрой настройки кнопокИнтересная функция — возможность добавить дополнительные кнопки с левой и с правой стороны экрана. Это могут быть кнопки навигации по тексту, кнопка доступа к буферу обмена, кнопка для выдвижения панели уведомлений, иконка приложения, управление громкостью или любая клавиша клавиатуры (например, Tab, которая позволяет перемещаться по графическим элементам запущенного в данный момент приложения).

Настраиваем дополнительные кнопки
Настраиваем дополнительные кнопки

Настраиваем дополнительные кнопкиПриложение поддерживает навигацию с Tasker. Ты можешь создать сразу несколько различных настроек клавиш (профилей) и переключать их динамически в зависимости от того или иного условия. Например, настроить показ кнопок переключения музыкальных треков только тогда, когда включен плеер. Или, например, включить кнопку буфера обмена, только если в самом буфере обмена что-то есть.

Вся эта функциональность доступна бесплатно. Однако если тебе нужна поддержка тем (например, возможность сделать кнопки навигации как в Google Pixel), то придется заплатить 130 рублей.

 


Notification Guard — прячем содержимое уведомлений от посторонних

Уведомления — это одна из удобнейших функций смартфона. Но они же несут опасность раскрытия личных данных. Да, можно отключить показ уведомлений на экране блокировки или скрыть личную информацию, но как быть с защитой от тех, кто может стоять у тебя за спиной, пока ты используешь смартфон? В этом случае поможет Notification Guard.

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

Всего доступно три вида маскировки: замена текста уведомления на текст You’ve got a new message, замена не только текста, но и иконки на иконку фейсбука, замена иконки на иконку SMS. Все эти правила можно по отдельности применять к любым уведомлениям либо настроить автоматическое скрытие уведомлений, содержащих определенный текст (нет, имя любовницы туда лучше не вписывать).

Интуитивно понятный интерфейс
Интуитивно понятный интерфейс

Интуитивно понятный интерфейсВ том случае, если ты вообще не хочешь получать уведомления, есть режим Do Not Disturb. В этом случае все уведомления отправятся в специальный ящик, который ты сможешь просмотреть тогда, когда у тебя появится для этого время.

Типы маскировки уведомлений и сами уведомления
Типы маскировки уведомлений и сами уведомления

Типы маскировки уведомлений и сами уведомленияДисклеймер для параноиков. Принцип работы Notification Guard — скрывать оригинальное уведомление и показывать вместо него другое. Для этого он использует официальный API Android, дающий доступ к содержимому уведомления. Естественно, если разработчик будет недостаточно добросовестным, он сможет слить эту информацию на третью сторону.

Впрочем, сторонний почтовый клиент или файловый менеджер с доступом к Dropbox смогут слить намного больше твоей инфы.

 


Инструменты для анализа безопасности

  • LazyDroid — скрипт для упрощения действий, связанных с анализом приложений, позволяет установить флаги отладки и бэкапа приложения, пересобрать и подписать приложение, выдернуть с устройства приложение, установленное с помощью Google Play, скопировать на комп приватный каталог приложения, внедрить гаджет Frida в APK.
  • ApkFile — библиотека для дампа информации о приложении в файл JSON. Позволяет извлечь информацию из манифеста, информацию о сертификатах, файлах DEX и классах.
Внедрение гаджета Frida с помощью LazyDroid

Внедрение гаджета Frida с помощью LazyDroid 


Посмотреть

 


Безопасность WebView

What’s new in WebView security — рассказ разработчиков Android о связанных с безопасностью новшествах компонента WebView (позволяет открывать веб-сайты внутри сторонних приложений) в Android O.

Первое: WebView теперь работает в своем собственном изолированном процессе (песочнице) и не может привести к падению или взлому хост-приложения. Более того, этот процесс не может писать данные в память устройства или самостоятельно загружать веб-страницы. К WebView применяется такой же seccomp-фильтр, как к процессам браузера Chrome. Фильтр не позволяет процессу выполнить опасные системные вызовы в случае, если он был взломан.

Второе: WebView теперь включает в себя технологию Google Safe Browsing, предупреждающую пользователя о потенциально небезопасных сайтах.

WebView теперь работает в отдельном процессе

WebView теперь работает в отдельном процессе 


Коллекция security-багов для Android

android-app-vulnerability-benchmarks — репозиторий, содержащий информацию об уязвимостях, которые могут появиться в приложениях для Android в результате ошибки программиста, а также исходники приложений-примеров и эксплоитов.

Среди примеров можно найти как самые глупые баги, такие как, например, хранение важной информации на карте памяти и открытые для стороннего доступа ContentProvider’ы (привет, mail.ru), так и более сложные, например уязвимости, которые приводят к возможности подмены активности (Activity hijack) и сервиса (Service hijack).

 


Статьи

 


Большой гайд по Kotlin

Exploring Kotlin’s hidden costs — Part 1 — как функциональность Kotlin и предлагаемый им синтаксический сахар влияют на производительность приложения. В первой части автор разбирает байт-код, генерируемый при использовании лямбд и объектов-компаньонов (companion object).

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

Второй: по возможности объявляй поля companion object, используя ключевое слово const, так ты избежишь создания дополнительных геттеров. Также можно использовать аннотацию @JvmField, которая заставит Kotlin не генерировать геттеры и сеттеры для указанного поля.

Exploring Kotlin’s hidden costs — Part 2 — вторая часть статьи о скрытых наценках Kotlin посвящена функциям, объявленным внутри функций, null safety и функциям с переменным числом аргументов. Выводы:

  1. Избегай обращений вложенных функций к переменным внешней функции.
  2. Чтобы избежать дополнительного оверхеда в релизных сборках, добавь в правила ProGuard (proguard-rules.pro) следующие строки:
  3. -assumenosideeffects class kotlin.jvm.internal.Intrinsics { static void checkParameterIsNotNull(java.lang.Object, java.lang.String); }

Они заставят ProGuard удалить проверки на null, в которых нет необходимости в релизных сборках.

  1. Не делай переменные примитивного типа (int, float) nullable, это заставляет компилятор использовать вместо них классы Integer и Float, из-за чего оверхед возрастет. По этой же причине объявляй массивы чисел как IntArray вместо Array.
  2. Не вызывай функции с переменным числом аргументов, передавая им массив. Это приведет к копированию массива.

Exploring Kotlin’s hidden costs — Part 3 — третья часть посвящена делегатам и диапазонам. Выводы:

  1. Используй делегаты в форме синглтонов (object) там, где это возможно, чтобы избежать создания новых объектов.
  2. Если ты инициализируешь с помощью делегата lazy переменную, которая будет находиться только в одном потоке, лучше применить lazy(LazyThreadSafetyMode.NONE), чтобы избежать блокировок.
  3. Попытайся не объявлять диапазоны примитивных типов заранее (например, val myRange get() = 1..10), это приводит к созданию дополнительного объекта InRange.
  4. Если ты часто используешь сравнение с диапазоном непримитивных типов, объяви этот диапазон заранее как константу, чтобы избежать повторного создания объектов.
  5. Не используй forEach в отношении диапазона ((1..10).forEach), это приведет к созданию дополнительного iterable-объекта.

 


Утечки памяти в Android-приложениях

Everything You Need To Know About Memory Leaks In Android Apps — статья о борьбе с утечками памяти в Android-приложениях. Автор рассказывает о причинах появления утечек, способах их поиска и рассматривает наиболее типичные примеры утечек.

Основные тезисы:

  • Используй инструменты Allocation Tracker из Android Studio и библиотеку LeakCanary для отлова утечек.
  • Всегда отключай листенеры при завершении активности. Например, останавливай процесс сбора информации о местоположении (для этого достаточно всего лишь сделать нечто вроде mLocationManager.removeUpdates(this) в методе onDestroy).
  • Будь осторожнее с вложенными классами. Они хранят ссылку на внешний класс, что может привести к утечке памяти, когда вложенный класс еще продолжает какую-то работу, а наружный уже не нужен, но он будет сохраняться в памяти. Решение простое: сделать вложенный класс статическим.
  • Избегай использования анонимных классов для выполнения длительных операций. Они представляют собой те же вложенные классы, поэтому их лучше заменить статическими вложенными классами.
  • Обращайся с битмапами правильно.
  • Изучи разницу между различными видами контекста (класс Context) и используй только те, что подходят в данной ситуации.

 


Использование корутин в Kotlin

A first walk into Kotlin coroutines on Android — о том, как работать с сопрограммами в Kotlin. Сопрограммы появились в Kotlin 1.1 и представляют собой нечто вроде легковесных потоков, которые в том числе позволяют реализовать концепцию async/await. Используя сопрограммы, можно последовательно вызывать асинхронные функции друг за другом без погружения в пучину callback hell.

 


Создание Guillotine Menu в Android

Guillotine Menu Animation on Android — рассказ о том, как сделать боковое меню с эффектом гильотины, когда меню не выдвигается справа, а падает сверху под углом. Статья с уклоном в математику, но ее не обязательно понимать, достаточно скопировать готовый код.

 


Как использовать push-уведомления с Firebase

How to add Push Notification capability to your Android app — простая и понятная статья, как добавить в приложение поддержку push-уведомлений с помощью Firebase. Рассчитана на новичков, поэтому никаких откровений, тебе просто расскажут, как это сделать.

 


Введение в разработку для Android Things

Android Things for beginners — введение в разработку для Android Things на примере простого приложения для Raspberry Pi 3, которое умеет последовательно зажигать лампочки в ответ на нажатие кнопки.

Интересно, что разработка для Android Things почти ничем не отличается от разработки для обычного Android. Та же Android Studio, та же Java, тот же ADB, тот же API и приложения в активностях. Устройство на базе Android Things зачастую не имеет экрана, но приложения для них все равно имеют активности. Только вместо кнопочек и окон ввода здесь шина GPIO, а вместо смартфона — подключенная по USB железка.

Схема описанного в статье проекта

Схема описанного в статье проекта 


Работа с nullable-типом в Kotlin: использование элвис-оператора и getOrDefault

Convincing the Kotlin compiler that code is safe — статья о том, как выходить из ситуации, когда ты знаешь, что значение переменной не может быть null, но компилятор этого не знает. Автор объясняет возможные техники на примере типа данных map, который всегда возвращает nullable-тип без оглядки на то, на самом ли деле значение nullable.

Лучшие способы побороть эту проблему:

  • элвис-оператор: map[key] = (map[key] ?: 0) + 1;
  • метод getOrDefault: map.getOrDefault(key, 0) + 1;

 


Как размещать константы в Kotlin с точки зрения эффективности исполнения кода

Where Should I Keep My Constants in Kotlin? — где и как лучше размещать константы в Kotlin с точки зрения эффективности исполнения кода. Ответ простой — поместить константу вне классов и объектов:

const val FOO = "foo"Компилятор Kotlin превратит его в такой код на Java, и это наиболее эффективная форма:

public final class ConstantsKt { @NotNull public static final String FOO = "foo"; } 


Пишем приложение из сериала «Силиконовая долина» на Kotlin

Not Kotdog: Using Computer Vision to Detect Hot Dogs in Kotlin — статья с рассказом о том, как с нуля создать аналог приложения «Не хот-дог» из сериала «Силиконовая долина» на Kotlin.

 


Секьюрная работа с полями ввода приложений, использующих API Autofill

Securing Apps From Android 8.0 Autofill — как защитить поля ввода приложения от приложений, использующих API Autofill в Android 8.0. Спойлер: для блокировки доступа ко всему Activity следует использовать такой код:

getWindow() .getDecorView() .setImportantForAutofill(View.IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS); 


Библиотеки для Android-разработчика

  • Swipe-Button — кнопка, активируемая свайпом, в стиле слайдера на экране блокировки iOS.
  • koin-android — эффективный и производительный dependency injection фреймворк для Kotlin.
  • Android CustomTabs — библиотека для работы с Chrome Custom Tabs с механизмом переключения на стандартный WebView, если Chrome не установлен на смартфоне.
  • Notifikation Manager — библиотека, позволяющая выяснить, находится приложение в фоне или отображается на экране.
  • Duo Navigation Drawer — боковое меню с красивым эффектом выдвижения.
  • Android-InfiniteCards — библиотека для создания интерфейса карточек в стиле меню запущенных приложений Android.
  • PrivacyStreams — единая библиотека для быстрого и удобного доступа к большому количеству различных данных о пользователе и смартфоне: контактам, местоположению, SMS, фотографиям, микрофону и так далее.
  • AntiVM — библиотека для защиты приложения от запуска в различных виртуализированных окружениях, таких как Parallel Space.

 


Полезные инструменты

  • adapticon.tooo.io — простое веб-приложение для оценки, как будет выглядеть адаптивная иконка для Android O в разных стилях.
  • shapeshifter.design — веб-приложение для быстрого создания анимированных иконок в формате AnimatedVectorDrawable.

На этом все.



Report Page