Android: хакинг, кодинг и прочая жесть @ezobnin
267подписчиков сейчас
0.0цитируемость
Русскийязык
Россиягео
Подписаться в Telegram
Данные обновлены 21.07.2020
Публикации всего: 50
Тут гугл решил закрутить гайки в Android основательно (https://android-developers.googleblog.com/2025/08/elevating-android-security.html) и как пример стран, которые поддержали инициативу тотального контроля, приводит Бразилию, Индонезию и Таиланд. И это очень смешно, потому что:
- Бразилия — страна, где суды в любой момент могут заставить мессенджер заблокировать целые каналы или даже заморозить сервис (Telegram, Twitter/X, теперь и Starlink/SpaceX попадали под раздачу).
- Индонезия — куча ограничений. Даже банальные сервисы вроде Steam, Epic Games или Yahoo у них в своё время блокировали, пока компании не согласились “зарегистрироваться”.
- Таиланд — у них тоже “цифровая безопасность” часто соседствует с политическими фильтрами.
А еще в пресс-релизе они сравнили тотальную верификацию разработчиков с проверкой паспортов в аэропортах как с чем-то хорошим. Браво! Мы все обожаем эти длинные очереди на паспортном контроле, идиотские вопросы и заполнение кучи бумажек.
Your Code Doesn't Have to Be a Mess - подборка советов как сохранить код чистым, понятным и не превратить его в кашу. Некоторые советы простые и даже очевидные (особенно для тех, кто понимает философию UNIX), но все мы постоянно о них забываем.
- Поставьте понятные цели. Четко сформулируйте цели и задачи, выполняемые вашим приложением. Запишите их, повесьте на стену и всегда посматривайте на них когда вам предлагают добавить новые функции.
- Добавьте ограничения. Сформулируйте также ограничения, которые должны быть применены к приложению, его функциям, используемым языкам и библиотекам. Это позволит не только сделать приложение более чистым и понятным, но и поможет вам мыслить более креативно.
- Говорите Нет. Поток запросов на новые функции и возможности никогда не иссякнет. Научившись говорить "Нет" вы не допустите разрастания кодовой базы во множество разных сторон.
- Удаляйте мусор. Регулярно проводите чистки кода. Удаляйте дебажный и неиспользуемый код, устаревшие и мало популярные функции; все, что не нужно в текущей версии приложения и может быть восстановлено из репозитория.
- Минимизируйте зависимости. Автор сторонних библиотек может перестать их поддерживать, поменять мировоззрение или сойти с ума. Всегда тщательно обдумывайте любую новую зависимость (а также по возможности оборачивайте вызовы сторонних библиотек в обертки, так их будет проще заменить).
Годный контент
Как определить годноту контента? Очень просто: годен тот контент, который дает полезные знания даже в тех областях, к которым он вроде бы не относится.
Две лучшие прочитанные мной книги по программированию называются: "Эффективная работа с унаследованным кодом" и "Высоконагруженные приложения: программирование, масштабирование, поддержка". Они принесли мне больше знаний и понимания профессии программиста, чем все книги по алгоритмам и чистому коду вместе взятые. И все это при том, что я почти не работал с legacy-кодом и не занимался программированием высоконагруженных систем.
Три черты современного пользователя
1. Знает слово "баг". Багом может быть все, что угодно, от функции, назначения которой он не понимает, до элемента поведения приложения, который ему не нравится. По мнению пользователя, баг, существующий на его устройстве, обязательно существует на всех остальных устройствах, а разработчик о нем знает, но слишком ленив, чтобы его исправлять.
2. Очень беспокоится за собственную конфиденциальность. Ожидает, что любые данные, к которым хочет получить доступ приложение, будут использованы в недобрых целях против него. При этом пользуется привязанным к аккаунту Google или Apple смартфоном, который каждую минуту передает на сервера в Колифорнии все, что только может передать.
3. В слове "техподдержка" видит только слово "поддержка". Ведь задача человека на другом конце не решать проблемы, а уверить пользователя в том, что проблема будет решена и сказать ему максимальное количество приятных слов: "Спасибо", "Ваше сообщение очень важно для нас", "Вы очень нам помогли". Честные ответы и не желание держать пользователя за идиота расцениваются как оскорбление.
Имена приложений и здравый смысл
Какое количество читателей этого блога используют (или использовали) мобильное приложение #WhoCalls? Вы когда-нибудь задумывались зачем в имени этого приложения стоит решетка? Да, она придает определенный шарм, но настоящая причина заключается в том, чтобы лончер и другие средства управления приложениями ставили его в начало списка (стандартные средства сортировки Java/Kotlin делают именно так).
Есть множество приложений, использующих ту же уловку. Их имена могут начинаться на знак @ или цифру. Есть приложения, которые вставляют в имя перенос строки (видимо чтобы на рабочем столе имя иконки выглядело солиднее). А есть просто везунчики: название 2GIS находится в начале списка просто потому, что у него такое название.
Более интересный пример: всем известный Magisk, вставляет в имя символы юникогда
\u0000. Этот символ ничего не значит, но он может сломать некоторые приложения, пытающиеся обнаружить наличие Magisk на устройствe используя поиск по имени.
К чему это я пишу? Да просто к тому, что если вы решили написать очередной менеджер приложений или любое другое приложение, работающее с другими установленными приложениями, то вам так или иначе придется иметь дело с этим безумием. Самый адекватный вариант в этом случае: откинуть все знаки вроде #, @ и т.д., преобразовать переносы строк в пробелы и отбросить непечатаемые символы UNICODE.An opinionated guide on how to make your Kotlin code fun to read and joy to work with - большой сборник советов по написанию чистого кода. Многое из них достаточно известны, но есть несколько не совсем очевидных.
1. Не используйте функцию let для управления потоком исполнения.
В коде на Kotlin можно часто увидеть примерно такие участки:
fun myMethod(nullableA: A?) {
nullableA?.let {
it.x()
it.y()
it.z()
}
}
Здесь let применяется как аналог конструкции if (nullableA == null) { ... }.
Такой код нарушает читаемость (просто потому что мозг быстрее реагирует на if в начале, чем на let в конце). Поэтому let стоит использовать только в выражениях присваивания и возврата значения. Например:
val protoClass = savedInstanceState?.getByteArray("protoValue")
?.let { ProtoClass.parseFrom(it) }
2. Используйте when вместо if в присваиваниях.
В Kotlin if .. else - это выражение, результат которого можно присвоить переменной:
val x = if (condition) {
0
} else {
1
}
Это действительно удобно, но взгляните как будет выглядеть тот же код после замены if на when:
val x = when {
condition -> 0
else -> 1
}
Код стал короче и понятнее.
3. Замените ?. проверкой на null.
Помните все эти ужасные цепочки проверок на null?
val x = a?.b?.c?.d?.eИногда кажется, что без них не обойтись, но зачастую оказывается, что проверять на null необходимо лишь первый элемент цепочки, тогда как ее остальную часть можно записать просто через точку:
if (a != null) {
val x = a.b.c.d.e
}
Выглядит намного приятнее, не так ли?High performance with idiomatic Kotlin - статья о о том, как писать высокопроизводительный код на Kotlin. В основном содержит достаточно очевидные советы: sequences вместо коллекций, инлайнинг функций, немутабельные переменные и т.д. Но интересна статья одним разделом, где автор приводит следующий пример.
Допустим у нас есть такой код:
fun titleStartsWithS(book: Book) = book.title.startsWith("S")
fun lengthOfTitleGraterThan5(book: Book) = book.title.length > 5
fun authorStartsWithB(book: Book) = book.author.startsWith("B")
val book1 = Book("Start with why", "Simon Sinek")
val book2 = Book("Dare to lead", "Brene Brown")
val books = listOf(book1, book2)
val filteredBooks = books
.filter(::titleStartsWithS)
.filter(::authorStartsWithB)
.filter(::lengthOfTitleGraterThan5)
В конце производится фильтрование коллекции книг по определенным критериям. Этот код вполне понятный, но неэффективный. Он целых три раза проходит по одной и той же коллекции books.
Один из вариантов улучшения кода будет таким:
books.filter(fun(book: Book) = titleStartsWithS(book)
&& lengthOfTitleGraterThan5(book)
&& authorStartsWithB(book))
Что ж, эффективность повысилась, но читаемость снизилась.
Гораздо более удачный вариант выглядит так:
inline infix fun <P> ((P) -> Boolean).and(crossinline predicate: (P) -> Boolean): (P) -> Boolean {
return { p: P -> this(p) && predicate(p) }
}
books.filter(
::titleStartsWithS
and ::authorStartsWithB
and ::lengthOfTitleGraterThan5
)
Здесь мы создаем инфиксную функцию-расширение and, с помощью которой может объединять результат выполнения нескольких функций, возвращающих boolean. В итоге код получается куда более читаемым и понятным.Теперь пользователям из России нельзя будет ничего купить в Google Play...
Украина - суверенное государство. Путин - агрессор. Россия - не Путин.
Все уже слышали о запуске Windows 11 на Pixel 6? Тут Mishaal Rahman рассказывает как это работает и как проделать почти то же самое на своем смартфоне. "Почти", потому, что вместо Windows 11 он показывает как запустить Linux в режиме полной виртуализации.
Вообще, возможность все это сделать появилась благодаря порту гипервизора KVM в Android 13. Того самого KVM, с помощью которого в Linux запускают другие линуксы и Windows. В данный момент гипервизор доступен только в Android 13, и только для смартфона Pixel 6 (Pro). Кроме того, потребуется разблокировать загрузчик, а затем активировать KVM с помощью fastboot. Далее можно запускать любой дистрибутив Linux (с поддержкой AArch64) с помощью менеджера виртуальных машин crosvm. Последний распространяется в модуле APEX и уже должен быть предустановлен на смартфон.
Rozetked
ВИЛСАКОМ РЕД / WYLSACOM RED
Библиотека программиста
[netstalkers]
Типичный программист
СТАС БОМБИТ