<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Make Android - Medium]]></title>
        <description><![CDATA[Make Android your writing space into Android, Java, Kotlin, Shell, Linux, Gradle, and Groovy. Uncover the future of technology through our in-depth articles, expert insights, and cutting-edge innovations. Stay on the forefront of Android’s evolution with us. - Medium]]></description>
        <link>https://medium.com/make-android?source=rss----ef894183aec6---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>Make Android - Medium</title>
            <link>https://medium.com/make-android?source=rss----ef894183aec6---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Fri, 13 Nov 2026 11:28:12 GMT</lastBuildDate>
        <atom:link href="https://medium.com/feed/make-android" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[How to Implement Pagination in Jetpack Compose]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/make-android/how-to-implement-pagination-in-jetpack-compose-aff743ad6ffe?source=rss----ef894183aec6---4"><img src="https://cdn-images-1.medium.com/max/2600/1*RuIMed5_8rWhDryELMjf5g.jpeg" width="6000"></a></p><p class="medium-feed-snippet">Introduction</p><p class="medium-feed-link"><a href="https://medium.com/make-android/how-to-implement-pagination-in-jetpack-compose-aff743ad6ffe?source=rss----ef894183aec6---4">Continue reading on Make Android »</a></p></div>]]></description>
            <link>https://medium.com/make-android/how-to-implement-pagination-in-jetpack-compose-aff743ad6ffe?source=rss----ef894183aec6---4</link>
            <guid isPermaLink="false">https://medium.com/p/aff743ad6ffe</guid>
            <category><![CDATA[pagination]]></category>
            <category><![CDATA[mobile-app-development]]></category>
            <category><![CDATA[android]]></category>
            <category><![CDATA[kotlin]]></category>
            <category><![CDATA[jetpack-compose]]></category>
            <dc:creator><![CDATA[Jaykishan Sewak]]></dc:creator>
            <pubDate>Fri, 04 Jul 2025 05:13:07 GMT</pubDate>
            <atom:updated>2025-07-04T05:13:07.789Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[AIDL vs HIDL HAL in Android: A Detailed Comparison]]></title>
            <link>https://medium.com/make-android/aidl-vs-hidl-hal-in-android-a-detailed-comparison-9706166eab92?source=rss----ef894183aec6---4</link>
            <guid isPermaLink="false">https://medium.com/p/9706166eab92</guid>
            <category><![CDATA[aosp]]></category>
            <category><![CDATA[android]]></category>
            <category><![CDATA[hidl]]></category>
            <category><![CDATA[hal]]></category>
            <category><![CDATA[aidl]]></category>
            <dc:creator><![CDATA[Narendra Harny]]></dc:creator>
            <pubDate>Wed, 09 Apr 2025 13:40:55 GMT</pubDate>
            <atom:updated>2025-04-09T13:52:38.165Z</atom:updated>
            <content:encoded><![CDATA[<h4>This article explains the significant difference between AIDL HAL and HIDL HAL with examples and usecase.</h4><h4>Introduction</h4><p>Android uses <strong>Hardware Abstraction Layers (HALs)</strong> to provide a bridge between the hardware and the Android framework. Traditionally, <strong>HIDL (Hardware Interface Definition Language)</strong> was used for this purpose, but starting with Android 10, <strong>AIDL (Android Interface Definition Language)</strong> has become the preferred approach. This article compares <strong>AIDL HAL and HIDL HAL</strong>, explaining their differences, advantages, and use cases.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*2l6owpAl-GU-iMKs83HUMQ.png" /></figure><h4>What is a HAL?</h4><p>A <strong>Hardware Abstraction Layer (HAL)</strong> in Android defines the interface through which the Android framework communicates with hardware components, such as cameras, sensors, and audio systems.</p><h4>What is HIDL?</h4><p>HIDL (<strong>Hardware Interface Definition Language</strong>) was introduced in <strong>Android 8 (Oreo)</strong> to define a stable interface between the Android framework and vendor-specific hardware implementations. It enables inter-process communication (<strong>IPC</strong>) via <strong>Binder</strong> or <strong>Passthrough mode</strong>.</p><h4>Features of HIDL:</h4><p>Uses .hal files to define interfaces.</p><p>Supports <strong>both Binder-based IPC and Passthrough mode</strong>.</p><p>Requires implementation in <strong>C++</strong>.</p><p>Interfaces are <strong>versioned</strong> for backward compatibility.</p><p>Used for <strong>vendor-specific implementations</strong>.</p><p>More rigid, making changes difficult without updating the entire vendor partition.</p><h4>What is AIDL?</h4><p>AIDL (<strong>Android Interface Definition Language</strong>) is an older IPC mechanism in Android that was later extended to HALs in <strong>Android 10 (Q)</strong>. AIDL HALs allow direct <strong>Binder IPC</strong>, making them more efficient and flexible.</p><h4>Features of AIDL:</h4><p>Uses .aidl files to define interfaces.</p><p>Uses <strong>Binder IPC only</strong> (no passthrough mode).</p><p>It can be implemented in <strong>C++ or Java</strong>.</p><p>Supports <strong>stable versions</strong> to ensure compatibility.</p><p>Recommended for <strong>all new HAL implementations</strong>.</p><p>It is easier to update without requiring a vendor partition upgrade.</p><h4>Key Differences Between AIDL and HIDL HALs —</h4><h4>Overview —</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Pz6GCTxK7w9iu8XhtZiCxw.png" /></figure><h4>Architecture —</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*SxsqoqokMRmMp3BT5e7yKw.png" /></figure><h4>Development Experience —</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Mzbhk0SLOXpXdGb_iEo1Xg.png" /></figure><h4>Performance &amp; Maintenance —</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*jtp-zqND9oN8Pdyeg3PntA.png" /></figure><h4>Example Syntax Comparison —</h4><pre><br>AIDL HAL:<br>interface IExample {<br>    int add(int a, int b);<br>}<br><br><br>HIDL HAL:<br>interface IExample {<br>    add(int32_t a, int32_t b) generates (int32_t result);<br>};</pre><h4>Summary —</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*K6rrt9VIBdRYWnIDb6ELPA.png" /></figure><h4>Why AIDL HAL is Preferred Over HIDL HAL</h4><p>With Android 10+, Google recommends using <strong>AIDL HALs </strong>for <strong>simplicity, flexibility, and direct Binder IPC communication</strong>.</p><h4>AIDL provides:</h4><p><strong>Easier updates</strong> — no need to update the entire vendor partition.</p><p><strong>Better performance</strong> — No additional abstraction layers.</p><p><strong>More flexibility</strong> — Easier to add/remove APIs.</p><p><strong>Future-proofing</strong> — Google’s preferred approach for new HALs.</p><h4>When to Use HIDL HAL?</h4><p>HIDL is still relevant for <strong>maintaining legacy systems</strong> in devices running <strong>Android 8/9</strong>. However, AIDL is the recommended approach for new HAL implementations.</p><h4>References:</h4><p><a href="https://developer.android.com/guide/components/aidl">Android AIDL Documentation</a>, <a href="https://source.android.com/devices/architecture/hidl">Android HIDL Documentation</a>, <a href="https://source.android.com/devices/architecture/hal">AOSP HAL Development Guide</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9706166eab92" width="1" height="1" alt=""><hr><p><a href="https://medium.com/make-android/aidl-vs-hidl-hal-in-android-a-detailed-comparison-9706166eab92">AIDL vs HIDL HAL in Android: A Detailed Comparison</a> was originally published in <a href="https://medium.com/make-android">Make Android</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Measure Your Code’s Reach: Integrating JaCoCo Code Coverage in Android Apps with Kotlin DSL]]></title>
            <link>https://medium.com/make-android/measure-your-codes-reach-integrating-jacoco-code-coverage-in-android-apps-with-kotlin-dsl-382d577864e7?source=rss----ef894183aec6---4</link>
            <guid isPermaLink="false">https://medium.com/p/382d577864e7</guid>
            <category><![CDATA[code-coverage]]></category>
            <category><![CDATA[gradle-kotlin-dsl]]></category>
            <category><![CDATA[android-testing]]></category>
            <category><![CDATA[unittest]]></category>
            <category><![CDATA[uitest]]></category>
            <dc:creator><![CDATA[Reena Rote]]></dc:creator>
            <pubDate>Mon, 03 Mar 2025 07:51:35 GMT</pubDate>
            <atom:updated>2025-03-03T07:51:35.830Z</atom:updated>
            <content:encoded><![CDATA[<p>Improving code quality is a constant pursuit for Android developers. Unit tests and UI tests are crucial in this journey, but how do you measure the effectiveness of these tests? Here’s where <strong>JaCoCo</strong> and <strong>Kotlin DSL</strong> come in, providing an efficient way to integrate code coverage for both unit and UI tests in your Android app.</p><h4><strong>What is JaCoCo?</strong></h4><p>JaCoCo is a free and open-source library that analyzes bytecode and identifies executed lines during test execution. This data is then used to generate reports, displaying how much of your code your tests cover.</p><h4><strong>Why Use JaCoCo in Your Android App?</strong></h4><p>Integrating JaCoCo offers several benefits:</p><ul><li><strong>Identify untested code:</strong> JaCoCo reveals sections of code untouched by your tests, highlighting areas needing test coverage improvement.</li><li><strong>Track code coverage trends:</strong> Monitoring coverage over time allows you to evaluate the effectiveness of your testing efforts and identify potential regressions.</li><li><strong>Maintain code quality:</strong> By aiming for high code coverage, you can ensure your tests are thorough and likely to catch bugs early.</li></ul><h4><strong>Integrating JaCoco with Kotlin DSL</strong></h4><p>Now, let’s see how to integrate JaCoco using Kotlin DSL:</p><p>1. Add Jacoco plugin to your <em>app/build.gradle file</em></p><pre>plugins {<br>    jacoco<br>}</pre><p>2. Enable coverage for UI and Unit Tests in android{ ... } block of <em>app/build.gradle</em></p><pre>android {<br><br>  buildTypes {<br>        debug {<br>            enableAndroidTestCoverage = true<br>            enableUnitTestCoverage = true<br>        }<br>}</pre><p>3. Now prepare your jacoco exclusion list</p><p>Code coverage tools like JaCoCo are used to measure how much of your source code is exercised by your tests. However, there are certain files or packages that you typically don’t want to include.</p><p>The exclusions variable should be defined outside of the android { ... } block.</p><pre>val exclusions = listOf(<br>    &quot;**/R.class&quot;,<br>    &quot;**/R\$*.class&quot;,<br>    &quot;**/BuildConfig.*&quot;,<br>    &quot;**/Manifest*.*&quot;,<br>    &quot;**/*Test*.*&quot;<br>)</pre><p>By specifying an exclusions list, you ensure that only relevant source code files are considered in the coverage analysis, providing a more accurate picture of the effectiveness of your tests in exercising your actual codebase.</p><p>4. Lets configure Test tasks outside of android { ... }:</p><p>The provided block of code configures Jacoco tasks for tests. Let’s break down its purpose:</p><pre>tasks.withType(Test::class) {<br>    configure&lt;JacocoTaskExtension&gt; {<br>        isIncludeNoLocationClasses = true<br>        excludes = listOf(&quot;jdk.internal.*&quot;)<br>    }<br>}</pre><p>isIncludeNoLocationClasses = true: This setting instructs Jacoco to include classes that have no source location information in the coverage report. These are typically classes generated dynamically or by the JVM, and including them can provide more accurate coverage information.</p><p>excludes = listOf(&quot;jdk.internal.*&quot;): This specifies a list of classes or packages to exclude from the coverage analysis. In this case, it excludes classes from the jdk.internal package.</p><p>Without the exclusion jdk.internal.*, your Jacoco execution might encounter errors like java.lang.ClassNotFoundException: jdk.internal.reflect.GeneratedSerializationConstructorAccessor1.</p><p>5. Configure Reports</p><p>Let&#39;s configure a task to generate reports from collected coverage data:</p><pre>android {<br>    // Iterate over all application variants (e.g., debug, release)<br>    applicationVariants.all { variant -&gt;<br>        // Extract variant name and capitalize the first letter<br>        val variantName = variant.name.replaceFirstChar {<br>            if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString()<br>        }<br><br>        // Define task names for unit tests and Android tests<br>        val unitTests = &quot;test${variantName}UnitTest&quot;<br>        val androidTests = &quot;connected${variantName}AndroidTest&quot;<br><br>        // Register a JacocoReport task for code coverage analysis<br>        tasks.register&lt;JacocoReport&gt;(&quot;Jacoco${variantName}CodeCoverage&quot;) {<br>            // Depend on unit tests and Android tests tasks<br>            dependsOn(listOf(unitTests, androidTests))<br>            // Set task grouping and description<br>            group = &quot;Reporting&quot;<br>            description = &quot;Execute UI and unit tests, generate and combine Jacoco coverage report&quot;<br>            // Configure reports to generate both XML and HTML formats<br>            reports {<br>                xml.required.set(true)<br>                html.required.set(true)<br>            }<br>            // Set source directories to the main source directory<br>            sourceDirectories.setFrom(layout.projectDirectory.dir(&quot;src/main&quot;))<br>            // Set class directories to compiled Java and Kotlin classes, excluding specified exclusions<br>            classDirectories.setFrom(files(<br>                fileTree(layout.buildDirectory.dir(&quot;intermediates/javac/&quot;)) {<br>                    exclude(exclusions)<br>                },<br>                fileTree(layout.buildDirectory.dir(&quot;tmp/kotlin-classes/&quot;)) {<br>                    exclude(exclusions)<br>                }<br>            ))<br>            // Collect execution data from .exec and .ec files generated during test execution<br>            executionData.setFrom(files(<br>                fileTree(layout.buildDirectory) { include(listOf(&quot;**/*.exec&quot;, &quot;**/*.ec&quot;)) }<br>            ))<br>        }<br>    }<br>}</pre><p>This script defines a Jacoco report task for each build variant. It executes both unit tests and Android instrumented tests (UI tests) associated with each variant and generates a combined Jacoco coverage report.</p><p>The report includes both XML and HTML formats. Source directories are set to the main source directory, and class directories are set to the compiled Java and Kotlin classes, excluding any specified exclusions.</p><p>Finally, execution data is collected from the .exec and .ec files generated during test execution.</p><p>6. Generating Reports</p><p>Option 1: Using the Terminal, execute the following command:</p><pre>./gradlew JacocoDebugCodeCoverage</pre><p>Option 2: Using the Gradle Task, navigate to Gradle -&gt; Tasks -&gt; reporting -&gt; JacocoDebugCodeCoverage.</p><p>7. Viewing the reports</p><p>Once your tests are executed, JaCoCo will generate coverage reports in XML and HTML formats. You can view these reports to analyze your code coverage and identify areas for improvement. The HTML report, in particular, provides a detailed overview of your codebase, highlighting covered and uncovered lines of code.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/940/1*oMB-SVfmIjM9PYChHvEnIA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*yq8lmagtaUhpy7HLSVGiLA.png" /></figure><p>After generating the Jacoco coverage reports, you can analyze them to gain insights into the effectiveness of your tests. These reports highlight the percentage of code covered by tests, pinpointing areas that require more attention.</p><p>When covering Jetpack Compose classes with code coverage tools like Jacoco, there are several known issues and challenges developers may encounter:</p><ol><li>Dynamic UI Generation: Jetpack Compose allows UI elements to be generated dynamically based on state changes. Code coverage tools may have difficulty tracking coverage accurately in such scenarios, as the UI structure is not predefined.</li><li>Lambda Expressions: Jetpack Compose heavily utilizes lambda expressions for defining UI components and event handlers. These anonymous functions might not be fully covered by tests, leading to lower coverage metrics.</li><li>State Management: Jetpack Compose relies on state management techniques such as State and ViewModel. Achieving full coverage for state-related logic can be challenging due to the dynamic nature of state changes.</li><li>Custom Composable Functions: Developers often create custom composable functions for reusable UI components. Ensuring comprehensive coverage for these custom components can be complex, especially when they’re deeply nested or heavily parameterised.</li><li>Animation and Interaction: Code coverage tools may struggle to accurately assess code paths triggered by animations or user interactions in Jetpack Compose. These dynamic behaviours can result in missed coverage.</li><li>View Model Composition: Jetpack Compose encourages the composition of small, reusable ViewModels. While unit testing these ViewModels is essential, achieving high coverage can be challenging due to the complex interactions between ViewModels and UI elements.</li><li>Experimental Nature: Jetpack Compose is still evolving, with new features and APIs being introduced regularly. Code coverage tools may not fully support all Jetpack Compose features or may encounter compatibility issues with newer versions.</li></ol><p>In the end, integrating JaCoCo into your Android project isn’t just about numbers and statistics — it’s about building better apps that users can rely on. So, if you’re serious about delivering top-notch Android experiences, JaCoCo is worth exploring. Happy coding and testing!</p><p>Please don’t hesitate to ask if you have any questions.</p><p><a href="https://github.com/reenarote/ComposeJacocoSample">Github</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=382d577864e7" width="1" height="1" alt=""><hr><p><a href="https://medium.com/make-android/measure-your-codes-reach-integrating-jacoco-code-coverage-in-android-apps-with-kotlin-dsl-382d577864e7">Measure Your Code’s Reach: Integrating JaCoCo Code Coverage in Android Apps with Kotlin DSL</a> was originally published in <a href="https://medium.com/make-android">Make Android</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Introduction to LottieFiles and Its Integration in Kotlin]]></title>
            <link>https://medium.com/make-android/introduction-to-lottiefiles-and-its-integration-in-kotlin-cabb4a1992cd?source=rss----ef894183aec6---4</link>
            <guid isPermaLink="false">https://medium.com/p/cabb4a1992cd</guid>
            <category><![CDATA[animation]]></category>
            <category><![CDATA[kotlin]]></category>
            <category><![CDATA[android]]></category>
            <category><![CDATA[ui]]></category>
            <category><![CDATA[java]]></category>
            <dc:creator><![CDATA[Reza Ramesh]]></dc:creator>
            <pubDate>Mon, 03 Mar 2025 07:50:21 GMT</pubDate>
            <atom:updated>2025-03-03T07:50:21.487Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*4XX_1QkKoJQ9OS9F8NF9vg.jpeg" /></figure><p>In recent years, animations have become an integral part of modern app and web development. They add a touch of interactivity and engagement to user interfaces, making the overall experience more enjoyable and dynamic. One popular tool that has gained significant attention in the development community for handling animations is LottieFiles. In this article, we’ll explore what LottieFiles is and how to integrate it into Kotlin-based projects to create stunning and interactive animations.</p><p><strong>What is LottieFiles?</strong></p><p>LottieFiles is an online platform and a library created by Airbnb that allows developers to use high-quality animations and vector graphics in their applications. It uses the Lottie format, which is based on JSON (JavaScript Object Notation), to represent complex animations created in Adobe After Effects, Figma, and other design tools. The Lottie format enables animations to be easily scalable and rendered natively across various platforms and devices without compromising on performance.</p><p><strong>Advantages of Using LottieFiles</strong></p><ol><li><strong>Lightweight and Fast:</strong> LottieFiles animations are small in size compared to traditional video or GIF animations. They are lightweight and don’t consume much memory, resulting in faster load times and smooth animations.</li><li><strong>Cross-Platform Compatibility:</strong> LottieFiles animations can be used across different platforms, including Android, iOS, Web, and even desktop applications. This universality ensures consistent animations across various devices.</li><li><strong>High Quality:</strong> LottieFiles supports vector-based animations, which means the animations remain crisp and sharp, regardless of the screen size or resolution.</li><li><strong>Interactivity:</strong> Developers can easily add interactivity to LottieFiles animations, making them respond to user input and create interactive experiences.</li><li><strong>Easy Customization:</strong> LottieFiles animations can be customized programmatically, enabling developers to adjust various aspects like colors, speed, and timing to suit the application’s theme.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*FMPOdGFeQYAwGWf19LZJKQ.jpeg" /></figure><p><strong>Integrating LottieFiles in Kotlin</strong></p><p>To integrate LottieFiles into a Kotlin-based Android project, follow these steps:</p><p><strong>Step 1: Add Lottie Dependency</strong></p><pre>dependencies {<br>    implementation &quot;com.airbnb.android:lottie:4.2.0&quot;<br>}</pre><p><strong>Step 2: Download Lottie Animation File</strong></p><p>Visit the LottieFiles website (<a href="https://lottiefiles.com/">https://lottiefiles.com/</a>) and browse through the vast collection of animations. Once you find the animation you want to use, download the Lottie JSON file.</p><p><strong>Step 3: Place Lottie File in Assets</strong></p><p>Copy the downloaded Lottie JSON file to the assets folder of your Android project. If the assets folder doesn&#39;t exist, create one under the main directory.</p><p><strong>Step 4: Implement Lottie Animation</strong></p><p>In your Kotlin Activity or Fragment, create a reference to the LottieAnimationView and load the Lottie animation from the assets folder:</p><pre>import android.os.Bundle<br>import androidx.appcompat.app.AppCompatActivity<br>import com.airbnb.lottie.LottieAnimationView<br><br>class MainActivity : AppCompatActivity() {<br><br>    override fun onCreate(savedInstanceState: Bundle?) {<br>        super.onCreate(savedInstanceState)<br>        setContentView(R.layout.activity_main)<br><br>        val animationView: LottieAnimationView = findViewById(R.id.animationView)<br>        animationView.setAnimation(&quot;your_animation.json&quot;)<br>        animationView.playAnimation()<br>    }<br>}</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/640/1*jO0l4iZmqicTNUO4ShB4DA.png" /></figure><p><strong>Step 5: Interact with Lottie Animation (Optional)</strong></p><p>If you want to add interactivity to the animation, you can control it programmatically. For instance, you can pause, resume, or stop the animation based on user interactions or application logic. Here’s an example of how to add interactivity to a Lottie animation:</p><pre>import android.os.Bundle<br>import android.view.View<br>import androidx.appcompat.app.AppCompatActivity<br>import com.airbnb.lottie.LottieAnimationView<br><br>class MainActivity : AppCompatActivity() {<br><br>    private lateinit var animationView: LottieAnimationView<br>    private var isAnimationPlaying = true<br><br>    override fun onCreate(savedInstanceState: Bundle?) {<br>        super.onCreate(savedInstanceState)<br>        setContentView(R.layout.activity_main)<br><br>        animationView = findViewById(R.id.animationView)<br>        animationView.setAnimation(&quot;your_animation.json&quot;)<br>        animationView.playAnimation()<br><br>        animationView.setOnClickListener {<br>            if (isAnimationPlaying) {<br>                animationView.pauseAnimation()<br>            } else {<br>                animationView.resumeAnimation()<br>            }<br>            isAnimationPlaying = !isAnimationPlaying<br>        }<br>    }<br>}</pre><p>In this example, when the user clicks on the Lottie animation, the animation will pause if it is currently playing, and resume if it is paused.</p><h4>Conclusion</h4><p>LottieFiles is a powerful tool that simplifies animation integration into Android applications built with Kotlin. Its lightweight, cross-platform compatibility, and interactive capabilities make it a popular choice among developers for creating engaging and visually appealing applications. By following the steps outlined in this article and exploring the provided example, you can seamlessly integrate LottieFiles into your Kotlin-based Android projects and elevate the user experience to a whole new level. So why wait? Give LottieFiles a try and bring your app to life with stunning animations!</p><p><a href="http://linkedin.com/in/rezaramesh/"><strong>LinkedIn</strong></a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=cabb4a1992cd" width="1" height="1" alt=""><hr><p><a href="https://medium.com/make-android/introduction-to-lottiefiles-and-its-integration-in-kotlin-cabb4a1992cd">Introduction to LottieFiles and Its Integration in Kotlin</a> was originally published in <a href="https://medium.com/make-android">Make Android</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Understanding Koin: A Lightweight Dependency Injection Framework for Android in Kotlin]]></title>
            <link>https://medium.com/make-android/understanding-koin-a-lightweight-dependency-injection-framework-for-android-in-kotlin-d0a8bf6f6905?source=rss----ef894183aec6---4</link>
            <guid isPermaLink="false">https://medium.com/p/d0a8bf6f6905</guid>
            <category><![CDATA[kotlin]]></category>
            <category><![CDATA[android]]></category>
            <category><![CDATA[developer]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[koin]]></category>
            <dc:creator><![CDATA[Reza Ramesh]]></dc:creator>
            <pubDate>Sat, 25 Jan 2025 08:24:41 GMT</pubDate>
            <atom:updated>2026-07-01T13:34:34.945Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*8j0SDadqj90-bleS3N13qg.jpeg" /></figure><h4><a href="https://open.spotify.com/episode/1Oty0cj0pAC2F2OPcT3yZ9?si=2ovdWQZCTSSjvnxFWRChFg">Listen to a podcast about Android 16</a> on Spotify</h4><p>Dependency Injection (DI) is a design pattern that allows developers to build loosely coupled, maintainable, and testable applications. For Android developers working with Kotlin, <strong>Koin</strong> has emerged as a powerful yet lightweight DI framework. Unlike other DI frameworks like Dagger, Koin does not rely on code generation or annotation processing, making it easier to integrate and faster to set up.</p><p>This article provides an in-depth overview of Koin, its benefits, and a step-by-step guide to implementing it in your Android projects.</p><h4><strong>What is Koin?</strong></h4><p>Koin is a pragmatic Dependency Injection framework written in Kotlin. It is designed to be simple and intuitive, allowing developers to define dependencies programmatically without relying on complex configurations or annotations. Koin is highly flexible, and its lightweight nature makes it a great choice for Android projects.</p><h4><strong>Key Features of Koin:</strong></h4><p>1. <strong>No code generation</strong>: Unlike Dagger, Koin does not require annotation processors or generated code.</p><p>2. <strong>Kotlin DSL</strong>: Dependencies are defined using a Kotlin Domain Specific Language (DSL).</p><p>3. <strong>Flexibility</strong>: Koin supports lazy injection, scoped components, and test-friendly configurations.</p><p>4. <strong>Lightweight</strong>: With minimal setup, Koin is easy to integrate into new or existing projects.</p><h4><strong>Why Choose Koin?</strong></h4><p>Here are some reasons to use Koin in your Android project:</p><p>1. <strong>Ease of Use</strong>: The Kotlin DSL simplifies dependency declarations, reducing boilerplate code.</p><p>2. <strong>Fast Integration</strong>: Setting up Koin takes only a few steps, making it ideal for small to medium-sized projects.</p><p>3. <strong>Testability</strong>: Koin allows for easy dependency swapping during testing.</p><p>4. <strong>No Compile-Time Overhead</strong>: Since Koin doesn’t rely on annotation processing, it doesn’t add compile-time overhead.</p><h4><strong>Setting Up Koin in an Android Project</strong></h4><p>To use Koin in your project, follow these steps:</p><p><strong>Step 1: Add Koin Dependencies</strong></p><p>Add the required Koin dependencies in your build.gradle file:</p><pre>dependencies {<br>    implementation &quot;io.insert-koin:koin-android:3.x.x&quot; // Koin Core<br>    implementation &quot;io.insert-koin:koin-androidx-scope:3.x.x&quot; // Scope API<br>    implementation &quot;io.insert-koin:koin-androidx-viewmodel:3.x.x&quot; // ViewModel API<br>    testImplementation &quot;io.insert-koin:koin-test:3.x.x&quot; // Koin for testing<br>}</pre><h4><strong>Step 2: Define a Module</strong></h4><p>A <strong>module</strong> in Koin is a container where you define how your dependencies should be created and provided. Here’s an example of a Koin module:</p><pre>val appModule = module {<br>    single { Repository(get()) } // Singleton instance<br>    factory { UseCase(get()) } // New instance every time<br>    viewModel { MainViewModel(get()) } // ViewModel instance<br>}</pre><h4><strong>Step 3: Initialize Koin</strong></h4><p>Initialize Koin in your Application class:</p><pre>class MyApplication : Application() {<br>    override fun onCreate() {<br>        super.onCreate()<br>        startKoin {<br>            androidContext(this@MyApplication)<br>            modules(appModule)<br>        }<br>    }<br>}</pre><p>Make sure to register the MyApplication class in your AndroidManifest.xml.</p><pre>&lt;application<br>    android:name=&quot;.MyApplication&quot;<br>    ...&gt;<br>&lt;/application&gt;</pre><h4><strong>Step 4: Inject Dependencies</strong></h4><p>Use Koin to inject dependencies into your classes. For example, in a ViewModel:</p><pre>class MainViewModel(private val useCase: UseCase) : ViewModel() {<br>    fun loadData() {<br>        useCase.execute()<br>    }<br>}</pre><p>In an activity or fragment, you can inject the ViewModel:</p><pre>class MainActivity : AppCompatActivity() {<br>    private val viewModel: MainViewModel by viewModel()<br><br>    override fun onCreate(savedInstanceState: Bundle?) {<br>        super.onCreate(savedInstanceState)<br>        setContentView(R.layout.activity_main)<br>        <br>        viewModel.loadData()<br>    }<br>}</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/836/1*jO1cFWl-8QSJQyJdERRaOQ.png" /></figure><h4><strong>Advanced Features of Koin</strong></h4><p><strong>1. Scopes</strong></p><p>Koin supports scoping, which allows dependencies to have a specific lifecycle. For example, a SessionManager can exist only during a user session.</p><pre>val sessionModule = module {<br>    scope(named(&quot;Session&quot;)) {<br>        scoped { SessionManager() }<br>    }<br>}</pre><p><strong>2. Testing with Koin</strong></p><p>Koin makes it easy to mock dependencies for unit tests. Use koin-test to write test cases with mock dependencies.</p><pre>class MainViewModelTest : KoinTest {<br>    private val useCase: UseCase = mockk()<br>    private val viewModel: MainViewModel = MainViewModel(useCase)<br><br>    @Test<br>    fun testLoadData() {<br>        every { useCase.execute() } returns Unit<br>        viewModel.loadData()<br>        verify { useCase.execute() }<br>    }<br>}</pre><p><strong>3. Dynamic Injection</strong></p><p>Koin supports dynamic injection, allowing you to resolve dependencies at runtime using get().</p><pre>val repository: Repository = get()</pre><p><strong>Koin vs Other DI Frameworks</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/788/1*KX9jYL_WBSMlQLlABe3uoA.png" /></figure><h4><strong>Conclusion</strong></h4><p>Koin offers a pragmatic and developer-friendly approach to Dependency Injection in Kotlin for Android. Its lightweight nature, simplicity, and flexibility make it a strong alternative to traditional DI frameworks like Dagger. Whether you’re building a small app or a large-scale application, Koin can streamline your dependency management process and improve code maintainability.</p><p>By following the steps outlined in this guide, you can easily integrate Koin into your Android projects and leverage its powerful features to build clean, testable, and scalable applications.</p><h3>Enjoyed this article?</h3><p>If this article helped you solve a problem or learn something new, consider supporting my work.</p><p>Your support helps me continue writing free, in-depth Android tutorials for the developer community.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*pzBIT0rJjRlb9kZXld4S6A.jpeg" /></figure><h3><a href="http://buymeacoffee.com/rezaramesh">Support Me — Buy Me a Coffee☕️</a></h3><h3>Connect with me👇🏻</h3><p><a href="http://linkedin.com/in/rezaramesh">LinkedIn</a> — <a href="http://github.com/rezaramesh-dev">Github</a> — <a href="https://open.spotify.com/show/25qT65GIe8bLBLTDUELQJl?si=47dfaafae75b4828">Spotify</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d0a8bf6f6905" width="1" height="1" alt=""><hr><p><a href="https://medium.com/make-android/understanding-koin-a-lightweight-dependency-injection-framework-for-android-in-kotlin-d0a8bf6f6905">Understanding Koin: A Lightweight Dependency Injection Framework for Android in Kotlin</a> was originally published in <a href="https://medium.com/make-android">Make Android</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Build AOSP Android-15 Car Emulator]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/make-android/build-aosp-android-15-car-emulator-aa5cdef7483d?source=rss----ef894183aec6---4"><img src="https://cdn-images-1.medium.com/max/2600/0*5TDkqSk8FlxIxBrP" width="6000"></a></p><p class="medium-feed-snippet">Building an Android-15 Car Emulator using the Android Open Source Project (AOSP) is a fascinating task in automotive software development&#x2026;</p><p class="medium-feed-link"><a href="https://medium.com/make-android/build-aosp-android-15-car-emulator-aa5cdef7483d?source=rss----ef894183aec6---4">Continue reading on Make Android »</a></p></div>]]></description>
            <link>https://medium.com/make-android/build-aosp-android-15-car-emulator-aa5cdef7483d?source=rss----ef894183aec6---4</link>
            <guid isPermaLink="false">https://medium.com/p/aa5cdef7483d</guid>
            <category><![CDATA[android-15]]></category>
            <category><![CDATA[aosp]]></category>
            <category><![CDATA[cár]]></category>
            <category><![CDATA[android-automotive]]></category>
            <category><![CDATA[infotainment]]></category>
            <dc:creator><![CDATA[Narendra Harny]]></dc:creator>
            <pubDate>Wed, 15 Jan 2025 10:05:36 GMT</pubDate>
            <atom:updated>2025-01-15T09:36:45.027Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Configure Content Security Policy (CSP) in Jenkins]]></title>
            <link>https://medium.com/make-android/configure-content-security-policy-csp-in-jenkins-a542925f1435?source=rss----ef894183aec6---4</link>
            <guid isPermaLink="false">https://medium.com/p/a542925f1435</guid>
            <category><![CDATA[jenkins]]></category>
            <category><![CDATA[bash]]></category>
            <category><![CDATA[ci-cd-pipeline]]></category>
            <category><![CDATA[groovy]]></category>
            <category><![CDATA[devops]]></category>
            <dc:creator><![CDATA[Famidha Thurab]]></dc:creator>
            <pubDate>Sun, 12 Jan 2025 07:13:55 GMT</pubDate>
            <atom:updated>2025-01-12T07:13:57.294Z</atom:updated>
            <content:encoded><![CDATA[<p>This article tells how to configure CSP in Jenkins</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*8CW7GbLQRei39Ae3" /><figcaption>Photo by <a href="https://unsplash.com/@michael75?utm_source=medium&amp;utm_medium=referral">Michael</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>Facing the below failure message when accessing HTML file reports through the Jenkins console means that CSP is restricted in Jenkins.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/972/1*-PhQ2_itkk2sYq5L0ZbCzw.png" /><figcaption>Message from Jenkins</figcaption></figure><p>So let us see what is CSP and how to modify the same in Jenkins</p><h3>What is CSP?</h3><p>Content Security Policy (CSP) is a security feature in Jenkins that helps prevent various attacks such as Cross-Site Scripting (XSS) and data injection attacks by specifying which dynamic resources can load. CSP is an HTTP header that instructs the browser about the sources from which it can load content.</p><h3>CSP in Jenkins</h3><p>In Jenkins, CSP can be configured to control the resources that can be loaded when users are viewing Jenkins interfaces, including HTML reports and other resources. By default, Jenkins has a restrictive CSP to enhance security, which can sometimes block legitimate content such as custom scripts in report plugins like the Robot Framework plugin.</p><h3>Modifying CSP in Jenkins</h3><h4>Using Jenkins Script Console</h4><p>This solution is temporary and will be cleared upon Jenkins’ restart.</p><ol><li>Go to <strong><em>Manage Jenkins</em></strong> -&gt; <strong><em>Script Console</em></strong>.</li><li>Run the following script:</li></ol><pre>System.setProperty(&quot;hudson.model.DirectoryBrowserSupport.CSP&quot;, &quot;sandbox allow-scripts; default-src &#39;none&#39;; img-src &#39;self&#39; data: ; style-src &#39;self&#39; &#39;unsafe-inline&#39; data: ; script-src &#39;self&#39; &#39;unsafe-inline&#39; &#39;unsafe-eval&#39; ;&quot;)</pre><h4>Using init.groovy.d</h4><p>This solution is persistent.</p><ol><li>Create the groovy script.</li></ol><pre> sudo mkdir -p /var/lib/jenkins/init.groovy.d<br> sudo nano /var/lib/jenkins/init.groovy.d/setCSP.groovy</pre><p>2. Add the script content</p><pre>import jenkins.model.Jenkins<br><br>   // Set the CSP system property if not already set<br>   String cspProperty = System.getProperty(&quot;hudson.model.DirectoryBrowserSupport.CSP&quot;)<br>   if (cspProperty == null || cspProperty.isEmpty()) {<br>       System.setProperty(&quot;hudson.model.DirectoryBrowserSupport.CSP&quot;, &quot;sandbox allow-scripts; default-src &#39;none&#39;; img-src &#39;self&#39; data: ; style-src &#39;self&#39; &#39;unsafe-inline&#39; data: ; script-src &#39;self&#39; &#39;unsafe-inline&#39; &#39;unsafe-eval&#39; ;&quot;)<br>       println &quot;CSP property set successfully&quot;<br>   } else {<br>       println &quot;CSP property already set: $cspProperty&quot;<br>   }</pre><p>3. Set Permissions and Restart Jenkins</p><pre>sudo chown jenkins:jenkins /var/lib/jenkins/init.groovy.d/setCSP.groovy<br>sudo chmod 755 /var/lib/jenkins/init.groovy.d/setCSP.groovy<br>sudo systemctl restart jenkins</pre><p>The Groovy script in the init.groovy.d directory will be executed every time Jenkins starts. The script checks if the hudson.model.DirectoryBrowserSupport.CSP property is already set. If not, it sets the property and prints a confirmation message. If the property is already set, it prints the existing value.</p><p>Executing the above steps resolves the CSP error can be resolved and the HTML reports can be viewed without any issues.</p><p>Thanks for reading!!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a542925f1435" width="1" height="1" alt=""><hr><p><a href="https://medium.com/make-android/configure-content-security-policy-csp-in-jenkins-a542925f1435">Configure Content Security Policy (CSP) in Jenkins</a> was originally published in <a href="https://medium.com/make-android">Make Android</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Free and Open Source Software (FOSS): A Revolution in Technology]]></title>
            <link>https://medium.com/make-android/free-and-open-source-software-foss-a-revolution-in-technology-6616b982d45b?source=rss----ef894183aec6---4</link>
            <guid isPermaLink="false">https://medium.com/p/6616b982d45b</guid>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[devops-practice]]></category>
            <category><![CDATA[ci-cd-pipeline]]></category>
            <dc:creator><![CDATA[Famidha Thurab]]></dc:creator>
            <pubDate>Sun, 12 Jan 2025 07:13:36 GMT</pubDate>
            <atom:updated>2025-01-12T07:13:38.099Z</atom:updated>
            <content:encoded><![CDATA[<p>The rapid growth of technology has transformed the way we work, communicate, and innovate. At the heart of this transformation lies an often-underestimated hero: Free and Open Source Software (FOSS).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*N1HW7HbVPwyK7GWK" /><figcaption>Photo by <a href="https://unsplash.com/@brenkee?utm_source=medium&amp;utm_medium=referral">Benjamin Balázs</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><h3>What is FOSS?</h3><p>FOSS refers to software that is freely available to use, modify, and distribute. It empowers individuals and organizations by promoting transparency, collaboration, and innovation.</p><h3>The Philosophy Behind FOSS</h3><p>The core principles of FOSS:</p><ol><li><strong>Freedom to Use:</strong> Users can use the software for any purpose.</li><li><strong>Freedom to Study:</strong> Access to the source code enables users to understand how the software works.</li><li><strong>Freedom to Modify:</strong> Users can adapt the software to their needs.</li><li><strong>Freedom to Share:</strong> Users can redistribute the original or modified software.</li></ol><p><strong><em>The ideological difference from proprietary software, emphasizing openness and collaboration.</em></strong></p><p>1. <strong>Accessibility of Source Code</strong></p><ul><li><strong>FOSS:</strong> The source code is open and freely accessible to anyone. This openness enables users to study, modify, and improve the software according to their needs.</li></ul><blockquote><strong>Philosophy:</strong> Knowledge should be shared, not hoarded.</blockquote><blockquote><strong>Impact:</strong> Encourages transparency and trust, as users can verify the software’s functionality and security.</blockquote><ul><li><strong>Proprietary Software:</strong> The source code is closed and protected by intellectual property laws. Users have no visibility into how the software works.</li></ul><blockquote><strong>Philosophy:</strong> The creator controls the software to retain competitive advantage and monetization.</blockquote><blockquote><strong>Impact:</strong> Creates dependency on the vendor for updates, fixes, and enhancements.</blockquote><p>2. <strong>Freedom and User Rights</strong></p><ul><li><strong>FOSS:</strong> Users have the freedom to use the software for any purpose, modify it, and share it with others. These freedoms empower users to take control of their technology.</li></ul><blockquote><strong>Collaboration:</strong> Developers worldwide can work together to improve the software.</blockquote><blockquote><strong>Example:</strong> Linux, where thousands of developers contribute to its evolution.</blockquote><ul><li><strong>Proprietary Software:</strong> Users are typically granted a limited license to use the software under strict terms. Modifications or sharing without permission are prohibited.</li></ul><blockquote><strong>Control:</strong> The vendor retains ownership and dictates how the software can be used.</blockquote><p>3. <strong>Development and Collaboration Model</strong></p><ul><li><strong>FOSS:</strong> Follows a community-driven development model where developers, users, and contributors work together openly. Contributions are often peer-reviewed, fostering rapid innovation and improvement.</li></ul><blockquote><strong>Philosophy:</strong> “Given enough eyeballs, all bugs are shallow” (Linus’s Law).</blockquote><blockquote><strong>Example:</strong> Apache HTTP Server, maintained by a diverse community of contributors.</blockquote><ul><li><strong>Proprietary Software:</strong> Development is conducted in-house by a limited team of employees, often in secrecy to maintain competitive advantage.</li></ul><blockquote><strong>Impact:</strong> Innovation is constrained by the resources and priorities of the company.</blockquote><p>4. <strong>Cost and Accessibility</strong></p><ul><li><strong>FOSS:</strong> Typically free to use, reducing barriers for individuals, startups, and developing nations to access technology.</li></ul><blockquote><strong>Collaboration:</strong> Open access allows contributors to improve software even without financial investment.</blockquote><ul><li><strong>Proprietary Software:</strong> Often comes with high licensing fees, limiting accessibility to those who can afford it.</li></ul><p>5. <strong>Philosophy of Ownership</strong></p><ul><li><strong>FOSS:</strong> Emphasizes collective ownership and the belief that technology should be a public good, not a commodity.</li></ul><blockquote><strong>Goal:</strong> To democratize technology and empower users.</blockquote><ul><li><strong>Proprietary Software:</strong> Focuses on exclusive ownership by the company, which monetizes the software as a product.</li></ul><blockquote><strong>Goal:</strong> Maximize profits and shareholder value.</blockquote><p>6. <strong>Longevity and Independence</strong></p><ul><li><strong>FOSS:</strong> Open nature ensures that the software can outlive the original creators, as the community can continue its development.</li></ul><blockquote><strong>Example:</strong> Even if a company ceases to support an open-source project, the community can fork and maintain it.</blockquote><ul><li><strong>Proprietary Software:</strong> Tied to the fate of the company. If the vendor discontinues support or goes out of business, users are left stranded.</li></ul><p>7. <strong>Security and Trust</strong></p><ul><li><strong>FOSS:</strong> Transparency fosters trust, as anyone can audit the code for vulnerabilities. The collaborative model ensures quicker detection and resolution of issues.</li><li><strong>Proprietary Software:</strong> Users must trust the vendor’s claims about security, as they cannot independently verify the software’s integrity.</li></ul><p><strong>In essence</strong>, FOSS embodies the ideals of openness, collaboration, and shared progress, while proprietary software emphasizes control, exclusivity, and monetization. This ideological difference defines the way these software models are developed, distributed, and used in the world.</p><h3>Benefits of FOSS</h3><p>1. <strong>Cost Savings</strong></p><ul><li><strong>Free to Use:</strong> Most FOSS is available at no cost, making it an attractive option for individuals, startups, and organizations with limited budgets.</li><li><strong>Reduced Licensing Costs:</strong> There are no recurring licensing fees, which can result in significant long-term savings.</li><li><strong>Examples:</strong> Linux, LibreOffice, and GIMP provide cost-effective alternatives to proprietary operating systems and software.</li></ul><p>2. <strong>Freedom and Flexibility</strong></p><ul><li><strong>Customization:</strong> Users have access to the source code, allowing them to modify the software to meet specific needs.</li><li><strong>No Vendor Lock-In:</strong> Users are not tied to a specific vendor’s ecosystem or licensing terms, ensuring greater independence.</li><li><strong>Adaptability:</strong> Organizations can scale or adapt FOSS tools as required without restrictive limitations.</li></ul><p>3. <strong>Transparency and Trust</strong></p><ul><li><strong>Open Codebase:</strong> FOSS allows anyone to inspect the source code, ensuring that there are no hidden backdoors, spyware, or malicious features.</li><li><strong>Security:</strong> Transparent code allows the global community to identify and fix vulnerabilities, often faster than proprietary vendors.</li><li><strong>Example:</strong> OpenSSL, widely used for secure communications, benefits from public scrutiny.</li></ul><p>4. <strong>Community Support</strong></p><ul><li><strong>Collaborative Development:</strong> FOSS is often developed and maintained by a global community of contributors, ensuring rapid innovation and continuous improvement.</li><li><strong>Peer Support:</strong> Users can access forums, mailing lists, and online communities for help, often at no cost.</li><li><strong>Example:</strong> The Python programming language has a robust and active community that supports developers worldwide.</li></ul><p>5. <strong>Encourages Innovation</strong></p><ul><li><strong>Collaborative Innovation:</strong> Open access to code encourages experimentation and the development of new features.</li><li><strong>Foundation for New Projects:</strong> Developers can build on existing open-source projects rather than starting from scratch, accelerating innovation.</li><li><strong>Example:</strong> Android, the world’s most popular mobile operating system, is built on the Linux kernel.</li></ul><p>6. <strong>Compatibility and Interoperability</strong></p><ul><li><strong>Adherence to Standards:</strong> FOSS often adheres to open standards, ensuring compatibility across different platforms and systems.</li><li><strong>Interoperability:</strong> Open-source tools can integrate seamlessly with other software, reducing dependency on proprietary solutions.</li><li><strong>Example:</strong> OpenDocument Format (ODF) ensures compatibility between office tools like LibreOffice and others.</li></ul><p>7. <strong>Educational Value</strong></p><ul><li><strong>Learning Opportunities:</strong> Access to source code provides an excellent resource for students, developers, and researchers to study and understand software development.</li><li><strong>Skill Development:</strong> By contributing to FOSS projects, developers gain valuable real-world experience.</li><li><strong>Example:</strong> Many developers start their careers by contributing to FOSS projects like Mozilla Firefox or Apache.</li></ul><p>8. <strong>Sustainability and Longevity</strong></p><ul><li><strong>Community Maintenance:</strong> FOSS projects can continue to thrive even if the original developers or organizations abandon them. The community can fork the project and maintain it independently.</li><li><strong>No Forced Upgrades:</strong> Users can continue using older versions without being forced to upgrade or pay for new versions.</li><li><strong>Example:</strong> LibreOffice emerged as a fork of OpenOffice, ensuring its continued development.</li></ul><p>9. <strong>Security and Reliability</strong></p><ul><li><strong>Rapid Bug Fixes:</strong> The collaborative nature of FOSS enables quick identification and resolution of bugs or security vulnerabilities.</li><li><strong>High Reliability:</strong> Many FOSS projects undergo extensive peer review, resulting in robust and stable software.</li><li><strong>Example:</strong> Apache HTTP Server is a highly reliable web server used by millions of websites globally.</li></ul><p>10. <strong>Promotes Digital Sovereignty</strong></p><ul><li><strong>Local Control:</strong> Governments and organizations can adapt FOSS to meet local regulations and privacy requirements.</li><li><strong>Reduced Dependency:</strong> FOSS reduces reliance on foreign or proprietary software vendors, promoting self-reliance.</li><li><strong>Example:</strong> Many governments, including those of India and Germany, adopt FOSS for public administration to reduce dependency on foreign software.</li></ul><p>11. <strong>Ethical and Social Impact</strong></p><ul><li><strong>Democratizing Technology:</strong> FOSS makes advanced technology accessible to underserved communities and developing countries.</li><li><strong>Encouraging Collaboration:</strong> It fosters a spirit of cooperation and shared progress among individuals and organizations.</li><li><strong>Environmental Impact:</strong> Reusing and modifying FOSS reduces the need for redundant development, saving resources.</li></ul><p>12. <strong>Commercial Opportunities</strong></p><ul><li><strong>Hybrid Business Models:</strong> Companies can provide paid services, support, or customizations for FOSS (e.g., Red Hat Enterprise Linux).</li><li><strong>Lower Entry Barriers:</strong> Startups can use FOSS to build products and services with minimal initial investment.</li><li><strong>Example:</strong> WordPress, an open-source CMS, powers millions of websites and enables a vast ecosystem of plugins, themes, and hosting services.</li></ul><p>FOSS delivers a compelling mix of cost-effectiveness, flexibility, transparency, and community-driven innovation. By empowering individuals and organizations to take control of their software, FOSS fosters a culture of openness and collaboration, ensuring that technology benefits society as a whole.</p><h3>Challenges Facing FOSS</h3><p>While Free and Open Source Software (FOSS) has numerous benefits, it is not without its challenges. Here are some key obstacles faced by FOSS projects and their ecosystems:</p><p>1. <strong>Lack of Dedicated Support</strong></p><ul><li><strong>Issue:</strong> Unlike proprietary software, which often comes with official customer support, FOSS typically relies on community-driven support.</li><li><strong>Impact:</strong> Users, especially businesses, may struggle with troubleshooting or resolving complex issues in a timely manner.</li><li><strong>Example:</strong> A company using an open-source database might need to hire experts or purchase third-party support services for critical issues.</li></ul><p>2. <strong>Sustainability of Projects</strong></p><ul><li><strong>Issue:</strong> Many FOSS projects depend on volunteer contributions, which can lead to funding and resource constraints.</li><li><strong>Impact:</strong> Projects may stagnate or die out if maintainers lose interest, face burnout, or lack financial support.</li><li><strong>Example:</strong> Projects like Heartbleed (an OpenSSL vulnerability) exposed how critical FOSS projects can suffer from underfunding.</li></ul><p>3. <strong>Security Risks</strong></p><ul><li><strong>Issue:</strong> While the open nature of FOSS allows for transparency, it also means vulnerabilities are visible to malicious actors.</li><li><strong>Impact:</strong> If a vulnerability is not promptly patched, it can lead to security breaches.</li><li><strong>Example:</strong> High-profile vulnerabilities like Log4Shell (in Apache Log4j) highlighted the risks of widely used FOSS components.</li></ul><p>4. <strong>Fragmentation</strong></p><ul><li><strong>Issue:</strong> Forking, a common practice in FOSS, can lead to fragmentation, where similar projects diverge and compete rather than collaborate.</li><li><strong>Impact:</strong> Fragmentation can dilute resources and create confusion among users.</li><li><strong>Example:</strong> The split between OpenOffice and LibreOffice resulted in two similar but competing office suites.</li></ul><p>5. <strong>Steeper Learning Curve</strong></p><ul><li><strong>Issue:</strong> Many FOSS tools prioritize functionality over user-friendliness, making them less intuitive for non-technical users.</li><li><strong>Impact:</strong> This limits adoption among casual users and businesses unfamiliar with open-source systems.</li><li><strong>Example:</strong> Linux-based operating systems like Ubuntu are more user-friendly now, but still pose challenges for users accustomed to Windows or macOS.</li></ul><p>6. <strong>Compatibility and Integration</strong></p><ul><li><strong>Issue:</strong> FOSS projects may face difficulties integrating with proprietary systems or software.</li><li><strong>Impact:</strong> Businesses relying on hybrid systems (both open-source and proprietary) may encounter compatibility issues.</li><li><strong>Example:</strong> An open-source CMS might not seamlessly integrate with proprietary enterprise resource planning (ERP) tools.</li></ul><p>7. <strong>Misuse of Licensing</strong></p><ul><li><strong>Issue:</strong> Users may inadvertently violate open-source licenses due to a lack of understanding or oversight.</li><li><strong>Impact:</strong> This can lead to legal disputes, especially in commercial environments.</li><li><strong>Example:</strong> Misinterpreting GPL license obligations can result in legal action for failing to share modifications to the code.</li></ul><p>8. <strong>Limited Commercial Incentives</strong></p><ul><li><strong>Issue:</strong> Contributors to FOSS projects often work without direct financial rewards.</li><li><strong>Impact:</strong> This can discourage developers from contributing long-term or lead them to prioritize paid proprietary work instead.</li><li><strong>Example:</strong> Developers working on niche FOSS tools may struggle to secure sponsorships or donations.</li></ul><p>9. <strong>Perception and Trust Issues</strong></p><ul><li><strong>Issue:</strong> Some businesses and individuals perceive FOSS as unreliable or less secure compared to proprietary alternatives.</li><li><strong>Impact:</strong> This can hinder the adoption of FOSS in corporate and governmental settings.</li><li><strong>Example:</strong> Despite its robustness, Linux faces skepticism from organizations accustomed to proprietary operating systems.</li></ul><p>10. <strong>Governance and Decision-Making</strong></p><ul><li><strong>Issue:</strong> Many FOSS projects lack formal governance structures, leading to disagreements and inefficiencies in decision-making.</li><li><strong>Impact:</strong> This can delay critical updates or result in forks.</li><li><strong>Example:</strong> Governance disputes have affected projects like Node.js, leading to the creation of forks like io.js.</li></ul><p>11. <strong>Competition with Proprietary Software</strong></p><ul><li><strong>Issue:</strong> Proprietary software companies often have vast resources for marketing, development, and customer support, making it difficult for FOSS projects to compete.</li><li><strong>Impact:</strong> FOSS projects may struggle to gain visibility and adoption.</li><li><strong>Example:</strong> Despite its capabilities, GIMP often lags behind Adobe Photoshop in professional settings due to Adobe’s brand dominance and marketing.</li></ul><p>12. <strong>Dependency Management</strong></p><ul><li><strong>Issue:</strong> FOSS projects often depend on other open-source components, which may become unmaintained or introduce vulnerabilities.</li><li><strong>Impact:</strong> A single unmaintained dependency can jeopardize an entire project.</li><li><strong>Example:</strong> The Left-Pad incident in Node.js showed how the removal of a small, widely used library disrupted thousands of projects.</li></ul><blockquote><strong>Addressing These Challenges</strong></blockquote><p>While these challenges are significant, many can be mitigated through:</p><ul><li>Community and corporate sponsorships.</li><li>Improved documentation and user experience.</li><li>Enhanced education on open-source licenses and governance.</li><li>Hybrid models that combine open-source principles with commercial services (e.g., Red Hat).</li></ul><p>FOSS’s resilience lies in its community, adaptability, and commitment to open collaboration, ensuring that these challenges are continually addressed.</p><h3>Licensing in FOSS</h3><p>Licensing plays a critical role in the Free and Open Source Software (FOSS) ecosystem. It defines the terms under which software can be used, modified, and shared, ensuring the freedom of the software while protecting the rights of its creators.<br>FOSS license are designed to ensure the key principles of FOSS as mentioned above which distinguish FOSS licenses from proprietary licenses, which restrict usage and redistribution.</p><h3>Types of FOSS Licenses</h3><p>FOSS licenses generally fall into two categories:</p><p><strong><em>A. Permissive Licenses</em></strong></p><ul><li><strong>Characteristics:</strong></li></ul><blockquote>Allow freedom to use, modify, and redistribute the software with minimal restrictions.</blockquote><blockquote>Permit inclusion in proprietary software.</blockquote><blockquote>Often require acknowledgment of the original authors.</blockquote><ul><li><strong>Examples:</strong></li></ul><blockquote><strong>MIT License:</strong> Simple and permissive; only requires attribution.</blockquote><blockquote><strong>Apache License 2.0:</strong> Includes patent rights and requires changes to be documented.</blockquote><blockquote><strong>BSD Licenses:</strong> Minimal restrictions; used for projects like FreeBSD.</blockquote><ul><li><strong>Use Case:</strong> Ideal for projects aiming for broad adoption, including use in commercial software.</li></ul><p><strong><em>B. Copyleft Licenses</em></strong></p><ul><li><strong>Characteristics:</strong></li></ul><blockquote>Require that derivative works also be distributed under the same license.</blockquote><blockquote>Ensure that the software and its modifications remain open source.</blockquote><ul><li><strong>Examples:</strong></li></ul><blockquote><strong>GNU General Public License (GPL):</strong> Strong copyleft license requiring redistribution of derivative works under the GPL.</blockquote><blockquote><strong>Lesser GPL (LGPL):</strong> Similar to GPL but allows linking with proprietary software.</blockquote><blockquote><strong>Affero GPL (AGPL):</strong> Extends GPL to cover software used over a network (e.g., SaaS).</blockquote><ul><li><strong>Use Case:</strong> Suitable for projects aiming to protect the open-source nature of derivatives.</li></ul><h3>Common FOSS Licenses and Their Implications</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*MavzG18vvgVnP-QmMi3f9A.png" /><figcaption>Common FOSS Licenses</figcaption></figure><h3>Choosing a FOSS License</h3><p>When selecting a license for a project, should consider:</p><ul><li><strong>Desired Usage:</strong> Is the goal broad adoption (permissive) or ensuring openness (copyleft)?</li><li><strong>Community Expectations:</strong> Many ecosystems favor specific licenses (e.g., GPL in Linux projects).</li><li><strong>Legal Implications:</strong> Understanding obligations like attribution or sharing modifications.</li></ul><p>Licensing is the backbone of the FOSS ecosystem, balancing freedom with legal protections. By choosing the right license and adhering to its terms, developers and organizations can foster innovation, collaboration, and widespread adoption while safeguarding their work and the broader open-source community.</p><h3>Tools for FOSS</h3><p>Licensing tools for Free and Open Source Software (FOSS) are designed to help organizations, developers, and projects manage open-source licenses, ensure compliance, and mitigate legal risks. These tools typically analyze source code, dependencies, and other components to identify licensing terms and potential conflicts. Below is a list of famous licensing tools that facilitate FOSS license management:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*cYX_AfzNcGD-fZXD58aL0w.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*J-Q39xaQ546vBiodFmN0QA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*UZCpJMfFYtpAoRVKQPyhzg.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*9jeWY2sdy1yWEBUyFa0kHA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*fBrdEjSthHkMfWqzvoxpIg.png" /></figure><p>Free and Open Source Software (FOSS) embodies the ideals of openness, collaboration, and innovation. By empowering developers and organizations to freely access, modify, and distribute software, FOSS has driven technological advancements, democratized software development, and fostered global collaboration. From industry-leading tools to grassroots community projects, its impact is evident in every domain of technology.</p><p>Thanks for reading!!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6616b982d45b" width="1" height="1" alt=""><hr><p><a href="https://medium.com/make-android/free-and-open-source-software-foss-a-revolution-in-technology-6616b982d45b">Free and Open Source Software (FOSS): A Revolution in Technology</a> was originally published in <a href="https://medium.com/make-android">Make Android</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Managing Open Source Software: How Tools Like Black Duck Ensure Compliance and Security]]></title>
            <link>https://medium.com/make-android/managing-open-source-software-how-tools-like-black-duck-ensure-compliance-and-security-9628e51215cf?source=rss----ef894183aec6---4</link>
            <guid isPermaLink="false">https://medium.com/p/9628e51215cf</guid>
            <category><![CDATA[ci-cd-pipeline]]></category>
            <category><![CDATA[devops-practice]]></category>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[Famidha Thurab]]></dc:creator>
            <pubDate>Sun, 12 Jan 2025 07:13:19 GMT</pubDate>
            <atom:updated>2025-01-12T07:13:22.050Z</atom:updated>
            <content:encoded><![CDATA[<p>In today’s digital landscape, ensuring the security and compliance of software has become paramount. Black Duck, a leading solution for managing Free and Open Source Software (FOSS), addresses these concerns by providing organizations with robust tools to manage open-source components within their codebase. This article explores what Black Duck is, its features, benefits, and its significance in modern software development.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*BxsGbsj0irMsz55z" /><figcaption>Photo by <a href="https://unsplash.com/@riverfx?utm_source=medium&amp;utm_medium=referral">River Fx</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><h3>What is Black Duck?</h3><p>Black Duck is a product developed by Synopsys that helps organizations identify and manage open-source components in their software. Free and Open Source Software (FOSS) is widely used across industries due to its cost-effectiveness and innovation potential. However, it also introduces risks such as vulnerabilities, outdated components, and license compliance issues. Black Duck aids in mitigating these risks by offering visibility into the FOSS ecosystem of a codebase.</p><h3>How Does Black Duck Work?</h3><p>Black Duck employs a multi-step process to analyze and manage FOSS components:</p><ol><li><strong>Code Scanning:</strong> Black Duck scans the entire codebase to identify all FOSS components and associated metadata, such as version information, licenses, and known vulnerabilities.</li><li><strong>Component Identification:</strong> It uses a comprehensive knowledge base of open-source projects to match identified components accurately. This ensures a complete inventory of FOSS used in the software.</li><li><strong>Vulnerability Analysis:</strong> The platform cross-references identified components with databases like the National Vulnerability Database (NVD) to detect known vulnerabilities. It also evaluates the severity and potential impact of these vulnerabilities.</li><li><strong>License Analysis:</strong> Black Duck checks for license compliance, identifying potential conflicts or restrictions that could pose legal or operational risks.</li><li><strong>Policy Enforcement:</strong> Organizations can define specific policies for FOSS usage, and Black Duck automatically flags any components or actions that violate these policies.</li><li><strong>Integration with Workflows:</strong> By integrating with CI/CD pipelines, development tools, and issue tracking systems, Black Duck ensures that FOSS management is seamlessly embedded into the software development lifecycle.</li><li><strong>Reporting and Recommendations:</strong> The platform generates detailed reports and provides actionable recommendations to address vulnerabilities, update outdated components, or resolve license issues.</li></ol><h3>Key Features of Black Duck</h3><ol><li><strong>Comprehensive Scanning:</strong> Black Duck scans codebases to identify open-source components and provides detailed insights into potential vulnerabilities and license types.</li><li><strong>Vulnerability Management:</strong> The platform integrates with vulnerability databases like the National Vulnerability Database (NVD) to detect known vulnerabilities in open-source components.</li><li><strong>License Compliance:</strong> Black Duck ensures that software complies with FOSS licenses, helping organizations avoid legal and financial repercussions.</li><li><strong>Policy Management:</strong> Users can define custom policies for FOSS usage to align with their organization’s security and compliance standards.</li><li><strong>Continuous Integration/Continuous Deployment (CI/CD) Integration:</strong> Black Duck integrates seamlessly with CI/CD pipelines, allowing for automated scans during the development process.</li><li><strong>Reports and Dashboards:</strong> The platform provides intuitive dashboards and comprehensive reports that help stakeholders make informed decisions.</li></ol><h3>Benefits of Using Black Duck</h3><ul><li><strong>Enhanced Security:</strong> By identifying vulnerabilities in FOSS components, Black Duck helps organizations proactively address security risks.</li><li><strong>Compliance Assurance:</strong> The platform ensures adherence to legal and regulatory requirements related to FOSS usage.</li><li><strong>Improved Software Quality:</strong> By replacing outdated or vulnerable components, Black Duck enhances the overall quality and reliability of software.</li><li><strong>Time and Cost Savings:</strong> Automating FOSS management reduces manual effort and potential costs associated with security breaches or non-compliance.</li></ul><h3>Why is Black Duck Important?</h3><p>As organizations increasingly adopt FOSS, managing its risks becomes critical. Black Duck addresses these challenges by:</p><ul><li>Providing visibility into the FOSS components used in a project.</li><li>Offering actionable insights to remediate vulnerabilities and ensure compliance.</li><li>Streamlining the integration of security practices into the development lifecycle.</li></ul><h3>Conclusion</h3><p>Black Duck is an essential tool for organizations leveraging Free and Open Source Software. Its ability to identify vulnerabilities, ensure compliance, and integrate seamlessly into development workflows makes it a valuable asset for modern software development teams. By adopting Black Duck, organizations can enhance their software’s security posture, maintain compliance, and build trustworthy applications.</p><p>Thanks for reading!!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9628e51215cf" width="1" height="1" alt=""><hr><p><a href="https://medium.com/make-android/managing-open-source-software-how-tools-like-black-duck-ensure-compliance-and-security-9628e51215cf">Managing Open Source Software: How Tools Like Black Duck Ensure Compliance and Security</a> was originally published in <a href="https://medium.com/make-android">Make Android</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Build AOSP Android-14 Car Emulator]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/make-android/build-aosp-android-14-car-emulator-1bbfe2aeeb83?source=rss----ef894183aec6---4"><img src="https://cdn-images-1.medium.com/max/2600/0*7sQz00FY87fU02HF" width="5184"></a></p><p class="medium-feed-snippet">Building an Android-14 Car Emulator using the Android Open Source</p><p class="medium-feed-link"><a href="https://medium.com/make-android/build-aosp-android-14-car-emulator-1bbfe2aeeb83?source=rss----ef894183aec6---4">Continue reading on Make Android »</a></p></div>]]></description>
            <link>https://medium.com/make-android/build-aosp-android-14-car-emulator-1bbfe2aeeb83?source=rss----ef894183aec6---4</link>
            <guid isPermaLink="false">https://medium.com/p/1bbfe2aeeb83</guid>
            <category><![CDATA[android]]></category>
            <category><![CDATA[aosp-build]]></category>
            <category><![CDATA[aosp-14]]></category>
            <category><![CDATA[android-14]]></category>
            <category><![CDATA[car-emulator]]></category>
            <dc:creator><![CDATA[Narendra Harny]]></dc:creator>
            <pubDate>Sun, 12 Jan 2025 07:12:51 GMT</pubDate>
            <atom:updated>2025-01-12T14:15:46.256Z</atom:updated>
        </item>
    </channel>
</rss>