<?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: Mbuodile Obiosio</title>
    <description>The latest articles on DEV Community by Mbuodile Obiosio (@mbobiosio).</description>
    <link>https://dev.to/mbobiosio</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F548188%2F4fb161bf-2e6a-424a-89ec-68b59e666f9e.jpg</url>
      <title>DEV Community: Mbuodile Obiosio</title>
      <link>https://dev.to/mbobiosio</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mbobiosio"/>
    <language>en</language>
    <item>
      <title>When Every Zstandard Library Failed on Android, I Built My Own</title>
      <dc:creator>Mbuodile Obiosio</dc:creator>
      <pubDate>Tue, 21 Jul 2026 18:11:02 +0000</pubDate>
      <link>https://dev.to/mbobiosio/when-every-zstandard-library-failed-on-android-i-built-my-own-5glm</link>
      <guid>https://dev.to/mbobiosio/when-every-zstandard-library-failed-on-android-i-built-my-own-5glm</guid>
      <description>&lt;p&gt;Meet unzstd - a pure Java Zstandard (zstd) decoder for Android and the JVM.&lt;/p&gt;

&lt;p&gt;What looked like a simple dependency turned into a surprisingly difficult problem.&lt;/p&gt;

&lt;p&gt;I needed to decompress zstd-compressed datasets in an Android app. Existing options all had major trade-offs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;aircompressor 2.x depends on "sun.misc.Unsafe", which crashes on Android ART.&lt;/li&gt;
&lt;li&gt;aircompressor 3.x moved to "java.lang.foreign", which Android doesn't support.&lt;/li&gt;
&lt;li&gt;zstd-jni works well, but requires native ".so" files, ABI-specific packaging, and brings additional complexity with newer Android memory page requirements.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I had to build a pure Java alternative so I ported aircompressor's decoder&lt;/p&gt;

&lt;p&gt;The result:&lt;/p&gt;

&lt;p&gt;✅ No native code&lt;br&gt;
✅ No "Unsafe"&lt;br&gt;
✅ No "java.lang.foreign"&lt;br&gt;
✅ Android API 26+&lt;br&gt;
✅ JVM 9+&lt;br&gt;
✅ Zero "Unsafe" references in the compiled bytecode (verified)&lt;/p&gt;

&lt;p&gt;To make sure it was actually correct, I differentially tested it against libzstd across compression levels 1-22, covering one-shot decompression, streaming, fuzzing, and corruption-boundary tests.&lt;/p&gt;

&lt;p&gt;It's decode-only, Apache 2.0 licensed, and completely open source.&lt;/p&gt;

&lt;p&gt;If you're building Android or Java applications that consume zstd-compressed data, I hope this saves you a few days of debugging.&lt;/p&gt;

&lt;p&gt;implementation("com.qyntrax:unzstd:0.1.0")&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/mbobiosio/unzstd" rel="noopener noreferrer"&gt;https://github.com/mbobiosio/unzstd&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feedback, bug reports, and contributions are always welcome.&lt;/p&gt;

&lt;h1&gt;
  
  
  Android #Java #Kotlin #OpenSource #JVM #Zstd #Compression
&lt;/h1&gt;

</description>
      <category>android</category>
      <category>code</category>
      <category>java</category>
      <category>programming</category>
    </item>
    <item>
      <title>Android App First Launch</title>
      <dc:creator>Mbuodile Obiosio</dc:creator>
      <pubDate>Thu, 12 May 2022 18:48:16 +0000</pubDate>
      <link>https://dev.to/mbobiosio/android-app-first-launch-2jhk</link>
      <guid>https://dev.to/mbobiosio/android-app-first-launch-2jhk</guid>
      <description>&lt;p&gt;Did a simple illustration of working with DataStore, Hilt and Coroutines to implement checking if app is launched first time.&lt;/p&gt;

