TGViewer
Channel Public Channel
Android Broadcast

Android Broadcast

@android_broadcast

Подборка новостей и статей для Android разработчиков.

Реклама и связь с автором @ab_manager

РКН https://abdev.by/rkn_tg_ab #MQRZR
Subscribers
14.5K
Photos
3.9K
Videos
399
Links
6.3K

Showing posts older than #9311 · Back to latest

Older Posts 19 shown
Post #9309 7.63K
‼️ В Android снова накладывают ограничения на фоновую работу - фраза которой не удивить Android разработчика

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

#android
  • 🔥 34
  • 👍 14
  • 🤝 4
  • 🤯 1
Post #9307 6.93K
  • 🤔 4
  • 👍 2
  • ❤ 1
  • 🏆 1
Post #9306 6.29K
Как много приложений уже используют BDUI (Backend Driven UI или Server Driven UI) или перешли на него? Вы удивитесь, но МНОГО. Так проще для бизнеса:
👉 можно делать больше экспериментов
👉 не надо ждать когда разработчики сделают все варианты UI для экспериментов
👉 BDUI позволяет не ждать прохождение модерации магазина
👉 Элементы управления нативные а не как будет с Web

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

#android #bdui #sdui
  • 🤯 11
  • 👍 6
Post #9302 6.93K
🐘 Gradle начиная с версии 8.0. обязательно требует зависимостей между task, если один использует результаты другого

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

#gradle
  • ❤ 21
  • 👍 12
  • 🔥 2
Post #9301 7.34K
🏝 Проблемы с порядком 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
  • 👍 10
  • ❤ 7
  • 🤯 6
Post #9300 6.95K
📹 Embedded Layout Inspector (EN,6м)

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

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

#compose #androidstudio
  • 👍 17
Post #9299 10.1K
Подборка ТОП AI инструментов в разных сферах
  • 🤔 42
  • 👍 10
  • 🤯 8
  • 🔥 2
  • ❤ 1
Post #9297 8.31K
@mobile_reviews_bot - Telegram бот для отслеживания отзывов на приложение в Google Play и App Store. Отвечать можно прямо из бота + есть ИИ для генерации ответов. Есть бесплатный тариф

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

#googleplay #appstore
  • 🔥 23
  • 👍 3
  • 🤯 3
  • ❤ 1
Post #9296 6.82K
  • ❤ 8
  • 👍 2
Post #9295 7.09K
🚀 Вышел стабильный 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
  • 🤯 33
  • 👍 17
  • 🔥 2
  • ❤ 1
Post #9294 5.9K
Очередное достижение на YouTube. За лет 5 лет ведение YouTube это не так много, но больше только впереди

#AndroidBroadcast
  • 🏆 102
  • 👍 53
  • ❤ 10
  • 🎉 8
  • 🔥 5
Post #9293 8.35K
📚 Must-read для разработчиков: книги, которые прокачают ваш код и мышление

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

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

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

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

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

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

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

#реклама
  • 🔥 39
  • 🤯 9
  • 👍 5
  • 🤔 3
  • ❤ 1
Post #9292 5.99K
🤖 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 #оптимизация
  • 👍 45
  • ❤ 4
  • 🔥 4
Post #9291 6.62K
‼️ Следите за правила для минификации кода 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
  • 👍 22
Post #9290 6.8K
📹 Как мы случайно ускорили релизную сборку в два раза. Роман Заремба, Юрий Анисимов из Т-Банк, Mobius 2025 Весна

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

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

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

#android #mobius #gradle
  • 🔥 34
  • 👍 11
Post #9288 7.28K
🐱 Droidex - Android библиотека для определения уровня производительности устройства на основе характеристик и состояния: процессора, памяти, размера heap, скорости доступа в сеть, свободного хранилища, заряда батаерии и прочих настроек на устройстве.

DroidDex.getPerformanceLevelLd(PerformanceClass.CPU, PerformanceClass.MEMORY)
.observe(lifecycleOwner) { level: PerformanceLevel ->
when(level) {
EXCELLENT -> // Флагманский уровень
HIGH -> // Довольно сильное устройство, но не самое мощное
AVERAGE -> // Средняя производительность/возможности
LOW -> // Бюджетный телефон/низкая производительность
UNKNOWN -> // Не смогли понять ничего
}
}


Больше подробностей в статье или вот ссылка

#android #производительность
  • 👍 45
  • ❤ 4
Older posts →
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →