Категория > Новости > Android: идентификация по обоям и security-новшества Android 12 - «Новости»
Android: идентификация по обоям и security-новшества Android 12 - «Новости»3-11-2021, 00:01. Автор: Parker |
Android 12 Release Notes — официальный документ команды разработчиков Google о новшествах платформы Android 12. Мы сосредоточимся исключительно на новых функциях безопасности. Ограничения на показ оверлеев. С новой версии Android больше не предоставляет разрешение на показ оверлеев (окон поверх экрана) автоматически для предустановленных приложений. Исключение сделано только для системных приложений, располагающихся в каталоге /system. ОС также налагает ограничения на оверлеи. Теперь приложения не могут использовать непрозрачные оверлеи, которые пропускают через себя нажатия (раньше с их помощью пользователя вынуждали нажать определенные элементы интерфейса, перекрыв их безобидным окном). Кроме того, приложения теперь могут попросить систему не показывать оверлеи поверх своих окон с помощью разрешения Возможность отключить 2G. Android 12 позволяет отключать поддержку сотовых сетей стандарта 2G в настройках смартфона, чтобы защититься от атак, использующих понижение до 2G. Улучшения Wi-Fi. Android 12 поддерживает WPA3 Hash-to-Element (H2E), WPA2/WPA3-Enterprise transition mode и Transition Disable indication. Разрешения на использование Bluetooth. Android 12 включает несколько новых разрешений для работы с Bluetooth:
Эти разрешения заменяют ранее применявшиеся разрешения Индикаторы камеры и микрофона. Как и iOS, начиная с 12-й версии Android будет показывать индикаторы использования микрофона и камеры в правом верхнем углу экрана. Идентификация Android-устройств по обоямHow Android Wallpaper Images Can Threaten Your Privacy — занимательная статья о том, как идентифицировать любое устройство с Android по установленным на экране обоям. Небольшое предисловие. Еще в Android 2.0 появился класс В той же Android 8.1 у класса Для демонстрации этой техники автор создал приложение и выложил его исходники на GitHub. РазработчикуКак избежать создания объектовEffective Kotlin Item 47: Avoid unnecessary object creation — статья о том, как сделать приложение чуточку быстрее, избавившись от ненужного создания дополнительных объектов. Основная идея: объекты — дорогое удовольствие. Они занимают память, а на их создание уходит хоть и совсем незначительное по современным меркам, но время. Поэтому даже виртуальная машина Java старается минимизировать создание дополнительных объектов. Например, можно было бы подумать, что две следующие строки должны быть разными объектами, но это не так (оператор
val str1 = "Lorem ipsum dolor sit amet"
val str2 = "Lorem ipsum dolor sit amet"
print(str1 == str2) // True
print(str1 === str2) // True
Виртуальная машина, видя два одинаковых объекта типа String, объединяет их в один объект. То же самое происходит с типами
val i1: Int? = 1
val i2: Int? = 1
print(i1 == i2) // True
print(i1 === i2) // True
Для хранения каждого объекта используется заголовок из 12 байт, который на 64-битных системах выравнен по 8 байтам. Так что в целом заголовок занимает 16 байт, плюс сама ссылка на объект. Это не так много, но, когда имеешь дело с большим количеством одинаковых небольших объектов, это играет свою роль. Например, На создание объектов также уходит время. Оно совсем небольшое при создании одиночных объектов, но может иметь серьезные негативные последствия, когда объектов много. Например:
class A
private val a = A()
// Benchmark result: 2.698 ns/op
fun accessA(blackhole: Blackhole) {
blackhole.consume(a)
}
// Benchmark result: 3.814 ns/op
fun createA(blackhole: Blackhole) {
blackhole.consume(A())
}
// Benchmark result: 3828.540 ns/op
fun createListAccessA(blackhole: Blackhole) {
blackhole.consume(List(1000) { a })
}
// Benchmark result: 5322.857 ns/op
fun createListCreateA(blackhole: Blackhole) {
blackhole.consume(List(1000) { A() })
}
Есть несколько способов избежать создания объектов. Один из них — использовать синглтоны. Например, в следующей реализации связного списка объект класса Empty создается при каждом создании списка, хотя он всегда один и тот же:
sealed class LinkedList<T>
class Node<T>(
val head: T,
val tail: LinkedList<T>
) : LinkedList<T>()
class Empty<T> : LinkedList<T>()
// Usage
val list: LinkedList<Int> =
Node(1, Node(2, Node(3, Empty())))
val list2: LinkedList<String> =
Node("A", Node("B", Empty()))
Просто заменим его синглтоном:
object Empty : LinkedList<Nothing>()
Еще один способ — использовать пул объектов. Так делает, например, библиотека поддержки корутин. Вместо создания потока для каждой фоновой задачи она поддерживает пул (по сути, массив) потоков и запускает код на уже подготовленном потоке. Простейшая реализация пула может выглядеть примерно так:
private val connections: MutableMap<String, Connection> =
mutableMapOf<String, Connection>()
fun getConnection(host: String) =
connections.getOrPut(host) { createConnection(host) }
Перейти обратно к новости |