&lt;p&gt;Hopefully it helps someone&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/mbobiosio/AppFirstLaunch-Hilt-DataStore" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Please leave a star if it helps&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Dynamic Feature modules template</title>
      <dc:creator>Mbuodile Obiosio</dc:creator>
      <pubDate>Mon, 09 May 2022 07:51:02 +0000</pubDate>
      <link>https://dev.to/mbobiosio/dynamic-feature-modules-template-2hoh</link>
      <guid>https://dev.to/mbobiosio/dynamic-feature-modules-template-2hoh</guid>
      <description>&lt;p&gt;An Android template project following a multi module approach with clean architecture. It has been built following Clean Architecture Principle, Dynamic Feature modules, Repository Pattern, MVVM Architecture in the presentation layer as well as jetpack components.&lt;/p&gt;

&lt;p&gt;I created this repository to demonstrate best development practices by utilizing up to date tech-stack.&lt;/p&gt;

&lt;p&gt;Dynamic Feature Modules and Dynamic Delivery?&lt;br&gt;
Dynamic feature modules allow separation of certain features and resources from the base module of the app and include them in the app bundle. User can then download and install these modules later when they are required(on demand) even after the app has already been installed.&lt;/p&gt;

&lt;p&gt;Dynamic Delivery is Google Play's app serving model that uses Android App Bundles to generate and server optimized APKs for each user's device configuration so that users download only the feature and resources the need to run the app.&lt;/p&gt;

&lt;p&gt;Play Feature Delivery allow certain features of the app to be delivered conditionally (depending on user's language, location/country, paying or free user etc.) or downloaded on demand.&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%2Flfqvsjx007mbmakjb51a.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%2Flfqvsjx007mbmakjb51a.png" alt="Image description" width="800" height="1733"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/mbobiosio/ModularDynamicFeatureHilt" rel="noopener noreferrer"&gt;Github Repository&lt;/a&gt;&lt;/p&gt;

</description>
      <category>android</category>
      <category>kotlin</category>
      <category>mobile</category>
      <category>programming</category>
    </item>
    <item>
      <title>ModularAppTemplate</title>
      <dc:creator>Mbuodile Obiosio</dc:creator>
      <pubDate>Mon, 09 May 2022 07:32:07 +0000</pubDate>
      <link>https://dev.to/mbobiosio/modularapptemplate-l8m</link>
      <guid>https://dev.to/mbobiosio/modularapptemplate-l8m</guid>
      <description>&lt;p&gt;An Android template project following a multi module approach with clean architecture. It has been built following Clean Architecture Principle, Repository Pattern, MVVM Architecture in the presentation layer as well as jetpack components.&lt;/p&gt;

&lt;p&gt;I created this repository to demonstrate best development practices by utilizing up to date tech-stack.&lt;/p&gt;

&lt;p&gt;Details&lt;br&gt;
Operating System : Android&lt;br&gt;
Programming Language: Kotlin&lt;br&gt;
Architecture : MVVM&lt;br&gt;
Dependency Injection : Hilt&lt;br&gt;
Fragment Management : Navigation Component&lt;br&gt;
Design : Material Design 3&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%2Flfqvsjx007mbmakjb51a.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%2Flfqvsjx007mbmakjb51a.png" alt="Image description" width="800" height="1733"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/mbobiosio/ModularAppTemplate" rel="noopener noreferrer"&gt;Github Repository&lt;/a&gt;&lt;/p&gt;

</description>
      <category>android</category>
      <category>kotlin</category>
      <category>mobile</category>
      <category>programming</category>
    </item>
    <item>
      <title>MoviesBoard - TMDB API project</title>
      <dc:creator>Mbuodile Obiosio</dc:creator>
      <pubDate>Fri, 01 Jan 2021 14:45:41 +0000</pubDate>
      <link>https://dev.to/mbobiosio/moviesboard-tmdb-api-project-1i7h</link>
      <guid>https://dev.to/mbobiosio/moviesboard-tmdb-api-project-1i7h</guid>
      <description>&lt;p&gt;MoviesBoard app showcases Android best practices with Google's recommended architecture: MVVM + Repository + Offline support + Android Architecture Components + Paging 3 + LiveData + Moshi + Coroutines + Material Theme Components + Retrofit2.&lt;/p&gt;

&lt;p&gt;I would appreciate more contributions&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/mbobiosio/MoviesBoard" rel="noopener noreferrer"&gt;Github Repository&lt;/a&gt;&lt;/p&gt;

</description>
      <category>kotlin</category>
      <category>android</category>
      <category>opensource</category>
    </item>
    <item>
      <title>ConnectivityLifeData for API 30 &amp; lower APIs</title>
      <dc:creator>Mbuodile Obiosio</dc:creator>
      <pubDate>Sun, 27 Dec 2020 18:48:50 +0000</pubDate>
      <link>https://dev.to/mbobiosio/lifecyle-connectivity-for-api-30-lower-apis-1mm8</link>
      <guid>https://dev.to/mbobiosio/lifecyle-connectivity-for-api-30-lower-apis-1mm8</guid>
      <description>&lt;p&gt;I made this super lightweight library to enable Android Developers handle network changes across API 16 to 30.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&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%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/mbobiosio" rel="noopener noreferrer"&gt;
        mbobiosio
      &lt;/a&gt; / &lt;a href="https://github.com/mbobiosio/LiveDataConnection" rel="noopener noreferrer"&gt;
        LiveDataConnection
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A super simple, super light-weight lifecycle aware solution written in Kotlin that helps you to capture network connectivity events with support for lower APIs
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;p&gt;&lt;a href="https://www.codacy.com/gh/mbobiosio/LifecycleConnectivity/dashboard?utm_source=github.com&amp;amp;utm_medium=referral&amp;amp;utm_content=mbobiosio/LifecycleConnectivity&amp;amp;utm_campaign=Badge_Grade" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a697b6045f749a8737b44be5afea8c3bc87e18f145905e1282d9d50e5be78666/68747470733a2f2f6170702e636f646163792e636f6d2f70726f6a6563742f62616467652f47726164652f3535643665666465613364333461306561313662343462306331653237313734" alt="Codacy Badge"&gt;&lt;/a&gt;
&lt;a href="https://sonarcloud.io/dashboard?id=mbobiosio_LifecycleConnectivity" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/075d5714ca99f98251fc9dfa7842405505c6ff9dadc252080071816e8091e3b9/68747470733a2f2f736f6e6172636c6f75642e696f2f6170692f70726f6a6563745f6261646765732f6d6561737572653f70726f6a6563743d6d626f62696f73696f5f4c6966656379636c65436f6e6e6563746976697479266d65747269633d7371616c655f726174696e67" alt="Maintainability Rating"&gt;&lt;/a&gt;
&lt;a href="https://developer.android.com/reference" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/373ed905e8531fe965db1058760c6294d4b042ba3ae6404ef620b78dcd8d9226/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f706c6174666f726d2d616e64726f69642d627269676874677265656e" alt="Platform"&gt;&lt;/a&gt;
&lt;a href="https://developer.android.com/studio/releases/platforms#4.1" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/8e1c3d8b89cc933be83f2c1dd37ebd5b3934b667b40a221b006049823889e84a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4150492d31362532422d627269676874677265656e2e7376673f7374796c653d666c6174" alt="API"&gt;&lt;/a&gt;
&lt;a href="https://jitpack.io/#mbobiosio/ConnectivityLiveData" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/f1388a70d9a0b3c15504942a32cc0439529e2cb3d9fbbba8d29b1935d8fb0ec0/68747470733a2f2f6a69747061636b2e696f2f762f6d626f62696f73696f2f436f6e6e65637469766974794c697665446174612e737667" alt=""&gt;&lt;/a&gt;
&lt;a href="https://sonarcloud.io/dashboard?id=mbobiosio_LifecycleConnectivity" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/e5a8398b36512a986b44b4594cc2c52e73541efd3618a78f2573699af2acb6b8/68747470733a2f2f736f6e6172636c6f75642e696f2f6170692f70726f6a6563745f6261646765732f6d6561737572653f70726f6a6563743d6d626f62696f73696f5f4c6966656379636c65436f6e6e6563746976697479266d65747269633d76756c6e65726162696c6974696573" alt="Vulnerabilities"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;br&gt;
A super simple, super light-weight lifecycle aware solution written in Kotlin that helps you to capture network connectivity events with support for lower APIs
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;USAGE&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://app.codacy.com/gh/mbobiosio/LifecycleConnectivity?utm_source=github.com&amp;amp;utm_medium=referral&amp;amp;utm_content=mbobiosio/LifecycleConnectivity&amp;amp;utm_campaign=Badge_Grade" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/252fcd4cf52f3142d56e9e8e45cda7de7af2a836048585563bbf51bd64cc6625/68747470733a2f2f6170692e636f646163792e636f6d2f70726f6a6563742f62616467652f47726164652f6463356363306163393537343432316461653630316639643836653262626361" alt="Codacy Badge"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Including in your project&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Add below codes to your &lt;b&gt;root&lt;/b&gt; build.gradle&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;allprojects {
   repositories {
      maven { url 'https://jitpack.io' }
   }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Add connectionlivedata dependency to your project's &lt;b&gt;module&lt;/b&gt; build.gradle&lt;/p&gt;
&lt;div class="highlight highlight-source-groovy notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;implementation &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;'&lt;/span&gt;com.github.mbobiosio:connectionlivedata:1.0.3&lt;span class="pl-pds"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Use in your Activity&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight highlight-source-kotlin notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt; &lt;span class="pl-k"&gt;val&lt;/span&gt; connectionLiveData &lt;span class="pl-k"&gt;=&lt;/span&gt; &lt;span class="pl-en"&gt;ConnectionLiveData&lt;/span&gt;(&lt;span class="pl-c1"&gt;this&lt;/span&gt;)
 connectionLiveData.observe(&lt;span class="pl-c1"&gt;this&lt;/span&gt;, {
     &lt;span class="pl-en"&gt;Log&lt;/span&gt;.d(&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;Status&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;, &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;span class="pl-e"&gt;$it&lt;/span&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;)
 })&lt;/pre&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Use in your Fragment&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight highlight-source-kotlin notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt; &lt;span class="pl-k"&gt;val&lt;/span&gt; connectionLiveData &lt;span class="pl-k"&gt;=&lt;/span&gt; &lt;span class="pl-en"&gt;ConnectionLiveData&lt;/span&gt;(activity &lt;span class="pl-k"&gt;as&lt;/span&gt; &lt;span class="pl-en"&gt;Activity&lt;/span&gt;)
 connectionLiveData.observe(viewLifecycleOwner, {
    &lt;span class="pl-en"&gt;Log&lt;/span&gt;.d(&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;Status&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;, &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;span class="pl-e"&gt;$it&lt;/span&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;)
 })&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Contribute&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;If you want to contribute to this app, you're always welcome!
See &lt;a href="https://github.com/mbobiosio/LiveDataConnectionCONTRIBUTING.md" rel="noopener noreferrer"&gt;Contributing Guidelines&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;📝 License&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;This project is released under the MIT license.
See &lt;a href="https://github.com/mbobiosio/LiveDataConnection./LICENSE" rel="noopener noreferrer"&gt;LICENSE&lt;/a&gt; for details.&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;
&lt;pre class="notranslate"&gt;&lt;code&gt;MIT License
Copyright (c) 2020 Mbuodile Obiosio

Permission is hereby&lt;/code&gt;&lt;/pre&gt;…&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/mbobiosio/LiveDataConnection" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Feel to create a pull request.&lt;/p&gt;

</description>
      <category>android</category>
      <category>kotlin</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
