Telegram Web Link
Меняете работу приложения в зависимости от состояния/возможностей устройства?
Anonymous Poll
13%
Да
3%
Пробовали, но отказались
62%
Нет
13%
А так можно?
1%
Не занимаюсь разработкой
1%
Другой вариант
8%
Не участвую в опросе
👍7
Media is too big
VIEW IN TELEGRAM
📹 Как мы случайно ускорили релизную сборку в два раза. Роман Заремба, Юрий Анисимов из Т-Банк, Mobius 2025 Весна

Спикеры рассказали о том, как боролись за ускорение релизной сборки в мобильном банке и что из этого в итоге получилось. Разобрали особенности релизной сборки, связанные с подрезкой (shrinking) кода и ресурсов. Посмотрели, как профилировать и анализировать работу R8, а также отдельных Gradle-тасок, участвующих в подготовке релизной версии приложения.

Доклад для практикующих Андроид-инженеров с элементами хардкора.

🔗 Подробнее о конференции Mobius
🔗 Скачать презентацию

#android #mobius #gradle
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥29👍11
‼️ Следите за правила для минификации кода R8 - такой вывод стоит сделать из доклада

Из-за того что одна команда добавила правило, это сильно затормозило весь этап работы R8 🤯 Причина - слишком сложный/объемный анализ кода на основе правила
# The proguard configuration file for the following section is
/builds/../feature-1.0.0/proguard.txt

-if class ru.tinkoff.feature.**.*$Companion {
kotlinx.serialization.KSerializer serializer(...);
}
-keep,includedescriptorclasses class ru.tinkoff.feature.**$$serializer { *; }

# End of content from /builds/../feature-1.0.0/proguard.txt
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20
🤖 Strict-режим Android Resource Shrinker — аккуратнее, он без компромиссов

В Android можно включить resource shrinking, чтобы убрать из финального APK/Bundlа неиспользуемые ресурсы (строки, drawables, layouts и т.д.)
android {
buildTypes {
release {
shrinkResources true
minifyEnabled true
}
}
}


С недавних пор Google экспериментирует со strict режимом работы шринкера, который делает эту очистку более агрессивной, а именно:
👉 Удаляет все ресурсы, которые не удалось найти в коде или XML.
👉 Не делает допущений, что ресурс “вдруг используется где-то через reflection”. Нету явного использования или keep правила - удаление
👉 Режет всё под корень — даже если вы явно используете getIdentifier() или динамически загружаете ресурсы по имени, он может их не заметить и выкинуть.

📉 Эффект - меньший размер сборки, но есть риск крешей в рантайме, если ресурсы удалены, а были нужны

Как включается strict режим:
# В gradle.properties
android.experimental.enableStrictResourceShrinking=true


🛡 Как сохранить нужные ресурсы от удаления?

Если вы точно знаете, что ресурс используется, но shrinker может его не заметить:
1️⃣ProGuard правила (R8 учитывает их для ресурсов тоже):
# Правила для R8
-keepresources R.string.some_dynamic_string
-keepresources R.drawable.icon_loaded_by_name

2️⃣Файлы в папках res/raw/ и assets/ shrinker не трогает вообще.
3️⃣tools:keep и tools:discard в XML (подробнее тут):
<resources xmlns:tools="http://schemas.android.com/tools"
tools:keep="@layout/landing,@drawable/logo"
tools:discard="@drawable/unused_image" />


Рекомендации:
👉 Не включайте strict-режим без хорошего UI-тест-покрытия.
👉 Проверьте, что не используете динамическое получение ресурсов getIdentifier() без крайней необходимости.
👉 Добавляйте -keepresources, если есть малейшие сомнения.

Подробнее про оптимизацию ресурсов читайте в официальной документации

#android #r8 #оптимизация
Please open Telegram to view this post
VIEW IN TELEGRAM
👍434🔥4
📚 Must-read для разработчиков: книги, которые прокачают ваш код и мышление

Если вы хотите писать не просто рабочий, а чистый, масштабируемый и профессиональный код, сохраните себе эту подборку.

1️⃣ «Чистый код»
Для: Junior+/Middle, кто хочет избавиться от неидеального кода.
Фишка: учимся именовать переменные, рефакторить и работать с legacy так, чтобы коллеги не проклинали вас в чатиках.

