26 марта 2024 г.

RuStore и поддержка разных архитектур

 

Сам Signal знает?
    Не так давно в RuStore завезли Signal. И это (по крайней мере сейчас) оригинальное приложение. Я даже упоминал об этом на lor.sh, и люди посчитали, что это поддельное или пропатченное приложение. Но нет, обновление из RuStore без проблем установилось поверх существующего оригинального приложения, что означает, что это тоже оригинальное. Ну, либо VK смогли украсть закрытый ключ подписи, конечно.

    Всё было ничего до недавнего времени. Появилось обновление Signal, несовместимое с текущей версией. И я испугался, что VK пытается сейчас уже раздавать подделку, из-за чего и сел разбираться.

28 января 2024 г.

О паролях и парольных фразах

В бложике описал известную проблему консольного клиента mariadb, который не может сожрать пароль, длинее 80 символов: https://lor.sh/@umnik/111828511992647563 

Это привело к небольшому, но полезному спору. На одной стороне я, с фразой в более 90 символов, на другой стороне уважаемый (не ирония, не шутка) в своих кругах человек, считающий, что это бессмысленно. Кстати, рекомендую подписаться на канал этого человека, если вы связаны с ИБ, он правда хорош (нет, не реклама :); да и какая реклама, если у него почти 8k человек): https://t.me/infosecmemes

Предполагаю, что оппонент отталкивается от, в общем-то, правильного утверждения, что 18+ символов — это великолепный пароль, который уже не перебрать за разумное время.

19 марта 2023 г.

Обход режима MODE_IGNORED в app-op

Сообщение о проблеме

Подробное объяснение уязвимости CVE-2022-20551, исправленной в Android в феврале 2023 года.

Об AppOpsManager

Отслеживаем (логирование) и контроль доступа (разрешение, запрет) к критичным API системы происходит через механизм app-opов. App-opы (давайте просто app-ops во множественном числе и app-op в единственном) покрывают большой набор функциональности — от рантайм пермишенов до монитора состояния батарейки. Управление же всеми этими фичами, внутри, происходит через AppOpsManager

13 марта 2023 г.

Изменения Android 14

Это просто подбивка списка изменений с пояснениями, чтобы не скакать по статьям на официальном сайте. Хотя правильнее, конечно, читать оригинал.

Изменения, касающиеся всех приложений

Фото такого пирога с сайта рецептов

Здесь собраны изменения, которые задевают приложения, даже если их таргет ниже 14. Называется новая версия Android Upside-down cake — "перевёрнутый" пирог или "вверх ногами" или "наизнанку" — как угодно. В общем, суть в том, что после выпекания этот пирог переворачивают и то, что раньше было верхом пирога становится его дном. 

7 декабря 2022 г.

Об утечке ключей подписи Samsung и LG

Используя последние обновления,
вы в безопасности. А мы - Google, мы врать не станем


    Все уже слышали новость о компрометировании ключей подписи APK файлов некоторых производителей Android прошивок.

    Сам я не стал писать об этом даже в бложике на лорше, потому что был уверен, что сейчас новость будет из каждого утюга (и заодно привет и спасибо Саше, который изначально мне дал ссылку на оригинальный issue). В итоге и правда написали, но так, что читатели не осознали ситуацию и новость просто исчезла из инфополя за пару дней.

    Так что внесу чуть ясности в эту историю.

24 марта 2022 г.

Схема Мячина. Об утечке Яндекса и других

    Это копия сообщения из моего linked.in, потому что там неудобно читать.

    Итак, хотя никто этого не просил, предлагаю свой вариант, как не допустить утечки, подобной #Yandex. На заметку не только #DeliveryClub, но вообще всем (вот такой я самонадеянный и с распухшим эго).

    В чём проблема не только Яндекса, но 99,99999% фирм (и снова привет, кое-какой менеджер из кое-какой фирмы, ага) - они полагаются на то, что доступ к БД строго ограничен, а сотрудники - доверенные лица. Это, прошу прощения, говно. Никогда, никогда, НИКОГДА нельзя рассчитывать, что даже самый проверенный человек не станет "предателем".

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

    Итак, нарушитель - это сотрудник компании с доступом к БД. От этого нарушителя и отталкиваемся. Предлагаемый мной подход будет защищать от этой модели, но не защитит от нарушитеЛЕЙ, которые целенаправленно будут менять работу сервера и принимать MR друг друга в мастер, когда цель этих мёрджей будет в сливе данных.

Что требуется

  1. Курьер должен знать номер заказа, количество позиций заказа и адрес доставки + комментарии к доставке. Но не имени, ни телефона
  2. Сервер должен знать телефон курьера, номер и точный состав заказа и ваш телефон. Но ни вашего адреса, ни имени.

    Уже здесь видно, что имя не нужно никому, не так ли? Это первый очевидный косяк - зачем вы вообще хранили имя?!

  3. Администратор БД не должен получить доступ к номеру телефона, но должен получить к номеру заказа и данным курьера

Как это сделать

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

  1. Клиентское приложение сообщает, что будет формировать заказ
  2. Сервер присылает клиентскому приложению свой ключ
  3. Клиентское приложение в ответ даёт свой ключ серверу
  4. Оба они генерируют общий секрет
  5. Клиентское приложение отправляет заказ на сервер, зашифрованный общим секретом и в ответ получает номер заказа

    На этом этапе сервер знает состав заказа и его номер

  6. Сервер связывается с рестораном и создаёт с ним пару ключей с общим секретом 
  7. Сервер сообщает ресторану состав заказа, пошифрованный на этом секрете, а также номер заказа 
  8. Сервер связывается с курьером и создаёт с ним пару ключей с общим секретом 
  9. Сервер сообщает курьеру номер заказа, ресторан и количество позиций заказа, но не его состав

    На этом этапе ресторан знает номер заказа и его состав. При чём нумерация заказов для ресторана лучше пусть вообще не совпадает с номером клиента. Тогда утечка связки "номер у пользователя" и "состав" не позволит связать этот заказ с рестораном для типовых заказов. Потому что "бургер и кола" - слишком общий заказ


    Курьер знает номер заказа, с точки зрения ресторана, дабы его забрать. И знает количество позиций, но не состав заказа. Для него это просто коробки


  10. И курьер, и ресторан, оба сообщают серверу, что заказ забрали
  11. Сервер сообщает приложению пользователя о том, что курьер в пути
  12. Приложения клиента и курьера, оба, отправляют на сервер ключи и тот пересылает их им обоим. Сам сервер, разумеется, ключей не сохраняет.

    Здесь первое узкое место и здесь возможен ТОЛЬКО целенаправленный саботаж - все разработчики сервиса должны будут друг друга покрывать, дабы сделать мёрдж в мастер, который заставит сервак сохранять ключи


  13. Приложения курьера и клиента создают общий секрет
  14. Клиент сообщает серверу свой физический адрес, пошифрованный секретом из пункта выше
  15. Сервер не может его прочитать, т.к. у него нет секрета курьера и клиента. Он просто перешлёт некий блоб курьеру
  16. Приложение курьера дешифрует данные и может прочитать адрес
  17. Клиент, на общем с сервером секрете, шифрует номер телефона и сообщает его серверу
  18. Для общения в чате с клиентом курьер использует их общий секрет. Сервер не знает об их переписке. В случае разбирательств клинет покажет скриншоты. А если всё хорошо, нефига читать чужие сообщения
  19. Для телефонного звонка курьер звонит из приложения, а сервер проксирует звонок через себя. Верно и обратное - клиент к курьеру

    Итак, сейчас сервер знает номер телефона, номер заказа, состав заказа, телефон курьера и телефон клиента. Не знает имени и адреса.


    Курьер знает адрес, номер заказа, количество позиций заказа. Не знает состав заказа, имени и телефона клиента.


    Клиент знает номер заказа, состав. Не знает имени курьера, телефона курьера. Курьеры тоже люди и нефига их ФИО раскидывать туда-сюда.

  20. Курьер доставляет заказ и сообщает об этом серверу 
  21. Курьерское приложение уничтожает секрет пользователя и его адрес (который прочесть без секрета всё равно нельзя). Больше курьер не может общаться с пользователем никак. Любая связь только через Яндекс. И ЭТО ОЧЕНЬ ВАЖНО. Потому что таксисты любят писать после выполнения заказа девушкам. А иногда любят угрожать 
  22. Клиент подтверждает получение заказа. Его приложение уничтожает секрет с курьером 
  23. Сервер получает 2 подтверждения доставки 
  24. Сервер уничтожает адрес пользователя и его номер телефона. Но сохраняет состав заказа и общий секрет на некоторый срок. Этот срок - это срок возможного обжалования заказа. Скажем, 24 часа

   На этом этапе у курьера нет ничего о пользователе и заказе. Наверное, только номер, чтобы, если что, ТП Яндекса могла сказать "была жалоба по заказу 210". У курьера остаётся общий с сервером секрет, чтобы номер заказа и количество позиций можно было считывать в установленные 24 часа

    У сервера есть общий с курьером секрет и секрет общий с клиентом. Остаётся инфа о составе заказа и его номер, остаётся инфа о связи с рестораном. Это нужно для разбирательств ошибок. У сервера нет адреса клиента, имени и телефона

    У клиента остаётся состав заказа, номер и общий с сервером ключ. Теперь жалобы он подписывает этим же ключом, дабы сервер мог удостовериться, что это реально тот же заказ, ведь он и жалоба на одном ключе.

    Через 24 часа у клиента вытирается общий секрет. Он продолжает видеть свой заказ и номер, но уже не может пожаловаться.

    Сервер также вытирает общий ключ с клиентом, а также уничтожает оставшиеся данные с заказом. Ну или не уничтожает, потому что это БД и дорого. Прочесть их нельзя из-за вытертого ключа.

Конечный результат

  1. Никто никогда не знает имени
  2. Курьер никогда не знает телефон и не может писать в личку после выполнения работы
  3. Админ не может сдамить данные за полгода на сервере
  4. Сиюминутный SELECT * FROM DOSTAVKA содержит минимальную информацию и каждый заказ пошифрован на своём ключе, который живёт в другой таблице. Это будет просто шифрованный мусор

    Если Яндекс, или Деливери, или кто угодно возьмёт в работу эту схему (не в этом виде, а подгонит под свои запросы, конечно), назовите её "схема Мячина". Я про это никогда не узнаю, никто у вас не будет знает, кто такой Мячин. Но я буду про себя думать, что кому-то когда-то смог помочь.

22 января 2022 г.

Android устройство для ребёнка

Веб версия Family Link

     Все пользователи приложений родительского контроля под Android, это для вас. Сюда же тех, кто рассматривает такие приложение, но их отпугивает встроенная в них реклама и покупки. Суть этой записи в том, чтобы изначально правильно настроить устройство для ребёнка и отказаться от решений родительского контроля, которые будут так или иначе просить у вас денег.

    Важно понимать. Здесь рассматривается подход, когда у ребёнка своё собственное устройство, он не пользуется вашим. Если для вас такой подход непригоден, вы можете создать второй профиль на собственном устройстве и этого будет, в общем-то, достаточно. Если же у вашего ребёнка реально своё собственное Android устройство и, что здесь ОЧЕНЬ важно, оно использует учётную запись Google, то можете продолжить чтение.

    Как понять, использует ли прошивка в этом устройсте учётную запись Google? Если не понимаете, о чём идёт речь, то значит использует. Всё просто.

9 июля 2021 г.

Проект не собирается гредлом

    После очередного обновления системы (pacman -Suy в данном случае) у меня перестал собираться проект из командной строки:

➜  clicker git:(master) ✗ ./gradlew assembleAndroidTest assembleDebug
Starting a Gradle Daemon, 1 incompatible Daemon could not be reused, use --status for details
> Task :app:processDebugMainManifest FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:processDebugMainManifest'.
> Unable to make field private final java.lang.String java.io.File.path accessible: module java.base does not "opens java.io" to unnamed module @101d84f6

24 августа 2020 г.

Изменения Android 11, которые затрагивают все приложения

     Как всегда, я рекомендую читать оригинал, а не мой перевод: https://developer.android.com/preview/behavior-changes-all Кроме того, мне сказали, что читать всю простыню тяжело и люди хотят просто конкретики. Так что попробую в этот раз сделать не полный, а сокращённый перевод, опустив совсем уж технические детали.

    Однако, чтобы эта запись была более полезной, чем просто список фич, сюда же будет подтянут текст с расширенным объяснением того или иного изменения. То есть если у какого-то изменения есть своя статья (например, она есть у one-time permissions), то оттуда будет взято пояснение, что это такое и как работает.

17 декабря 2019 г.

Приложение не устанавливается, или устанавливается, но его не видно

Здесь можно включить поддержку нескольких профилей
    Буквально на днях у меня случилась аномалия, которой изначально я не придал значения. Ставлю приложение по adb, а оно не появляется в лончере. Делаю adb shell pm list packages, а его нет в списке установленных. Хотя установка проходит успешно! А сегодня ситуация усугубилась. Устанавливал другое приложение из файлового менеджера и получал ошибку установки. Хеш apk был правильный, приложение правильное, перезагрузка не помогала.

    Но на днях я включал другие профили в системе, хотя потом их удалил. Был у меня и профиль Гостя в Андроиде. И решил проверить подозрения.

7 августа 2019 г.

Ответ No changes detected в продуктах JetBrains при попытке сделать коммит

Якобы изменений нет
    Если вы столкнулись с ответом git «No changes detected» в ваших Android Studio,  PyCharm, Intelij IDEA PhpStorm и прочих, то это для вас. Другое проявление проблемы — когда вы пишете новый код или изменяете существующий, сбоку нет этих цветных полос, уведомляющих об изменённых участках кода.


10 апреля 2019 г.

MS TFS REST API через боль и слёзы

Первый подход к снаряду. Выглядит так себе
    Раскуриваю REST API у TFS и мне хочется выть. Нет, возможно это нормально для больших и ветвистых проектов, а мои знания в прошлые разы были слишком простыми, т.к. строились на несложных опен сорсных проектах типа STF https://github.com/openstf/stf и подобных. И из-за этого у меня сложилось ложное впечатлиение, что REST API, это когда просто потянул за верёвочку и всё тебе пришло или толкнул коробку с данными, которые быстро набросал туда и всё снова работает.

    Но Microsoft мне показал, насколько я неправ.

22 ноября 2018 г.

Когда в Android Studio отсуствует Module

    Ещё одна сверх короткая запись.
Этот модуль должен быть доступен сразу
Но если его нет, то, видимо, эта запись для вас

    Бывала ли у вас с Android Studio проблема, что проект нифига не собирается, в проект даже Android SDK не подключается, кнопка синхронизации с файлами Gradle недоступна, либо просто ничего не делает. И при этом Студия то и дело сообщает об ошибке
java.lang.IllegalArgumentException: Argument for @NotNull parameter 'message' of com/android/tools/idea/gradle/project/sync/GradleSyncState.syncFailed must not be null
    Вот так выглядит ситуация, когда проблемы нет. В случае воспроизведения этой ошибки здесь будет только 1.8 (ну или другая версия JDK) и всё:
Когда проблема решена


5 августа 2018 г.

Изменения поведений в Android P. Часть 2: от тегирования сокетов до ещё большего урезания Apache HTTP client (дважды!)

Последняя публичная бета
Дальше — релиз

     Эта статья является переводом второй половины вот этой: https://developer.android.com/preview/behavior-changes.html. Как всегда, я рекомендую читать оригинал.
    Перевод первой половины: https://myachinqa.blogspot.com/2018/04/android-p-1.html

   Теги сокетов

    До Android P, если сокет был затеган методом setThreadStatsTag(), то при использовании binder IPC с ParcelFileDescriptor контейнером для отправки сокета другому процессу, тег слетал.
    В Android P это поведение изменилось и теперь в этом сценарии тег сохраняется. Такое изменение может повлиять на оценки статистик сетевого трафика, если, например, получить их у метода queryDetailsForUidTag(). Чтобы вернуть старое поведение  вам нужно вызвать untagSocket() перед отправкой сокета другому процессу.

Сообщение о доступном объёме байтов в сокете

    Если вызвать метод available() после shutdownInput(), то будет возвращён 0.

Больше данных о сетях для VPN клиентов

    До версии платформы ниже Android P класс NetworkCapabilities сообщал ограниченный набор данных для VPN. Например, сообщал TRANSPORT_VPN, но не NET_CAPABILITY_NOT_VPN. Из-за этого разработчикам было трудно понимать, приведёт ли использование VPN к расходу средств пользователя. К примеру, проверка NET_CAPABILITY_NOT_METERED не определяла, поднят VPN на сети с оплатой трафика или же на безлимитной сети.
    Начиная с Android P, когда VPN вызывает метод setUnderlyingNetworks(), система просуммирует транспорты и свойства всех сетей, на которых запущено подключение и вернёт нормальную совокупность свойств этих сетей.

19 апреля 2018 г.

Почему мой новый Android телефон не поддеривает Quick Charge, но быстро заряжается на родной зарядке с Type C разъёмом?

То самое зарядное устройство
    Заказал я как-то на Aliexpress зарядное устройство на 5 портов — 4 просто мощных (до 15 Ватт) и одно QC 3.0. Устройство приехало, планшет на microUSB заряжало быстро. Быстро заряжает и Power Bank от Xiaomi. Но вот мои Pixel 2 и Nexus 5x заряжаются от него как от обычного зарядного устройства. Т.е. никаких 15/18 Ватт, максимум 7,5, т.е. даже не 8 Ватт. Но почему? Устройство ведь современное!
    tl;dr: я — дурак. Зарядка не может иметь выход не Type C. Деньги на ветер.


4 апреля 2018 г.

Изменения поведений в Android P. Часть 1: от доступа к датчикам до возможных проблем взаимодействия с сетью

    Эта статья является переводом первой половины вот этой: https://developer.android.com/preview/behavior-changes.html. Как всегда, я рекомендую читать оригинал.


    В Android P есть множество изменений поведения системы и большая их часть скажется на всех приложениях, вне зависимости от заявленного в них target. Разумеется, есть и такие изменения, которые будут применены только к тем приложениям, в которых объявлена поддержка Android P. Для максимальной ясности описания, эта запись будет разделена на несколько частей. В первой статье будет описана часть изменений, применимых ко всем приложениям, во второй статье будет продолжение описания этих изменений. В третьей статье будут описаны те изменения, которые коснутся приложений, заявивших поддержку Android P.

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

18 марта 2018 г.

Android P: Возможности и API. Ч. 2: от Анимации до Переворота

    Это продолжение перевода, начатой здесь: https://myachinqa.blogspot.ru/2018/03/android-p-api-1-wi-fi-rtt-imagedecoder.html Разумеется, я снова рекомендую во-первых читать оригинал, во-вторых дождаться финальной версии статьи. Пока делался перевод второй части, я уже увидел изменения, которые Google успел сделать за несколько дней. Думаю, к релизу их будет ещё несколько.
    Чтобы хоть как-то оправдать чтение моего перевода, а не оригинала, я добавил свои комментарии, помогающие прояснить некоторые возможные вопросы.

  Анимация

    В Android P появился новый класс для отрисовки и отображения анимированных GIF и WebP — AnimatedImageDrawable. Как и в ситуации с AnimatedVectorDrawable, анимацией в AnimatedImageDrawable управляет RenderThread. Операции декодирования RenderThread выполняет в рабочем потоке, потому они не мешают самому RenderThread. Благодаря такой реализации в вашем приложении могут быть анимированные изображения и при этом нет нужды заботиться их управлением или переживать, что они будут оказывать влияние на UI поток.

13 марта 2018 г.

Форматирование карты памяти как внутренней памяти. Возвращение Android Adoptable Storage

Получаем вот этот экран
    В Android 6, кроме прочего, появилась встроенная возможность форматировать карточки памяти как часть внутренней памяти — adoptable storage. Это отлично, это удобно. Конечно, мрази-производители убирали эту возможность, но МОЖЕТ БЫТЬ решение ниже может помогать и в случае таких производителей.

    В моём же варианте речь про Android Emulator. Дело в том, что
ещё недавно образы в эмуляторе позволяли форматировать «карты памяти» так, чтобы они становились внутренней памятью. Без этого вы не можете, к примеру, выполнить простое
adb push myDir /sdcard/

11 марта 2018 г.

Android P: Возможности и API. Ч. 1: от Wi-Fi RTT до ImageDecoder

Подсвечивание новых API

    Эта статья является переводом вот этой: https://developer.android.com/preview/features.html Как и всегда раньше, я рекомендую читать оригинал. Т.к. в оригинале 100% будут изменения текста, я буду обновлять и свою статью. Так что разумнее всего читать её после релиза. И эту, и оригинал — смотря что вам удобнее.
    Кроме того, здесь лишь половина от оригинала. Вторая часть находится под заголовком «ч. 2». Так и читать попроще, и корректировать точнее.

    В Android P вводится несколько отличных фишек для пользователей и разработчиков. Этот документ кратко описывает, что нового появилось именно у разработчиков.

    Для изучения новых API, прочтите отчёт по API diff или посетите страницу со списком всех Android API — на ней новые API подсвечены, чтобы их было проще увидеть.
    Также ознакомьтесь со страницей «Изменение поведений Android P» (TODO: когда переведу и эту страницу, ссылку заменю), чтобы прикинуть, в каких местах могли быть задеты ваши приложения.

7 марта 2018 г.

Android эмулятор не запускается с ошибкой PANIC: Missing emulator engine program for 'x86' CPU

Утилита имеет множество опций,
включая аргументы quemu
    Если вы привыкли запускать Android эмулятор из командной строки (а если не привыкли — рекомендую), то могли заметить, что в последних версиях она перестала запускать самые новые эмуляторы. Скажем, она не сможет запустить эмулятор Android 8.1 на Pixel 2.
    В моём случае возникает вот такая ошибка:
umnik@myachin: > emul @Pixel_2_API_27
PANIC: Missing emulator engine program for 'x86' CPU.
    Пусть вас не смущает emul. Это просто алиас на  $ANDROID_HOME/tools/emulator. В общем, если вы столкнулись с похожей проблемой, то вот решение.

24 февраля 2018 г.

PyCharm под Linux не сохраняет пароли и токены

Ну всё, заработало
    Если под вашей Kubuntu, openSUSE или любом другом дистрибутиве без GNOME установленный PyCharm/AndroidStudio/IDEA или иной продукт JetBrains не может никак сохранить пароль или токен от вашей любимой системы контроля версий, то, возможно, вы столкнулись с той же самой проблемой, что и я. В моём случае PyCharm Community не сохранял токен для GitHub, из-за чего я не мог удобно работать с ним.
    Решение супер простое. Нужно просто установить gnome-keyring. Всё, проблема решена. Теперь при сохранении пароля/токена поднимется запрос пароля кейринга, куда это пароль/токен и будет сохранён.

3 февраля 2018 г.

Проблема запуска Android emulator из командной строки

Хочется, но не удаётся
    Если вы попытались запустить эмулятор Android из командной строки и словили ошибку
ERROR:android/android-emu/android/qt/qt_setup.cpp:28:Qt library not found at ../emulator/lib64/qt/lib
для GNU/Linux или
emulator/qemu/windows-x86_64/qemu-system-i386.exe': No such file or directory
для Windows, то вам сюда.

5 января 2018 г.

Как работает Now Playing в Google Pixel 2

Now Playing распознал гимн СССР
    Да нет никакой тайны, как работает распознавание окружающей музыки в Pixel 2. Тут, скорее, интересны мелкие детали. Если вы не знаете, что такого особенного в Now Playing и чем это отличается от распознавание другими инструментами, тем же Ассистентом (Google Now для России, где ещё нет Ассистента) или же Google Music, то мне есть чем вас удивить. Ключевыми особенностями Now Playing в том, что оно во-перых работает оффлайн, ей не нужен Интернет, во-вторых ей не нужна специальная команда для начала распознавания трека.
    Если вас это заинтересовало хотя бы с точки зрения реализации, то добро пожаловать под кат.

24 декабря 2017 г.

Запуск эмулятора Android под *buntu

Когда эмулятор всё-таки запустился
    Короткая специфичная запись, которая сможет помочь сберечь ваши нервы. Если в вашей Ubuntu/Kubuntu/Xubuntu/Mint/etc. не запускается Android Emulator из Android Studio или IntelliJ IDEA, эта запись должна вам помочь.
    Почему Google не исправляет этот баг я не знаю. Он был записан ещё в 15 году, а я пишу эти строки в 17. 2017, если это важно, а то выяснится, что в 3017 баг всё ещё воспроизводится.

10 октября 2017 г.

Изменения в поведениях Android 8.0. Часть 2: Приложения с target Android 8.0 (API level 26)

    Перевод второй половины статьи https://developer.android.com/about/versions/oreo/android-8.0-changes.html. Свои комментарии я пометил курсивом. Как и ранее, я рекомендую читать оригинал.
Перевод первой части статьи: https://myachinqa.blogspot.ru/2017/09/android-80-1-target-api-level.html
 
    Эти изменения поведений затрагивают исключительно те приложения, у которых в targetSdkVersion указано Android 8.0 (API level 26) и выше. То есть если вы собираете приложение с таким параметром, вам нужно удостовериться, что оно поддерживает все эти изменения.

3 сентября 2017 г.

Изменения в поведениях Android 8.0. Часть 1: Приложения с любым target API level

   Перевод первой половины статьи об изменениях в Android 8.0. Как обычно, я рекомендую вам читать оригинал: https://developer.android.com/about/versions/oreo/android-8.0-changes.html Свои комментарии я пометил курсивом.
    Android 8.0 (API level 26), кроме новых возможностей и разных плюшек, некоторые привычные поведения системы и API. В этой статье описываются некоторые ключевые изменения, которые вам необходимо понимать и учитывать при разработке приложений.
   И хотя большинство этих изменений затрагивают все приложения и не важно, какая версия Android указана как target, есть и такие, которые повлияют лишь на те приложения, которые объявили в манифесте о готовности к Android 8.0. Для упрощения чтения, статья была разделена на две: приложения с любым target API level и приложения с target на Android 8.0.
   

21 мая 2017 г.

Представляем Treble: модульную основу для Android

    Статья является переводом вот этой запси в блоге для разработчиков под Android: https://android-developers.googleblog.com/2017/05/here-comes-treble-modular-base-for.html Как и всегда прежде, я рекомендую вам читать оригинал, если ваш уровень владения английским языком выше моего (наверняка это так).
    Сама запись важна хотя бы тем, что я пока не встречал упоминания об этом проекте нигде в Твиттере, Фейсбуке и Гугл Плюс. Единственный человек, который упоминал о нём — мой коллега, сидящий у меня за спиной. А между тем, это очень интересная фича. Впрочем, как и всегда, производители устройств её наверняка проигнорируют. Спойлер: Sony — молодцы.

    Мы, в Android team, считаем, что каждый сладкий (прим. перев.: буквально «сладкий», «десертный», если хотите; думаю, вы понимате, почему так) релиз — это причина сделать Android лучше для наших пользователей и партнёров по экосистеме. И каждый рах мы слышим от партнёров, создающих устройства, что обновление существующих устройств на новую версию Android чрезвычайно трудозатратно и дорого.
    При разработке Android O, мы очень тесно работали с изготовителями устройств и чипсетов, делали шаги к решению проблемы и теперь, с волнением, представляем вам Project Treble — самое большое низкоуровневое изменение в архитектуре Android на сегодня.

13 апреля 2017 г.

Изменения в работе с идентификаторами устройства в Android O

    Перевод записи https://android-developers.googleblog.com/2017/04/changes-to-device-identifiers-in.html

    В этой записи рассказывается о том, что вам грозит, когда пользователь обновится на Android O, если вы тем или иным способом пытаетесь этого пользователя распознавать, получать его ID. Как обычно, строго рекомендую читать оригинал, а не мой корявый перевод.


Изменения в работе с идентификаторами устройства в Android O

Posted by Giles Hogben, Privacy Engineer

    В Android O появляются некоторые улучшения, дабы помочь пользователю управлять доступом к своим идентификаторам. Эти улучшения включают:
  • Ограничение на использование постоянных (не сбрасываемых) устройство-зависимых идентификаторов
  • Обновление системой Wi-Fi стека, связанного с изменениями прошивки Wi-Fi чипсета на устройствах типа Pixel, Pixel XL и Nexus 5x для рандомизации MAC адресов во время сканирований сетей
  • Обновление в механизме, которым приложения запрашивали информацию об учётной записи и предоставление большего контроля над данными пользователя

16 июля 2016 г.

Что делать, если не нажимается кнопка «Разрешить» в Android

Запрос разрешения, без которого антивирус будет слепым и беззубым
    Если у вас на устройстве установлен Android 6, то вы уже много раз нажимали кнопку «Разрешить» / „Allow“. А некоторые из вас в июне 2016 года столкнулись с проблемой, что кнопка разрешения не реагирует на тапы, а запрет работает нормально. Этой достаточно короткой записью я попробую указать на причины проблемы и рассказать решение. Если вам нужно только решение и вы пришли сюда по запросу из поисковой системы, то вот оно: «Удалите приложения, использующие оверлей и написанные не руками, а жопой. Чаще всего жизнь портит вот этот файловый менеджер: https://play.google.com/store/apps/details?id=com.rhmsoft.fm»

    Если вам интересна причина этого поведения, то добро пожаловать в статью.

26 мая 2016 г.

Негативные сценарии тестирования

    Ииииииии... Это последняя запись из цикла! Она самая короткая, самая простая и практически целиком состоит из реальных историй. По возможности — глупо-смешных. Даже есть видео, снятое специально для записи вот прямо в момент написания. Свежачок-с. К сожалению, я не догадался снять скриншот с сообщением о падении Youtube клиента, он бы подошёл. Упал прямо при заливке того ролика, который вставлен в статью. Ладно, пусть будет мой экран блокировки.

    На старте тестирования, вне зависимости от того, новый это проект или такой, что его стоило бы уже похоронить, в целом всегда ясно, с чего начинать. Если, конечно, к момент старта тестирования ни одно из звеньев цепи не слажало. Обычно тестировщики вычитывают требования и прочие документы с нерусскими названиями, типа «БиЭрКью», «ЭсАрки» и «Юзер стори» и прикидывают, как написать тест кейс, чтобы он проверил выполенения всех этих документов. Это всё понятно, на поверхности и нет смысла на этом задерживаться. Но есть ещё поведение самого Android, о котором иногда не знают не то что аналитики, но даже архитекторы и некоторые разработчики. А помня, что с AOSP никто не работает, только с кастомами, таких особенностей всплывает довольно много. И я говорю не о стрессовых сценариях, когда памяти нет или батарейку внезапно вынули (как-то встречал негодование человека на терминал GNU/Linux, что тот не показывает пароль при вводе, а у него глючная клавиатура и он не понимает, вводит пароль или же это клавиатура снова не работает), а о штатном поведении кастомизации Android и даже поведении, заложенном в AOSP. То есть штатные поведения системы, которые могут отрицательно сказаться на тестируемом продукте. Так называемые, негативные сценарии.

9 мая 2016 г.

Android SDK. Тестируем по-настоящему!

    Эта запись — предпоследняя из всего цикла. Пожалуй, она самая скучная, однако она ближе всего к тому, что называется тестированием. И, мне кажется, она ещё и самая длинная. Я попытался разбавить всю эту скукоту наглядными примерами, скриншотами. Книги с картинками читают охотнее? По крайней мере популярные «блоггеры» (а я — популярный, у меня есть минимум 8 читателей, скоро продамся кому-нибудь и работать перестану!) часто ставят всякие картинки, возможно это и работает.
    Как бы то ни было, здесь можно получить минимальное понимание того, что есть в Android SDK и что из этого нужно тестировщику. А главное — зачем. Ещё тут есть море грамматических ошибок, наверное, так как писать большую часть текста приходилось ночью, а я по ночам люблю спать и после 22 часов, как правило, уже сплю.

    Уверен, вам было интересно узнать, во сколько я засыпаю. Читайте дальше, там ещё интереснее!

 Android SDK

    Мы подбираемся всё ближе и ближе к инструментам и методам тестирования. Инструменты для тестирования, а также всякий вспомогательный инструментарий, входит в состави Android SDK. Самые нужные компоненты из состава SDK, конкретно для тестировщиков, это инструменты SDK, они же SDK tools, инструменты сборки, они же Build tools (внезапно, да?) и инструменты платформы, они же Platform tools. Нет никакого смысла запоминать это. Я просто сказал названия папок из установленного пакета Android SDK:
Рис. 1. Содержание папки Android SDK
    В этих папках лежит много чего, но я расскажу про минимальный полезный набор.

14 апреля 2016 г.

Исследовательское тестирование как метод изучения Android

Картинка без смысла
    Вторая часть лекции рассматривает реальные проблемы на реальных устройствах. Все рассмотренные проблемы вызваны архитектурой системы, Если точнее, изменениями, которые вносят некоторые производители в архитектуру, а приложения ничего с этим сделать не могут, потому что не имеют возможности влиять на работу системы. Использовать буду только реальные ситуации и, по возможности, буду давать ссылки в баг-трекер Google, чтобы каждый мог убедиться, что это всё не выдумки.

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

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

    Все ключевые термины, что описано ниже, вы уже встречали в предыдущей статье из этого цикла. Теперь дополним понимание этих терминов с той стороны, которая называется «исследовательское регрессионное тестирование». Регрессионное здесь — потому что я буду описывать проблемы, которые появлялись из-за обновлений системы.

11 апреля 2016 г.

Android не запрашивет пароль в процессе загрузки устройства

До Android N Accessibility недоступен в процессе загрузки ОС

    На официальном форуме «Лаборатории Касперского» пользователь задал интересный вопрос, суть которого я, к своему стыду, не понял сразу и отправил человека не в то направление. К счастью, пользователь верно разобрался сам, а я потратил несколько минут выходных на то, чтобы докопаться до причины.

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

6 апреля 2016 г.

Основы понимания приложений

    Этой записью я открою короткий цикл длинных и скучных (не просто так же имя блогу дано!) статей о тестировании приложений под Android. Здесь теория, теория, теория, вперемешку с историями «из жизни», которые, конечно, наиболее ценны (для меня).
    Все статьи буду идти от очень общего к частностям. Это поможет сначала разобраться с тем, как всё работает, как устроено, как называется, а затем — жонглировать этими теоретическими знаниями. Например в этой, открывающей статье, я сначала расскажу вскользь о компонентах приложений, затем расскажу о них подробно, а затем — добавлю понимания, где можно найти эти компоненты. Так будет построена каждая последующая статья, но, кроме того, каждая последующая будет сильно завязана на каждую предыдущую. Так что если уж решили подтянуть уровень понимания Android и исследовательского тестирования приложений под Android, стоит читать всё.
    К чёрту, приступим!

    Программный код пишется, в основном, на Java. То есть вы можете писать на чём угодно, хоть на той же Scala, да хоть на Python. Но тут есть свои подводные камни, очевидные и не очевидные. Можно писать и на C и нативный код будет работать также быстро, как и Java (слова «быстро» и «Java» в одном предложении и даже нет слова «память», спешите видеть!), возможно даже быстрее, но это дороже в скорости разработки и затратах на сопровождение.
Итак, код пишется на Java. Далее Android SDK (Software Development Kit — набор средств для разработки) собирает код и все требуемые файлы ресурсов в файл APK (Android Application Package) — программный пакет Android, который суть — zip файл с расширением .apk. То, что это zip, легко убедиться, посмотрев на заголовок, где мы увидим буквы PK:
    Ну или «РК» — РосКом и многозначительное многоточие… Кстати, а кто помнит, какие буквы находятся в заголовках exe и dll файлов и что они означают? Это буквы MZ — инициалы Марка Зибовски, бывшего архитектора компании Microsoft, который был одним из создателей MS DOS. Он и разработал этот формат исполняемых файлов, который заменил собой устаревший .com. Пятиминутка бесполезных знаний!

15 марта 2016 г.

Trusty TEE (Безопасная среда выполнения Trusty)

    Вся статья является переводом вот этой: https://source.android.com/security/trusty/index.html. Как обычно, я предлагаю читать оригинал, так как в своём переводе я могу допустить ошибки. Этот записью планирую начать небольшой набор статей о том, как обеспечивается безопасность в Android, когда все разработки ещё не сломаны конечными производителями аппаратов. И первая статья — о TEE. Потому что даже про FDE нельзя рассказать, пока не усвоится вот это базовое знание.
    По возможности я вставлял поясняющие комментарии и ссылки на Википедию. Также старался избегать перевода терминов, если этот перевод уже не общепринят в русском языке. Потому по всему тексту будет TEE, а не БСВ.

Trusty TEE

    Trusty — это набор программных компонентов, поддерживающих на мобильном устройстве безопасную среду выполнения или, в оригинальной терминологии, — Trusted Execution Environment (TEE).

    Trusty состоит из:
  • Операционной системы (Trusty ОС), работающей на процессоре, поддерживающем TEE
  • Драйверов для ядра Android (Linux), обеспечивающих взаимодействие с приложениями, работающими под Trusty OS
  • Набора библиотек для системного ПО Android, обеспечивающих взаимодействие с доверенными приложениями, выполняемыми внутри Trusty OS, использующего драйверы ядра
Важно: В Trusty и Trusty API вносятся изменения.
Чтобы больше узнать о Trusty API, смотрите описание API. Примечание. Перевод описания возможно и будет, если в нём будут важные куски для понимания всего происходящего.

2 февраля 2016 г.

Экран блокировки с пустым паролем в Android — это не баг, а фича!

...на самом деле баг тут есть.
    В Android есть полезная (необходимая!) штука — FDE, то есть полное шифрование диска. Матчасть можно почитать здесь: https://source.android.com/security/encryption/. Ну или чуть позже в этом самом блоге, я планирую перевести статью. При использовании шифрования (в Nexus 6 и более новых, а также в некоторых устройствах сторонних производителей его предлагают использовать при первом же включении) у пользователя просят пароль*. Этим паролем устройство НЕ шифруется. И это уже интересное, так что здесь логично поставить кат.

17 января 2016 г.

В Google Play Developer Console появились промокоды

    Перевод вот этой статьи Google. Как обычно, рекомендую читать статью в оригинале, т. к. в своём переводе я могу ошибаться.

    За последние больше чем полгода в Google Play Developer Console было добавлено несколько новых инструментов, которые могут помочь в продвижении ваших продуктов. Фичи бета тестинга позволяют получить обратную связь от пользователями и помогают исправлять проблемы. В разделе экспериментов вы можете запустить A/B тестирование ваших приложений. Универсальные кампании для приложений и отчёты по активностям пользователей помогают расширять аудиторию за счёт понимания интересов пользователей и оценивать успешность маркетинга.

16 января 2016 г.

Не используйте aapt для удаления файлов из apk

    Очень короткая запись про то, что aapt не стоит использовать для модификации apk файлов, лучше 7z подтянуть или иное решение. А ещё лучше, конечно, свалить в Новую Зеландию или Таиланд на ПМЖ, чего уж тут. Открыт для ваших предложений =)

2 января 2016 г.

Chrome Custom Tabs

    Уже достаточно давно Google представила Custom Tab’ы. Чтобы не таскать конструкцию “custom tab” обзову их по своей сути – это управляемые вами (разработчиками) вкладки от браузера Chrome, но внутри ваших приложений, по типу WebView. Вы как бы заказываете у Хрома его возможности. Так что обзову их “клиентские табы”.
    Статья – перевод вот этой официальной статьи: https://developer.chrome.com/multidevice/android/customtabs Опубликован оригинал был давно, ещё 30 августа 2015, но популярности клиентские табы пока не получили. Лично у меня пока только одно приложение их использует – Talon for Twitter. А между тем это реально удобная вещь, возможности который сильно превышают возможности системного WebView. К тому же эта фишка работает быстрее ВебВью и загружается быстрее Хрома.

29 декабря 2015 г.

В Android аду есть специальное место для Samsung

    Это перевод вот этой записи: http://verybadalloc.com/android/2015/12/19/special-place-for-samsung-in-android-hell/. Как всегда, рекомендую читать в оригинале, если есть такая возможность.
    Отказ от отвественности: если вы здесь только чтобы услышать, как кто-то поносит Samsung, проматывайте вниз. И да, вы пришли по назначению.
    Если вы используете библиотеку поддержки appcompat (конечно же используете), то могли видеть вот такой стек трейс  с Статистике падений от устройств Samsung под Android 4.2.2:
java.lang.NoClassDefFoundError: android.support.v7.internal.view.menu.MenuBuilder
at android.support.v7.app.ActionBarActivityDelegateBase.initializePanelMenu(ActionBarActivityDelegateBase.java:991)
at android.support.v7.app.ActionBarActivityDelegateBase.preparePanel(ActionBarActivityDelegateBase.java:1041)
at android.support.v7.app.ActionBarActivityDelegateBase.doInvalidatePanelMenu(ActionBarActivityDelegateBase.java:1259)
at android.support.v7.app.ActionBarActivityDelegateBase.access$100(ActionBarActivityDelegateBase.java:80)
at android.support.v7.app.ActionBarActivityDelegateBase$1.run(ActionBarActivityDelegateBase.java:116)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:176)
at android.app.ActivityThread.main(ActivityThread.java:5299)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
at dalvik.system.NativeStart.main(Native Method)

15 ноября 2015 г.

Оптимизации Doze и App Standby

    Эта запись - неточный перевод статьи Google https://developer.android.com/training/monitoring-device-state/doze-standby.html. Обо всех найденных ошибках смело сообщайте - мне важно улучшить качество своих переводов.
    Начиная с Android 6.0 (API level 23), в Android добавлены две энергосберегающие технологии, которые увеличивают время жизни батареи, путём управление поведением приложений, когда устройство не подключено к источнику питания. Doze уменьшает потребление батареи откладыванием фоновых активностей приложений, использующих процессор и сеть, когда устройство не используется долгий период времени. App Standby откладывает использование процессора и сети приложениями, с которыми пользователь долго не взаимодействовал.
    Doze и App Standby управляют поведением всех приложений, работающих в Android 6.0 и выше, вне зависимости от того, используется TagetSdkVersion 23 или нет. Для обеспечения удобства взаимодействия пользователя с вашим приложением, протестируйте его в режимах Doze и App Standby и внесите необходимые корректировки в его код. Вся дополнительная информация под катом.

29 октября 2015 г.

Изменения в Android 6, часть вторая

    Это вторая часть перевода (первая здесь) и предупреждение тоже самое: читайте оригинал и сообщайте мне об ошибках

Изменения в Android 6.0: от букмарков до Android for Work

Условие: По тексту будет часто использоваться конструкция “Android 6.0 (API level 23)”. Её использует сам Google и, потому, использую и я. Возможно это поможет избежать ситуации, если в будущем Android 6 будет охватывать API других версий и если на одну версию API будет несколько версий Android 6.

23 октября 2015 г.

Изменения в Android 6, часть первая

    Эта запись - не точный перевод официальной статьи от Google: https://developer.android.com/intl/ja/about/versions/marshmallow/android-6.0-changes.html Если вы владеете английским языком на уровне, достаточным для комфортного чтения, лучше обратитесь к первоисточнику. Также мне будет полезно, если вы укажете на ошибки перевода, особенно в матчасти.

Изменения в Android 6.0: от пермишенов до выделения текста

    Условие: По тексту будет часто использоваться конструкция “Android 6.0 (API level 23)”. Её использует сам Google и, потому, использую и я. Возможно это поможет избежать ситуации, если в будущем Android 6 будет охватывать API других версий и если на одну версию API будет несколько версий Android 6.
   
Для реализации новых свойств и возможностей, Android 6.0 (API level 23) включает разнообразные изменения системы и изменение API. Этот документ освещает те из них, которые вам нужно понимать и которые затронут ваши приложения.
    Если вы ранее публиковали приложения под Android, будьте готовы, что изменения платформы заденут ваши приложения.

15 октября 2015 г.

Спасаемся от Андроидлокеров (Trojan-Ransom)

    Вчера ко мне обратился знакомый с проблемой, которая была когда-то популярна в Windows, а затем пришла под Android. На смартфоне работал троян-вымогатель. Он запускался вместе с самой системой и в течении трёх секунд показывал свой экран поверх всех прочих, полностью блокируя доступ к интерфейсу Андроида. Картинка справа - это как раз скриншот с моего тестового телефона. Реализовано это было штатной возможностью Device Admin. В отличие от обычных полноэкранных приложений, экран вымогателя нельзя было убрать нажатием Home или свайпом от области уведомлений и вниз. Собственно, это одна из тех возможностей, которые есть у приложения, использующего права DA.

    Однако избавиться от подобных троянов можно, если только они не заблокировали доступ паролем (хотя и здесь есть самая последняя надежда). Сделать это можно несколькими способами, но все они связаны с работой в командной строке, с подключением устройства по adb. И это не так уж сложно, даже если вы не знаете, что такое adb. И, прежде чем мы начнём, сразу скажу, где взять adb (кроме Android SDK). Вот здесь.

16 марта 2015 г.

Android Asset Packaging Tool: команды, параметры, вот это всё

    Страннота, но я не нашёл официальной документации для aapt на https://developer.android.com/. А между тем утилита нужная, когда речь идёт о работе с apk. Конечно, можно обойтись любым архиватором, но блин, кто его знает, какой баг притянет с собой этот архиватор в новой версии? В этом плане aapt мне видится более правильным.
    Итак (я вендоёб): aapt.exe 2> d:\aapt.txt и под кат.