<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" >

  <channel>
    <title><![CDATA[Все посты подряд / Android / Хабр]]></title>
    <link>https://habr.com/ru/hubs/android_dev/posts/</link>
    <description><![CDATA[Android – пишем под самую популярную мобильную ОС]]></description>
    <language>ru</language>
    <managingEditor>editor@habr.com</managingEditor>
    <generator>habr.com</generator>
    <pubDate>Thu, 30 Apr 2026 23:53:02 GMT</pubDate>
    
    
      <image>
        <link>https://habr.com/ru/</link>
        <url>https://habrastorage.org/webt/ym/el/wk/ymelwk3zy1gawz4nkejl_-ammtc.png</url>
        <title>Хабр</title>
      </image>
    

    
      
        
    

  

  
  <item>
    <title><![CDATA[Пост @ant3mc — Голосовые интерфейсы (+2) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1026518/</guid>
    <link>https://habr.com/ru/posts/1026518/?utm_campaign=1026518&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p> Кому нужен качественный и бесплатный движок синтеза речи в Андроид (работает оффлайн, на уровне системы) ?</p><p> Недавно в Гугл Плей появилось приложение<br> BookFusion Voice <br>которое даёт возможность установить нейро-голоса Piper в качестве системных. Соответственно, они будут доступны в любых приложениях.<br> Русских голосов 4, но хорошего качества из них один- “Irina”  (звучит заметно лучше, чем стандартные от Гугл).</p><p> Есть небольшая проблема- если установить несколько голосов, то могут быть проблемы с выбором конкретного (это зависит от приложения, которое использует синтез).</p> <a href="https://habr.com/ru/posts/1026518/?utm_campaign=1026518&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 22 Apr 2026 11:10:19 GMT</pubDate>
    <dc:creator><![CDATA[ant3mc]]></dc:creator>
      
      <category><![CDATA[синтез речи]]></category><category><![CDATA[оффлайн]]></category><category><![CDATA[tts]]></category><category><![CDATA[android]]></category><category><![CDATA[piper]]></category><category><![CDATA[offline]]></category><category><![CDATA[accessibility]]></category><category><![CDATA[доступность]]></category><category><![CDATA[bookfusion voice]]></category><category><![CDATA[voice]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @MaxRokatansky — Блог компании OTUS (+4) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/otus/posts/1009498/</guid>
    <link>https://habr.com/ru/companies/otus/posts/1009498/?utm_campaign=1009498&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>5 бесплатных уроков марта для мобильных разработчиков</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/55f/cd0/17b/55fcd017ba2a4c4ddddda98397079179.png" width="1800" height="980"></figure><blockquote><p>12 марта 20:00<br><strong>&gt;&gt;</strong> <strong>Профессиональные модульные тесты в Android: как тесты улучшают код</strong><br><sup>Открытый вебинар&nbsp;</sup><a href="https://otus.pw/2659/" rel="noopener noreferrer nofollow"><sup>курса</sup></a><sup> «Android-разработчик. Продвинутый уровень»</sup><br>Урок о том, как писать в Android осмысленные модульные тесты для ViewModel, репозиториев и бизнес-логики, чтобы они не маскировали проблемы, а реально улучшали архитектуру и поддержку кода. <a href="https://otus.pw/0K4n/" rel="noopener noreferrer nofollow">Записаться на урок</a></p></blockquote><blockquote><p>18 марта 20:00<br><strong>&gt;&gt; Пишем простой проигрыватель на SwiftUI</strong><br><sup>Открытый вебинар&nbsp;</sup><a href="https://otus.pw/DMZA/" rel="noopener noreferrer nofollow"><sup>курса</sup></a><sup> «IOS-разработчик»</sup><br>Соберете на SwiftUI простой медиапроигрыватель с интерактивным интерфейсом, освоите работу с локальными аудио- и видеофайлами в iOS и наметите путь к интеграции внешних сервисов. <a href="https://otus.pw/7VAh/" rel="noopener noreferrer nofollow">Записаться на урок</a></p></blockquote><blockquote><p>19 марта 20:00<br><strong>&gt;&gt; Современная архитектура приложения и внедрение зависимостей</strong><br><sup>Открытый вебинар&nbsp;</sup><a href="https://otus.pw/EWYM/" rel="noopener noreferrer nofollow"><sup>курса</sup></a><sup> «Android-разработчик. Продвинутый уровень»</sup><br>Разберемся, как выстроить Android-приложение на основе чистой архитектуры, связать слои через MVVM и настроить внедрение зависимостей с помощью Koin без лишней магии. <a href="https://otus.pw/W7LgH/" rel="noopener noreferrer nofollow">Записаться на урок</a></p></blockquote><blockquote><p>23 марта 20:00<br><strong>&gt;&gt; Навигация Pro-уровня в SwiftUI: как строить масштабируемые iOS-приложения без хаоса в переходах</strong><br><sup>Открытый вебинар&nbsp;</sup><a href="https://otus.pw/7ekz/" rel="noopener noreferrer nofollow"><sup>курса</sup></a><sup> «IOS-разработчик. Продвинутый уровень»</sup><br>Как в SwiftUI проектировать навигацию без архитектурного хаоса: отделять переходы от интерфейса, управлять deep link и модальными экранами, строить масштабируемую структуру приложения. <a href="https://otus.pw/nDtd/" rel="noopener noreferrer nofollow">Записаться на урок</a></p></blockquote><blockquote><p>25 марта 20:00<br><strong>&gt;&gt; Как писать Flutter-код так, чтобы ИИ правильно его дописывал</strong><br><sup>Открытый вебинар&nbsp;</sup><a href="https://otus.pw/ZiSu/" rel="noopener noreferrer nofollow"><sup>курса</sup></a><sup> «Flutter-разработчик»</sup><br>Поймете, почему искусственный интеллект ошибается при генерации Flutter-кода, и освоите приёмы, которые улучшат подсказки, повысят читаемость проекта и ускорят дальнейшую разработку. <a href="https://otus.pw/he47/" rel="noopener noreferrer nofollow">Записаться на урок</a></p></blockquote><p><em>Еще больше бесплатных уроков от преподавателей курсов по всем ИТ-направлениям можно посмотреть </em><a href="https://otus.pw/wbzs/" rel="noopener noreferrer nofollow"><em>в календаре мероприятий.</em></a></p> <a href="https://habr.com/ru/posts/1009498/?utm_campaign=1009498&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 13 Mar 2026 07:06:24 GMT</pubDate>
    <dc:creator><![CDATA[MaxRokatansky (OTUS)]]></dc:creator>
      
      <category><![CDATA[подборка уроков]]></category><category><![CDATA[бесплатные уроки]]></category><category><![CDATA[онлайн-образование]]></category><category><![CDATA[мобильная разработка]]></category><category><![CDATA[Android]]></category><category><![CDATA[flutter]]></category><category><![CDATA[lifelong education]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — Смартфоны (+4) — 10.03.2026 17:30]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1008670/</guid>
    <link>https://habr.com/ru/posts/1008670/?utm_campaign=1008670&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Открытый проект <a href="https://github.com/shiahonb777/web-to-app" rel="noopener noreferrer nofollow">WebToApp</a> позволяет превратить сайт в&nbsp;полноценное Android‑приложение прямо на&nbsp;саартфоне без&nbsp;ПК, Android Studio или&nbsp;знаний кодинга. Можно сделать приложение из&nbsp;обычного HTML‑сайта, React, Vue или&nbsp;Next.js. Также можно добавить иконку, включить блокировку рекламы и защиту приватности, тёмную тему, медиа‑инструменты и даже собственные скрипты.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/e3d/d25/c6d/e3dd25c6d1702c56d8c689dc7049ae99.png" width="1054" height="583"></figure> <a href="https://habr.com/ru/posts/1008670/?utm_campaign=1008670&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 10 Mar 2026 14:30:26 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[WebToApp]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — Смартфоны (+4) — 09.03.2026 14:41]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1008134/</guid>
    <link>https://habr.com/ru/posts/1008134/?utm_campaign=1008134&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Для&nbsp;Android вышло приложение‑брандмауэр <a href="https://github.com/AhmetCanArslan/ShizuWall" rel="noopener noreferrer nofollow">ShizuWall</a>, которое делает смартфон безопаснее: </p><ul><li><p>умеет полностью отключать доступ к&nbsp;интернету для&nbsp;выбранных приложений;</p></li><li><p>допускает к&nbsp;сети только избранные приложение;</p></li><li><p>запрещает фоновую интернет‑активность нежелательных приложений;</p></li><li><p>при&nbsp;этом никаких VPN‑туннелей и Root‑прав не&nbsp;требуется&nbsp;— всё работает из&nbsp;коробки;</p></li><li><p>бесплатно приложение на Kotlin доступно <a href="https://github.com/AhmetCanArslan/ShizuWall/releases/tag/v4.3" rel="noopener noreferrer nofollow">на&nbsp;GitHub</a>, есть версия и <a href="https://play.google.com/store/apps/details?id=com.arslan.shizuwall" rel="noopener noreferrer nofollow">в&nbsp;Google Play.</a></p></li></ul><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/bd0/644/86b/bd064486b2694443c43245f975fc1077.png" width="707" height="398"></figure> <a href="https://habr.com/ru/posts/1008134/?utm_campaign=1008134&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 09 Mar 2026 11:41:44 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[ShizuWall]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @AlfaTeam — Блог компании Альфа-Банк (+3) — 25.02.2026 12:08]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/alfa/posts/1003432/</guid>
    <link>https://habr.com/ru/companies/alfa/posts/1003432/?utm_campaign=1003432&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Как ускорить прогон с 3 часов до 12 минут?</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/7fb/898/1ae/7fb8981ae34730463309239e666e5078.png" width="780" height="436"></figure><p>Когда в Android-проекте ≈800 модулей и 37 000 unit-тестов, полный прогон на CI легко превращается в полдня ожидания. У нас было ровно так: больше 3 часов на полный запуск &nbsp;— и ощущение, что локально это вообще не вариант. А потом команда нашла настоящие причины тормозов и довела прогон до 12 минут.</p><p>В статье <a href="https://habr.com/ru/companies/alfa/articles/993352/" rel="noopener noreferrer nofollow">«37 000 unit-тестов против Gradle: как мы добились 12-минутного прогона»</a> конкретная инженерная история без магии. Приглашаем к чтению Android-разработчиков, техлидов и тех, кто отвечает за CI/скорость поставки. Тут много идей, которые можно примерить на себя!</p><p>Делитесь вашими подходами к решению проблем производительности в комментах)</p> <a href="https://habr.com/ru/posts/1003432/?utm_campaign=1003432&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 25 Feb 2026 09:08:04 GMT</pubDate>
    <dc:creator><![CDATA[AlfaTeam (Альфа-Банк)]]></dc:creator>
      
      <category><![CDATA[unit-tests]]></category><category><![CDATA[gradle]]></category><category><![CDATA[mockk]]></category><category><![CDATA[performance optimization]]></category><category><![CDATA[android]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @AlfaTeam — Блог компании Альфа-Банк (+2) — 24.02.2026 11:19]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/alfa/posts/1002912/</guid>
    <link>https://habr.com/ru/companies/alfa/posts/1002912/?utm_campaign=1002912&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Ахиллесова пята SharedPreferences</strong></p><p>Статья про то, о чём не спрашивают на собесeдованиях и не рассказывают на курсах по Android-разработке — о неявной особенности Android, которая влияет на деградацию производительности и приводит к невоспроизводимым ANR в вашем приложении.</p><p>SharedPreferences часто используют «по привычке» — сохранить токен, флажок, пару строк. Но в какой-то момент это начинает тормозить интерфейс и даже приводить к ANR, особенно если запись/чтение происходит не там и не тогда, где вы ожидаете. Автор делится измерениями производительности, показывает, как деградация превращается в потерю кадров при переходах между экранами, а затем сравнивает варианты.</p><a href="https://habr.com/ru/companies/alfa/articles/991556/" target="_blank" rel="noopener noreferrer nofollow" class="embed_link embed_layout-right"><div class="embed__thumb" style="background-image: url(&quot;https://habrastorage.org/getpro/habr/upload_files/f8c/d1a/a80/f8cd1aa808857f0d643926687626a216.png&quot;);"></div><div class="embed__caption"><div class="embed__caption-title"><span>Ахиллесова пята SharedPreferences и стоит ли внедрять Datastore как альтернативу</span></div><div class="embed__caption-description">В этой статье я расскажу то, о чём не спрашивают на собесeдованиях и не рассказывают на курсах по An...</div><span class="embed__caption-host">habr.com</span></div></a><p>Эта статья будет особенно интересна Android-разработчикам и тимлидам, которые уже сталкивались с мистическими ANR, просадками перформанса и фризами на слабых девайсах, а также тем, кто держит в приложении много сторонних SDK и хочет понимать, как неявные записи в SharedPreferences могут незаметно копить нагрузку.</p><p>Читайте статью <a href="https://habr.com/ru/companies/alfa/articles/991556/" rel="noopener noreferrer nofollow">«Ахиллесова пята SharedPreferences и стоит ли внедрять Datastore как альтернативу»</a></p> <a href="https://habr.com/ru/posts/1002912/?utm_campaign=1002912&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 24 Feb 2026 08:19:03 GMT</pubDate>
    <dc:creator><![CDATA[AlfaTeam (Альфа-Банк)]]></dc:creator>
      
      <category><![CDATA[SharedPreferences]]></category><category><![CDATA[Datastore]]></category><category><![CDATA[ANR]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — Облачные сервисы (+3) — 08.01.2026 17:58]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/983638/</guid>
    <link>https://habr.com/ru/posts/983638/?utm_campaign=983638&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Клиент YouTube для Android под названием <a href="https://github.com/prateek-chaubey/YTPro" rel="noopener noreferrer nofollow">Download YT PRO</a> весит всего 60 кБ (48 кБ в архиве). Приложение не требует Root-прав, убирает рекламу, даже спонсорскую. Видео не ставится на паузу, если свернуть приложение или заблокировать экран. Есть встроенный загрузчик видео и шортсов. Добавлен ИИ Gemini, который сразу сделает саммари даже часовых лекций и выдаст факты и советы по контенту.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/f6e/dba/c08/f6edbac08769401d75c52072e48c28c0.png" width="688" height="876"></figure> <a href="https://habr.com/ru/posts/983638/?utm_campaign=983638&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 08 Jan 2026 14:58:03 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[Download YT PRO]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @ant3mc — Android (+1) — 25.12.2025 18:31]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/980598/</guid>
    <link>https://habr.com/ru/posts/980598/?utm_campaign=980598&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>  Не нравится скроллить длинные тексты, поэтому искал веб-браузер для Андроид, в котором можно перелистывать  касаниями. Поиск и нейросети подсказали несколько вариантов, из которых часть оказалась  устаревшей или просто ошибочной. К примеру- в Mozila Firefox была такая встроенная возможность , но её убрали.<br> С остальными дело такое-</p><ol><li><p>У Firefox есть много расширений, среди них нашёл подходящий режим чтения с перелистыванием. Однако оно работало плохо .</p></li><li><p>EinkBro. Его пришлось ставить из APK. Тоже глючил.</p></li><li><p>UC Browser. Обещают такую функцию. Из Гугл Плей его удалили, но  в магазине Xiaomi он есть.  Среди разрешений требует возможность изменять системные настройки. Поэтому решил не устанавливать.</p></li></ol><p> 4. Наконец нашёл Via Browser. Очень маленький, но с богатыми настройками, среди них можно назначить на "длительные нажатия" на стандартные элементы  интерфейса( к примеру, на "вперёд") разные действия на выбор. Среди них есть и перелистывание.<br> Кроме того Via поддерживает скрипты и в режиме чтения очень хорошо сохраняет уже переформатированный текст( с крупным шрифтом) в PDF и MHT( даже сложные статьи с  Хабра).</p> <a href="https://habr.com/ru/posts/980598/?utm_campaign=980598&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 25 Dec 2025 15:31:14 GMT</pubDate>
    <dc:creator><![CDATA[ant3mc]]></dc:creator>
      
      <category><![CDATA[Android]]></category><category><![CDATA[веб-браузеры]]></category><category><![CDATA[чтение]]></category><category><![CDATA[доступность]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — Смартфоны (+4) — 09.12.2025 05:15]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/974688/</guid>
    <link>https://habr.com/ru/posts/974688/?utm_campaign=974688&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>В Telegram заработала система входа в аккаунт через Passkey, но только для российских номеров телефона. Ключевое преимущество Passkeys — возможность войти в аккаунт в одно касание, не вводя номер телефона и одноразовый код. </p><p>Как создать ключ: </p><ul><li><p>Убедитесь, что у вас последняя версия мессенджера (Android — 12.2.10; iOS — 12.2.3). </p></li><li><p>Как и вход по почте, новую функцию нужно предварительно настроить. Для этого откройте <em>Настройки › Конфиденциальность › Ключи доступа</em>. </p></li><li><p>Если пункт «Ключи доступа» отсутствует, то эта опция недоступна для вашего аккаунта. На текущий момент Passkeys доступны только для аккаунтов, к которым привязан российский номер. </p></li><li><p>Нажмите «Добавить ключ доступа» и подтвердите его создание. </p></li><li><p>Устройство может запросить код экрана блокировки или биометрию, чтобы разблокировать хранилище ключей. </p></li><li><p>Созданный ключ появится в списке.</p></li></ul><p> Как войти с помощью ключа: </p><ul><li><p>На актуальной версии Telegram для Android или iOS приложение автоматически предложит выбрать ключ доступа для входа. </p></li><li><p>Если это не происходит, через несколько секунд под заголовком «Номер телефона» появится ссылка «используйте ключ доступа», на которую следует нажать. </p></li><li><p>Нажатие на кнопку запустит ваш менеджер паролей, который предложит выбрать ключ, проверит вашу личность по лицу, отпечатку пальца либо PIN-коду экрана блокировки, а затем передаст выбранный ключ мессенджеру. </p></li><li><p>Ключ доступа выполняет функции как номера телефона, так и одноразового кода подтверждения одновременно.</p></li><li><p>Если вы включили двухфакторную авторизацию для аккаунта, вам потребуется ввести свой облачный пароль, который вы задали самостоятельно.</p></li></ul><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/0f7/1ab/5e6/0f71ab5e636eecfdefcf769e543a0fbc.jpg" width="2560" height="1920"></figure> <a href="https://habr.com/ru/posts/974688/?utm_campaign=974688&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 09 Dec 2025 02:15:23 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[telegram]]></category><category><![CDATA[passkey]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — Информационная безопасность (+4) — 08.12.2025 05:02]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/974312/</guid>
    <link>https://habr.com/ru/posts/974312/?utm_campaign=974312&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>В Telegram появилась опция авторизации через ключи доступа. Новая функция для Android и iOS под названием Passkey позволит входить в аккаунт без дополнительных подтверждений в виде СМС-кодов и паролей. Активировать ключи доступа можно в разделе «Конфиденциальность». Чтобы подключить функцию, нужно создать ключ и подтвердить личность с помощью сканирования лица (Face ID), отпечатка пальца (Touch ID) или код-пароля. Созданный Passkey будет храниться на устройстве. Функция поможет обойти ограничения при регистрации в мессенджере.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/db3/639/e0a/db3639e0a3860b3a6b3a23f812ac2a18.png" width="612" height="548"></figure> <a href="https://habr.com/ru/posts/974312/?utm_campaign=974312&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 08 Dec 2025 02:02:21 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[passkey]]></category><category><![CDATA[telegram]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @BHV_publishing — Блог компании Издательство БХВ (+2) — 14.11.2025 12:44]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/bhv_publishing/posts/966436/</guid>
    <link>https://habr.com/ru/companies/bhv_publishing/posts/966436/?utm_campaign=966436&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Здравствуйте, уважаемые читатели. Обращаем ваше внимание, что в блоге SSP-Soft вышел детальный обзор нашей новой книги о технологии <a href="https://habr.com/ru/companies/ssp-soft/articles/964728/" rel="noopener noreferrer nofollow">Jetpack Compose</a> для Android. Jetpack Compose (в книге разобрана версия 1.6) - это передовой инструментарий для Kotlin-разработчиков, предназначенный для проектирования и модернизации пользовательских интерфейсов, рассчитанных именно на работу с мобильными устройствами. В книге также рассмотрены основы языка Kotlin для Android и работа с Android Studio. Заказывайте <a href="https://bhv.ru/product/osnovy-jetpack-compose-razrabotka-prilozhenij-dlya-android-s-pomoshhyu-jetpack-compose-android-studio-i-kotlin/" rel="noopener noreferrer nofollow">книгу</a> у нас на сайте и читайте с удовольствием! </p><p>P.S. Эта книга - одна из наших лучших находок в области англоязычного самиздата, однако нас в целом интересует тема разработки на Kotlin. Если у вас есть гитхаб с черновиками, либо вы прямо сейчас готовите рукопись - не стесняйтесь написать об этом Валентину Холмогорову <a class="mention" href="/users/holmogorov">@Holmogorov</a>, Олегу Сивченко <a class="mention" href="/users/olegsivchenko">@OlegSivchenko</a>или просто в личные сообщения в этом блоге.</p><p>Спасибо вам за ваш интерес и Сергею Березину <a class="mention" href="/users/sergbe">@sergbe</a>за вышеупомянутую рецензию. </p> <a href="https://habr.com/ru/posts/966436/?utm_campaign=966436&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 14 Nov 2025 09:44:32 GMT</pubDate>
    <dc:creator><![CDATA[BHV_publishing (Издательство БХВ)]]></dc:creator>
      
      <category><![CDATA[jetpack]]></category><category><![CDATA[kotlin]]></category><category><![CDATA[мобильная разработка]]></category><category><![CDATA[ui]]></category><category><![CDATA[книги по программированию]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Finam_Broker — Графический дизайн (+3) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/finam_broker/posts/959806/</guid>
    <link>https://habr.com/ru/companies/finam_broker/posts/959806/?utm_campaign=959806&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Как я сделал blur и линзу в Jetpack Compose</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/981/6c2/08f/9816c208f3e4bec10a26454d49ef84d0.jpeg" width="1480" height="1000"></figure><p>Всем привет! Меня зовут Владимир, я мобильный разработчик в «Финам». В одном из недавних проектов нужно было добавить в интерфейс Jetpack Compose визуальные эффекты поверх контента, например размытый хедер или движущуюся «лупу».&nbsp;</p><p>Обычно такие приемы встречаются в играх, где весь экран — это фактически полотно для рисования OpenGL. В классической XML-разметке UI я с таким не сталкивался, поэтому пришлось довольно глубоко погрузиться во внутреннюю кухню Compose. Этот разбор может быть полезен тем, кто решает похожие задачи.</p><p>Сначала на Stack Overflow я нашел <a href="https://stackoverflow.com/questions/79513919/how-to-use-rendernode-in-jetpack-compose-to-create-frosted-glass-blur" rel="noopener noreferrer nofollow">неплохой пример</a> создания эффекта размытия на определенном участке экрана — к сожалению, это решение не было универсальным и зависело от верстки. Однако мое внимание привлекли два класса из фреймворка: <a href="https://developer.android.com/reference/android/graphics/RenderNode" rel="noopener noreferrer nofollow">RenderNode</a> и <a href="https://developer.android.com/reference/kotlin/androidx/compose/ui/graphics/layer/GraphicsLayer" rel="noopener noreferrer nofollow">GraphicsLayer</a>.&nbsp;</p><p>Если коротко, можно захватить часть экрана через GraphicsLayer, а в RenderNode записать контент. Но перед этим его можно обработать. После обработки метод drawWithContent() выводит результат в canvas.&nbsp;</p><p>Сначала я попытался модифицировать эффект размытия из ответа на Stack Overflow, затем сделал размытие в форме круга, который движется вслед за пальцем, и постепенно пришел к окончательному варианту с движущейся прозрачной линзой. Код для отрисовки эффекта я показал <a href="https://habr.com/ru/companies/finam_broker/articles/924802/" rel="noopener noreferrer nofollow">в статье</a>.</p><p>В результате можно получить эффект линзы, которая будет перемещаться за пальцем, если водить им по экрану.&nbsp;</p><p>Какие выводу я могу сделать:</p><ul><li><p>в Compose можно делать крутые визуальные эффекты, если покопаться в RenderNode;</p></li><li><p>это неочевидный, но мощный инструмент, он дает простор для кастомизации.</p></li></ul><p>Мой пример не самый изобретательный, но способ, <a href="https://habr.com/ru/companies/finam_broker/articles/924802/" rel="noopener noreferrer nofollow">который я показал</a>, открывает почти безграничные возможности для реализации визуальных эффектов в Android-разработке, чем мы в «Финам» и пользуемся очень активно в наших финтех-проектах. Итоговый результат оформил <a href="https://github.com/puritanin/ComposeRenderTest" rel="noopener noreferrer nofollow">в GitHub-репозитории</a> — берите и пробуйте в своих проектах.</p> <a href="https://habr.com/ru/posts/959806/?utm_campaign=959806&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 25 Oct 2025 11:00:30 GMT</pubDate>
    <dc:creator><![CDATA[Finam_Broker (Финам)]]></dc:creator>
      
      <category><![CDATA[kotlin]]></category><category><![CDATA[GraphicsLayer]]></category><category><![CDATA[RenderNode]]></category><category><![CDATA[UI effects]]></category><category><![CDATA[Blur effect]]></category><category><![CDATA[мобильная разработка]]></category><category><![CDATA[кастомные компоненты]]></category><category><![CDATA[графика в программировании]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @AlfaTeam — Блог компании Альфа-Банк (+4) — 24.10.2025 14:45]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/alfa/posts/959886/</guid>
    <link>https://habr.com/ru/companies/alfa/posts/959886/?utm_campaign=959886&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Открываем набор на бесплатное обучение по IT-направлениям по программе Альфа-Будущее Кампус</strong></p><p>Открываем новый набор на обучение по разным IT-направлениям в рамках образовательной программы&nbsp;<strong>Альфа-Будущее Кампус</strong>:&nbsp;</p><ul><li><p><strong><a href="https://bit.ly/4qolQNV" rel="noopener noreferrer nofollow">QA</a></strong></p></li><li><p><strong><a href="https://bit.ly/42UcJdW" rel="noopener noreferrer nofollow">Android-разработка</a></strong></p></li><li><p><strong><a href="https://bit.ly/47KQ45B" rel="noopener noreferrer nofollow">Бизнес-анализ</a></strong></p></li><li><p><strong><a href="https://bit.ly/4o9LMvs" rel="noopener noreferrer nofollow">Системный анализ</a></strong></p></li></ul><p>Сроки программ — от 3 месяцев до полугода, за которые вы научитесь создавать современные цифровые продукты под руководством ведущих экспертов Альфа-Банка в разработке, системной аналитике, QA и бизнес-аналитике.</p><p>Выбирайте курс, переходите по ссылке, изучайте программу и подавайте заявку. Успейте присоединиться до 27 октября! ❤️</p><blockquote><p><strong>Обучение бесплатно.</strong></p></blockquote><p>А если хотите узнать, есть ли польза от курсов, как проходит обучение (на примере факультета аналитики), и подойдет ли вам онлайн-обучение IT-специальности, читайте нашу статью по ссылке ниже. На примере факультета системной аналитики рассказали, как готовится программа, как проводятся собеседования с людьми и помогло ли ученикам обучение:</p><a href="https://habr.com/ru/companies/alfa/articles/695442/" target="_blank" rel="noopener noreferrer nofollow" class="embed_link embed_layout-right"><div class="embed__thumb" style="background-image: url(&quot;https://habrastorage.org/getpro/habr/upload_files/fce/e95/20b/fcee9520b8b73b13f09f1df2dec3f5b0.png&quot;);"></div><div class="embed__caption"><div class="embed__caption-title"><span>Можно ли стать аналитиком, отучившись в онлайн-школе?</span></div><div class="embed__caption-description">С каждым годом в наших командах появляется всё больше перспективных тестировщиков, разработчиков и а...</div><span class="embed__caption-host">habr.com</span></div></a> <a href="https://habr.com/ru/posts/959886/?utm_campaign=959886&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 24 Oct 2025 11:45:43 GMT</pubDate>
    <dc:creator><![CDATA[AlfaTeam (Альфа-Банк)]]></dc:creator>
      
      <category><![CDATA[обучение]]></category><category><![CDATA[курсы]]></category><category><![CDATA[альфа кампус]]></category><category><![CDATA[системный анализ]]></category><category><![CDATA[тестирование]]></category><category><![CDATA[андроид разработка]]></category><category><![CDATA[бизнес-анализ]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @AlfaTeam — Блог компании Альфа-Банк (+2) — 16.10.2025 09:31]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/alfa/posts/957014/</guid>
    <link>https://habr.com/ru/companies/alfa/posts/957014/?utm_campaign=957014&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Разбор полётов: вся правда о падениях Android-приложений</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/47a/9c3/101/47a9c310197e9eb5e5ac6b0723b080fd.jpg" width="780" height="436"></figure><p>Почему Android-приложение вылетает с ошибкой и что на самом деле происходит под капотом? Абакар, главный технический лидер разработки в Альфа-Банке, раскрывает наглядно и увлекательно этапы срабатывания необработанных исключений: от простого деления на ноль до глубоких слоёв архитектуры Android</p><p>В статье <a href="https://habr.com/ru/companies/alfa/articles/950280/" rel="noopener noreferrer nofollow">«Почему моё Android-приложение крашится?»</a> — понятные пошаговые разборы, примеры реальных трейс-лодов, ссылки на исходный код Android и даже инсайты, почему приложение лучше сразу завершить, чем пытаться спасти после критической ошибки.</p><p>Идеально для разработчиков, которые хотят разобраться в механике аварийных завершений своих приложений, настроить обработку ошибок и узнать, как глобальные обработчики реально работают в Android.</p> <a href="https://habr.com/ru/posts/957014/?utm_campaign=957014&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 16 Oct 2025 06:31:49 GMT</pubDate>
    <dc:creator><![CDATA[AlfaTeam (Альфа-Банк)]]></dc:creator>
      
      <category><![CDATA[crash]]></category><category><![CDATA[андроид]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @thank_accept — Android (+1) — 29.09.2025 16:59]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/951764/</guid>
    <link>https://habr.com/ru/posts/951764/?utm_campaign=951764&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Вспомнил холивары на первой работе на тему: что такое Activity?</strong><br><br>Тогда, среди Android-разработчиков, в моде была MVC и общение было примерно такое:<br><br>"Activity - это контроллер" -  говорили одни.<br><br>"Activity - это вью" -  говорили другие.<br><br>"Activity - это модель" -  <span class="habrahidden">так к сожалению никто не говорил, иначе было бы еще интереснее 😁</span><br><br>Позиции противоположные и бескомпромиссные, противостояние зацикливалось и вызывало бурю эмоций. Пока не договорились <span class="habrahidden">(читай как одни продавили других) </span><br><br><strong>Кто из них прав?</strong> <br><br>Никто. <br><br>Или и те и другие.<br><br><strong>Правильный же ответ такой:<br></strong><br>Я создатель приложения и какую роль я дам этому классу(Activity) такую он и будет выполнять.<br><br>Это если смотреть со стороны архитектуры приложения.<br><br>А если смотреть со стороны OS Android, то Activity - это интерфейс через который пользовательское приложение взаимодействует с операционной системой.<br><br>Вот и всё :)<br><br>P.S. <span class="habrahidden">А какие холивары вспоминаются вам?)</span><br><br></p> <a href="https://habr.com/ru/posts/951764/?utm_campaign=951764&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 29 Sep 2025 13:59:48 GMT</pubDate>
    <dc:creator><![CDATA[thank_accept]]></dc:creator>
      
      <category><![CDATA[android]]></category><category><![CDATA[activity]]></category><category><![CDATA[mvc]]></category><category><![CDATA[архитектура]]></category><category><![CDATA[холивар]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @thank_accept — Читальный зал (+3) — 26.09.2025 18:08]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/951062/</guid>
    <link>https://habr.com/ru/posts/951062/?utm_campaign=951062&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Пост о том как я разработчиков нанимал, история из жизни :)<br><br>Однажды мне написали из IT-компании что занимается разработкой решений для бизнеса под ключ, в общем аутсорс, и попросили меня помочь им с наемом.<br><br>У меня большой опыт в мобильной разработке, в основном нативный Android приправленный мультиплатформой на Compose Multiplatform и Flutter.<br><br>Руководитель компании попросил меня помочь сформировать команду Android-разработки на доработку и поддержку достаточно масштабного и сложного проекта X.<br><br>Проект тащил свое приятное но от того не менее сложное Legacy: многомодульность, Clean Architecture, DI, MVVM, Kotlin, Coroutines, Flow работа с БД и клиент-серверное взаимодействие - в общем популярный набор современного бизнес-приложения. <br><br>Строго говоря у меня было две задачи: <br>1. Помочь джуниору разобраться в проекте чтобы он мог уже что-то делать<br>2. Набрать команду нативных Android-разработчиков<br><br>Условия усложнялись тем, что компания что до этого разрабатывала проект не очень-то шла на контакт и обе стороны принимали друг-друга в штыки. По этому сам проект и задачи передавались со скрипом и негативными эмоциями, "проект теперь ваш, вот вы и разбирайтесь, мы сделали конфетку, там все понятно" - говорили одни, "у нас команда профессионалов и задачи задерживаются потому что вы написали чрезмерно сложный недо-код" - говорили другие, а владелец продукта говорил-  "ничего не волнует делайте как хотите за все уплочено" (бизнес и конкуренция как ни крути 😁)<br><br>На тот момент у компании уже было пару молодых Android-джуниоров и мидл на других проектах, плюс один на проекте X, и хотелось нанять еще крепких мидлов, сеньера, и парочку стажеров на проект. Эмоции эмоциями, а работа должна быть сделана, и чтобы ее сделать нужны люди способные её сделать за приемлемый оклад и другие печеньки от компании.<br><br>Ситуацию в целом обрисовал.. (хотя ситуация конечно масштабнее там еще и менеджмент с загонкой джунов и эйчар структура направленная на формирование командного духа и внутреннего обучения.. ( как я вижу из своего опыта и то и другое скорее мешает чем помогает в моменты когда надо работу работать и должно быть сделано еще вчера ). Вот хорошая метафора пришла: ситуация как в "Лебедь, Рак и Щука", воз - это работа, а все остальные это Лебедь, Рак и Щука.)<br><br>Идем дальше:<br><br>Эйчары стали лить на меня трафик из соискателей на должность Android-разработчика. И на протяжении 2-х недель я каждый день собеседовал по 2-3 кандидата, иногда 1-го. Уровень у всех очень отличался. Приходили как совсем свежие пирожки прямо после курсов, так и уже матерые обкатанные на серьезных проектах колобки. У меня был стек проекта и потому вопросы тоже считай были сформированы, диалог строился так: Привет-привет, расскажи про свой опыт, и от этого опыта погнали ветвиться по темам в сторону нужных компетенций и стека. С кем-то укладывались в 30-минут, с кем-то залипали на 2 часа. Т.е. с кем-то шли дальше в глубину, а с кем-то прошли по верхам и на этом все. <br><br>По одному только времени общения можно судить про уровень подготовки, если бы не одно но - попадались ребята подкованные на язык, они хорошо отвечали по темам, но это все пустые слова из документации не подкрепленные реальным опытом.<br><br>Чтобы как-то передавать то что я узнавал в процессе собеседования о кандидатах, мы ввели оценку, грубо говоря число от 1 до 5, насколько человек подходит на проект + моя рекомендация. Дальше уже другие люди делали какой-то оффер на работу, или не делали.<br><br>В итоге за 2 недели мы наняли 5 человек, + тот разработчик что изначально был на проекте с моей (и божьей) помощью вкатился в проект и начал работу по задаче.<br><br>На этом история не закончилась, их ждал неизбежный онбординг, притирка и командообразование, но это уже совсем другая история.. <br><br>Я еще пару недель занимался онбордингом на проекте + выступал адвокатом разработчиков + переводчиком с менеджерского на разработческий и обратно, та еще задачка 😁. <br><br>1-н нанятый стажер в итоге не потянул и отвалился, остальные 5-ро продолжили работу, уже без меня, а я отправился дальше :)<br><br></p> <a href="https://habr.com/ru/posts/951062/?utm_campaign=951062&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 26 Sep 2025 15:08:13 GMT</pubDate>
    <dc:creator><![CDATA[thank_accept]]></dc:creator>
      
      <category><![CDATA[кейс]]></category><category><![CDATA[история]]></category><category><![CDATA[наем]]></category><category><![CDATA[собеседования]]></category><category><![CDATA[опыт]]></category><category><![CDATA[онбординг]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @thank_accept — Android (+4) — 21.09.2025 19:46]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/949126/</guid>
    <link>https://habr.com/ru/posts/949126/?utm_campaign=949126&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Проблема:</strong> Кадровый голод по специалистам, и при этом рекордные количества откликов на вакансии.</p><p><strong>Причина:</strong> Плохая воронка наема специалиста (по аналогии с воронкой продаж, хорошие воронки способствуют продажам, а плохие нет), читай как - существующий процесс наема не помогает нанять специалиста, притом что специалистов на рынке более чем достаточно.</p><p><strong>Общее решение:</strong> Изменить процесс наема так чтобы он помогал нанять специалиста для решения задач бизнеса.</p><p><strong>Конкретные варианты решения:</strong></p><ol><li><p>Использовать зарекомендовавшие себя решения в других воронках\процессах получения чего-либо. Например сарафанное радио и нетворкинг, кумовщину и рефералки, при этом отказаться от существующих фильтров в пользу доверия на старте.</p></li><li><p>Устранить причину мешающую текущему процессу наема. Например сократить цепочку ЛПР-ов на пути соискателя до оптимума. </p><p><span class="habrahidden">(Сейчас это авто-скрипт, эйчар(или ряд эйчаров), собеседующий специалист(или ряд специалистов), представитель команды(или ряд представителей), опционально тут еще какие-то посредники, и вот тут уже можно выйти на работу и работать 😁. Причем на каждом этапе у лже-ЛПР-ов есть цель отсеять человека на основании формального фильтра. Тогда как лучшие работники обычно "неформалы" ибо они про работу работать как Стив Возняк, а не про продукт(себя) продавать как Стив Джобс. Очевидно что не каждая птица долетит даже до середины.. 😢)</span></p><p>Оптимум - это ван ту ван, один ЛПР-соискатель на одного ЛПР-нанимателя. Собеседовать можно сколько угодно, но в конце один ответственный человек собирает всю информацию в кучу <span class="habrahidden">(и это не оценки и выжимки специалистов, а прям сесть и посмотреть портфолио,  видео собеседования, пересказ нейронки прочитать как минимум по этому видео, переписку, на свою текущую ситуацию по задачам и срокам посмотреть и т.д.)</span> и на основе всех имеющихся данных принять полноценное решение.</p><p>ЛПР - это тот кто принимает решение что считает лучшим на этот момент, а не тот который работает по прописанному скрипту <span class="habrahidden">(иначе это не ЛПР, а человек которого настоящий ЛПР назначил отрабатывать строго по скрипту 😜)</span>.</p></li><li><p>Устранить еще одну причину мешающую процессу наема. Например монолитность условий для прохождения собеседования. Можно искать пол жизни рыцаря на белом коне, до момента когда ни конь ни рыцарь уже будут не нужны, а можно взять то что само приползло и докрутить его под свои хотелки уже здесь и сейчас <span class="habrahidden">(то что само приползло должно быть согласно на докрутку, чтобы ни одно живое существо не пострадало в процессе наема 😁).</span></p></li></ol><p>P.S. <span class="habrahidden">Все 3 варианта решения на самом деле про одно и то же, только заход с разных сторон: убрать не то что мешает обрабатывать заявки на чиле, в пол уха, левой пяткой, а убрать то что действительно мешает нанять сотрудника для решения конкретных задач. (Да стало много спама, ну и что? Разве то что много спама говорит о том что среди спама нет специалистов способных делать работу? Нет. Как раз таки в этом и заключается задача\работа нанимателя - нанять сотрудника в этих конкретных условиях. Ну да, придется поработать. Соискатель, наниматель и работодатель в одной лодке как ни крути, если кто-то не хочет грести, то далеко ли уплывет такая лодка?🛶)</span></p><p>Хорошего дня, наема и трудоустройства!</p><p>Обнял 🤗</p> <a href="https://habr.com/ru/posts/949126/?utm_campaign=949126&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sun, 21 Sep 2025 16:46:49 GMT</pubDate>
    <dc:creator><![CDATA[thank_accept]]></dc:creator>
      
      <category><![CDATA[работа]]></category><category><![CDATA[наем]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @thank_accept — Android (+4) — 20.09.2025 17:25]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/948902/</guid>
    <link>https://habr.com/ru/posts/948902/?utm_campaign=948902&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Дело не в том как ты проходишь собеседование</p><p>Дело в том хочет человек тебя нанять или нет</p><p>Т.е. проходишь ты дальше или нет основывается не на твоих желаниях и знаниях, а на желаниях и знаниях собеседующего</p><p>Так что не парься, будь счастлив 😁</p><p>Воспринимай собеседования не как путь именно к этой работе, а как путь к чему-то вообще :)<br><br>В любом случае этот шаг делает тебя на шаг ближе к цели<br><br>Если ты не прошел собес, то выбор простой: сражайся с этим или наслаждайся этим, и даже если сражаешься, то насладись сражением 😁<br><br>P.S. <span class="habrahidden">И так во всём..</span></p> <a href="https://habr.com/ru/posts/948902/?utm_campaign=948902&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 20 Sep 2025 14:25:35 GMT</pubDate>
    <dc:creator><![CDATA[thank_accept]]></dc:creator>
      
      <category><![CDATA[размышления]]></category><category><![CDATA[собеседования]]></category><category><![CDATA[путь]]></category><category><![CDATA[поиск работы]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @thank_accept — Читальный зал (+3) — 10.09.2025 09:21]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/945520/</guid>
    <link>https://habr.com/ru/posts/945520/?utm_campaign=945520&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Я проснулся, делал зарядку и размышлял о поиске работы, и вот что я осознал:</p><p>Эйчары не понимают бизнес.</p><p>Бизнес не понимает эйчаров.</p><p>Эйчары не понимают технарей.</p><p>Технари не понимают эйчаров.</p><p>Бизнес не понимает технарей.</p><p>Технари не понимают бизнес.</p><p>Как следствие - эйчары нанятые бизнесом чтобы нанять непонятных для них технарей, нанимают еще хуже чем нанял бы бизнес, потому что эйчары не понимают ни бизнес, ни технарей. <br><br>Делегирование делегированием, а эффективность эффективностью.</p><p><strong>Еще:</strong></p><p>Бизнес конкурирует с бизнесом.</p><p>Эйчары конкурируют с эйчарами.</p><p>Технари конкурируют с технарями.<br><br>И все конкурируют со всеми.</p><p>Как следствие - на технических собесах технари с обеих сторон стремятся доминировать друг над другом. Так как решение о наеме принимает собеседующая сторона, то она имеет преимущество над соискателем и ему приходится подстраиваться. <br><br>Как следствие, на технических собеседованиях не может быть никакой объективной оценки, идеальный кандидат здесь - не человек который решает реальные задачи, а человек который идеально подстраивается под собеседующих. <br><br>И служит такое техническое собеседование больше не для того чтобы помочь бизнесу решить свои задачи, а для того чтобы не пустить сильных конкурентов в команду и набрать более слабых и лояльных конкурентов, согласных и похожих на человека собеседующего. Это работает на подсознательном уровне.</p><p><strong>Выводы:</strong></p><p>Собеседования которые проводит не "бизнес" - не помогают бизнесу найти нужных людей, а наоборот мешают ему это сделать.</p><p>Бизнес который делегирует наем рано или поздно оказывается в положении "свой среди чужих, чужой среди своих", фактически самым ценным ресурсом компании - людьми - теперь владеет не Бизнес, а Технарь и HR.</p><p>Такие дела.<br><br><strong>Вот еще интересные мысли о наеме, с которых все началось:</strong><br><br>Бизнес строит воронку наема, из эйчаров и технарей, в несколько этапов, и вроде все логично, происходит отсев неподходящих и выбор подходящих.<br><br>Первичный отсев простейший и почти не требует затрат. Затраты начинаются на этапе собеседований. Фактически компания тратит силы, время и деньги на каждое собеседование.<br><br>Понимают ли они то что происходит во всей полноте? Похоже что нет, иначе процесс был бы устроен другим образом.<br><br>А происходит следующее: соискатель приходит на собеседование, обучается на нем правильно отвечать на вопросы, если проходит то устраивается на работу, если не проходит, то идет на следующее собеседование, и так пока не устроится.<br><br>Т.е. фактически компания которая дала отказ соискателю, затратила ресурсы, обучила соискателя, и передала его другой компании. Вот что происходит на самом деле.<br><br>В итоге человек все равно будет работать и решать технические задачи что ставит компания, иначе он и не пошел бы на собес в эту компанию, но, делать это он будет в другой компании.<br><br>А теперь вернись к началу, вероятно теперь станет понятно откуда взялись такие тезисы :)<br><strong><br>P.S.</strong> Похоже всё это не является проблемой только потому, что получается микро-коммунизм в  наеме. Одна компания обучает соискателей для другой, и та в свою очередь делает так же. По сути работает не система наема в компании, а побочные эффекты от нескольких систем наема разных компаний.<br><br><span class="habrahidden"><strong>Откуда такие мысли:</strong><br><br>Я уже 12 лет как в теме, и устраивался на работу сам, и искал людей на свои проекты, и собеседовал как технарь(в Android разработке) на проекты бизнеса. В общем я пощупал этого слона с разных сторон, и теперь когда я снова в активном поиске - это сложилось в объемную картину.</span></p> <a href="https://habr.com/ru/posts/945520/?utm_campaign=945520&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 10 Sep 2025 06:21:07 GMT</pubDate>
    <dc:creator><![CDATA[thank_accept]]></dc:creator>
      
      <category><![CDATA[наем]]></category><category><![CDATA[hr]]></category><category><![CDATA[hr-процесс]]></category><category><![CDATA[hr-технологии]]></category><category><![CDATA[осознание]]></category><category><![CDATA[инсайт]]></category><category><![CDATA[бизнес]]></category><category><![CDATA[бизнес-процессы]]></category><category><![CDATA[технарь]]></category><category><![CDATA[android development]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @KonishchevDmitry — Android (+2) — 07.09.2025 12:53]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/944712/</guid>
    <link>https://habr.com/ru/posts/944712/?utm_campaign=944712&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>WhatsApp сканирует сеть?</strong></p><p>Совершенно случайно наткнулся на интересное:</p><p>У меня дома стриггерился алерт: мой домашний сервачок (он же роутер) помимо всего прочего отслеживает количество уникальных от-forward'енных <code>$src_ip + $dst_ip + $dst_port</code> – и алертит, когда их количество превышает некоторый порог.</p><p>И вот за последние сутки с моего телефона + телефона жены 2560 + 4082 уникальных пар <code>$dst_ip + $dst_port</code> (где <code>602x22</code> ниже – это соединения на 22 порт на 602 разных IP-адреса):</p><pre><code>kate-mobile.lan (4082 IP+port pairs): 3117 TCP (1534x443, 602x22, 261x80, 237x554, 220x53, 29x23, 28x983, 21x553, 20x179, 12x1443, 9x5222, 6x5228, 4x4460, 4x21, 2x571, 2x9243, 2x240, 2x383, 2x185, 2x260, 2x299, 2x237, 2x336, 2x131, 2x512, 1x464, 1x734, 1x4416, 1x371, 1x10, 1x863, 1x895, 1x759, 1x815, 1x178, 1x830, 1x271, 1x838, 1x707, 1x629, 1x174, 1x1003, 1x894, 1x3237, 1x887, 1x962, 1x603, 1x855, 1x241, 1x494, 1x540, 1x181, 1x352, 1x454, 1x373, 1x654, 1x56, 1x646, 1x175, 1x876, 1x810, 1x556, 1x395, 1x483, 1x697, 1x212, 1x34, 1x588, 1x348, 1x605, 1x680, 1x460, 1x401, 1x224, 1x143, 1x161, 1x104, 1x655, 1x872, 1x521, 1x459, 1x911, 1x705, 1x317, 1x377, 1x807, 1x323, 1x893, 1x866, 1x142, 1x1001, 1x170, 1x920, 1x843, 1x209, 1x463, 1x156, 1x569, 1x952, 1x701, 1x184, 1x597, 1x389, 1x647, 1x8543, 1x487, 1x624, 1x537, 1x814, 1x259, 1x578, 1x26, 1x904, 1x751, 1x652, 1x795, 1x234, 1x671, 1x45, 1x4477, 1x307, 1x635, 1x651, 1x227, 1x806, 1x752, 1x203, 1x220, 1x582, 1x568, 1x153, 1x844, 1x402), 965 UDP (379x443, 278x53, 116x554, 83x123, 38x22, 22x23, 7x2002, 6x983, 4x179, 2x4123, 2x512, 2x21, 2x553, 1x363, 1x652, 1x654, 1x1003, 1x299, 1x307, 1x377, 1x680, 1x807, 1x804, 1x966, 1x685, 1x240, 1x463, 1x655, 1x806, 1x45, 1x383, 1x336, 1x153, 1x260, 1x28, 1x241, 1x603)
mobile.lan (2560 IP+port pairs): 1899 TCP (814x443, 405x22, 171x554, 168x80, 160x53, 23x983, 18x179, 18x1443, 15x23, 10x553, 9x5222, 6x21, 5x7275, 3x5228, 2x19302, 1x759, 1x37, 1x629, 1x685, 1x581, 1x582, 1x10000, 1x142, 1x250, 1x846, 1x125, 1x872, 1x657, 1x8543, 1x604, 1x90, 1x727, 1x567, 1x911, 1x739, 1x810, 1x4477, 1x866, 1x26, 1x491, 1x10, 1x156, 1x626, 1x178, 1x422, 1x977, 1x155, 1x12, 1x402, 1x683, 1x21007, 1x306, 1x595, 1x184, 1x4416, 1x472, 1x14, 1x904, 1x166, 1x165, 1x753, 1x988, 1x4434, 1x11, 1x28, 1x317, 1x622, 1x535, 1x718, 1x686, 1x637, 1x207, 1x244, 1x153, 1x7000, 1x8443, 1x966, 1x383, 1x5223, 1x985, 1x161, 1x994, 1x395, 1x898, 1x39, 1x592, 1x6447), 661 UDP (307x443, 168x53, 81x554, 36x123, 24x22, 10x23, 6x983, 6x179, 4x19302, 3x553, 3x21, 1x153, 1x685, 1x626, 1x155, 1x592, 1x19000, 1x491, 1x306, 1x472, 1x125, 1x8443, 1x28, 1x966)
</code></pre><p>Поставил себе <a href="https://play.google.com/store/apps/details?id=com.emanuelef.remote_capture" rel="noopener noreferrer nofollow">PCAPdroid</a> на телефон, и выяснилось, что WhatsApp (я им совсем не пользуюсь – установлен по необходимости):</p><ul><li><p>За последний месяц съел 23 MB Wi-Fi трафика.</p></li><li><p>За <strong>сегодняшний день</strong> съел 92 MB Wi-Fi трафика.</p></li><li><p>Постоянно открывает соединения на разные IP и всякие мутные порты (ssh, ntp, ftp).</p></li></ul><p>Хотелось бы верить, что это какая-то очередная защита от блокировок или вроде того, но, учитывая недавние истории про <a href="https://habr.com/ru/articles/915732/" rel="noopener noreferrer nofollow">слежку за пользователями на Android</a>, что-то не очень верится. :)</p><p>Как-то более глубоко исследовать эту ситуацию, честно говоря, нет желания (да и наверняка он подобными сканированиями занимается только изредка, чтобы не привлекать к себе лишнего внимания) – поэтому всё выше написанное исключительно JFYI, без каких-либо интересных подробностей.</p><p>P.S.: Большая просьба не воспринимать это как очередную рекламу в пользу всем известного мессенджера, который сейчас активно продвигается – все совпадения случайны.</p> <a href="https://habr.com/ru/posts/944712/?utm_campaign=944712&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sun, 07 Sep 2025 09:53:18 GMT</pubDate>
    <dc:creator><![CDATA[KonishchevDmitry]]></dc:creator>
      
      <category><![CDATA[безопасность]]></category><category><![CDATA[сканирование портов]]></category><category><![CDATA[слежка за пользователями]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @atomlib — Android (+4) — 06.09.2025 16:11]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/944572/</guid>
    <link>https://habr.com/ru/posts/944572/?utm_campaign=944572&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Кормак Хэйден&nbsp;— владелец Oasis, приложения для iPhone и смартфонов на Android, которое публикует якобы научно обоснованные рейтинги воды и фильтров, опираясь на результаты лабораторных тестов и открытые данные. Плату берут за, как утверждается, доступ к части функций, чтобы финансировать независимые (без рекламы) анализы. На сайте проекта <a href="https://www.oasishealth.app/tap-water" rel="noopener noreferrer nofollow">ведётся</a> раздел с рейтингами бутилированной воды и фильтров, поиск по водопроводной воде по городам США, а также возможность заказать домашние тест-наборы для отправки проб в лабораторию.</p><p>В личном микроблоге Хэйден <a href="https://x.com/cormachayden_/status/1963643566443601957" rel="noopener noreferrer nofollow">опубликовал</a> лаконичный пост. В нём он в три слова и две кавычки пожаловался, что его давно просили сделать приложение для Android, но финансовый результат Кормака разочаровал.</p><figure class=""><img src="https://habrastorage.org/webt/ct/na/1r/ctna1rogbdlwgfzvn0nsgvxzgog.jpeg" alt="cormachayden_" title="cormachayden_"><div><figcaption><a href="https://x.com/cormachayden_/status/1963643566443601957" rel="noopener noreferrer nofollow">cormachayden_</a></figcaption></div></figure><p>В комментариях Хэйдену <a href="https://x.com/HiiJax/status/1963714826619765104" rel="noopener noreferrer nofollow">указали</a>, что кнопка покупки на Android попросту была сломана. Кормак <a href="https://x.com/cormachayden_/status/1963736507124232677" rel="noopener noreferrer nofollow">ответил</a>, что локально на его машине всё работает. На самом деле ситуация ещё более смешная.</p><p>Оплата на Android в Oasis действительно сломана, это так. Однако в регионе США всё работает, <a href="https://x.com/cormachayden_/status/1963822020078235957" rel="noopener noreferrer nofollow">указывает</a> Хэйден. Это будет относительно легко пофиксить. Забавно именно то, что поправить уже нельзя: база данных данных Oasis крайне похожа на открытую закраудсорсенную базу данных OpenFoodFacts, а схожие же функции <a href="https://x.com/6thumbs/status/1963739271115997479" rel="noopener noreferrer nofollow">даёт</a> бесплатное приложение Yuka. Кстати, Oasis по дизайну UI сильно напоминает Yuka.</p><p>Один из комментаторов даже <a href="https://x.com/data_ccelerator/status/1963720882167128355" rel="noopener noreferrer nofollow">назвал</a> Oasis всего лишь фронтендом OpenFoodFacts. Кормак <a href="https://x.com/cormachayden_/status/1963735787008319878" rel="noopener noreferrer nofollow">парировал</a>, что в данных последней тяжёлых металлов и ПФАС нету и что Oasis собирает и публикует лабораторные данные, а Yuka якобы устарела, часто ошибается и не включает лабораторные измерения. Впрочем, в комментариях <a href="https://x.com/RedDevi52539977/status/1963735990238900443" rel="noopener noreferrer nofollow">спросили</a>, не заполняет ли Oasis эти значения случайными числами. Один из микроблогеров <a href="https://x.com/janderson45/status/1963792877521191332" rel="noopener noreferrer nofollow">заметил</a>, что на двух скриншотах у бренда Fiji стоит <a href="https://x.com/cormachayden_/status/1963741978501521850" rel="noopener noreferrer nofollow">разная оценка</a>.</p><p>На самом деле часто данные Oasis вводят в заблуждение. В комментариях к твиту <a href="https://x.com/GabyStanAcc/status/1963854689562140782" rel="noopener noreferrer nofollow">нашли</a> ошибки в выставленных предельно допустимых концентрациях: в приложении часто занижены ПДК относительно рекомендуемых властями США, и в реальности представленные количества вредных веществ представлять угрозу <a href="https://x.com/LaissezLucas/status/1963739882968190999" rel="noopener noreferrer nofollow">не могут</a>. Зато эта дополнительная строгость к чистоте на три–четыре порядка ниже ПДК позволяет резко критиковать разные бренды за наличие в них мышьяка и тяжёлых металлов.</p><p>Хэйден резок в суждениях. В ответ на критику он <a href="https://x.com/cormachayden_/status/1963760565412917293" rel="noopener noreferrer nofollow">заявил</a>, что стандарты собеседника в отношении еды и здоровья устарели. Остряки на это <a href="https://x.com/chandlerseita1/status/1963770110205948104" rel="noopener noreferrer nofollow">заметили</a>, что его Oasis допускает грубые грамматические ошибки уже в описании в каталоге приложений.</p><p>Наконец, секретом финансового успеха может быть банальный обман пользователей. Один из комментаторов <a href="https://x.com/shhjawline/status/1963697731492352445" rel="noopener noreferrer nofollow">указывает</a> на тестовый период, который может запутать. Триал длится три дня, а затем начинают списывать по $4,99&nbsp;в неделю. Возможно, что часть пользователей удаляет приложение и просто забывает отключить эту подписку.</p><p>Вызывает вопросы сама цена. Есть ли смысл платить по $30&nbsp;ежегодной подписки за привилегию сравнивать разные бренды бутилированной воды? И вообще, заслуживает ли статуса отдельного приложения то, что может быть страницей в Интернете?</p> <a href="https://habr.com/ru/posts/944572/?utm_campaign=944572&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 06 Sep 2025 13:11:06 GMT</pubDate>
    <dc:creator><![CDATA[atomlib]]></dc:creator>
      
      <category><![CDATA[Android]]></category><category><![CDATA[iOS]]></category><category><![CDATA[iPhoneOS]]></category><category><![CDATA[мобильные операционные системы]]></category><category><![CDATA[операционные системы]]></category><category><![CDATA[бутилированная вода]]></category><category><![CDATA[вода]]></category><category><![CDATA[ПДК]]></category><category><![CDATA[приложения]]></category><category><![CDATA[монетизация]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — Информационная безопасность (+3) — 04.09.2025 19:50]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/944014/</guid>
    <link>https://habr.com/ru/posts/944014/?utm_campaign=944014&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Разработчик (Mobile Developer) и программист Алексей Гладков попытался независимо изучить компоненты мессенджера Max.</p><iframe id="68b9c32f589625dedabe57a7" src="https://embedd.srv.habr.com/iframe/68b9c32f589625dedabe57a7" class="embed_video embed__content" allowfullscreen="true"></iframe> <a href="https://habr.com/ru/posts/944014/?utm_campaign=944014&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 04 Sep 2025 16:50:35 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[мессенджер]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @rolagg — Android (+3) — 30.08.2025 03:00]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/942208/</guid>
    <link>https://habr.com/ru/posts/942208/?utm_campaign=942208&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Почему разработчикам опенсорсных приложений для Android может не потребоваться подтверждать свою личность</strong></p><p>Недавно Google <a href="https://habr.com/ru/news/940716/" rel="noopener noreferrer nofollow">анонсировала</a>, что скоро смартфоны на базе Android будут работать только с приложениями, чьи разработчики подтвердили свою личность непосредственно Google. Но как это будут проверять? Напрашивается проверка по ключам подписи, но погодите-ка…</p><p>Если вы более-менее интересуетесь опенсорсом, наверняка вы слышали про “магазин” F-Droid. Что примечательно в нём — все приложения в его главном (единственном по умолчанию) репозитории собираются из исходников и подписываются одной сущностью — F-Droid. Эта особенность делает данный источник приложений уникальным в своём роде — в Google Play или RuStore каждый разработчик собирает и подписывает приложение сам.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/0a3/301/615/0a330161553de1b2c255bf78d33a79d1.png" width="1022" height="385"></figure><p>Если Google не передумает и действительно введёт блокировку на “анонимных” разработчиков, вполне возможно, что F-Droid просто создаст единый аккаунт для своего ключа подписи, и продолжит спокойно предоставлять приложения даже на “сертифицированных” Android-девайсах.</p><p>Но наверняка вы скажете, что там распространяются приложения, неугодные Google, и будете правы. Однако они и так ломаются каждый месяц самой же корпорацией ввиду открытых исходников этих приложений и способов парсинга контента без официального API. Так что, думаю, обойдётся.</p><p>Что думаете?</p> <a href="https://habr.com/ru/posts/942208/?utm_campaign=942208&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 30 Aug 2025 00:00:47 GMT</pubDate>
    <dc:creator><![CDATA[rolagg]]></dc:creator>
      
      <category><![CDATA[f-droid]]></category><category><![CDATA[open source]]></category><category><![CDATA[android]]></category><category><![CDATA[google]]></category><category><![CDATA[sideloading]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @DolgopolovDenis — Android (+1) — 20.07.2025 17:45]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/929342/</guid>
    <link>https://habr.com/ru/posts/929342/?utm_campaign=929342&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>🎲 Retrofit 3.0 — что изменилось?</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/6ad/b9e/f77/6adb9ef773357b24bf50de3ed5cb06ce.png" width="1000" height="540"></figure><div class="floating-image"><p><em>При поддержке блога </em><a href="https://t.me/dolgo_polo_dev" rel="noopener noreferrer nofollow"><em>@dolgo_polo_dev</em></a></p></div><p>Вышел Retrofit 3.0.  А точнее в один день вышло 2 версии — Retrofit 3.0 и 2.12</p><p>Библиотека важная, поэтому попробовал разобраться, что изменилось</p><p>Самое интересное случилось в 2.12 — добавили стриминговую сериализацию из Kotlin/Java-классов в Json/Protobuf</p><p>Зачем это нужно было? </p><p>➡ чтобы большие классы не сериализовывались целиком перед отправкой запроса, а начинали это делать во время передачи данных на бэк</p><p>Это позволит чутка снизить нагрузку на процессор и оперативку, если</p><ul><li><p>передаете объемные данные в теле запроса (1 мегабайт+)</p></li><li><p>где-то вызываете <code>Retrofit.Call.enqueue()</code> с главного потока — стриминг перенесет сериализацию с главного UI-потока в бэкграунд</p></li></ul><p>Чтобы изменения заработали, нужно создавать конвертер с помощью функции withStreaming()</p><p><code>MoshiConverterFactory.create(moshi).withStreaming() // пример</code></p><p>В Retrofit 3.0 просто апнули версию <code>OkHttp (3.14.9 -&gt; 4.12.0)</code>. И немного поправили внутреннего кода, пару строк для совместимости с 4.12.0</p><p>Так что если обновите версию Retrofit, у вас транзитивно апнется OkHttp — будьте внимательны, берегите себя и своих тестировщиков</p><p>Из хороших новостей — Retrofit 3.0 формальный мажор, то есть бинарно совместим с предыдущими версиями (по словам разработчиков). Мажорное версию апнули для хайпа, чтобы подчеркнуть обновление OkHttp</p><p>Пруфы:</p><ul><li><p>compare 3.0 with previous  (<a href="https://github.com/square/retrofit/compare/2.12.0...3.0.0#diff-ee4546957dd484579c54b92114186cb4b3181a8906d98fbf94fbc526bf755943)(%D1%82%D0%B0%D0%BC" rel="noopener noreferrer nofollow">https://github.com/square/retrofit/compare/2.12.0...3.0.0#diff-ee4546957dd484579c54b92114186cb4b3181a8906d98fbf94fbc526bf755943)(там</a> много ченжей, но 90% из них — это обновление их website с документацией)</p></li></ul><ul><li><p>compare 2.12 with previous (<a href="https://github.com/square/retrofit/compare/2.11.0...2.12.0" rel="noopener noreferrer nofollow">https://github.com/square/retrofit/compare/2.11.0...2.12.0</a>) (тут можно посмотреть, за счет чего сериализация стала асинхронной)</p></li></ul><p>остальные посты про Android публикую в <a href="https://t.me/dolgo_polo_dev" rel="noopener noreferrer nofollow">https://t.me/dolgo_polo_dev</a></p> <a href="https://habr.com/ru/posts/929342/?utm_campaign=929342&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sun, 20 Jul 2025 14:45:42 GMT</pubDate>
    <dc:creator><![CDATA[DolgopolovDenis]]></dc:creator>
      
      <category><![CDATA[Retrofit]]></category><category><![CDATA[Retrofit 3.0]]></category><category><![CDATA[OkHttp]]></category><category><![CDATA[Android]]></category><category><![CDATA[android development]]></category><category><![CDATA[retrofit]]></category><category><![CDATA[android network]]></category><category><![CDATA[okhttpmockwebserver]]></category><category><![CDATA[kotlin]]></category><category><![CDATA[android sdk]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @almirus — Реверс-инжиниринг (+1) — 30.06.2025 08:14]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/923248/</guid>
    <link>https://habr.com/ru/posts/923248/?utm_campaign=923248&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Нужно было быстренько перехватить вызов нативной функции и посмотреть значение переменной в Android приложении. Как то давно использовал для этого замечательную утилиту Frida. Установил на планшет <a href="https://github.com/frida/frida/releases" rel="noopener noreferrer nofollow">frida-server</a> (root уже был) и клиент на PC, написал классический JS хук, но он не работал:</p><pre><code class="typescript">defineHandler({
  onEnter(log, args, state) {
    conslole.log('decoder_CRC_check()');
  },

  onLeave(log, retval, state) {
    const libc = Module.findBaseAddress('libc.so');
    console.log(hexdump(libc, {
      /* address: ptr('0x1000'), -- to override the base address */
      offset: 0,
      length: 64,
      header: true,
      ansi: true
    }));
  }
});</code></pre><p>В консоли лишь получал <code>TypeError: not a function at onEnter (D:\Distrib\Android TV\frida\hook.js:7)</code></p><p>Убил полдня в поисках "чего я делаю не так", при том что и официальная <a href="https://frida.re/docs/javascript-api/" rel="noopener noreferrer nofollow">дока</a> и нейронки твердят, что именно так и нужно получать базовый адрес модуля и, при необходимости, функций. Оказалось, во <strong><a href="https://frida.re/news/2025/05/17/frida-17-0-0-released/" rel="noopener noreferrer nofollow">Frida 17</a></strong><a href="https://frida.re/news/2025/05/17/frida-17-0-0-released/" rel="noopener noreferrer nofollow"> автор полностью удалил некоторые функции</a> (а дока и нейронки еще не обновились):</p><ul><li><p>Module.ensureInitialized()</p></li><li><p>Module.findBaseAddress()</p></li><li><p>Module.getBaseAddress()</p></li><li><p>Module.findExportByName()</p></li><li><p>Module.getExportByName()</p></li><li><p>Module.findSymbolByName()</p></li><li><p>Module.getSymbolByName()</p></li><li><p>Туда же статические функции Memory</p></li></ul><p>И теперь надо писать цепочку вызовов:</p><pre><code class="javascript">const lib = Process.findModuleByName("libc.so");
console.log("[*] libc.so loaded at base: " + lib.base);
const funcAddr = lib.findExportByName("decoder_CRC_t_init");</code></pre><p>Итог получился такой универсальный скрипт:</p><pre><code class="typescript">Java.perform(function () {
	const System = Java.use("java.lang.System");
    const Runtime = Java.use('java.lang.Runtime');
    const SystemLoadLibrary = System.loadLibrary.overload('java.lang.String');
    const VMStack = Java.use('dalvik.system.VMStack');
    // "ожидание"\перехват динамической загрузки нативных библиотек
    SystemLoadLibrary.implementation = function(library) {
		console.log("Loading dynamic library =&gt; " + library);
        const loaded = Runtime.getRuntime().loadLibrary0(
            VMStack.getCallingClassLoader(), library
        );
        if (library.includes("mylibname")) {
            console.log("\n[+] Hooked mylibname");
            // перехватываем только нужную нам
            hookNativeFunc();
        }
        return loaded;
    }	
});

function hookNativeFunc() {
    //тут имя полностью как называется сам файл в ресурсах
	const lib = Process.findModuleByName("libmylibname.so");
    console.log("[*] mylibname.so loaded at base: " + lib.base);
    const funcAddr = lib.findExportByName("decoder_CRC_t_init");
    if (!funcAddr) {
        console.log("[-] Function not found!");
		return;
    }
    console.log("[+] Found decoder_CRC_t_init at: " + funcAddr);
    Interceptor.attach(funcAddr, {
        onEnter: function (args) {
            var result = args[0];
            var inputPtr = args[1];
            var len = args[2].toInt32();
            console.log("\n[+] decoder_CRC_t_init called");
            console.log("    result:    " + result);
            console.log("    inputPtr:  " + inputPtr);
            console.log("    len:       " + len);
        },
        onLeave: function (retval) {
            //нужный адрес массива, например из IDA PRO
            const wordArrayOffset = 0x5B2C04;
            const wordArray = lib.base.add(wordArrayOffset);
			var ptr = new NativePointer(wordArray); // современный вариант чтения
            console.log("[*] 5B2C04 contents:");
            try {
                console.log(hexdump(ptr, {
				  offset: 0,
				  length: 512,
				  header: true,
				  ansi: true
				}));
            } catch (e) {
                console.log("[!] Error reading 5B2C04:", e);
            }
            console.log("Return value:", retval);
        }
    });
}
</code></pre><p>Запускается так <code>frida -U -f com.android.app -l hook.js</code></p> <a href="https://habr.com/ru/posts/923248/?utm_campaign=923248&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 30 Jun 2025 05:14:07 GMT</pubDate>
    <dc:creator><![CDATA[almirus]]></dc:creator>
      
      <category><![CDATA[frida]]></category><category><![CDATA[android]]></category><category><![CDATA[reverse-engineering]]></category><category><![CDATA[c++]]></category><category><![CDATA[js]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @AlfaTeam — Блог компании Альфа-Банк (+4) — 27.06.2025 12:05]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/alfa/posts/922480/</guid>
    <link>https://habr.com/ru/companies/alfa/posts/922480/?utm_campaign=922480&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Как ускорить Android-разработку и избавиться от мучительно долгих запусков эмуляторов ради простого теста?&nbsp;</strong></p><p>Ответ — Robolectric — мощный инструмент для UI‑тестирования Android‑кода без эмулятора.&nbsp;</p><p>Позволяет запускать юнит-тесты Android-приложений прямо в JVM, без эмуляторов и физических устройств. Экономия на каждом тестовом прогоне, обратная связь почти мгновенная.</p><p>В Android‑комьюнити у Robolectric неоднозначная репутация из‑за трудностей совместимости с другими библиотеками. Но…его почти бесценные возможности пробудили любопытство и желание копнуть глубже и осмыслить этот инструмент.&nbsp;</p><blockquote><p>Так и родилась статья «<a href="https://habr.com/ru/companies/alfa/articles/910226/" rel="noopener noreferrer nofollow">Мечтают ли андроиды о Robolectric? Разбираем фреймворк по косточкам</a>» от Павла Нестеренко, нашего Android-разработчика.<br></p></blockquote><p>Если вы устали ждать, пока эмулятор запустится, и хотите гонять юнит-тесты за секунды прямо в JVM, то рекомендуем статью к прочтению!</p> <a href="https://habr.com/ru/posts/922480/?utm_campaign=922480&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 27 Jun 2025 09:05:19 GMT</pubDate>
    <dc:creator><![CDATA[AlfaTeam (Альфа-Банк)]]></dc:creator>
      
      <category><![CDATA[android]]></category><category><![CDATA[kotlin]]></category><category><![CDATA[robolectric]]></category><category><![CDATA[тестирование мобильных приложени]]></category><category><![CDATA[разработка мобильных приложений]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @svetlana_dolmatova — Блог компании Wildberries & Russ (+1) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/wildberries/posts/921020/</guid>
    <link>https://habr.com/ru/companies/wildberries/posts/921020/?utm_campaign=921020&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/380/3b9/be2/3803b9be2b0f8124e2d211da8050bed8.jpg" width="1280" height="720"></figure><p><strong>Save the date: 4 июля встречаемся на <a href="https://wbtech.timepad.ru/event/3425551/" rel="noopener noreferrer nofollow">Android Meetup</a>! </strong><br><br>В программе доклады от спикеров Wildberries &amp; Russ и Альфа-Банка, Q&amp;A-сессия с розыгрышем мерча, нетворкинг и фуршет для классного завершения вечера.</p><p>Поговорим о том, как оживить виджеты, подружить Compose с Koin и навигацией, а заодно встроить одно Android-приложение в другое без боли...или с болью:<br></p><p><strong>«Виджеты на Android: это просто?»</strong><br><em> Александр Гирев, Android Team Lead продуктовой команды WB Partners</em></p><p><strong>«Compose+Koin+JetpackNavigation: что мы поняли за 2 года»</strong><br> <em>Арсений Шпилевой, Android-разработчик кор-команды WB Partners</em></p><p><strong>«Интеграция Android-приложений: подходы и лучшие практики»</strong><br><em> Абакар Магомедов, главный техлид разработки в Альфа-Банке</em></p><p><strong>Когда: </strong>4 июля 18:00 (сбор гостей с 17:00)<br><strong>Где</strong>: Москва, <a href="https://yandex.ru/maps/org/prostranstvo_vesna/138042183388/?ll=37.673279%2C55.778649&amp;utm_source=share&amp;z=12" rel="noopener noreferrer nofollow">пространство Весна</a> + онлайн-трансляция</p><p>Регистрация <a href="https://wbtech.timepad.ru/event/3425551/" rel="noopener noreferrer nofollow">уже открыта</a> — присоединяйтесь онлайн или офлайн!</p> <a href="https://habr.com/ru/posts/921020/?utm_campaign=921020&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 23 Jun 2025 15:11:46 GMT</pubDate>
    <dc:creator><![CDATA[svetlana_dolmatova (Wildberries & Russ)]]></dc:creator>
      
      <category><![CDATA[android]]></category><category><![CDATA[meetup]]></category><category><![CDATA[wb]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — Мессенджеры (+3) — 21.06.2025 10:44]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/920498/</guid>
    <link>https://habr.com/ru/posts/920498/?utm_campaign=920498&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Telegram <a href="https://t.me/contest_ru/54" rel="noopener noreferrer nofollow">запустил</a> конкурс для&nbsp;разработчиков под&nbsp;Android. Призовой фонд: $50 000. Срок сдачи работ: 11&nbsp;июля, 23:59&nbsp;по&nbsp;дубайскому времени (UTC+4). Объявление итогов: июль 2025.</p><p>В&nbsp;дополнение к&nbsp;призовым, победитель конкурса сможет присоединиться к&nbsp;команде Telegram в&nbsp;Дубае и зарабатывать 1&nbsp;миллион долларов в&nbsp;год после вычета налогов. </p><p>Задача: Внедрить обновлённый интерфейс профилей в&nbsp;приложение Telegram для&nbsp;Android в&nbsp;строгом соответствии с&nbsp;предоставленным дизайном. </p><p>Полные условия конкурсного задания, технические подробности и макеты <a href="https://t.me/contest/420" rel="noopener noreferrer nofollow">представлены</a> в&nbsp;отдельном канале платформы.</p> <a href="https://habr.com/ru/posts/920498/?utm_campaign=920498&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 21 Jun 2025 07:44:32 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[Android]]></category><category><![CDATA[telegram]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @AGalilov — Android — 20.06.2025 12:41]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/920206/</guid>
    <link>https://habr.com/ru/posts/920206/?utm_campaign=920206&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Вы - начинающий разработчик под Андроид или просто пишете "для себя" и решили отображать динамическую анимацию через <a href="https://developer.android.com/reference/android/view/SurfaceView" rel="noopener noreferrer nofollow">SurfaceView</a>. Например, взяв за основу вот этот <a href="https://habr.com/ru/articles/126316/" rel="noopener noreferrer nofollow">код</a> или похожий. Вы разместили <code>SurfaceView</code> или его наследника (у меня <code>MySurfaceView</code>) в activity layout:</p><pre><code class="xml">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activityMain"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"&gt;

    &lt;agalilov.doppler.MySurfaceView
        android:id="@+id/dopplerView"
        android:background="#040947"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginBottom="15dp"
        app:layout_constraintBottom_toTopOf="@+id/btnStartStop"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" /&gt;

    &lt;Button
        android:id="@+id/btnStartStop"
        android:layout_width="118dp"
        android:layout_height="56dp"
        android:layout_marginStart="16dp"
        android:layout_marginBottom="16dp"
        android:text="@string/start"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/dopplerView" /&gt;

&lt;/androidx.constraintlayout.widget.ConstraintLayout&gt;</code></pre><p>Запускаете приложение и... ничего не работает: <code>SurfaceView</code> не меняется, картинки нет! Ошибок тоже нет, код рисования выполняется впустую.</p><p>Я провёл почти всю ночь, разбираясь в причине. Оказалось, для <code>SurfaceView</code>, который размещён внутри другого <code>View</code>, по-умолчанию используется z-order "позади" родительского <code>View</code>. Это поведение, документированное в <a href="https://developer.android.com/reference/android/view/SurfaceView#setZOrderOnTop(boolean)" rel="noopener noreferrer nofollow">разных</a> <a href="https://learn.microsoft.com/ru-ru/dotnet/api/android.views.surfaceview.setzorderontop?view=net-android-35.0" rel="noopener noreferrer nofollow">источниках</a>, оказалось для меня неожиданным.</p><p>Лечится просто: при инициализации (в конструкторе класса-наследника) SurfaceView устанавливаем <code>setZOrderOnTop(true)</code>:</p><pre><code class="java">public MySurfaceView(Context context, AttributeSet attributeSet) {
    super(context, attributeSet);
    setZOrderOnTop(true);
    . . .
}</code></pre><p>Вот такая история :)</p> <a href="https://habr.com/ru/posts/920206/?utm_campaign=920206&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 20 Jun 2025 09:41:47 GMT</pubDate>
    <dc:creator><![CDATA[cvigi]]></dc:creator>
      
      <category><![CDATA[surfaceview]]></category><category><![CDATA[android]]></category><category><![CDATA[android development]]></category><category><![CDATA[android sdk]]></category><category><![CDATA[анимация]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @David_Osipov — Android (+2) — 18.06.2025 21:22]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/919668/</guid>
    <link>https://habr.com/ru/posts/919668/?utm_campaign=919668&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>URLCheck: Полезная утилита для инспекции URL на Android</strong></p><p>Хочу поделиться находкой, которая многим здесь придется по душе. Каждый из нас хоть раз с недоверием кликал по сокращенной или странной ссылке, присланной в мессенджере или почте. Сколько раз мы неосознанно переходили по ссылкам с кучей UTM-меток и прочего трекающего мусора?</p><p>Недавно я наткнулся на утилиту для Android, которая решает эту проблему - <strong>URLCheck</strong>.</p><p>Это не браузер, а приложение-посредник. Вы назначаете его для открытия ссылок по умолчанию, и когда вы кликаете на любую ссылку, вместо того чтобы сразу открыть его в браузере, URLCheck перехватывает его и показывает вам вот такое окно:<br></p><figure class=""><img src="https://habrastorage.org/getpro/habr/upload_files/4dc/c05/da2/4dcc05da22a8b4024854bb46a6945675.jpg" width="450" height="1000"></figure><p><strong>Вот несколько любопытных ключевых фич:</strong></p><ul><li><p><strong>Очистка от трекеров:</strong> Автоматически вырезает из линка весь мусор вроде UTM-меток и параметров отслеживания, используя правила проекта ClearURLs.</p></li><li><p><strong>Сканер VirusTotal:</strong> Позволяет в один клик отправить ссылку на проверку в VirusTotal и посмотреть отчет. (Нужен свой бесплатный API-ключ).</p></li><li><p><strong>Раскрытие коротких ссылок:</strong> Показывает, куда на самом деле ведет укороченный линк типа <code>bit.ly</code> - зачастую фишинговые ссылки скрываются за укороченными линками, чтобы усложнить блокировки.</p></li><li><p><strong>Проверка по хост-листам:</strong> Интегрируется со списками StevenBlack (adware, malware, fakenews и т.д.) и предупреждает, если домен находится в одном из них.</p></li><li><p><strong>Pattern-checker:</strong> Для продвинутых - можно настроить свои правила на основе регулярных выражений. Например, автоматически заменять <code>http</code> на <code>https</code> или <a href="http://twitter.com" rel="noopener noreferrer nofollow"><code>twitter.com</code></a> на <a href="http://nitter.net" rel="noopener noreferrer nofollow"><code>nitter.net</code></a>.</p></li><li><p><strong>Полный контроль над линком:</strong> Вы можете вручную отредактировать URL, посмотреть историю изменений или просто скопировать/поделиться ей.</p></li></ul><p>И самое главное — приложение <strong>с открытым исходным кодом</strong>! Настоящий швейцарский нож для тех, кто заботится о своей безопасности и приватности в сети.</p><p><strong>Где скачать:</strong></p><ul><li><p><strong><a href="https://f-droid.org/en/packages/com.trianguloy.urlchecker/" rel="noopener noreferrer nofollow">F-Droid</a></strong></p></li><li><p><strong><a href="https://play.google.com/store/apps/details?id=com.trianguloy.urlchecker" rel="noopener noreferrer nofollow">Google Play</a></strong></p></li><li><p><strong><a href="https://github.com/TrianguloY/URLCheck" rel="noopener noreferrer nofollow">GitHub</a> </strong>(репка)</p></li></ul><p>В общем, рекомендую попробовать. Для меня это стало одним из приложений категории "must-have".</p> <a href="https://habr.com/ru/posts/919668/?utm_campaign=919668&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 18 Jun 2025 18:22:50 GMT</pubDate>
    <dc:creator><![CDATA[David_Osipov]]></dc:creator>
      
      <category><![CDATA[android]]></category><category><![CDATA[безопасность]]></category><category><![CDATA[приватность]]></category><category><![CDATA[url]]></category><category><![CDATA[open source]]></category><category><![CDATA[утилиты]]></category><category><![CDATA[трекеры]]></category><category><![CDATA[urlcheck]]></category><category><![CDATA[рекомендации]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — Смартфоны (+2) — 18.06.2025 08:03]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/919404/</guid>
    <link>https://habr.com/ru/posts/919404/?utm_campaign=919404&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Google опубликовала ролик в рамках своей юмористической рекламной кампании Best Phones Forever с «диалогом» между&nbsp;персонифицированными смартфонами Pixel и iPhone. Повествование разворачивается вокруг анонсированных Apple «прорывных» функций iOS 26, которые, по&nbsp;задумке Google, на&nbsp;самом деле уже давно доступны пользователям Pixel. </p><p>В видео iPhone перечисляет «новые» возможности операционной системы Apple: перевод сообщений и звонков в&nbsp;режиме реального времени, интеллектуальный отбор вызовов и умное удержание. Выясняется, что аналогичный функционал появился на&nbsp;устройствах Pixel еще пять лет назад, что ставит под&nbsp;сомнение новизну представленных Apple решений. </p><iframe id="68524852aadce8eb96b8b225" src="https://embedd.srv.habr.com/iframe/68524852aadce8eb96b8b225" class="embed_video embed__content" allowfullscreen="true"></iframe> <a href="https://habr.com/ru/posts/919404/?utm_campaign=919404&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 18 Jun 2025 05:03:47 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[google]]></category><category><![CDATA[pixel]]></category><category><![CDATA[android]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Not_coolEd — Android (+1) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/918986/</guid>
    <link>https://habr.com/ru/posts/918986/?utm_campaign=918986&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>📜 M-V-подставь_свое</strong></p><p><strong>Model-View-*** -</strong> это шаблоны проектирования<br> Важное уточнение: это шаблоны проектирования только для <strong>presentation</strong> слоя, а не для целого приложения</p><p>💃 <strong>Model</strong><br> - это как раз та часть приложения о которой мы ближайшее время говорить не будем<br> Чаще всего ее называют бизнес логикой, но это не совсем верно<br> Пока, лучше всего воспринимать ее как модель данных которую наше приложение хочет передать пользователю<br> Причем не важно будет это Ui или API, или что-то другое<br> MV шаблоны не про frontend, а про то как передать данные клиенту, кем бы он ни был</p><p>🖼 <strong>View</strong><br> - это само представление данных пользователю. То, что он по итогу получит<br> В мире андройд это обычно Activity, Fragment, View или Compose</p><p><strong>🪝***</strong><br> - это <strong>какая-то</strong> прослойка между моделью данных и их представлением пользователю</p><p><strong>Для чего все эти шаблоны вообще придумали?</strong></p><p>Дело в том, что View это какой-то вариант отображения данных клиенту 🏐<br> И часто возникает ситуация, что нужно создать другой вариант отображения ⚽️<br> Это может быть как бизнес потребность в перекраске кнопок и проведении при этом ab-тестов, 🏀<br> или желании разработчиков заменить технологию отображения 🏈</p><p>Например, у вас было консольное приложение, а вы вдруг захотели сделать для него UI (GitBash|GitUi здравствуйте),<br> ну или решили заменить <strong>Android.View</strong> на <strong>Compose</strong></p><p>Во всех этих случаях нам хочется чем-то разделить саму <strong>View и работу с Model</strong>, чтобы иметь возможность заменить только View, не трогая ничего другого</p><p>В Android, к этому еще добавляется <strong>проблема пересоздания</strong> View при изменении конфигурации. Когда вы переворачиваете экран (и не только), весь ваш UI просто уничтожается и создается полностью заново. Хотя с точки зрения пользователя это все тот же экран с теми же данными 🫠</p><p>Это создает дополнительную потребность <strong>отвязать View от остального приложения</strong>, чтобы можно было ее подменять прямо в рантайме</p><p>Основные шаблоны это <strong>MVC</strong>, <strong>MVP</strong>, <strong>MVVM</strong> и <strong>MVI</strong><br> О них мы и поговорим в следующих постах...</p><p><em>ПС. Посты с большим опережением есть в тг канале из описания профиля</em></p> <a href="https://habr.com/ru/posts/918986/?utm_campaign=918986&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 17 Jun 2025 09:00:30 GMT</pubDate>
    <dc:creator><![CDATA[Not_coolEd]]></dc:creator>
      
      <category><![CDATA[arhitectura]]></category><category><![CDATA[mvc]]></category><category><![CDATA[mvp]]></category><category><![CDATA[mvvm]]></category><category><![CDATA[mvi]]></category><category><![CDATA[design templates]]></category><category><![CDATA[templates]]></category><category><![CDATA[notcooled]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — Android (+4) — 25.05.2025 17:49]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/912656/</guid>
    <link>https://habr.com/ru/posts/912656/?utm_campaign=912656&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Магазину приложений RuStore <a href="https://t.me/rustore_games/91" rel="noopener noreferrer nofollow">исполнилось</a> три года. Количество установок этого приложения на&nbsp;устройствах пользователей превысило 100&nbsp;млн.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/76a/026/dea/76a026deaed7ecf731c5aa326f842a46.jpg" width="1280" height="1280"></figure><p>25&nbsp;мая 2022&nbsp;года VK при&nbsp;поддержке Минцифры <a href="https://habr.com/ru/news/t/667660/" rel="noopener noreferrer nofollow">запустила</a> открытое бета‑тестирование отечественного магазина мобильных приложений для&nbsp;Android под&nbsp;названием <a href="https://apps.rustore.ru/" rel="noopener noreferrer nofollow">RuStore</a>. </p><p>В&nbsp;начале февраля 2023&nbsp;года RuStore <a href="https://habr.com/ru/news/t/715674/" rel="noopener noreferrer nofollow">объявил</a> о&nbsp;завершении этапа бета‑тестирования магазина приложений. Также создатели платформы перевели интерфейс консоли разработчика на&nbsp;английский язык для&nbsp;удобства иностранных издателей и партнёров.</p><p>В&nbsp;декабре 2024&nbsp;года месячная аудитория магазина приложений RuStore составила 50&nbsp;млн пользователей старше 12&nbsp;лет по&nbsp;всей России, согласно исследованию Mediascope. Аудитория Xiaomi Mi Store составила 19&nbsp;млн, Samsung Galaxy Store&nbsp;— 14&nbsp;млн, HUAWEI AppGallery&nbsp;— 10&nbsp;млн, <a href="https://habr.com/ru/news/875328/" rel="noopener noreferrer nofollow">рассказали</a> Хабру в&nbsp;пресс‑службе RuStore. А&nbsp;в&nbsp;Минцифры заявили, что&nbsp;RuStore от&nbsp;VK <a href="https://tass.ru/ekonomika/22796471" rel="noopener noreferrer nofollow">обошёл </a>по&nbsp;числу пользователей в&nbsp;России App Store от&nbsp;Apple.</p><p>В&nbsp;VK добавили, что&nbsp;в&nbsp;каталоге RuStore уже более 50&nbsp;тысяч приложений, доступных на&nbsp;ОС Android, Harmony OS и «Аврора», от&nbsp;разработчиков из 40&nbsp;стран мира. Также вышли версии RuStore для&nbsp;электронных книг и умных телевизоров, для&nbsp;проекторов, Hi‑Fi‑аудиоплееров, игровых консолей, кассовых терминалов, умных часов.</p> <a href="https://habr.com/ru/posts/912656/?utm_campaign=912656&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sun, 25 May 2025 14:49:55 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[rustore]]></category><category><![CDATA[три года]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Surf_Studio — Блог компании Surf (+4) — 16.05.2025 13:34]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/surfstudio/posts/910002/</guid>
    <link>https://habr.com/ru/companies/surfstudio/posts/910002/?utm_campaign=910002&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Google I/O 2025: два вечера главных анонсов вместе с Surf</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/edc/ca9/f2f/edcca9f2f8e809d47161e08007f1fd44.png" width="3840" height="2160"></figure><p>20 и 21 мая — подключайся к нашим стримам по Google I/O. Будем вместе следить за анонсами новинок, делиться первыми впечатлениями и обсуждать всё самое интересное из мира технологий и разработки в прямом эфире.</p><p>Смотрим и комментируем:</p><ul><li><p><strong>20 мая (вторник) </strong><br>→ 20:00 — <a href="https://io.google/2025/explore/google-keynote-1" rel="noopener noreferrer nofollow">Google Keynote</a>: все главные анонсы и будущее технологий от Google.</p></li><li><p><strong>21 мая (среда)</strong><br> → 20:00 — <a href="https://io.google/2025/explore/pa-keynote-5" rel="noopener noreferrer nofollow">What’s new in Android development tools</a>: новинки для Android-разработчиков.<br> →  21:00 — <a href="https://io.google/2025/explore/pa-keynote-12" rel="noopener noreferrer nofollow">What’s new in Flutte</a>r: свежие обновления для Flutter-сообщества.</p></li></ul><p>Время указано по Москве. Позже добавим сюда наших спикеров и персональные ссылки на трансляции.</p><p>Залетай на эфиры в <a href="https://vk.com/surfstudio" rel="noopener noreferrer nofollow">нашу группу ВКонтакте</a>, чтобы обсудить новинки и пообщаться с разработчиками. Запись сохраним.</p> <a href="https://habr.com/ru/posts/910002/?utm_campaign=910002&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 16 May 2025 10:34:32 GMT</pubDate>
    <dc:creator><![CDATA[Surf_Studio (Surf)]]></dc:creator>
      
      <category><![CDATA[google]]></category><category><![CDATA[android]]></category><category><![CDATA[flutter]]></category><category><![CDATA[мобильная разработка]]></category><category><![CDATA[разработка под android]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @yadro_team — Блог компании YADRO (+4) — 29.04.2025 10:38]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/yadro/posts/905402/</guid>
    <link>https://habr.com/ru/companies/yadro/posts/905402/?utm_campaign=905402&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Android-приложение «Контакты»: работает — не трогай</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/cab/cad/0c9/cabcad0c9bdf54a4e8b79f704c69aa27.jpg" width="740" height="415"></figure><p>У многих полей контакта есть типы. Например, у номеров телефонов или адресов электронной почты по умолчанию есть типы «рабочий» и «домашний». Аналитики сказали, что нужно реализовать дополнительные типы и дать пользователю возможность создавать свои. Звучит легко, но на деле оказалось совсем непросто.</p><p>Чтобы заменить стандартные типы полей, нужно добавить новую базу данных с доступными типами полей, а также реализовать отображение и возможность выбора поля. Для этого пришлось во многом переписать код редактирования полей контакта, где и без этого логика была непростой. Теперь стало совсем сложно: при добавлении или обновлении поля в contentProvider нужно указывать тип поля, так что мы начали указывать «custom».</p><p>После добавления кастомных типов приложение потеряло стабильность, появились кейсы, в которых кастомные типы работали неправильно. Один из них приводил к крашу: база данных не успевала создаваться при открытии интента на редактирование контакта.</p><p>Изначальный путь пользователя — это открыть приложение и увидеть список контактов с аватаркой, именем и номером телефона. Пока этот список подгружался на экране, база данных обычно успевала создаться. Но мы не учли, что при открытии интента на редактирование контакта из другого приложения сразу появляется экран редактирования — в этом случае база данных не успевала инициализироваться.</p><p>Создание схемы БД и инициализация стандартными значениями происходила в отдельном потоке, так что у нас получилась небольшая гонка потоков. UI готов отобразить экран и идет в БД за данными, но БД не успевает инициализироваться, так что запрос приводил к критической ошибке. Баг воспроизводился при попытке обратиться к БД только при первом холодном запуске на устройстве или после очистки данных, так как здесь приложению приходится заново создавать схему базы данных.</p><p>Пришлось опять добавлять костыль: в отдельной корутине ожидать инициализации БД и только потом начинать рисовать экран...</p><blockquote><p>Дмитрий Бражник, старший инженер-программист в департаменте разработки мобильных приложений <a href="https://yadro.com/?utm_source=habr&amp;utm_medium=referral&amp;utm_campaign=aosp_230425" rel="noopener noreferrer nofollow">YADRO</a>, рассказал <strong><a href="https://habr.com/ru/companies/yadro/articles/903316/" rel="noopener noreferrer nofollow">в статье</a></strong>, как его команда пыталась допилить стандартное AOSP-приложение «Контакты» и к чему они в итоге пришли.</p></blockquote> <a href="https://habr.com/ru/posts/905402/?utm_campaign=905402&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 29 Apr 2025 07:38:13 GMT</pubDate>
    <dc:creator><![CDATA[yadro_team (YADRO)]]></dc:creator>
      
      <category><![CDATA[приложения для android]]></category><category><![CDATA[aosp]]></category><category><![CDATA[contacts]]></category><category><![CDATA[приложения]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Surf_Studio — Блог компании Surf (+4) — 16.04.2025 17:59]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/surfstudio/posts/901466/</guid>
    <link>https://habr.com/ru/companies/surfstudio/posts/901466/?utm_campaign=901466&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Хардкодить допоздна? А может, лучше нет, ворк?</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/806/060/9da/8060609daa7c93c20cbcd094252a23b6.png" alt="&gt;&gt; Регистрация и программа &lt;&lt;" title="&gt;&gt; Регистрация и программа &lt;&lt;" width="2127" height="1320"><div><figcaption><a href="https://surftech.timepad.ru/event/3321077/" rel="noopener noreferrer nofollow">&gt;&gt; Регистрация и программа &lt;&lt;</a></figcaption></div></figure><p>23 апреля в 20:00 приглашаем воронежских разработчиков на неформальный митап. Для тех, кто не сможет прийти офлайн, будет трансляция.</p><p>Никаких скриншотов кода на слайдах. Никакого душного обсуждения документации. Поговорим о том, что окружает нас вне работы. Прокачаем софт-скиллы и нетворкинг.</p><p>В программе митапа три доклада:</p><ul><li><p><strong>Лёша, Android-разработчик Surf — «Дедлайн "вчера": как работать с приоритетами».</strong><br><br><em>Как рассеивается внимание? Как ставить приоритеты в работе с командой? Когда нужно выносить переписку в звонок, а когда можно обойтись текстом? Ответим на эти и многие другие вопросы про приоритеты в работе и жизни.</em></p></li><li><p><strong>Дима, Flutter-разработчик Surf — «Тимлид — друг или враг? Или так»?</strong><br><br><em>Расскажу о роли тимлида, но со стороны&nbsp;нижестоящего сотрудника. Что мне нравится/что не нравится в лиде, что для меня кажется полезным, а смысл чего я не понимаю.</em></p></li><li><p><strong>Кирилл, iOS-разработчик, наш друг и гость из Una Financial — «Work-life health для IT-шника среднего возраста».</strong><br><br><em>Поделюсь жизненными проблемами разработчиков и способами их решения. Внимательный слушатель вообще сможет их избежать! Обсудим, как сделать жизнь лучше, повысить её качество. Максимально продлим трудоспособный возраст.</em></p></li></ul><p>Митап пройдет 23 апреля, в 20:00, в воронежском пространстве «Eventuki»: ул. Фридриха Энгельса, 52. </p><p>Участие в митапе бесплатное, чтобы прийти или получить ссылку на трансляцию, <strong><a href="https://surftech.timepad.ru/event/3321077/" rel="noopener noreferrer nofollow">нужно зарегистрироваться</a></strong> 👈</p><p>Запись трансляции обязательно сохраним, но если вы из Воронежа, мы очень ждём понетворкать вживую. До встречи 😉</p> <a href="https://habr.com/ru/posts/901466/?utm_campaign=901466&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 16 Apr 2025 14:59:10 GMT</pubDate>
    <dc:creator><![CDATA[Surf_Studio (Surf)]]></dc:creator>
      
      <category><![CDATA[митап]]></category><category><![CDATA[митапы]]></category><category><![CDATA[воронеж]]></category><category><![CDATA[митапы в воронеже]]></category><category><![CDATA[софт-скиллы]]></category><category><![CDATA[нетворкинг]]></category><category><![CDATA[нетворкинг в ит]]></category><category><![CDATA[нетворк]]></category><category><![CDATA[разработка приложений]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — Смартфоны (+2) — 28.03.2025 09:51]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/895160/</guid>
    <link>https://habr.com/ru/posts/895160/?utm_campaign=895160&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Вышло видеоруководство по переводу смартфонов Pixel на <a href="https://grapheneos.org/releases" rel="noopener noreferrer nofollow">GrapheneOS</a> с упором на конфиденциальность, включая настройку ключевых параметров и установку приложений, а также способы работать с сервисами Google Play с отключением трекеров.</p><iframe id="67e646d3693dbaa8506ca098" src="https://embedd.srv.habr.com/iframe/67e646d3693dbaa8506ca098" class="embed_video embed__content" allowfullscreen="true"></iframe><p></p> <a href="https://habr.com/ru/posts/895160/?utm_campaign=895160&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 28 Mar 2025 06:51:41 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[google]]></category><category><![CDATA[pixel]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @bartwell — Kotlin (+1) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/890834/</guid>
    <link>https://habr.com/ru/posts/890834/?utm_campaign=890834&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Добавлен Room! :)<br>Ранее я уже делился <a href="https://habr.com/ru/articles/886214/" rel="noopener noreferrer nofollow">статьей</a> про <a href="https://github.com/bartwell/delight-sql-viewer" rel="noopener noreferrer nofollow">Delight SQL Viewer</a> — библиотеку, позволяющую отлаживать SQLDelight-базу данных напрямую внутри вашего Kotlin Multiplatform-приложения. Однако в одном из наших внутренних проектов используется <a href="https://developer.android.com/kotlin/multiplatform/room" rel="noopener noreferrer nofollow">Room Multiplatform</a> и хотелось иметь возможность отладки БД и в нем. Так и появилась вторая версия библиотеки, которая теперь поддерживает и Room, и SQLDelight.</p><p>Что делает библиотека?</p><ul><li><p>Позволяет просматривать, добавлять, редактировать и удалять записи в базе через удобный UI прямо в приложении.</p></li><li><p>Автоматически добавляет иконку-ярлык для быстрого запуска (Android и iOS). </p></li><li><p>На Desktop ярлыки не поддерживаются. Для запуска интерфейса используйте обычную кнопку или меню в вашем UI.</p></li><li><p>Легко отключается в продакшен-сборках — можно либо не вызывать init, либо подключать stub-модуль вместо основной библиотеки.</p></li></ul><p>Как использовать?</p><p>Зависимости (shared/build.gradle.kts)</p><pre><code class="kotlin">val isRelease = /* Ваша логика определения релизной сборки */

dependencies {
    if (isRelease) {
        // В релизе – stub, чтобы не вшивать весь отладочный UI.
        api("ru.bartwell.delightsqlviewer:stub:2.0.0")
    } else {
        // В debug – полная функциональность.
        api("ru.bartwell.delightsqlviewer:runtime:2.0.0")
        api("ru.bartwell.delightsqlviewer:core:2.0.0")
        // Выберите, что используете:
        api("ru.bartwell.delightsqlviewer:sqldelight-adapter:2.0.0")
        // или
        // api("ru.bartwell.delightsqlviewer:room-adapter:2.0.0")
    }
}</code></pre><p>Инициализация</p><ul><li><p><strong>SQLDelight</strong> (Android):</p><pre><code class="kotlin">DelightSqlViewer.init(
    object : SqlDelightEnvironmentProvider() {
        override fun getDriver() = sqlDelightDriver
        override fun getContext() = context
    }
)</code></pre></li><li><p><strong>Room</strong> (Android):</p><pre><code class="kotlin">DelightSqlViewer.init(
    object : RoomEnvironmentProvider() {
        override fun getDriver() = roomDatabase
        override fun getContext() = context
    }
)</code></pre></li><li><p><strong>iOS</strong> (пример для SQLDelight):</p><pre><code class="swift">let provider = SqlDelightEnvironmentProvider(driver: sqlDriver)
DelightSqlViewer.shared.doInit(provider: provider, isShortcutEnabled: true)</code></pre><p>Аналогично и для RoomEnvironmentProvider.</p><p>Также, чтобы ярлык корректно работал на iOS, в вашем AppDelegate нужно переопределить методы обработки ярлыков, например:</p><pre><code class="swift">class AppDelegate: NSObject, UIApplicationDelegate {
    func application(
        _ application: UIApplication,
        configurationForConnecting connectingSceneSession: UISceneSession,
        options: UIScene.ConnectionOptions
    ) -&gt; UISceneConfiguration {
        return ShortcutActionHandler.shared.getConfiguration(session: connectingSceneSession)
    }
}</code></pre><p>Или вызовите DelightSqlViewer.shared.launch() в обработчике вашего Shortcut.</p></li><li><p><strong>Desktop</strong>:</p><pre><code class="kotlin">DelightSqlViewer.init(
    object : SqlDelightEnvironmentProvider() {
        override fun getDriver() = sqlDelightDriver
    }
)</code></pre></li></ul><p>        Аналогично и для RoomEnvironmentProvider.</p><p>Запуск</p><p>После инициализации вызов DelightSqlViewer.launch() откроет интерфейс просмотра и редактирования (на Android/iOS можно также запустить через ярлык при долгом тапе на иконку приложения).</p><pre><code class="kotlin">Button(onClick = { DelightSqlViewer.launch() }) {
    Text("Open DB Viewer")
}</code></pre><p>Итог</p><p>Теперь <strong>Delight SQL Viewer</strong> покрывает оба основных способа хранения данных в мультиплатформенных проектах — <strong>SQLDelight</strong> и <strong>Room Multiplatform</strong>. Если нужно быстро проверить содержимое вашей БД или вручную поправить что-то прямо во время тестирования, эта библиотека может сэкономить кучу времени. Ну и, конечно, легко «прячется» в релизе, чтобы никакого отладочного UI не оставалось.</p><p>Ссылка на репозиторий: <a href="https://github.com/bartwell/delight-sql-viewer" rel="noopener noreferrer nofollow">https://github.com/bartwell/delight-sql-viewer</a></p><p>Буду рад фидбэку и вопросам!</p><p></p> <a href="https://habr.com/ru/posts/890834/?utm_campaign=890834&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 21 Mar 2025 06:00:46 GMT</pubDate>
    <dc:creator><![CDATA[bartwell]]></dc:creator>
      
      <category><![CDATA[kotlin multiplatform]]></category><category><![CDATA[sqldelight]]></category><category><![CDATA[room]]></category><category><![CDATA[библиотека]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @okixisp — Блог компании AvitoTech (+2) — 06.03.2025 11:20]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/avito/posts/888418/</guid>
    <link>https://habr.com/ru/companies/avito/posts/888418/?utm_campaign=888418&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Как устроена мобильная архитектура Авито?</strong></p><p>Гость нового выпуска подкаста <strong>«Android Broadcast»</strong> — <strong>Александр Бильчук</strong>, руководитель юнита мобильной архитектуры Авито. В беседе с <strong>Кириллом Розовым</strong> Саша делится особенностями работы отдела мобильной архитектуры:</p><ul><li><p>как ставятся задачи и требования к их выполнению?</p></li><li><p>как оценить пользу архитектурных решений?</p></li><li><p>как влияют Jetpack Compose, SwiftUI, AI на архитектуру?</p></li><li><p>как вообще прийти к роли мобильного архитектора?</p></li></ul><p>Ответы на эти и другие вопросы вы найдете в видео.</p><iframe id="67c95a76757b29e4c09b2d79" src="https://embedd.srv.habr.com/iframe/67c95a76757b29e4c09b2d79" class="embed_video embed__content" allowfullscreen="true"></iframe><p>Подписывайтесь на <a href="https://clc.to/mnG_FQ" rel="noopener noreferrer nofollow">канал AvitoTech в Telegram</a>, там мы рассказываем больше о профессиональном опыте наших инженеров, проектах и работе в Авито, а также анонсируем митапы и статьи.  </p> <a href="https://habr.com/ru/posts/888418/?utm_campaign=888418&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 06 Mar 2025 08:20:46 GMT</pubDate>
    <dc:creator><![CDATA[okixisp (AvitoTech)]]></dc:creator>
      
      <category><![CDATA[android]]></category><category><![CDATA[mobile]]></category><category><![CDATA[андроид]]></category><category><![CDATA[мобильная разработка]]></category><category><![CDATA[architecture]]></category><category><![CDATA[архитектура]]></category><category><![CDATA[архитектура мобильных приложений]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @402d — Разработка под Android — 26.02.2025 19:08]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/886126/</guid>
    <link>https://habr.com/ru/posts/886126/?utm_campaign=886126&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Aptoide криво публикует приложения в RuStore</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/e7f/568/809/e7f56880945b6751215fe2e8ef78fcca.png" width="910" height="312"></figure><p>Это перевод с английского языка. В русской версии описания было "<strong>обновление не затрагивает РФ"</strong></p><p>В общем, мало что сделали это (стащили в свой стор и перезалили в рушку) без разрешения, так еще и криво. </p><p></p> <a href="https://habr.com/ru/posts/886126/?utm_campaign=886126&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 26 Feb 2025 16:08:01 GMT</pubDate>
    <dc:creator><![CDATA[402d]]></dc:creator>
      
      <category><![CDATA[rustore]]></category><category><![CDATA[aptoide]]></category><category><![CDATA[google play]]></category>
  </item>
  

	
  

  

  

      

      

      

    
  </channel>
</rss>