2️⃣ «Идеальный программист»
Для: всех, кто хочет прокачать и код, и профессиональное мышление.
Фишка: про ответственность, дисциплину и почему «работает» ≠ «норм».

3️⃣ «Чистая архитектура»
Для: Middle+/Senior, кто проектирует системы.
Фишка: SOLID, Dependency Rule и как сделать архитектуру, которая не развалится через полгода.

4️⃣ «Head First. Архитектура ПО»
Для: тех, кто любит объяснения без скуки.
Фишка: интерактивный формат, картинки и «разжёвано» для новичков в теме.

🔥 По промокоду BROADCAST -25% на книги в издательстве Питер

Читали что-то из этого? Делитесь впечатлениями в комментариях!

#реклама
🔥38🤯9👍5🤔31
Очередное достижение на YouTube. За лет 5 лет ведение YouTube это не так много, но больше только впереди

#AndroidBroadcast
36🏆94👍5210🎉7🔥5
🚀 Вышел стабильный JavaScript движок от Google для Android

Новая стабильная библиотека Jetpack JavaScript Engine позволит разработчикам выполнять JS код в изолированной и ограниченной среде.

class MainActivity : ComponentActivity() {

// Теперь nullable, без lateinit
private var jsSandbox: JavaScriptSandbox? = null
private var jsIsolate: JavaScriptIsolate? = null

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

if (!JavaScriptSandbox.isSupported()) {
Log.e("JS", "JavaScriptSandbox не поддерживается")
return
}

lifecycleScope.launch {
// Создаём и сохраняем в nullable-поле
jsSandbox = JavaScriptSandbox
.createConnectedInstanceAsync(applicationContext)
.await()
jsIsolate = jsSandbox?.createIsolate()

// При выполнении гарантируем, что jsIsolate != null
val result: String = jsIsolate
?.evaluateJavaScriptAsync(JS_SCRIPT_SCRING)
?.await()
?: "Ошибка: isolate не инициализирован"

Log.d("JS", "Результат выполнения: $result")
}
}

override fun onDestroy() {
super.onDestroy()
// Закрываем только если не null
jsIsolate?.close()
jsSandbox?.close()
}
}


#jetpack #js
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯29👍16🔥21
@mobile_reviews_bot - Telegram бот для отслеживания отзывов на приложение в Google Play и App Store. Отвечать можно прямо из бота + есть ИИ для генерации ответов. Есть бесплатный тариф

Подробности на сайте

#googleplay #appstore
🔥23👍3🤯21
Подборка ТОП AI инструментов в разных сферах
🤔41👍8🤯8🔥21
Media is too big
VIEW IN TELEGRAM
📹 Embedded Layout Inspector (EN,6м)

Демонстрация возможностей встроенного в Android Studio инструмента Layout Inspector для дебага Compose UI

0:00 - Что за инструмент
1:31 - Как дебажить
5:26 - Итоги

#compose #androidstudio
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15
🏝 Проблемы с порядком Gradle Task при использовании KSP 2.0.2

Продолжаю разработку проекта FrameIO - Kotlin Multiplatform клиента для сервиса frame.io и стоклнулся с падением сборки из-за порядка задач (ниже стек с примером проблемы):

Some problems were found with the configuration of task ':module:kspDebugKotlinAndroid' (type 'KspAATask').
- Gradle detected a problem with the following location: './module'.

Reason: Task ':module:kspDebugKotlinAndroid' uses this output of task ':module:javaPreCompileDebug' without declaring an explicit or implicit dependency. This can lead to incorrect results being produced, depending on what order the tasks are executed.

Possible solutions:
1. Declare task ':module:javaPreCompileDebug' as an input of ':module:kspDebugKotlinAndroid'.
2. Declare an explicit dependency on ':module:javaPreCompileDebug' from ':module:kspDebugKotlinAndroid' using Task#dependsOn.
3. Declare an explicit dependency on ':core:user-session:javaPreCompileDebug' from ':module:kspDebugKotlinAndroid' using Task#mustRunAfter.

