<?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: Nagaraj Alagusundaram</title>
    <description>The latest articles on DEV Community by Nagaraj Alagusundaram (@naagalgates).</description>
    <link>https://dev.to/naagalgates</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F466104%2F2f69738d-b5a7-4a89-9808-9312956c3565.jpg</url>
      <title>DEV Community: Nagaraj Alagusundaram</title>
      <link>https://dev.to/naagalgates</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/naagalgates"/>
    <language>en</language>
    <item>
      <title>How to build, sign, and distribute your Android App using Azure Pipelines? [Explained]</title>
      <dc:creator>Nagaraj Alagusundaram</dc:creator>
      <pubDate>Thu, 07 Jan 2021 23:13:14 +0000</pubDate>
      <link>https://dev.to/naagalgates/how-to-build-sign-and-distribute-your-android-app-using-azure-pipelines-2d8f</link>
      <guid>https://dev.to/naagalgates/how-to-build-sign-and-distribute-your-android-app-using-azure-pipelines-2d8f</guid>
      <description>&lt;p&gt;As a mobile developer, I know the pain of building the APKs regularly and sharing the latest version with different teams. Additionally, we need to upload the newest version to the Microsoft AppCenter and Google PlayStore. A minor mistake in the routine may lead to some serious trouble. For any unforeseen issue, the best solution is to automate the process. &lt;/p&gt;

&lt;p&gt;Here at &lt;a href="https://xam.com.au/" rel="noopener noreferrer"&gt;XAM&lt;/a&gt;, we use Azure Pipelines to build, Sign &amp;amp; publish the APKs without any manual intervention and thus preventing the time taken for the repeated tasks.&lt;/p&gt;

&lt;p&gt;Continuous Integration – Azure DevOps: &lt;/p&gt;

&lt;p&gt;Today I’m going to explain the process involved in Continuous Integration using the Azure DevOps for Android.&lt;/p&gt;

&lt;p&gt;The advantages of Azure DevOps are&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Accessible anywhere
No server maintenance
Good community support
Often updated
Low cost
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Steps:&lt;/p&gt;

&lt;p&gt;Setup Android project:&lt;/p&gt;

&lt;p&gt;I have created a simple Hello World Android project in GitHub for your convenience. In the root folder, you should find a YAML file named ‘pipelines_android.yml’. If you don’t want to create it from scratch, please make sure you commit this file to your repo. &lt;/p&gt;

&lt;p&gt;Got to your project&lt;/p&gt;

&lt;p&gt;Pipelines-&amp;gt; Create Pipeline&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fknqo06oogqwokypq8k4u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fknqo06oogqwokypq8k4u.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select your repo source &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fqp0l6a1a6r1njd51m22m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fqp0l6a1a6r1njd51m22m.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Since you’ve already added the YAML file, select the existing file to create a pipeline. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F9431wuoige6rt9gpy5gm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F9431wuoige6rt9gpy5gm.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Else you can create a new YAML file by selecting the appropriate option.&lt;/p&gt;

&lt;p&gt;I have already added the parameters to the pipelines. Please add as many parameters as you need.&lt;/p&gt;

&lt;p&gt;Allow the user to select the build type and their preferred operating system.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fobfivtykgi66fds10elc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fobfivtykgi66fds10elc.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, create a triggering point for this pipeline. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fdz2uj1r4y8ubq21z5vpu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fdz2uj1r4y8ubq21z5vpu.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In my pipeline, I’ve added the branch “master” as a trigger. So, whenever there is a pull request merged on the master branch, this pipeline will start.&lt;/p&gt;

&lt;p&gt;Create a variable group, as shown below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Feh72e3lu9m1rtup4pumt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Feh72e3lu9m1rtup4pumt.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To create a new variable group:&lt;/p&gt;

&lt;p&gt;Goto Pipelines-&amp;gt; Library&lt;br&gt;
Click + Variable group&lt;br&gt;
Add a variable group name.&lt;br&gt;
Add variables.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F332jdgof0yi92m6a38db.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F332jdgof0yi92m6a38db.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Clean the workspace and then add a pool image.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fjova9qy7wyzbs2p1m2fs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fjova9qy7wyzbs2p1m2fs.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The first step is to create Gradle@2, as shown below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F5nfg3pivj8rchtyc78i6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F5nfg3pivj8rchtyc78i6.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The next task is to sign the generated APK.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F3d60ubt45dvpdxs25iik.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F3d60ubt45dvpdxs25iik.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After Signing the APK, now we will have to publish the artifacts. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Flku9qxkjspdk5plxy5qg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Flku9qxkjspdk5plxy5qg.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After publishing it internally, let’s publish the artifacts to the AppCenter.&lt;/p&gt;

&lt;p&gt;Go to &lt;a href="https://appcenter.ms/apps/create" rel="noopener noreferrer"&gt;https://appcenter.ms/apps/create&lt;/a&gt; and create a new App.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fc96v8zw7p3voa6plf13a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fc96v8zw7p3voa6plf13a.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the App created in AppCenter, now introduce a testing group.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fm65xql3vub8xmvyzzyaj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fm65xql3vub8xmvyzzyaj.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fpl5u0kpeu3t8gtsbbbrr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fpl5u0kpeu3t8gtsbbbrr.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click the spanner icon and make a note of the group id. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fm0iniy1lewgbo2pecbac.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fm0iniy1lewgbo2pecbac.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The next step is to create a service connection between Azure DevOps and AppCenter. &lt;/p&gt;

&lt;p&gt;In AppCenter, go to the account settings page and add a new API token. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fq4912skow00xsilqd7k2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fq4912skow00xsilqd7k2.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In Azure DevOps:&lt;br&gt;
Click the Settings menu (gear icon) in Azure DevOps.&lt;br&gt;
Click the “Service Connection” menu on the left.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fn51cge7rt4tb4jkku0io.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fn51cge7rt4tb4jkku0io.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Choose “Visual Studio App Center” and click the Next button.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fixkaydgymnp311bpt6rm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fixkaydgymnp311bpt6rm.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Paste the copied token, give an appropriate name for this connection, and click Save. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgjm6kvtp1b2vkqbqle5x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgjm6kvtp1b2vkqbqle5x.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Go to Library-&amp;gt; Add new Variable group.&lt;br&gt;
Add AppCenter Connection.&lt;br&gt;
Add Slug Id: Username/AppName&lt;br&gt;
Add Group Id: paste the copied group id.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fknuqm377w8fk715wg07t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fknuqm377w8fk715wg07t.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then in the pipeline, add the AppCenterDistribute@3 task.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmuw81e4sa51tkb20q6ob.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmuw81e4sa51tkb20q6ob.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Build the pipeline, and you should see the artifacts uploaded in the AppCenter.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fb0hc13czwm5b2vundc4t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fb0hc13czwm5b2vundc4t.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have any doubts, let’s &lt;a href="https://www.nagaraj.com.au" rel="noopener noreferrer"&gt;chat&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To download YAML file: &lt;a href="https://github.com/NaagAlgates/AzurePipelines/blob/main/AndroidAzurePipelines/pipelines_android.yml" rel="noopener noreferrer"&gt;Click here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you think there is a better solution, please feel free to fork my &lt;a href="https://github.com/NaagAlgates/AzurePipelines" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;. &lt;/p&gt;

</description>
      <category>azure</category>
      <category>pipelines</category>
      <category>android</category>
      <category>distribute</category>
    </item>
    <item>
      <title> Android Studio 4.1: Embedded Emulator
