Media is too big
VIEW IN TELEGRAM
Делаю ревью кода проекта примера от Google - "Now in Android". Весь стек технологий от Google, Compose и адаптивная верстка UI
#AndroidBroadcast #codereview
Please open Telegram to view this post
VIEW IN TELEGRAM
DroidDex.getPerformanceLevelLd(PerformanceClass.CPU, PerformanceClass.MEMORY)
.observe(lifecycleOwner) { level: PerformanceLevel ->
when(level) {
EXCELLENT -> // Флагманский уровень
HIGH -> // Довольно сильное устройство, но не самое мощное
AVERAGE -> // Средняя производительность/возможности
LOW -> // Бюджетный телефон/низкая производительность
UNKNOWN -> // Не смогли понять ничего
}
}
Больше подробностей в статье или вот ссылка
#android #производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
Меняете работу приложения в зависимости от состояния/возможностей устройства?
Anonymous Poll
13%
Да
3%
Пробовали, но отказались
62%
Нет
12%
А так можно?
1%
Не занимаюсь разработкой
1%
Другой вариант
8%
Не участвую в опросе
Media is too big
VIEW IN TELEGRAM
Спикеры рассказали о том, как боролись за ускорение релизной сборки в мобильном банке и что из этого в итоге получилось. Разобрали особенности релизной сборки, связанные с подрезкой (shrinking) кода и ресурсов. Посмотрели, как профилировать и анализировать работу R8, а также отдельных Gradle-тасок, участвующих в подготовке релизной версии приложения.
Доклад для практикующих Андроид-инженеров с элементами хардкора.
🔗 Подробнее о конференции Mobius
🔗 Скачать презентацию
#android #mobius #gradle
Please open Telegram to view this post
VIEW IN TELEGRAM
Из-за того что одна команда добавила правило, это сильно затормозило весь этап работы 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
В 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 может его не заметить:
# Правила для R8
-keepresources R.string.some_dynamic_string
-keepresources R.drawable.icon_loaded_by_name
res/raw/
и assets/
shrinker не трогает вообще.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
📚 Must-read для разработчиков: книги, которые прокачают ваш код и мышление
Если вы хотите писать не просто рабочий, а чистый, масштабируемый и профессиональный код, сохраните себе эту подборку.
1️⃣ «Чистый код»
Для: Junior+/Middle, кто хочет избавиться от неидеального кода.
Фишка: учимся именовать переменные, рефакторить и работать с legacy так, чтобы коллеги не проклинали вас в чатиках.
2️⃣ «Идеальный программист»
Для: всех, кто хочет прокачать и код, и профессиональное мышление.
Фишка: про ответственность, дисциплину и почему «работает» ≠ «норм».
3️⃣ «Чистая архитектура»
Для: Middle+/Senior, кто проектирует системы.
Фишка: SOLID, Dependency Rule и как сделать архитектуру, которая не развалится через полгода.
4️⃣ «Head First. Архитектура ПО»
Для: тех, кто любит объяснения без скуки.
Фишка: интерактивный формат, картинки и «разжёвано» для новичков в теме.
🔥 По промокоду
Читали что-то из этого? Делитесь впечатлениями в комментариях!
#реклама
Если вы хотите писать не просто рабочий, а чистый, масштабируемый и профессиональный код, сохраните себе эту подборку.
1️⃣ «Чистый код»
Для: Junior+/Middle, кто хочет избавиться от неидеального кода.
Фишка: учимся именовать переменные, рефакторить и работать с legacy так, чтобы коллеги не проклинали вас в чатиках.
2️⃣ «Идеальный программист»
Для: всех, кто хочет прокачать и код, и профессиональное мышление.
Фишка: про ответственность, дисциплину и почему «работает» ≠ «норм».
3️⃣ «Чистая архитектура»
Для: Middle+/Senior, кто проектирует системы.
Фишка: SOLID, Dependency Rule и как сделать архитектуру, которая не развалится через полгода.
4️⃣ «Head First. Архитектура ПО»
Для: тех, кто любит объяснения без скуки.
Фишка: интерактивный формат, картинки и «разжёвано» для новичков в теме.
🔥 По промокоду
BROADCAST
-25% на книги в издательстве ПитерЧитали что-то из этого? Делитесь впечатлениями в комментариях!
#реклама
Очередное достижение на YouTube. За лет 5 лет ведение YouTube это не так много, но больше только впереди
#AndroidBroadcast
#AndroidBroadcast
Новая стабильная библиотека 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
Используете библиотеку Jetpack App Search?
Anonymous Poll
88%
Не знаю про такую
1%
Да
7%
Знаю, но не использую
0%
Пробовали, но отказались
0%
Не пишу под Android
0%
Другой вариант (пиши в комментах)
3%
Не участвую в опросе
@mobile_reviews_bot - Telegram бот для отслеживания отзывов на приложение в Google Play и App Store. Отвечать можно прямо из бота + есть ИИ для генерации ответов. Есть бесплатный тариф
Подробности на сайте
#googleplay #appstore
Подробности на сайте
#googleplay #appstore
Media is too big
VIEW IN TELEGRAM
Демонстрация возможностей встроенного в Android Studio инструмента Layout Inspector для дебага Compose UI
0:00 - Что за инструмент
1:31 - Как дебажить
5:26 - Итоги
#compose #androidstudio
Please open Telegram to view this post
VIEW IN TELEGRAM
Продолжаю разработку проекта 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
Явное объявление зависимостей требуется чтобы корректно выстроить порядок выполнения task-ок, гарантировать воспроизводимость сборки.
#gradle
Please open Telegram to view this post
VIEW IN TELEGRAM
🚀 Знаете ли вы, что 30 минут работы стоя в день улучшают кровообращение и снижают нагрузку на позвоночник?
Теперь внедрить привычку в рутину стало проще!
Компания Ergostol представляет новинку — умный стол DeskUp, который помогает заботиться о здоровье маленькими, но эффективными шагами:
✅ Плавно меняйте высоту (73–118 см) одним нажатием кнопки
✅ Чередуйте сидячие и стоячие позы во время работы, звонков или творчества
✅ Устали на созвоне? Опустите столешницу за секунды — сигнал, что пора завершать встречу!
Большие результаты начинаются с маленьких решений:
▸ Начните с 10 минут стоя во время утренней рутины
▸ Добавьте 1 видеозвонок без стула
▸ Используйте 3 предустановки высоты на пульте, чтобы не отвлекаться на настройки.
🎁 Начните свой путь к здоровью со скидкой по промокоду
👉 Стол DeskUp и другие новинки по ссылке
Реклама. ООО «СОФТЭФФЕКТ». ИНН 7735575262
Теперь внедрить привычку в рутину стало проще!
Компания Ergostol представляет новинку — умный стол DeskUp, который помогает заботиться о здоровье маленькими, но эффективными шагами:
✅ Плавно меняйте высоту (73–118 см) одним нажатием кнопки
✅ Чередуйте сидячие и стоячие позы во время работы, звонков или творчества
✅ Устали на созвоне? Опустите столешницу за секунды — сигнал, что пора завершать встречу!
Большие результаты начинаются с маленьких решений:
▸ Начните с 10 минут стоя во время утренней рутины
▸ Добавьте 1 видеозвонок без стула
▸ Используйте 3 предустановки высоты на пульте, чтобы не отвлекаться на настройки.
🎁 Начните свой путь к здоровью со скидкой по промокоду
ANDROID10
👉 Стол DeskUp и другие новинки по ссылке
Реклама. ООО «СОФТЭФФЕКТ». ИНН 7735575262
Как много приложений уже используют BDUI (Backend Driven UI или Server Driven UI) или перешли на него? Вы удивитесь, но МНОГО. Так проще для бизнеса:
👉 можно делать больше экспериментов
👉 не надо ждать когда разработчики сделают все варианты UI для экспериментов
👉 BDUI позволяет не ждать прохождение модерации магазина
👉 Элементы управления нативные а не как будет с Web
Подробнее про BDUI подход в статье(6м)
#android #bdui #sdui
👉 можно делать больше экспериментов
👉 не надо ждать когда разработчики сделают все варианты UI для экспериментов
👉 BDUI позволяет не ждать прохождение модерации магазина
👉 Элементы управления нативные а не как будет с Web
Подробнее про BDUI подход в статье(6м)
#android #bdui #sdui
В вашем мобильном приложение есть BDUI?
Anonymous Poll
56%
Нет
30%
Да, собственное решение
3%
Да, используем стороннее решение
2%
Было, но отказались
4%
Не знаю
0%
Не занимаюсь разработкой
1%
Другой вариант
5%
Не участвую в опросе