<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Prakhar Shakya</title>
    <description>The latest articles on DEV Community by Prakhar Shakya (@prakhars).</description>
    <link>https://dev.to/prakhars</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2020892%2F77f0fb73-2198-4f11-b4bd-6b4c7fa2f98e.jpg</url>
      <title>DEV Community: Prakhar Shakya</title>
      <link>https://dev.to/prakhars</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/prakhars"/>
    <language>en</language>
    <item>
      <title>Why do webdev posts get so much engagement? Where are Java people?</title>
      <dc:creator>Prakhar Shakya</dc:creator>
      <pubDate>Fri, 03 Jan 2025 05:59:20 +0000</pubDate>
      <link>https://dev.to/prakhars/why-do-webdev-posts-get-so-much-engagement-where-are-java-people-5eii</link>
      <guid>https://dev.to/prakhars/why-do-webdev-posts-get-so-much-engagement-where-are-java-people-5eii</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/prakhars" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2020892%2F77f0fb73-2198-4f11-b4bd-6b4c7fa2f98e.jpg" alt="prakhars"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/prakhars/a-comprehensive-guide-to-mastering-kotlin-coroutines-1ai3" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;A Comprehensive Guide to Mastering Kotlin Coroutines&lt;/h2&gt;
      &lt;h3&gt;Prakhar Shakya ・ Jan 3&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#java&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#android&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#mobile&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#kotlin&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>webdev</category>
      <category>java</category>
      <category>discuss</category>
    </item>
    <item>
      <title>A Comprehensive Guide to Mastering Kotlin Coroutines</title>
      <dc:creator>Prakhar Shakya</dc:creator>
      <pubDate>Fri, 03 Jan 2025 05:54:04 +0000</pubDate>
      <link>https://dev.to/prakhars/a-comprehensive-guide-to-mastering-kotlin-coroutines-1ai3</link>
      <guid>https://dev.to/prakhars/a-comprehensive-guide-to-mastering-kotlin-coroutines-1ai3</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Coroutines simplify asynchronous programming by making it more readable and efficient. Think of threads as individual cars on a highway, each taking up space and resources. In contrast, coroutines are like carpooling - multiple tasks sharing resources efficiently.&lt;br&gt;
Three main benefits make coroutines stand out:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Simplicity and readability in handling async operations&lt;/li&gt;
&lt;li&gt;Efficient resource management compared to traditional threads&lt;/li&gt;
&lt;li&gt;Enhanced code maintainability through structured concurrency&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  Setting Up Coroutines
&lt;/h2&gt;

&lt;p&gt;To get started with coroutines in your Android project, add these dependencies to your &lt;code&gt;build.gradle&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dependencies {
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1"
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Understanding Coroutine Builders
&lt;/h2&gt;

&lt;p&gt;Coroutine builders are the foundation for creating and launching coroutines. Let's explore each type with practical examples:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Launch&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class WeatherService {
    fun updateWeather() {
        lifecycleScope.launch {
            // Simulating weather API call
            val weather = fetchWeatherData()
            updateUI(weather)
        }
    }

    private suspend fun fetchWeatherData(): Weather {
        delay(1000) // Simulate network delay
        return Weather(temperature = 25, condition = "Sunny")
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Asynch&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class StockPortfolio {
    suspend fun fetchPortfolioValue() {
        val stocksDeferred = async { fetchStockPrices() }
        val cryptoDeferred = async { fetchCryptoPrices() }

        // Wait for both results
        val totalValue = stocksDeferred.await() + cryptoDeferred.await()
        println("Portfolio value: $totalValue")
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Coroutine Scopes and Contexts
&lt;/h2&gt;

&lt;p&gt;Understanding scopes and contexts is crucial for proper coroutine management. Let's look at different scope types:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LifecycleScope&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class NewsActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        lifecycleScope.launch {
            val news = newsRepository.fetchLatestNews()
            newsAdapter.submitList(news)
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;ViewModelScope&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class UserViewModel : ViewModel() {
    private val _userData = MutableLiveData&amp;lt;User&amp;gt;()

    fun loadUserData() {
        viewModelScope.launch {
            try {
                val user = userRepository.fetchUserDetails()
                _userData.value = user
            } catch (e: Exception) {
                // Handle error
            }
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Working with Dispatchers
&lt;/h2&gt;

&lt;p&gt;Dispatchers determine which thread coroutines run on. Here's how to use different dispatchers effectively:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class ImageProcessor {
    fun processImage(bitmap: Bitmap) {
        lifecycleScope.launch(Dispatchers.Default) {
            // CPU-intensive image processing
            val processed = applyFilters(bitmap)

            withContext(Dispatchers.Main) {
                // Update UI with processed image
                imageView.setImageBitmap(processed)
            }
        }
    }

    suspend fun downloadImage(url: String) {
        withContext(Dispatchers.IO) {
            // Network operation to download image
            val response = imageApi.fetchImage(url)
            saveToDatabase(response)
        }
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Error Handling and Exception Management
&lt;/h2&gt;

&lt;p&gt;Proper &lt;a href="https://quashbugs.com/blog/a-deep-dive-into-kotlin-exception-handling" rel="noopener noreferrer"&gt;error handling&lt;/a&gt; is essential in coroutines. Here's how to implement it effectively:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class DataManager {
    private val exceptionHandler = CoroutineExceptionHandler { _, exception -&amp;gt;
        println("Caught $exception")
    }

    fun fetchData() {
        lifecycleScope.launch(exceptionHandler) {
            try {
                val result = riskyOperation()
                processResult(result)
            } catch (e: NetworkException) {
                showError("Network error occurred")
            } catch (e: DatabaseException) {
                showError("Database error occurred")
            }
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Flow and StateFlow
&lt;/h2&gt;

&lt;p&gt;Flow is perfect for handling streams of data, while StateFlow is ideal for managing UI state:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class SearchViewModel : ViewModel() {
    private val _searchResults = MutableStateFlow&amp;lt;List&amp;lt;SearchResult&amp;gt;&amp;gt;(emptyList())
    val searchResults: StateFlow&amp;lt;List&amp;lt;SearchResult&amp;gt;&amp;gt; = _searchResults.asStateFlow()

    fun search(query: String) {
        viewModelScope.launch {
            searchRepository.getSearchResults(query)
                .flowOn(Dispatchers.IO)
                .catch { e -&amp;gt; 
                    // Handle errors
                }
                .collect { results -&amp;gt;
                    _searchResults.value = results
                }
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Structured Concurrency
&lt;/h2&gt;

&lt;p&gt;Structured concurrency helps manage related coroutines effectively:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class OrderProcessor {
    suspend fun processOrder(orderId: String) = coroutineScope {
        val orderDeferred = async { fetchOrderDetails(orderId) }
        val inventoryDeferred = async { checkInventory(orderId) }
        val paymentDeferred = async { processPayment(orderId) }

        try {
            val order = orderDeferred.await()
            val inventory = inventoryDeferred.await()
            val payment = paymentDeferred.await()

            finalizeOrder(order, inventory, payment)
        } catch (e: Exception) {
            // If any operation fails, all others are automatically cancelled
            throw OrderProcessingException("Failed to process order", e)
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Kotlin coroutines provide a powerful yet intuitive way to handle asynchronous operations in Android development. By understanding these core concepts and patterns, you can write more efficient, maintainable, and robust applications. Remember to always consider the appropriate scope, dispatcher, and error handling strategies for your specific use case.&lt;/p&gt;

&lt;p&gt;The key to mastering coroutines is practice - start implementing them in your projects, experiment with different patterns, and gradually build more complex implementations as your understanding grows.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Originally written &lt;a href="https://quashbugs.com/blog/a-comprehensive-guide-to-mastering-kotlin-coroutines" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>java</category>
      <category>android</category>
      <category>mobile</category>
      <category>kotlin</category>
    </item>
    <item>
      <title>How to Inspect Element on an Android App (Actual App, not Web)</title>
      <dc:creator>Prakhar Shakya</dc:creator>
      <pubDate>Fri, 18 Oct 2024 10:19:18 +0000</pubDate>
      <link>https://dev.to/prakhars/how-to-inspect-element-on-an-android-app-easily-25b8</link>
      <guid>https://dev.to/prakhars/how-to-inspect-element-on-an-android-app-easily-25b8</guid>
      <description>&lt;p&gt;If you've ever thought, "How do I inspect an Android app the same way I do with websites?" – you're in the right place.&lt;/p&gt;

&lt;p&gt;Let's break it down, step by step, for &lt;em&gt;everyone&lt;/em&gt;.&lt;/p&gt;




&lt;p&gt;Although these steps will show you how to inspect elements on an app, keep in mind that this only works for apps that you own or have access to their source code. If you're thinking of inspecting a popular app (like AirBnB, Uber, etc.), well... sorry, friend, Android doesn't play that game. Unlike browsers where you can inspect anything and everything, Android apps are a bit more possessive. You can only inspect what you control.&lt;/p&gt;

&lt;p&gt;Oh, and while we're at it – inside &lt;strong&gt;Developer Options&lt;/strong&gt;, there's a setting called &lt;strong&gt;Show Layout Bounds&lt;/strong&gt;. It's a bit like putting on x-ray glasses for your app UI – it shows the boundaries, margins, and paddings of everything on the screen. Cool, right? Well, sort of. It's not exactly deep inspection, but it's handy for checking if everything lines up nicely or if your UI elements are misbehaving.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftu88iw9po6dwkazyc17n.png" alt="Layout bounds in Android Settings" width="800" height="616"&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Step 1: Ensure Your App is Debuggable
&lt;/h2&gt;

&lt;p&gt;First things first, your app needs to be debuggable. Without this, Android Studio won't let you peek under the hood.&lt;/p&gt;

&lt;p&gt;In your &lt;code&gt;build.gradle&lt;/code&gt; file, make sure you set &lt;code&gt;debuggable:true&lt;/code&gt; &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Heads up:&lt;/strong&gt; Set &lt;code&gt;debuggable:true&lt;/code&gt; only for testing or staging builds—not for your production builds. You don't want to ship a debuggable app to your users; it's a security risk.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Step 2: Setup Your Gear
&lt;/h2&gt;

&lt;p&gt;You need a few things to get started:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An Android phone (obviously)&lt;/li&gt;
&lt;li&gt;A USB cable to connect it to your computer&lt;/li&gt;
&lt;li&gt;Android Studio installed on your computer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Got it all? Great. Let’s get started.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Enable USB Debugging
&lt;/h2&gt;

&lt;p&gt;Make sure &lt;strong&gt;USB Debugging&lt;/strong&gt; is enabled on your device. Most mobile app developers will already have this on, but just in case:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;Developer Options&lt;/strong&gt; in your phone settings.&lt;/li&gt;
&lt;li&gt;Toggle on &lt;strong&gt;USB Debugging&lt;/strong&gt;. This allows your computer to communicate with your Android device for all the inspecting fun.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Plug in your Android device via USB, and you’re all set.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: Use Android Studio's Layout Inspector
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Install &lt;a href="https://developer.android.com/studio/install" rel="noopener noreferrer"&gt;Android Studio&lt;/a&gt; (it’s free).&lt;/li&gt;
&lt;li&gt;Connect your Android device and open &lt;strong&gt;Layout Inspector&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click on different UI elements to see their properties.&lt;/li&gt;
&lt;li&gt;Use the 3D view to see how your UI components stack up.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdsh1maaf9y617t8yln2u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdsh1maaf9y617t8yln2u.png" alt="Layout Inspector android studio" width="800" height="506"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Layout Inspector&lt;/strong&gt; gives you a super detailed view of each element in your app, including its properties and hierarchy. This is where the true dev magic happens, especially if you’re trying to debug a tricky UI.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5: Debug with Logcat
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyl4p8h981n8stbrrovdb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyl4p8h981n8stbrrovdb.png" alt="Logcat in Android studio" width="800" height="506"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Logcat is like a live feed of what's happening inside your app.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use the search bar to filter logs by keyword, tag, or process.&lt;/li&gt;
&lt;li&gt;Type your app's package name to focus on your app's logs.&lt;/li&gt;
&lt;li&gt;Look out for logs in red—they indicate errors or crashes.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;Log.d&lt;/code&gt;, &lt;code&gt;Log.i&lt;/code&gt;, &lt;code&gt;Log.e&lt;/code&gt;, etc., in your code to print custom messages.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 6: Inspect Network Requests
&lt;/h2&gt;

&lt;p&gt;Seeing network/API logs is crucial for debugging.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option 1: Android Studio's Network Profiler&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Select Your Device and App: Choose your device and the running app.&lt;/li&gt;
&lt;li&gt;Use the Network Tab: Run network operations in your app; they'll show up here.&lt;/li&gt;
&lt;li&gt;Inspect Requests: Click on requests to see headers, responses, and payloads.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Option 2: Use an OkHttp Interceptor&lt;/strong&gt;&lt;br&gt;
If your app uses OkHttp for networking, you can log network activity.&lt;/p&gt;

&lt;p&gt;Add the dependency:&lt;br&gt;
&lt;code&gt;implementation 'com.squareup.okhttp3:logging-interceptor:4.9.3'&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Configure your OkHttpClient:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);

OkHttpClient client = new OkHttpClient.Builder()
    .addInterceptor(logging)
    .build();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8ghh9z05i5tpjrfr9qol.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8ghh9z05i5tpjrfr9qol.png" alt="API call in android studio" width="730" height="312"&gt;&lt;/a&gt;&lt;br&gt;
Now, all your network requests and responses will be logged in &lt;strong&gt;Logcat&lt;/strong&gt;.(Blue one in the above screenshot)&lt;/p&gt;




&lt;h2&gt;
  
  
  Bonus: Inspect Web Content with Chrome DevTools
&lt;/h2&gt;

&lt;p&gt;This is the part where it feels like web dev magic. If your app uses WebView or you want to inspect a website on your Android device:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open Chrome on your computer.&lt;/li&gt;
&lt;li&gt;In the address bar, type: &lt;code&gt;chrome://inspect&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;You’ll see your connected Android device listed.&lt;/li&gt;
&lt;li&gt;Click Inspect on the app you want to view.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Boom! You should see something similar to the Elements panel you’re used to with web apps.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgvxn3d6u4guji333kal5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgvxn3d6u4guji333kal5.png" alt="Chrome Devtool inspect mobile" width="800" height="525"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Chrome DevTools is for inspecting web pages and WebView content, not native Android UI elements.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Set &lt;code&gt;debuggable:true&lt;/code&gt; in your app's debug build (not for production).&lt;/li&gt;
&lt;li&gt;Enable &lt;strong&gt;USB Debugging&lt;/strong&gt; on your Android device.&lt;/li&gt;
&lt;li&gt;Use Android Studio's &lt;strong&gt;Layout Inspector&lt;/strong&gt; to inspect UI elements.&lt;/li&gt;
&lt;li&gt;Leverage &lt;strong&gt;Logcat&lt;/strong&gt; for logging and error tracking.&lt;/li&gt;
&lt;li&gt;Monitor Network Requests with &lt;strong&gt;Network Profiler&lt;/strong&gt; or &lt;strong&gt;OkHttp Interceptor&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;Chrome DevTools&lt;/strong&gt; to inspect WebView content.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Inspecting elements on an Android app isn’t as instant as right-clicking on a webpage, but with this setup, it’s almost just as easy.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Disclaimer: Originally written for &lt;a href="https://quashbugs.com/blog/how-to-inspect-element-on-an-android-app-actual-app-not-web-2025-definitive" rel="noopener noreferrer"&gt;Quashbugs&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>android</category>
      <category>mobile</category>
      <category>testing</category>
      <category>androiddev</category>
    </item>
    <item>
      <title>I have a side gig for Mobile Devs who can write well.</title>
      <dc:creator>Prakhar Shakya</dc:creator>
      <pubDate>Mon, 09 Sep 2024 13:15:09 +0000</pubDate>
      <link>https://dev.to/prakhars/i-have-a-side-gig-for-mobile-devs-who-can-write-well-21he</link>
      <guid>https://dev.to/prakhars/i-have-a-side-gig-for-mobile-devs-who-can-write-well-21he</guid>
      <description>&lt;p&gt;I've been searching for developers who also enjoy writing for a while now. &lt;br&gt;
It's not that me and my organisation is in need people who can code, we are looking for writers who understand code and are well versed with corporate dev culture. &lt;/p&gt;

&lt;p&gt;And now, I found dev.to - seems like a lot of people here are exactly that. &lt;/p&gt;

&lt;p&gt;So, If you're a developer (Mobile ideally) and love writing - I have a sidegig for you. (Considering you have a main job as well)&lt;/p&gt;

&lt;p&gt;Comment here if you're interested, we'll take it from there.&lt;/p&gt;

</description>
      <category>career</category>
    </item>
    <item>
      <title>OpenSourced our Mobile Testing Tool</title>
      <dc:creator>Prakhar Shakya</dc:creator>
      <pubDate>Tue, 03 Sep 2024 13:11:07 +0000</pubDate>
      <link>https://dev.to/prakhars/opensourced-our-mobile-testing-tool-4djc</link>
      <guid>https://dev.to/prakhars/opensourced-our-mobile-testing-tool-4djc</guid>
      <description>&lt;p&gt;Github - &lt;a href="https://github.com/Oscorp-HQ/quash-max" rel="noopener noreferrer"&gt;https://github.com/Oscorp-HQ/quash-max&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Some context, quash-MAX is an in-app bug reporting tool for Mobile Apps. It captures data like Screenshots, session replays, Crash logs, API calls, device details, etc.&lt;br&gt;
We're still working on making it compatible for Flutter, iOS, etc. Android is already done, &amp;amp; Contributions are welcome.&lt;/p&gt;

&lt;p&gt;With this we've also started a discord community for mobile app developers. Feel free to comment for an invite.&lt;/p&gt;

&lt;p&gt;Any advice, suggestions on how to make it better is welcome.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>mobile</category>
      <category>testing</category>
      <category>android</category>
    </item>
  </channel>
</rss>