</title>
      <dc:creator>Nagaraj Alagusundaram</dc:creator>
      <pubDate>Tue, 13 Oct 2020 22:01:21 +0000</pubDate>
      <link>https://dev.to/naagalgates/android-studio-4-1-embedded-emulator-212d</link>
      <guid>https://dev.to/naagalgates/android-studio-4-1-embedded-emulator-212d</guid>
      <description>&lt;p&gt;I was very excited to see the tweet from the Android Studio's official twitter handle.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Wk849dJI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/cc1wwfpcvqgraux69isr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Wk849dJI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/cc1wwfpcvqgraux69isr.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Immediate action from me was to update my Android Studio.&lt;/p&gt;

&lt;p&gt;The first change I noticed was the new icon for Android Studio.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--C-7ufZ2v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/47tt1xwsxbyt0x404eoj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--C-7ufZ2v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/47tt1xwsxbyt0x404eoj.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then I watched this YouTube video to see the new features. (&lt;a href="https://www.youtube.com/watch?v=Yhbr6u7f3ME"&gt;https://www.youtube.com/watch?v=Yhbr6u7f3ME&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Out of all features, in this blog, we're going to see about the Embedded Emulator.&lt;br&gt;
This feature is really important for those who work on a single monitor and have to switch between the code and emulator for testing the app.&lt;/p&gt;

&lt;p&gt;I know that feeling!&lt;/p&gt;

&lt;p&gt;So I thought to try this new feature.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--98cKLCTK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/beng0fasznzy5wl3m5zy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--98cKLCTK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/beng0fasznzy5wl3m5zy.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I created a new login template project.&lt;/p&gt;

&lt;p&gt;Then I clicked the "Emulator" menu that can be found on the right side bottom.&lt;/p&gt;

&lt;p&gt;I could see the instructions to open the Emulator Settings shown below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FfOuMlR_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/br7tqedhre165n0bdrc4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FfOuMlR_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/br7tqedhre165n0bdrc4.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can click the "Emulator settings" menu directly from here, or you can open the Preferences and search for the emulator&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KAkrxeci--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/4sa5ytlrs5aly8fbwwid.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KAkrxeci--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/4sa5ytlrs5aly8fbwwid.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enable the checkbox&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--G3CxtJzM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ucp70aix0nth1ckx4wec.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--G3CxtJzM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ucp70aix0nth1ckx4wec.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then click Apply.&lt;/p&gt;

&lt;p&gt;Now try to execute the app. At this point, ensure that no active emulators are running.&lt;/p&gt;

&lt;p&gt;Unfortunately, nothing happened. Still, I saw only the instructions to launch the emulator in the tool window and not the emulator.&lt;/p&gt;

&lt;p&gt;Then, I tried to launch the emulator once again. I saw this error popping.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uE3RKMX9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/22vtu77ricdnl94l3n4m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uE3RKMX9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/22vtu77ricdnl94l3n4m.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I was not sure about the things happening. So I created a virtual device. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xmNSwsPm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/6s1455bd5lkrulz7ycqk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xmNSwsPm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/6s1455bd5lkrulz7ycqk.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I executed the app again and targeted the new device.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jzw2_l9v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ryb4z81opyzg9jlgrfqs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jzw2_l9v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ryb4z81opyzg9jlgrfqs.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;அடங் கொய்யால!&lt;/p&gt;

&lt;p&gt;All seems to be fine now. I'm able to execute the app in all virtual devices and more importantly, the emulator is now embedded in the Android Studio.  I don't have to switch my windows anymore while developing an Android app.&lt;/p&gt;

&lt;p&gt;Here is my full window&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DM_Ie0J8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/vjqmwckt99tgbtsf2v7d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DM_Ie0J8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/vjqmwckt99tgbtsf2v7d.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Not all features are available yet. But I still love it.&lt;/p&gt;

&lt;p&gt;Thank you to all the developers who worked all day to give us this feature.&lt;/p&gt;

</description>
      <category>androidstudio</category>
      <category>emulator</category>
      <category>android</category>
      <category>studio</category>
    </item>
    <item>
      <title>Why Flutter Renders Quickly?</title>
      <dc:creator>Nagaraj Alagusundaram</dc:creator>
      <pubDate>Thu, 10 Sep 2020 05:25:34 +0000</pubDate>
      <link>https://dev.to/naagalgates/why-flutter-renders-quickly-26lk</link>
      <guid>https://dev.to/naagalgates/why-flutter-renders-quickly-26lk</guid>
      <description>&lt;p&gt;Introduction: &lt;/p&gt;

&lt;p&gt;By now we all would have heard the word “Flutter” and we all know it’s a Google-owned cross-domain platform just like Microsoft's Xamarin and Facebook's React Native. Google Trends shows a stat that the “Flutter” keyword is trending when compared with its competitors.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YdjmUHLP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/82w8d0t1nczcbv4je4ij.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YdjmUHLP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/82w8d0t1nczcbv4je4ij.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Flutter is just another Framework and it is not a first of its kind but why it is trending? &lt;/p&gt;

&lt;p&gt;When you search on the internet you will find the Pros and Cons of adopting the Flutter. The important point mentioned in all blogs is “Flutter is quick” or “Flutter renders the UI quickly” but no one described it. So, I thought of writing a blog with examples to show that and please do not consider this as a comparison or Flutter praising blog.&lt;/p&gt;

&lt;p&gt;Components: &lt;/p&gt;

&lt;p&gt;Like everyone say, I also agree the fact that, In Flutter, everything’s a Widget.  But it is not fully true. &lt;/p&gt;

&lt;p&gt;Yes! &lt;/p&gt;

&lt;p&gt;There are few other too, which we are going to see in detail.&lt;/p&gt;

&lt;p&gt;Firstly, what is a widget? &lt;/p&gt;

&lt;p&gt;According to the documentation,  &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Widgets are the central class hierarchy in the Flutter framework. A widget is an immutable description of part of a user interface.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;We all know that there no such thing called static or immutable UI. In any given app or web, the contents are meant to change. So, it is mutable but how Flutter uses the immutable widgets to create an app?&lt;/p&gt;

&lt;p&gt;In reality, Flutter has three trees&lt;/p&gt;

&lt;p&gt;·       Widget&lt;/p&gt;

&lt;p&gt;·       Element&lt;/p&gt;

&lt;p&gt;·       RenderObjects&lt;/p&gt;

&lt;p&gt;With the help of these trees, Flutter reuses the components and makes it faster. &lt;/p&gt;

&lt;p&gt;But how?&lt;/p&gt;

&lt;p&gt;First, let’s describe each tree briefly and then I’ll show you an example on how it is achieved.&lt;/p&gt;

&lt;p&gt;According to the documentation,  &lt;/p&gt;

&lt;p&gt;Widget: Describes the configuration for an Element. &lt;/p&gt;

&lt;p&gt;Element: Is an instantiation of a Widget. (This is a mutable piece, which is responsible for updating and managing the UI)&lt;/p&gt;

&lt;p&gt;RenderObject: Handles size, layout, and painting.&lt;/p&gt;

&lt;p&gt;In other words, we can also mention these as &lt;/p&gt;

&lt;p&gt;·       Configure&lt;/p&gt;

&lt;p&gt;·       Life Cycle&lt;/p&gt;

&lt;p&gt;·       Paint &lt;/p&gt;

&lt;p&gt;If you have enough time to watch a video about the backed nature of each components, watch this: &lt;a href="https://www.youtube.com/embed/996ZgFRENMs"&gt;https://www.youtube.com/embed/996ZgFRENMs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here I’ve created a sample application to show how the rendering is happening in Flutter. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Yu7JLuUm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/55dcarqy7xzzfkoo7za0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Yu7JLuUm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/55dcarqy7xzzfkoo7za0.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This Application can also be cloned from GitHub: &lt;a href="https://github.com/NaagAlgates/how_flutter_ui_drawn.git"&gt;https://github.com/NaagAlgates/how_flutter_ui_drawn.git&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;The output of the application is simple. When the screen is clicked, draw a new set of the widget tree. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--raOd6Tgb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ax46mc6jtt7tgmle1y3r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--raOd6Tgb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ax46mc6jtt7tgmle1y3r.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZDSQ3LGO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/5btkwlh22j2ah52zaasl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZDSQ3LGO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/5btkwlh22j2ah52zaasl.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6p79XmkU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/rzvj697dvxqq57quyf35.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6p79XmkU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/rzvj697dvxqq57quyf35.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click the Flutter Inspector tab if you’re using Android Studio like shown below&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_Ap-H9Oo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ws4d2cbv1dzg6kifsx73.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_Ap-H9Oo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ws4d2cbv1dzg6kifsx73.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This tab shows how the widgets are arranged to form a tree called a widget tree. Each and every widget should have a renderObject. Each of these objects has their own id. Copy or note down this id because we are going to play around with it to prove why Flutter renders faster.&lt;/p&gt;

&lt;p&gt;In my case the ID for CustomText widgets are #6d2c7, #bcd50 and SizedBox is #ab197&lt;/p&gt;

&lt;p&gt;Sized Box widget is the one which helps in providing a space between two CustomText.&lt;/p&gt;

&lt;p&gt;CustomText is a Stateless widget class that holds certain Text widget properties.&lt;/p&gt;

&lt;p&gt;Now, for testing purpose, comment the SizedBox widget and uncomment the padding property (refer line 39 in the code)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SzBJcYAz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/8576uyxa881xd1vk4m28.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SzBJcYAz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/8576uyxa881xd1vk4m28.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Execute the code or just save the code and you should see the output immediately (Hot reload – Command + \ in mac). You should see no difference at all.&lt;/p&gt;

&lt;p&gt;Ideally what should happen next?&lt;/p&gt;

&lt;p&gt;Remove all the views and re-create the entire view. &lt;/p&gt;

&lt;p&gt;But what happened?&lt;/p&gt;

&lt;p&gt;Nothing has changed except for the removal of SizedBox and the inclusion of Padding. &lt;/p&gt;

&lt;p&gt;To prove that now check the renderObject ID for your new tree.&lt;/p&gt;

&lt;p&gt;In the tree, you should see the Padding widget in green color in-between two CustomText Widgets.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PwrdWeKb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/p46vdgk4n2z11f612o07.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PwrdWeKb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/p46vdgk4n2z11f612o07.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The IDs of the Widgets are as follows&lt;/p&gt;

&lt;p&gt;CustomText = #6d2c7&lt;/p&gt;

&lt;p&gt;Padding = #18959&lt;/p&gt;

&lt;p&gt;CustomText = #bcd50&lt;/p&gt;

&lt;p&gt;When you click the screen, now the IDs are as follows&lt;/p&gt;

&lt;p&gt;CustomText = #6d2c7&lt;/p&gt;

&lt;p&gt;SizedBox = #af954&lt;/p&gt;

&lt;p&gt;CustomText = #bcd50&lt;/p&gt;

&lt;p&gt;The value of Padding and SizedBox alone changed because a new RenderObject was called on every click and hence, Flutter draws the screen quickly and the operation is less expensive.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;         Nagaraj Alagusundaram&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Source: &lt;a href="https://www.xam-consulting.com/blog/why-flutter-renders-quickly"&gt;https://www.xam-consulting.com/blog/why-flutter-renders-quickly&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;LinkedIn: &lt;a href="https://www.linkedin.com/in/ausmnaag/"&gt;https://www.linkedin.com/in/ausmnaag/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Twitter: &lt;a href="https://twitter.com/NAlagusundaram"&gt;https://twitter.com/NAlagusundaram&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/NaagAlgates"&gt;https://github.com/NaagAlgates&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://www.nagaraj.com.au"&gt;https://www.nagaraj.com.au&lt;/a&gt; &lt;/p&gt;

</description>
      <category>flutter</category>
      <category>render</category>
      <category>dart</category>
      <category>widgets</category>
    </item>
  </channel>
</rss>
