Сегодня в выпуске: рассказ о решении некоторых проблем безопасности в Android Q, разбор работы новой системы обновления Android APEX, реверс северокорейского смартфона, введение в контекстно ориентированное программирование на Kotlin, а также советы по работе с GitHub и работе с Google Play Console.
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).
Теперь они рассказывают о более низкоуровневых вещах:
READ_CLIPBOARD_IN_BACKGROUND
. Без этого разрешения приложения не смогут читать буфер обмена, находясь в фоне, а получить его может только системный софт из состава прошивки.PACKAGE_ROLLBACK_AGENT
и MANAGE_ROLLBACKS
, а у команды pm
, позволяющей устанавливать и удалять приложения из командной строки, появится флаг --enable-rollback
. Это свидетельство, что добавится возможность откатиться до старых версий приложения.READ_EXTERNAL_STORAGE
и WRITE_EXTERNAL_STORAGE
, приложения могут читать всю карту памяти целиком, включая любые файлы, не принадлежащие самому приложению. Так сделано потому, что в картах памяти используется файловая система без разграничения полномочий, а также потому, что бесполезно разграничивать доступ на носителе, который в любой момент можно вынуть и прочитать все данные. Android Q позволит разграничить доступ к файлам на уровне их типов; появятся разрешения READ_MEDIA_AUDIO
, READ_MEDIA_VIDEO
и READ_MEDIA_IMAGES
.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. Пользователи получают обновление — все счастливы.
Таким же образом могут быть обновлены библиотеки и целые подсистемы. Уже сейчас в AOSP доступны пакеты с рантаймом ART («виртуальная машина», ответственная за запуск приложений) и библиотека криптографических алгоритмов conscrypt. В теории в пакет APEX можно упаковать практически любой компонент системы, и пользователи смогут обновить его независимо от производителя смартфона.
Интересно, что APEX не производит обновление «на живую», когда старый компонент заменяется на новый. Раздел /system
в Android недоступен для записи, поэтому APEX использует трюк с монтированием. Все обновляемые файлы внутри пакета APEX находятся в образе файловой системы ext4. Когда происходит «установка» пакета, система монтирует этот образ поверх раздела /system
в режиме bind. В результате файлы пакета как бы заменяют оригинальные файлы Android, хотя в реальности все остается на своих местах.
Точно такой же трюк использует Magisk для установки модификаций Android без изменения раздела /system
. И его автор уже сказал, что APEX станет проблемой для Magisk.
Hacking North Korea’s Android — презентация, посвященная взлому северокорейского смартфона Pyongyang 2407. Интересные факты:
Tips I wish I had when I started with Android apps — семь простых советов начинающему разработчику, с которыми я как более-менее опытный разработчик полностью согласен.
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
.
8 Productivity Tips for GitHub — краткая статья с восемью дельными советами по работе с GitHub.
t
и начни вводить имя файла. Появится выпадающий список, по которому ты сможешь перемещаться с помощью стрелок.suggestion
.t
и ввести имя функции, к которой ты хочешь переместиться.y
, чтобы получить постоянную ссылку, гарантирующую, что, даже если в будущем файл исчезнет из репозитория, его всегда можно будет найти по ссылке.b
, чтобы увидеть, кто и как давно изменял каждую строчку файла. Более свежие изменения будут отмечены более ярким цветом./
, чтобы выполнить поиск по репозиторию. Аналог клика по строке поиска слева сверху.Источник: medium.com
Читайте также
Последние новости