Сегодня в выпуске: рассказ о решении некоторых проблем безопасности в Android Q, разбор работы новой системы обновления Android APEX, реверс северокорейского смартфона, введение в контекстно ориентированное программирование на Kotlin, а также советы по работе с GitHub и работе с Google Play Console.
 

Почитать

 

Чего ожидать в Android Q

Android Q May Block Background Clipboard Reads, Better Protect Your Media Files, Support Downgrading Apps, and more — журналисты XDA Developers продолжают изучать непонятно как попавшую к ним раннюю сборку Android Q.

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

Теперь они рассказывают о более низкоуровневых вещах:

  1. Запрет на чтение буфера обмена в фоне. В Android любое приложение может прочитать буфер обмена безо всяких разрешений. Это security-фейл из-за ошибки проектирования: читать буфер обмена приложениям нужно, чтобы пользователь смог скопировать текст в их поле ввода. Судя по всему, инженеры Google не придумали, как безболезненно устранить этот недочет, поэтому решили хотя бы частично обезопасить пользователей, введя новое разрешение — READ_CLIPBOARD_IN_BACKGROUND. Без этого разрешения приложения не смогут читать буфер обмена, находясь в фоне, а получить его может только системный софт из состава прошивки.
  2. Возможность даунгрейдить приложения. В Android Q появятся доступные только приложениям из комплекта прошивки разрешения PACKAGE_ROLLBACK_AGENT и MANAGE_ROLLBACKS, а у команды pm, позволяющей устанавливать и удалять приложения из командной строки, появится флаг --enable-rollback. Это свидетельство, что добавится возможность откатиться до старых версий приложения.
  3. Ограничение на доступ к файлам на карте памяти. Сейчас, имея разрешения READ_EXTERNAL_STORAGE и WRITE_EXTERNAL_STORAGE, приложения могут читать всю карту памяти целиком, включая любые файлы, не принадлежащие самому приложению. Так сделано потому, что в картах памяти используется файловая система без разграничения полномочий, а также потому, что бесполезно разграничивать доступ на носителе, который в любой момент можно вынуть и прочитать все данные. Android Q позволит разграничить доступ к файлам на уровне их типов; появятся разрешения READ_MEDIA_AUDIO, READ_MEDIA_VIDEO и READ_MEDIA_IMAGES.
 

Модульный Android

APEX in Android Q: What Could Be The Biggest Thing Since Project Treble — статья об APEX, новой подсистеме Android, которая должна смягчить проблему с обновлениями ОС в будущем.

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

Чтобы как-то решить эту проблему, Google уже реализовала идею патчей безопасности и инициировала Project Treble. Последний разделяет Android на две независимые части, которые можно обновлять отдельно друг от друга. Идея здесь в том, что обычно проблемы с обновлениями возникают из-за производителей оборудования, которые отказываются обновлять драйверы своих устройств для новых версий Android. Project Treble позволяет обновлять ОС, не затрагивая драйверы и ядро Android.

Однако на этом Google не остановилась. В Android Q Google собирается внедрить подсистему APEX, которая позволит обновлять куски Android даже в обход производителя устройства. По своей сути APEX — это пакетный менеджер, очень похожий на тот, что используется в дистрибутивах Linux и новой операционке Google Fuchsia. Работает он примерно так: допустим, по очередному указу правительства в России вновь изменяют часовые пояса. Команда разработчиков Android формирует новую версию пакета с часовыми поясами и выкладывает ее в Google Play. Пользователи получают обновление — все счастливы.

Содержимое пакета APEX
Содержимое пакета APEX

Таким же образом могут быть обновлены библиотеки и целые подсистемы. Уже сейчас в AOSP доступны пакеты с рантаймом ART («виртуальная машина», ответственная за запуск приложений) и библиотека криптографических алгоритмов conscrypt. В теории в пакет APEX можно упаковать практически любой компонент системы, и пользователи смогут обновить его независимо от производителя смартфона.

Интересно, что APEX не производит обновление «на живую», когда старый компонент заменяется на новый. Раздел /system в Android недоступен для записи, поэтому APEX использует трюк с монтированием. Все обновляемые файлы внутри пакета APEX находятся в образе файловой системы ext4. Когда происходит «установка» пакета, система монтирует этот образ поверх раздела /system в режиме bind. В результате файлы пакета как бы заменяют оригинальные файлы Android, хотя в реальности все остается на своих местах.

Точно такой же трюк использует Magisk для установки модификаций Android без изменения раздела /system. И его автор уже сказал, что APEX станет проблемой для Magisk.

Процесс «установки» пакета APEX
Процесс «установки» пакета APEX
 

Что внутри корейского Android

Hacking North Korea’s Android — презентация, посвященная взлому северокорейского смартфона Pyongyang 2407. Интересные факты:

  • В устройстве используется материнская плата WBW5511, такая же, как в BLU Life Play 2 и некоторых других смартфонах. Чипсет — Mediatek MT6582.
  • Как и многие другие устройства Северной Кореи, смартфон работает на устаревшей версии Android: 4.2.2 Jellybean с интерфейсом в стиле старых версий iOS.
  • Браузер залочен на местный интранет Kwangmyong. Wi-Fi отключен полностью, но имеется поддержка местных 3G/CDMA-провайдеров Koryolink, Kang Song и Byol.
  • Смартфон использует систему DRM, которая позволяет просматривать, прослушивать и читать файлы, либо созданные на самом устройстве, либо одобренные правительством Северной Кореи (для этого используются цифровые подписи RSA2048). Если закинуть видеоклип на карту памяти, устройство откажется его воспроизводить.
  • Система логирует все попытки открыть неподписанные файлы.
  • Проверка на доступ к файлам осуществляется на низком уровне (нельзя установить сторонний файловый менеджер и открыть файл), но ее легко взломать.
Pyongyang 2407 собственной персоной
Pyongyang 2407 собственной персоной
 

Разработчику

 

Несколько простых советов

Tips I wish I had when I started with Android apps — семь простых советов начинающему разработчику, с которыми я как более-менее опытный разработчик полностью согласен.

  1. Тщательно работай над каждой версией. Ты удивишься, увидев, что спустя несколько лет люди все еще используют версию приложения, которую ты выпустил вчера. Постарайся сделать так, чтобы эта версия даже через несколько лет работала стабильно: сохраняй совместимости API бэкенда и тщательно тестируй каждую новую версию.
  2. Сторонние магазины приложений — потеря времени. Публикация приложения за пределами Google Play тебе вряд ли что-то даст, но отнимет массу времени.
  3. Продажа приложения, возможно, не лучший способ его монетизации. Если ты собираешься посвятить поддержке своего приложения много времени, развивая его в течение нескольких лет, стоит подумать о монетизации с помощью подписки.
  4. Crash reporting — наше все. Обязательно используй сервис для сбора отчетов об ошибках или вкладку Android Vitals в консоли разработчика Google Play. Ты можешь сколь угодно долго тестировать приложение, но всегда найдется немало странных смартфонов, на которых оно будет крашиться.
  5. Не поддавайся соблазну заработать больше. Любой начинающий разработчик, приложение которого пользуется спросом, задумывается об интеграции большего количества рекламных баннеров и повышении цены. Будь осторожен, реклама не должна отвлекать и мешать использованию приложения. Иначе ты рискуешь потерять всю базу пользователей.
  6. Регулярно обновляй приложение. Забыв о своем детище на полгода-год, ты можешь удивиться, как трудно его обновить, если, например, изменятся правила Google Play. Библиотеки устаревают, инструменты обновляются, а ты получаешь множество несовместимостей одновременно.
  7. Слушай пользователей. Любой отзыв о приложении важен. Просто ответив на него, а еще лучше выполнив просьбу автора, ты можешь получить множество дополнительных установок и избежать деинсталляций.
 

Контекстно ориентированное программирование в Kotlin

An introduction to context-oriented programming in Kotlin — несмотря на громкое желтушное название, интересная и полезная статья об особенностях Kotlin, позволяющих решать задачи, для которых они, казалось бы, не предназначены.

Первая особенность — функции-расширения, которые позволяют добавить свой собственный метод в любой класс, независимо от того, есть у разработчика доступ к его исходному коду или нет (пример: fun String.doSomthing() {}). Вторая — блоки области действия, которые позволяют выполнять код в контексте того или иного объекта без указания его имени (пример: with (string) { doSomthing() }).

Объединив их вместе, мы получим неожиданный результат:

class B

class A{
    fun B.doBSomething(){}
}

fun main(){
    val a = A()
    val b = B()
    with(a){
        b.doBSomething() // Так можно
    }
    b.doBSomething() // А так нельзя
}

Но что это дает? Возможность писать код, который будет работать по-разному в зависимости от контекста. Взгляни на следующий пример:

interface NumberOperations{
    operator fun Number.plus(other: Number) : Number
    operator fun Number.minus(other: Number) : Number
    operator fun Number.times(other: Number) : Number
    operator fun Number.div(other: Number) : Number
}

object DoubleOperations: NumberOperations{
    override fun Number.plus(other: Number) = this.toDouble() + other.toDouble()
    override fun Number.minus(other: Number) = this.toDouble() - other.toDouble()
    override fun Number.times(other: Number) = this.toDouble() * other.toDouble()
    override fun Number.div(other: Number) = this.toDouble() / other.toDouble()
}

fun main(){
    val n1: Number = 1.0
    val n2: Number = 2

    val res = with(DoubleOperations){
        (n1 + n2)/2
    }

    println(res)
}

Этот код показывает, как выполнять математические операции над числами по правилам типа Double. Если программисту понадобится выполнить их по правилам другого типа, он может создать другой «контекст» и указать его в аргументе функции with.

 

Советы по работе с GitHub

8 Productivity Tips for GitHub — краткая статья с восемью дельными советами по работе с GitHub.

  1. Быстрый поиск по репозиторию. Открой любой репозиторий, нажми t и начни вводить имя файла. Появится выпадающий список, по которому ты сможешь перемещаться с помощью стрелок.
  2. Предложения в pull-реквестах. При комментировании pull-реквеста ты можешь предложить альтернативный код, разместив его в markdown-блоке кода с тегом suggestion.
  3. Удобная навигация по исходному коду. Chrome-плагин Octotree добавляет на страницы репозиториев сайдбар, с помощью которого можно «ходить» по репозиторию так же, как ты делаешь это в IDE.
  4. Прыжок к функции во время code review. Во время ревью кода из pull-реквеста ты в любой момент можешь нажать t и ввести имя функции, к которой ты хочешь переместиться.
  5. Постоянная ссылка на файл или каталог. При просмотре файла или каталога нажми y, чтобы получить постоянную ссылку, гарантирующую, что, даже если в будущем файл исчезнет из репозитория, его всегда можно будет найти по ссылке.
  6. Кто изменял файл? Просматривая файл, ты можешь нажать b, чтобы увидеть, кто и как давно изменял каждую строчку файла. Более свежие изменения будут отмечены более ярким цветом.
  7. Поиск по репозиторию. Нажми /, чтобы выполнить поиск по репозиторию. Аналог клика по строке поиска слева сверху.
  8. Шаблоны ответов. Если тебе надоело каждый раз писать один и тот же ответ в комментариях, просто создай заготовку с помощью опции Saved replies.
Сайдбар Octotree
Сайдбар Octotree
 

Читшит по стандартным функциям Kotlin


Источник: medium.com

 

Библиотеки

  • GradleKotlinConverter — скрипт для упрощения миграции файлов Gradle на Kotlin;
  • ChocoBar — расширенная кастомизированная версия снекбара (Snackbar), информационного сообщения в нижней части экрана;
  • syndication — написанная на Kotlin библиотека для парсинга фидов RSS 2.0 и ATOM 1.0;
  • CarMarker-Animation — анимация автомобиля, движущегося по карте;
  • Eiffel — легковесная библиотека для управления состояниями View с использованием Jetpack Architecture Components;
  • TrackEyes — приложение-пример, способное отслеживать движение глаз с помощью Google Vision API;
  • Kissme — мультиплатформенная Kotlin-библиотека для сохранения пар ключ:значение в зашифрованном виде (поддерживается Android и iOS);
  • Tri-State-Checkbox — чекбокс с тремя состояниями;
  • currency-edittext — EditText для ввода сумм в различных валютах.

Евгений Зобнин

Евгений Зобнин

Редактор рубрики X-Mobile. По совместительству сисадмин. Большой фанат Linux, Plan 9, гаджетов и древних видеоигр.

1 комментарий

  1. Аватар

    AseN

    11.02.2019 at 22:15

    «Ограничение на доступ к файлам на карте памяти. Сейчас, имея разрешения READ_EXTERNAL_STORAGE и WRITE_EXTERNAL_STORAGE, приложения могут читать всю карту памяти целиком»

    Забыли про SAF?

Оставить мнение

Check Also

Хроники битвы при Denuvo. Как «непробиваемая» игровая защита EA Origin оказалась пробиваемой

Защита от пиратства Denuvo пришла на смену SecuROM и связана с одним действующим лицом – Р…