# Dmitry Samoylenko - Android Developer Blog

This is a personal blog. Mail me if you want to use materials from it.

This is one page of public article previews, not the complete archive. Follow Next page to continue. Summaries are not the original full articles.

## How to debug Android apps over the Internet

DevFeed: [How to debug Android apps over the Internet](<https://devfeed.tech/articles/how-to-debug-android-apps-over-the-internet-29059.md>)

Original publisher: [Read original article](<https://dmitrysamoylenko.com/2024/06/26/android-adb-debug-over-internet.html>)

Author: Dmitry Samoylenko

Published: 2024-06-26T00:00:00Z

Content type: tutorial

Language: en

Sources: [Dmitry Samoylenko - Android Developer Blog](<https://devfeed.tech/sources/dmitry-samoylenko-android-developer-blog.md>)

Topics: [adb](<https://devfeed.tech/topics/adb.md>), [Android](<https://devfeed.tech/topics/android.md>), [Wireless Debugging](<https://devfeed.tech/topics/wireless-debugging.md>), [debug](<https://devfeed.tech/topics/debug.md>), [Internet](<https://devfeed.tech/topics/internet.md>)

Tags: [adb](<https://devfeed.tech/tags/adb.md>), [android](<https://devfeed.tech/tags/android.md>), [android-apps](<https://devfeed.tech/tags/android-apps.md>), [debug](<https://devfeed.tech/tags/debug.md>), [internet](<https://devfeed.tech/tags/internet.md>), [remote](<https://devfeed.tech/tags/remote.md>), [server](<https://devfeed.tech/tags/server.md>)

### AI overview

A tutorial about debugging Android apps over the Internet when the developer and target device are in different locations or the app runs on a remote machine. It outlines connecting the phone to one machine with adb and checking the connection from the remote machine.

### Source excerpt

How to debug Android apps over the Internet

## How to cast Linux audio and microphone to Discord

DevFeed: [How to cast Linux audio and microphone to Discord](<https://devfeed.tech/articles/how-to-cast-linux-audio-and-microphone-to-discord-29058.md>)

Original publisher: [Read original article](<https://dmitrysamoylenko.com/2023/11/25/linux-music-and-mic-to-discord.html>)

Author: Dmitry Samoylenko

Published: 2023-11-25T00:00:00Z

Content type: tutorial

Language: en

Sources: [Dmitry Samoylenko - Android Developer Blog](<https://devfeed.tech/sources/dmitry-samoylenko-android-developer-blog.md>)

Topics: [Discord](<https://devfeed.tech/topics/discord.md>), [Linux](<https://devfeed.tech/topics/linux.md>), [Playback](<https://devfeed.tech/topics/playback.md>)

Tags: [audio](<https://devfeed.tech/tags/audio.md>), [cast](<https://devfeed.tech/tags/cast.md>), [devices](<https://devfeed.tech/tags/devices.md>), [discord](<https://devfeed.tech/tags/discord.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [linux](<https://devfeed.tech/tags/linux.md>), [music](<https://devfeed.tech/tags/music.md>), [music-player](<https://devfeed.tech/tags/music-player.md>), [playback](<https://devfeed.tech/tags/playback.md>)

### AI overview

A tutorial explaining how to route Linux system audio and microphone input to Discord by creating virtual audio sinks and configuring them in PulseAudio's pavucontrol.

### Source excerpt

How to cast Linux audio and microphone to Discord

## Databinding Episode II; Past Mistakes

DevFeed: [Databinding Episode II; Past Mistakes](<https://devfeed.tech/articles/databinding-episode-ii-past-mistakes-29057.md>)

Original publisher: [Read original article](<https://dmitrysamoylenko.com/2021/10/13/databinding_past_mistakes.html>)

Author: Dmitry Samoylenko

Published: 2021-10-13T00:00:00Z

Content type: article

Language: en

Sources: [Dmitry Samoylenko - Android Developer Blog](<https://devfeed.tech/sources/dmitry-samoylenko-android-developer-blog.md>)

Topics: [Android](<https://devfeed.tech/topics/android.md>), [android-development](<https://devfeed.tech/topics/android-development.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Java](<https://devfeed.tech/topics/java.md>), [Development](<https://devfeed.tech/topics/development.md>), [Jetpack](<https://devfeed.tech/topics/jetpack.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [android-development](<https://devfeed.tech/tags/android-development.md>), [bugs](<https://devfeed.tech/tags/bugs.md>), [java](<https://devfeed.tech/tags/java.md>), [jetpack](<https://devfeed.tech/tags/jetpack.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>)

### AI overview

This short Android development article examines a databinding problem involving inheritance between Kotlin and Java classes. It concludes that Java classes should not inherit from Kotlin classes in this situation and briefly suggests considering Jetpack Compose.

### Source excerpt

Databinding Episode II; Mistakes of the Past

## Modifying a THICC-15 Laptop for Android Development

DevFeed: [Modifying a THICC-15 Laptop for Android Development](<https://devfeed.tech/articles/finishing-the-thi-15-29056.md>)

Original publisher: [Read original article](<https://dmitrysamoylenko.com/2021/04/01/choose-right-tool.html>)

Author: Dmitry Samoylenko

Published: 2021-04-01T00:00:00Z

Content type: article

Language: en

Sources: [Dmitry Samoylenko - Android Developer Blog](<https://devfeed.tech/sources/dmitry-samoylenko-android-developer-blog.md>)

Topics: [Development](<https://devfeed.tech/topics/development.md>), [android-development](<https://devfeed.tech/topics/android-development.md>), [cpu](<https://devfeed.tech/topics/cpu.md>)

Tags: [android-development](<https://devfeed.tech/tags/android-development.md>), [development](<https://devfeed.tech/tags/development.md>), [heat](<https://devfeed.tech/tags/heat.md>), [internals](<https://devfeed.tech/tags/internals.md>), [laptop](<https://devfeed.tech/tags/laptop.md>), [processor](<https://devfeed.tech/tags/processor.md>)

### AI overview

A hands-on account of modifying a THICC-15 laptop for Android development. The author adds a desktop Ryzen 9 3950X, cuts an opening in the cover, installs mesh ventilation, and adds copper cooling plates and thermal paste to improve portability and cooling.

### Source excerpt

Or a Laptop for Android Development First step - we buy this chunky guy Update: on their site, only the full version with internals THICC-15 is left

## Experiment with Kotlin Mobile Multiplatform

DevFeed: [Experiment with Kotlin Mobile Multiplatform](<https://devfeed.tech/articles/experiment-with-kotlin-mobile-multiplatform-29055.md>)

Original publisher: [Read original article](<https://dmitrysamoylenko.com/2021/01/22/kmm.html>)

Author: Dmitry Samoylenko

Published: 2021-01-22T00:00:00Z

Content type: opinion

Language: en

Sources: [Dmitry Samoylenko - Android Developer Blog](<https://devfeed.tech/sources/dmitry-samoylenko-android-developer-blog.md>)

Topics: [multiplatform](<https://devfeed.tech/topics/multiplatform.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Mobile](<https://devfeed.tech/topics/mobile.md>), [Android](<https://devfeed.tech/topics/android.md>), [iOS](<https://devfeed.tech/topics/ios.md>), [Gradle](<https://devfeed.tech/topics/gradle.md>), [Ktor](<https://devfeed.tech/topics/ktor.md>), [Coroutines](<https://devfeed.tech/topics/coroutines.md>), [CI/CD](<https://devfeed.tech/topics/cicd.md>), [unit tests](<https://devfeed.tech/topics/unit-tests.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [ci-cd](<https://devfeed.tech/tags/ci-cd.md>), [coroutines](<https://devfeed.tech/tags/coroutines.md>), [gradle](<https://devfeed.tech/tags/gradle.md>), [ios](<https://devfeed.tech/tags/ios.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [ktor](<https://devfeed.tech/tags/ktor.md>), [mobile](<https://devfeed.tech/tags/mobile.md>), [multiplatform](<https://devfeed.tech/tags/multiplatform.md>), [unit-tests](<https://devfeed.tech/tags/unit-tests.md>)

### AI overview

An experiment with Kotlin Multiplatform examines shared code between Android and iOS, comparing app size and outlining benefits, maintenance challenges, tooling requirements, and possible effects on developer roles.

### Source excerpt

Experiment with ivi pages:

## Setting up precommit lints for all team members

DevFeed: [Setting up precommit lints for all team members](<https://devfeed.tech/articles/setting-up-precommit-lints-for-all-team-members-29054.md>)

Original publisher: [Read original article](<https://dmitrysamoylenko.com/2020/12/06/configure_lints.html>)

Author: Dmitry Samoylenko

Published: 2020-12-06T00:00:00Z

Content type: tutorial

Language: en

Sources: [Dmitry Samoylenko - Android Developer Blog](<https://devfeed.tech/sources/dmitry-samoylenko-android-developer-blog.md>)

Topics: [Script](<https://devfeed.tech/topics/script.md>), [Git](<https://devfeed.tech/topics/git.md>), [Unix](<https://devfeed.tech/topics/unix.md>), [Command-line interface](<https://devfeed.tech/topics/cli.md>), [Windows](<https://devfeed.tech/topics/windows.md>)

Tags: [androidstudio](<https://devfeed.tech/tags/androidstudio.md>), [command-line](<https://devfeed.tech/tags/command-line.md>), [detekt](<https://devfeed.tech/tags/detekt.md>), [git](<https://devfeed.tech/tags/git.md>), [pre-commit](<https://devfeed.tech/tags/pre-commit.md>), [script](<https://devfeed.tech/tags/script.md>), [unix](<https://devfeed.tech/tags/unix.md>), [windows](<https://devfeed.tech/tags/windows.md>)

### AI overview

A tutorial on configuring Detekt and ktlint, running lint checks before each Git commit with a pre-commit script, and sharing the setup with team members. The script supports Unix systems and requires edits for Windows.

### Source excerpt

What lints?

## Which is faster? ConcurrentSkipListSet vs TreeSet+synchronized

DevFeed: [Which is faster? ConcurrentSkipListSet vs TreeSet+synchronized](<https://devfeed.tech/articles/which-is-faster-concurrentskiplistset-vs-treeset-synchronized-29053.md>)

Original publisher: [Read original article](<https://dmitrysamoylenko.com/2020/10/05/concurrent_skip_list_set.html>)

Author: Dmitry Samoylenko

Published: 2020-10-05T00:00:00Z

Content type: comparison

Language: en

Sources: [Dmitry Samoylenko - Android Developer Blog](<https://devfeed.tech/sources/dmitry-samoylenko-android-developer-blog.md>)

Topics: [Concurrency](<https://devfeed.tech/topics/concurrency.md>), [Java](<https://devfeed.tech/topics/java.md>), [Concurrent Programming](<https://devfeed.tech/topics/concurrent-programming.md>), [Benchmark](<https://devfeed.tech/topics/benchmark.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [asynchronous](<https://devfeed.tech/tags/asynchronous.md>), [code](<https://devfeed.tech/tags/code.md>), [concurrency](<https://devfeed.tech/tags/concurrency.md>), [java](<https://devfeed.tech/tags/java.md>), [performance](<https://devfeed.tech/tags/performance.md>), [synchronization](<https://devfeed.tech/tags/synchronization.md>)

### AI overview

This comparison examines manual synchronization with TreeSet versus ConcurrentSkipListSet for collecting and sorting data from asynchronous requests. In the described use case, TreeSet with synchronization was nearly twice as fast, while the broader choice depends on the workload and number of concurrent events.

### Source excerpt

What's the difference Those two collections are all sorted and very useful when you need to maintain some order in dynamically filled data. However, when concurrency takes place there is a gotcha. We have a choice: use manual synchronization or use ConcurrentSkipListSet from java.concurrent package.

## First Look at Jetpack Compose

DevFeed: [First Look at Jetpack Compose](<https://devfeed.tech/articles/first-look-at-jetpack-compose-29052.md>)

Original publisher: [Read original article](<https://dmitrysamoylenko.com/2020/09/13/jetpack_compose.html>)

Author: Dmitry Samoylenko

Published: 2020-09-13T00:00:00Z

Content type: article

Language: en

Sources: [Dmitry Samoylenko - Android Developer Blog](<https://devfeed.tech/sources/dmitry-samoylenko-android-developer-blog.md>)

Topics: [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [Android](<https://devfeed.tech/topics/android.md>), [Android Studio](<https://devfeed.tech/topics/android-studio.md>), [recyclerview](<https://devfeed.tech/topics/recyclerview.md>), [Canvas](<https://devfeed.tech/topics/canvas.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [android-studio](<https://devfeed.tech/tags/android-studio.md>), [canvas](<https://devfeed.tech/tags/canvas.md>), [compose](<https://devfeed.tech/tags/compose.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [recyclerview](<https://devfeed.tech/tags/recyclerview.md>)

### AI overview

This article gives an early evaluation of Jetpack Compose by comparing it with traditional Android Views and RecyclerView. It reports higher memory usage for Compose in large scrolling lists, while highlighting concise APIs, lazy-list support, and selective redraw behavior. The article notes that Compose was still in alpha and that its infinite-list support was limited.

### Source excerpt

Let's Create a Hundred Thousand Views I should say upfront that this article is not intended to nitpick this library, as I personally find it quite appealing. First, we'll create a simple list to add views to. This is an inefficient method, but it will illustrate the overall picture of how much attention was paid to performance in the new framework. So, let's compare the old method: class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val N = 100_000 setContentView( ScrollView(this).apply { addView( LinearLayout(context).apply { orientation = LinearLayout.VERTICAL repeat(N) { addView( TextView(context) .apply { text = "hello $it" }) } }) }) } } And the new method: class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val N = 100_000 setContent { MyApplicationTheme { Surface(color = MaterialTheme.colors.background) { ScrollableColumn { repeat(N) { Text(text = "Hello $it") } } } } } } } This is a simple scrolling list, where N text views are arranged vertically.

## Implementing a Global try-catch for an Android Application

DevFeed: [Implementing a Global try-catch for an Android Application](<https://devfeed.tech/articles/implementing-a-global-try-catch-for-an-android-application-29051.md>)

Original publisher: [Read original article](<https://dmitrysamoylenko.com/2020/08/19/android_try_catch.html>)

Author: Dmitry Samoylenko

Published: 2020-08-19T00:00:00Z

Content type: tutorial

Language: en

Sources: [Dmitry Samoylenko - Android Developer Blog](<https://devfeed.tech/sources/dmitry-samoylenko-android-developer-blog.md>)

Topics: [LineageOS](<https://devfeed.tech/topics/lineageos.md>), [Java](<https://devfeed.tech/topics/java.md>), [Crashlytics](<https://devfeed.tech/topics/crashlytics.md>), [Firebase](<https://devfeed.tech/topics/firebase.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [crashes](<https://devfeed.tech/tags/crashes.md>), [crashlytics](<https://devfeed.tech/tags/crashlytics.md>), [firebase](<https://devfeed.tech/tags/firebase.md>), [java](<https://devfeed.tech/tags/java.md>)

### AI overview

This Android tutorial explains how the ActivityThread and Looper architecture causes uncaught errors in activity or view callbacks to terminate an application. It presents a global error-handling approach that restarts the looper so the application can respond again, while recommending that caught crashes be sent to Firebase Crashlytics because they will no longer appear as standard crashes in Google Play reports.

### Source excerpt

Where in the Application is the main() Method Hidden?

## Replacing Direct Field Access with a Getter in IntelliJ IDEA

DevFeed: [Replacing Direct Field Access with a Getter in IntelliJ IDEA](<https://devfeed.tech/articles/a-cool-refactoring-hidden-in-intellij-idea-29050.md>)

Original publisher: [Read original article](<https://dmitrysamoylenko.com/2020/07/06/cool_intellij_idea.html>)

Author: Dmitry Samoylenko

Published: 2020-07-06T00:00:00Z

Content type: tutorial

Language: en

Sources: [Dmitry Samoylenko - Android Developer Blog](<https://devfeed.tech/sources/dmitry-samoylenko-android-developer-blog.md>)

Topics: [IntelliJ IDEA](<https://devfeed.tech/topics/intellij-idea.md>), [Refactoring](<https://devfeed.tech/topics/refactoring.md>), [Code](<https://devfeed.tech/topics/code.md>), [jetbrains](<https://devfeed.tech/topics/jetbrains.md>)

Tags: [code](<https://devfeed.tech/tags/code.md>), [intellij](<https://devfeed.tech/tags/intellij.md>), [intellij-idea](<https://devfeed.tech/tags/intellij-idea.md>), [jetbrains](<https://devfeed.tech/tags/jetbrains.md>), [refactoring](<https://devfeed.tech/tags/refactoring.md>)

### AI overview

A tutorial on using IntelliJ IDEA refactoring tools to replace direct field access with a getter throughout a codebase.

### Source excerpt

This is about replacing field access with a getter By default, there's a visible refactoring option for this through alt+insert - getter.