For more information, please refer to https://docs.gradle.org/8.14.2/userguide/validation_problems.html#implicit_dependency in the Gradle documentation.


Стек для сборки: Gradle 8.14.2, Kotlin 2.2.0, KSP 2.2.0-2.0.2, AGP 8.11.0

Решения проблемы пока нету в KSP (одно из issue), поэтому я задаю порядок Gradle Task сам:

// build.gradle.kts модуля где подключен ksp
afterEvaluate {
android.libraryVariants.forEach { variant ->
val variantCapitalized = variant.name.capitalized()
tasks.named("ksp${variantCapitalized}KotlinAndroid") {
dependsOn(
"${variant.name}AssetsCopyForAGP",
"process${variantCapitalized}Manifest",
"write${variantCapitalized}AarMetadata",
"javaPreCompile${variantCapitalized}",
"merge${variantCapitalized}Assets",
"merge${variantCapitalized}JniLibFolders",
"merge${variantCapitalized}NativeLibs",
"copy${variantCapitalized}JniLibsProjectOnly",
"generate${variantCapitalized}EmptyResourceFiles",
"copy${variantCapitalized}JniLibsProjectAndLocalJars",
"prepare${variantCapitalized}ArtProfile",
"write${variantCapitalized}LintModelMetadata",
"extractProguardFiles",
"prepareLintJarForPublish",
)
}
}
}


#android #kmp #koltin #ksp
Please open Telegram to view this post
VIEW IN TELEGRAM
👍87🤯5
🐘 Gradle начиная с версии 8.0. обязательно требует зависимостей между task, если один использует результаты другого

Явное объявление зависимостей требуется чтобы корректно выстроить порядок выполнения task-ок, гарантировать воспроизводимость сборки.

#gradle
Please open Telegram to view this post
VIEW IN TELEGRAM
19👍11🔥2
🚀 Знаете ли вы, что 30 минут работы стоя в день улучшают кровообращение и снижают нагрузку на позвоночник?

Теперь внедрить привычку в рутину стало проще!

Компания Ergostol представляет новинку — умный стол DeskUp, который помогает заботиться о здоровье маленькими, но эффективными шагами:
Плавно меняйте высоту (73–118 см) одним нажатием кнопки
Чередуйте сидячие и стоячие позы во время работы, звонков или творчества
Устали на созвоне? Опустите столешницу за секунды — сигнал, что пора завершать встречу!

Большие результаты начинаются с маленьких решений:
▸ Начните с 10 минут стоя во время утренней рутины
▸ Добавьте 1 видеозвонок без стула
▸ Используйте 3 предустановки высоты на пульте, чтобы не отвлекаться на настройки.

🎁 Начните свой путь к здоровью со скидкой по
промокоду ANDROID10

👉 Стол DeskUp и другие новинки по ссылке

Реклама. ООО «СОФТЭФФЕКТ». ИНН 7735575262
👍19🤔11🤯1
Как много приложений уже используют BDUI (Backend Driven UI или Server Driven UI) или перешли на него? Вы удивитесь, но МНОГО. Так проще для бизнеса:
👉 можно делать больше экспериментов
👉 не надо ждать когда разработчики сделают все варианты UI для экспериментов
👉 BDUI позволяет не ждать прохождение модерации магазина
👉 Элементы управления нативные а не как будет с Web

Подробнее про BDUI подход в статье(6м)

#android #bdui #sdui
🤯7👍4
Серия статей про MVI архитектуры и её корни:
1️⃣ Введение в MVx шаблоны (7м)
2️⃣ Подробнее про MVVM (8м)
3️⃣ Из чего готовят MVI (12м)
4️⃣ Готовим MVI (7м)

#архитектура #mvvm #mvi
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥30👍13🤔5🆒3
‼️ В Android снова накладывают ограничения на фоновую работу - фраза которой не удивить Android разработчика

Если хотите подробнее узнать про историю ограничений на выполнение работы в фоне с первых версий ОС до сегодня, то рекомендую вам прочитать статью(10м), а именно: AlarmManager, Background и Foreground Service, Doze Mode, JobScheduler и WorkManager, App Standby Buckets, Task Manager

#android
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥28👍13🤝4
2025/07/09 16:42:41
Back to Top
HTML Embed Code: