<?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: Emanuel Galvão</title>
    <description>The latest articles on DEV Community by Emanuel Galvão (@emanuelgalvao).</description>
    <link>https://dev.to/emanuelgalvao</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2450007%2Ff26ad6a3-b7a5-46ae-b3d3-effd22a5d0fa.png</url>
      <title>DEV Community: Emanuel Galvão</title>
      <link>https://dev.to/emanuelgalvao</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/emanuelgalvao"/>
    <language>en</language>
    <item>
      <title>Android MVI: O que é e como funciona essa arquitetura?</title>
      <dc:creator>Emanuel Galvão</dc:creator>
      <pubDate>Sun, 04 Oct 2026 13:13:03 +0000</pubDate>
      <link>https://dev.to/emanuelgalvao/android-mvi-o-que-e-e-como-funciona-essa-arquitetura-2eb5</link>
      <guid>https://dev.to/emanuelgalvao/android-mvi-o-que-e-e-como-funciona-essa-arquitetura-2eb5</guid>
      <description>&lt;p&gt;Trabalhando com desenvolvimento para a plataforma Android provavelmente você já deve ter ficado na dúvida sobre como uma arquitetura específica de &lt;em&gt;software&lt;/em&gt; funciona ou ainda quais são os pontos positivos e negativos de usar uma arquitetura em um projeto ou módulo novo.&lt;/p&gt;

&lt;p&gt;Nesse artigo vou tentar responder algumas dessas dúvidas relacionadas à arquitetura &lt;strong&gt;MVI&lt;/strong&gt; (&lt;em&gt;Model-View-Intent&lt;/em&gt;), que vem sendo uma arquitetura cada vez mais adotada e comum dentro do mundo de desenvolvimento &lt;em&gt;mobile&lt;/em&gt;, principalmente dentro do Android. Além disso, vou trazer um comparativo com outra arquitetura muito comum dentro da plataforma que é o &lt;strong&gt;MVVM&lt;/strong&gt; (&lt;em&gt;Model-View-ViewModel&lt;/em&gt;) de forma a te ajudar a entender a aplicação de cada uma delas.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é?
&lt;/h2&gt;

&lt;p&gt;O &lt;strong&gt;MVI&lt;/strong&gt; consiste em uma arquitetura baseada em intenções e em um fluxo de dados unidirecional, essas intenções podem ser entendidas como ações que podem ser realizadas pelo usuário durante o uso de uma funcionalidade ou aplicação. Tudo o que realiza a alteração de estado da aplicação, qualquer clique ou interação do usuário com a aplicação pode ser representado por uma intenção (&lt;em&gt;&lt;strong&gt;Intent&lt;/strong&gt;&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;Para entender em uma visão geral como funciona a arquitetura, precisamos primeiro saber o que a compõe. Como normalmente ocorre, cada letra da sigla que dá nome à arquitetura representa uma parte que integra o conjunto da obra. &lt;/p&gt;

&lt;p&gt;No &lt;strong&gt;MVI&lt;/strong&gt; temos essa sigla representando 3 peças principais:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model:&lt;/strong&gt; Consiste em um estado único que é responsável por representar uma tela ou funcionalidade, esse estado possui todas as informações necessárias para a construção das &lt;em&gt;Views&lt;/em&gt;. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;View:&lt;/strong&gt; É a camada de visualização das informações, o que de fato o usuário visualiza e interage de forma a resolver o problema proposto pela aplicação. Aqui temos toda a parte de &lt;em&gt;Activity&lt;/em&gt;, &lt;em&gt;Fragment&lt;/em&gt;, &lt;em&gt;Composables&lt;/em&gt; e qualquer outra interface de interação.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Intent:&lt;/strong&gt; Essa é a parte em que se baseia toda a arquitetura, que basicamente são as intenções/ações que o usuário pode realizar durante o uso de uma funcionalidade ou aplicação. Um ponto importante sobre esse conceito, ele não tem nenhuma relação com o &lt;em&gt;Intent&lt;/em&gt; usado no Android para abertura de &lt;em&gt;Activities&lt;/em&gt; e/ou comunicação com outros aplicativos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp99unb6rttqtaav77w8s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp99unb6rttqtaav77w8s.png" alt="Figura 1 - Comunicação entre as camadas" width="462" height="251"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Figura 1 - Comunicação entre as camadas
  &lt;p&gt;&lt;/p&gt;

&lt;p&gt;Na &lt;em&gt;Figura 1&lt;/em&gt; exibida acima, é possível ver de forma macro como funciona a interação entre as camadas nessa arquitetura. De forma simples, a &lt;em&gt;View&lt;/em&gt; é a tela que é exibida para o usuário, ele interage com essa tela e realiza ações, que são as &lt;em&gt;Intents&lt;/em&gt;, essas intenções demonstram a necessidade de uma manipulação de dados para atender a solicitação. A &lt;em&gt;Model&lt;/em&gt; é a responsável por manter um estado único e representar por completo a tela que é exibida ao usuário.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como essa arquitetura é organizada no Android?
&lt;/h2&gt;

&lt;p&gt;Acredito que a melhor forma de explicar sobre a organização dessa arquitetura dentro de um projeto Android é através de um exemplo prático. &lt;/p&gt;

&lt;p&gt;Vamos pensar na construção de uma tela inicial de um aplicativo esboçada pela &lt;em&gt;Figura 2&lt;/em&gt; abaixo. Nela podemos ver que a tela possui uma seção de &lt;em&gt;banners&lt;/em&gt;, uma lista de produtos e uma &lt;em&gt;bottomsheet&lt;/em&gt; para o usuário realizar o &lt;em&gt;login&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F40knpx241jwg7h20lelx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F40knpx241jwg7h20lelx.png" alt="Figura 2 - Esboço da tela inicial" width="202" height="392"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Figura 2 - Esboço da tela inicial
  &lt;p&gt;&lt;/p&gt;

&lt;p&gt;Agora com essa tela em mente podemos começar a organizar o nosso estado geral da tela, as interações que o usuário pode realizar e quais são os eventos únicos que podem ser exibidos pela interface.&lt;/p&gt;

&lt;p&gt;Para o estado geral vejo a necessidade de termos as informações abaixo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Saber se a tela está carregando ou se já terminou de carregar.&lt;/li&gt;
&lt;li&gt;Receber a lista de &lt;em&gt;banners&lt;/em&gt; que devem ser exibidos.&lt;/li&gt;
&lt;li&gt;Receber a lista de produtos que devem ser exibidos.&lt;/li&gt;
&lt;li&gt;Saber se precisamos exibir a &lt;em&gt;bottomsheet&lt;/em&gt; de &lt;em&gt;login&lt;/em&gt; ou não.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agora pensando nas ações que a tela pode ter e que o usuário pode realizar, temos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ação de carregar as informações da tela, seja no primeiro carregamento ou em uma atualização da tela.&lt;/li&gt;
&lt;li&gt;Ação de clicar para realizar o &lt;em&gt;login&lt;/em&gt; usando email e senha.&lt;/li&gt;
&lt;li&gt;Ação de clicar para ver um produto específico.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Por fim, temos os possíveis eventos únicos que a tela pode receber que são os eventos que exigem algum processamento que é responsabilidade da &lt;em&gt;View&lt;/em&gt;, no nosso caso foquei em apenas um:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Navegar para a tela de detalhes de um produto específico.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Com esses comportamentos definidos, podemos representar isso no código através das 3 entidades abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;data class&lt;/span&gt; &lt;span class="nc"&gt;UiState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;isLoading&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Boolean&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;banners&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Banner&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;listOf&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;products&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;listOf&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;showLogin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Boolean&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;sealed&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;Intent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="kd"&gt;object&lt;/span&gt; &lt;span class="nc"&gt;LoadData&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Intent&lt;/span&gt;
    &lt;span class="kd"&gt;data class&lt;/span&gt; &lt;span class="nc"&gt;Login&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;
    &lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;Intent&lt;/span&gt;
    &lt;span class="kd"&gt;data class&lt;/span&gt; &lt;span class="nc"&gt;GoToProduct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;productId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;
    &lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;Intent&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;sealed&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;Effect&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;data class&lt;/span&gt; &lt;span class="nc"&gt;NavigateToProduct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;productId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;
    &lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;Effect&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Além dessas entidades estabelecidas acima, precisamos definir mais uma peça central para nossa aplicação, que é o nosso &lt;strong&gt;Reducer&lt;/strong&gt;. O &lt;strong&gt;Reducer&lt;/strong&gt; é o componente responsável por receber o estado atual e também os dados necessários para uma mudança de estado específica, com isso em mãos o &lt;strong&gt;Reducer&lt;/strong&gt; consegue fazer a atualização dos parâmetros e devolver o novo estado que será propagado para a nossa &lt;em&gt;View&lt;/em&gt;. Para os nossos comportamentos definidos anteriormente, precisamos que o Reducer saiba tratar os seguintes cenários:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Controle da exibição do &lt;em&gt;loading&lt;/em&gt; enquanto realizamos algum processamento.&lt;/li&gt;
&lt;li&gt;Recebimento dos dados que devem ser exibidos na tela e atualização das informações no estado.&lt;/li&gt;
&lt;li&gt;Recebimento do sucesso no &lt;em&gt;login&lt;/em&gt; e tratamento para esconder a &lt;em&gt;bottomsheet&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Com isso definido podemos criar o &lt;strong&gt;HomeReducer&lt;/strong&gt;, sendo uma classe que vai possuir um único método de &lt;code&gt;reduce&lt;/code&gt; que sempre recebe o estado atual e a ação que ele deve processar, podemos representar ele pela seguinte classe:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HomeReducer&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;sealed&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;Action&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="kd"&gt;object&lt;/span&gt; &lt;span class="nc"&gt;DisplayLoading&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Action&lt;/span&gt;
        &lt;span class="kd"&gt;data class&lt;/span&gt; &lt;span class="nc"&gt;DataLoaded&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;banners&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Banner&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;,&lt;/span&gt;
            &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;products&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;Action&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="kd"&gt;object&lt;/span&gt; &lt;span class="nc"&gt;LoginSuccess&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Action&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;UiState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Action&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;UiState&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;Action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DisplayLoading&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isLoading&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="nc"&gt;Action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DataLoaded&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;isLoading&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;banners&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;banners&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;products&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;products&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nc"&gt;Action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;LoginSuccess&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;isLoading&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;showLogin&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com essas informações definidas, podemos detalhar melhor todo o fluxo de dados em cada uma das interações. Na &lt;em&gt;Figura 3&lt;/em&gt; abaixo temos a separação da comunicação entre a &lt;em&gt;View&lt;/em&gt;, &lt;em&gt;ViewModel&lt;/em&gt; e a camada de dados, nela podemos ver por completo a interação de todos os fluxos que descrevi anteriormente.&lt;/p&gt;

&lt;p&gt;Começando a explicação pela &lt;em&gt;ViewModel&lt;/em&gt;, fica claro que ela expõe para a Activity um &lt;code&gt;UiState&lt;/code&gt; através de um &lt;code&gt;StateFlow&lt;/code&gt; e um &lt;code&gt;Effect&lt;/code&gt; através de um &lt;code&gt;Channel&lt;/code&gt;, além de um método &lt;code&gt;handle&lt;/code&gt; que recebe sempre uma &lt;code&gt;Intent&lt;/code&gt;. Do lado da Activity vemos que possuímos uma &lt;code&gt;Screen&lt;/code&gt; feita em Jetpack Compose e também temos dois &lt;code&gt;Observers&lt;/code&gt; que acompanham as atualizações do &lt;code&gt;UiState&lt;/code&gt; e do &lt;code&gt;Effect&lt;/code&gt; fornecidos pela &lt;em&gt;ViewModel&lt;/em&gt;. Ainda temos a camada de dados com os &lt;code&gt;UseCases&lt;/code&gt;, &lt;code&gt;Repositories&lt;/code&gt; e comunicação com uma API remota.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzvssxm99tw5vfufb3sj7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzvssxm99tw5vfufb3sj7.png" alt="Figura 3 - Fluxo completo de uma tela de Home na arquitetura MVI" width="745" height="611"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Figura 3 - Fluxo completo de uma tela de Home na arquitetura MVI
  &lt;p&gt;&lt;/p&gt;

&lt;p&gt;Explicando de fato os fluxos possíveis dessa tela mostrados na imagem e como eles funcionam:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Fluxo inicial:&lt;/strong&gt; Ao entrar na tela precisamos realizar as buscas dos dados que devem ser exibidos, isso será realizado usando uma API remota. Para esse objetivo temos os passos demonstrados no &lt;em&gt;Diagrama de Sequência 1&lt;/em&gt; abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F38zw86m1u19uh04oywv9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F38zw86m1u19uh04oywv9.png" alt="Diagrama de Sequência 1 - Fluxo inicial de carregamento da home" width="799" height="417"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Diagrama de Sequência 1 - Fluxo inicial de carregamento da home
  &lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Fluxo de &lt;em&gt;login&lt;/em&gt;:&lt;/strong&gt; Com a &lt;em&gt;bottomsheet&lt;/em&gt; sendo exibida damos a opção do usuário realizar o &lt;em&gt;login&lt;/em&gt; digitando o email e senha. Ao clicar no botão de “Entrar” segue-se a sequência demonstrada pelo &lt;em&gt;Diagrama de Sequência 2&lt;/em&gt; abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp6hewbfei257l0onbq44.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp6hewbfei257l0onbq44.png" alt="Diagrama de Sequência 2 - Fluxo de sucesso no login" width="800" height="412"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Diagrama de Sequência 2 - Fluxo de sucesso no login
  &lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Fluxo de seleção de produto:&lt;/strong&gt; Tendo a lista de produtos sendo mostrada na tela existe a possibilidade do usuário realizar a seleção de um deles de forma a visualizar mais informações sobre ele. Ao realizar essa ação temos o fluxo mostrado no &lt;em&gt;Diagrama de Sequência 3&lt;/em&gt; abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxds8mmt1hv0n35858lm5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxds8mmt1hv0n35858lm5.png" alt="Diagrama de Sequência 3 - Fluxo de navegação para detalhes de produto" width="357" height="222"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Diagrama de Sequência 3 - Fluxo de navegação para detalhes de produto
  &lt;p&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Observação:&lt;/strong&gt; Para deixar mais simples a explicação e exibição na imagem não foram mostrados os fluxos de erros, porém eles basicamente envolveriam uma atualização no estado ou ainda uma ocorrência única de exibição de mensagens explicando as falhas.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Com isso concluímos a explicação completa de como funcionam todos os fluxos que tínhamos definido para essa tela na análise inicial.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quais são os benefícios que essa arquitetura traz?
&lt;/h2&gt;

&lt;p&gt;Dentre os principais benefícios que a arquitetura MVI oferece, podemos focar nos quatro descritos abaixo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mais clareza na compreensão dos fluxos disponíveis de uma tela/funcionalidade, de forma que é simples entender quais são os comportamentos e estados que uma tela/funcionalidade pode oferecer.&lt;/li&gt;
&lt;li&gt;Facilidade em realizar a criação de testes dos fluxos, como temos a clareza do fluxo e qual é o estado final esperado é fácil criar um teste que irá validar se o resultado obtido condiz com o desejado ou se temos alguma falha no fluxo.&lt;/li&gt;
&lt;li&gt;Compatibilidade e integração com o &lt;em&gt;Jetpack Compose&lt;/em&gt;, pois como foi demonstrado anteriormente temos o estado completo da tela e as intenções disponíveis, com isso é simples criar os comportamentos que a interface deve fornecer.&lt;/li&gt;
&lt;li&gt;Separação de estados da tela e de eventos únicos, de forma a separar o que são mudanças persistentes nas informações da tela e o que são ocorrências únicas, como navegações ou exibições de mensagens de erro.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Quando não utilizar a arquitetura MVI?
&lt;/h2&gt;

&lt;p&gt;Além dos pontos positivos, temos que pensar em quais cenários não seria relevante usar essa arquitetura. De forma simples não é interessante quando estamos trabalhando nos seguintes casos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Para aplicações muito simples é pouco vantajoso o uso da arquitetura &lt;strong&gt;MVI&lt;/strong&gt; devido à quantidade de classes necessárias para orquestração dos fluxos como foi mostrado antes. Por isso, para cenários básicos de funcionalidades pouco complexas talvez seja interessante analisar outras opções de arquiteturas.&lt;/li&gt;
&lt;li&gt;Times com pouco conhecimento nos conceitos de programação reativa, pois exige uma curva de aprendizado maior para conseguir entender e aplicar essa arquitetura no projeto. &lt;/li&gt;
&lt;li&gt;Aplicações que exigem entrega rápida ou são apenas protótipos ou ainda tem interfaces visuais muito simples e com poucos estados.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  O que diferencia a arquitetura MVI e a MVVM?
&lt;/h2&gt;

&lt;p&gt;Para fazer um comparativo e elucidar um pouco mais sobre as principais diferenças entre a forma de uso de cada uma dessas arquiteturas organizei a tabela abaixo trazendo as diferenças entre ambas em alguns tópicos específicos.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;MVI&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;MVVM&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Estado&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Um único objeto de estado que representa a tela por completo&lt;/td&gt;
&lt;td&gt;Pode oferecer múltiplos objetos de estado para diversos elementos da tela&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fluxo de Dados&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fluxo de dados unidirecional, de forma a ficar claro todo o curso das informações&lt;/td&gt;
&lt;td&gt;Possibilidade de fluxo bidirecional, com a &lt;em&gt;ViewModel&lt;/em&gt; expondo estados e até mesmo &lt;em&gt;callbacks&lt;/em&gt; para uso pela &lt;em&gt;View&lt;/em&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Comunicação View⭤ViewModel&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A &lt;em&gt;ViewModel&lt;/em&gt; expõe um único método de acesso para a &lt;em&gt;View&lt;/em&gt;, recebendo sempre uma intenção e permitindo que a &lt;em&gt;ViewModel&lt;/em&gt; tenha total controle do fluxo&lt;/td&gt;
&lt;td&gt;Normalmente a &lt;em&gt;View&lt;/em&gt; tem acesso a vários métodos da &lt;em&gt;ViewModel&lt;/em&gt;, de forma a &lt;em&gt;View&lt;/em&gt; poder chamar vários deles, dificultando o controle do fluxo apenas pela &lt;em&gt;ViewModel&lt;/em&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Erros&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;São controlados de forma direta através do único objeto de estado ou ainda por um objeto de &lt;em&gt;Effect/SideEffect&lt;/em&gt; responsável por eventos únicos da tela&lt;/td&gt;
&lt;td&gt;Tratamento de erros pode ocorrer misturado entre os vários objetos de estado expostos pela &lt;em&gt;ViewModel&lt;/em&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Atualização de Dados&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Possui um &lt;em&gt;Reducer&lt;/em&gt;, responsável por utilizar os dados e fazer a atualização correta do estado&lt;/td&gt;
&lt;td&gt;Usa a própria &lt;em&gt;ViewModel&lt;/em&gt; para fazer o controle e atualização dos estados&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Espero que eu tenha conseguido deixar um pouco mais claro como funciona a arquitetura &lt;strong&gt;MVI&lt;/strong&gt; no Android, de forma a você conseguir compreender e aplicar em suas aplicações no futuro. Acredito que pude explicar como funciona usando um fluxo real e que também tenha apresentado as vantagens e desvantagens em utilizá-la. Se restar alguma dúvida e/ou sugestão de melhoria, deixo o campo dos comentários aberto para discutirmos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fontes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;[1] E. P. Beltré, “Yes, That’s MVI: The Pattern’s Full History, Misconceptions, and Modern Android Form,” Medium, May 29, 2025. &lt;a href="https://proandroiddev.com/yes-that-is-mvi-674f810ca4fe" rel="noopener noreferrer"&gt;https://proandroiddev.com/yes-that-is-mvi-674f810ca4fe&lt;/a&gt; (acessado em 04/10/2026).&lt;/p&gt;

&lt;p&gt;[2] S. O. Akhtar, “Mastering MVI in Android: A Complete Guide with Sample Code,” Medium, Feb. 18, 2026. &lt;a href="https://blog.stackademic.com/mastering-mvi-in-android-a-complete-guide-with-sample-code-70d312a9a140" rel="noopener noreferrer"&gt;https://blog.stackademic.com/mastering-mvi-in-android-a-complete-guide-with-sample-code-70d312a9a140&lt;/a&gt; (acessado em 04/10/2026).&lt;/p&gt;

&lt;p&gt;[3] J. SANTOS, “Introdução ao padrão MVI no desenvolvimento Android,” DIO, Nov. 24, 2023. &lt;a href="https://www.dio.me/articles/introducao-ao-padrao-mvi-no-desenvolvimento-android" rel="noopener noreferrer"&gt;https://www.dio.me/articles/introducao-ao-padrao-mvi-no-desenvolvimento-android&lt;/a&gt; (acessado em 04/10/2026).&lt;/p&gt;

</description>
      <category>android</category>
      <category>architecture</category>
      <category>mobile</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Android Developer Verification: O que muda a partir de setembro de 2026</title>
      <dc:creator>Emanuel Galvão</dc:creator>
      <pubDate>Thu, 01 Oct 2026 02:14:12 +0000</pubDate>
      <link>https://dev.to/emanuelgalvao/android-developer-verification-o-que-muda-a-partir-de-setembro-de-2026-16ab</link>
      <guid>https://dev.to/emanuelgalvao/android-developer-verification-o-que-muda-a-partir-de-setembro-de-2026-16ab</guid>
      <description>&lt;p&gt;Se você faz parte do mundo de desenvolvimento mobile, seja como desenvolvedor de fato ou como alguém que tem contato com o time de desenvolvimento, deve ter ouvido falar recentemente sobre mudanças na distribuição de aplicativos dentro do sistema Android. &lt;/p&gt;

&lt;p&gt;Tendo conhecimento prévio sobre esse tema ou caindo de paraquedas nesse artigo provavelmente você deve estar confuso sobre como essas mudanças vão impactar o desenvolvimento de aplicativos e como isso afeta a experiência do usuário final das aplicações criadas para essa plataforma. &lt;/p&gt;

&lt;p&gt;Meu objetivo com esse artigo é explicar de forma simples o que muda e quais são as novas diretrizes que precisamos nos atentar para essas mudanças ocorrerem de forma transparente para os usuários de nossas aplicações.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qual o objetivo da mudança?
&lt;/h2&gt;

&lt;p&gt;Devido a problemas recorrentes relacionados a usuários que são expostos a malwares e golpes, a Google tem o objetivo de tornar o sistema Android mais seguro de forma a reduzir os riscos para seus usuários e evitar o contato com aplicações maliciosas. &lt;/p&gt;

&lt;p&gt;Com essa visão, na metade de 2025 a Google anunciou um plano de mudanças relacionadas a melhorar a identificação das aplicações desenvolvidas para a plataforma. Isso se torna necessário pois mesmo já tendo um processo de publicação através da Google Play também existem lojas paralelas de aplicativos que podem não solicitar um processo alinhado com as políticas recomendadas. &lt;/p&gt;

&lt;p&gt;E além de lojas não oficiais existe também a possibilidade de instalar aplicativos diretamente através de arquivos &lt;code&gt;.apk&lt;/code&gt; que podem ser baixados e compartilhados de forma muito simples e com baixíssima segurança. O que torna possível qualquer pessoa criar uma aplicação maliciosa para tentar prejudicar usuários desatentos.&lt;/p&gt;

&lt;p&gt;Pensando nesse risco a Google criou o &lt;strong&gt;Android Developer Verification&lt;/strong&gt;, que vai ser uma forma de identificar a empresa ou desenvolvedor que está por trás de um aplicativo, de forma a trazer mais segurança para os usuários finais.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quando a mudança ocorrerá?
&lt;/h2&gt;

&lt;p&gt;Por mais que pareça algo que mudou de ontem para hoje, na verdade como mencionei acima, desde o segundo semestre de 2025 já havia sido divulgado um calendário para garantir que ninguém seria pego de surpresa. Porém isso pode ter passado despercebido por alguns desenvolvedores, o que faz com que pareça ser uma emergência trabalhar nessas mudanças para realizar as adequações necessárias de forma que a aplicação continue sendo distribuída sem maiores problemas.&lt;/p&gt;

&lt;p&gt;No calendário divulgado pela Google a mudança começa a valer a partir de &lt;strong&gt;30 de setembro de 2026&lt;/strong&gt; para alguns países, são eles: &lt;strong&gt;Brasil&lt;/strong&gt;, Indonésia, Singapura e Tailândia. E após essa fase inicial, em &lt;strong&gt;2027&lt;/strong&gt; a mudança se torna válida para todos os países do mundo e todos os dispositivos Android certificados.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como era antes e o que mudou?
&lt;/h2&gt;

&lt;p&gt;Antes dessa mudança, para instalar qualquer aplicativo por fora da loja oficial da Google poderiam ser utilizadas outras lojas paralelas, como a Galaxy Store, Honor App Market, GetApps, entre outras. E ainda era possível baixar de forma direta o arquivo &lt;code&gt;.apk&lt;/code&gt; e realizar a instalação de qualquer aplicativo, em alguns casos era solicitado uma autorização para realizar a instalação de aplicativos de fontes desconhecidas e apenas dando consentimento nas configurações do dispositivo a instalação era realizada tranquilamente.&lt;/p&gt;

&lt;p&gt;Com as alterações das políticas, aplicativos que não possuem a verificação serão possíveis de serem distribuídos apenas por canais externos às lojas oficiais e além disso será necessário que o usuário realize um fluxo avançado para prosseguir com a instalação do aplicativo.&lt;/p&gt;

&lt;p&gt;O fluxo avançado mencionado acima é um processo novo e bem mais burocrático necessário de ser executado pelo usuário e com algumas barreiras de forma a mitigar possíveis ataques ou ações que gerem danos ao usuário. &lt;strong&gt;O processo de instalação requer que os seguintes passos sejam executados:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;É necessário habilitar o &lt;strong&gt;Modo de Desenvolvedor&lt;/strong&gt; nas configurações e também confirmar que não está sendo coagido a desligar as opções de segurança.&lt;/li&gt;
&lt;li&gt;Em seguida, é preciso reiniciar e desbloquear o celular, de forma a evitar possíveis acessos remotos ou ligações em andamento que estejam persuadindo o usuário a realizar ações.&lt;/li&gt;
&lt;li&gt;Depois disso, é preciso aguardar &lt;strong&gt;24 horas&lt;/strong&gt; para seguir com o processo de forma a evitar um possível gatilho de urgência forçando a pessoa a instalar alguma aplicação maliciosa.&lt;/li&gt;
&lt;li&gt;Com a espera concluída deve ser feita uma confirmação com a biometria ou PIN e fica liberada a instalação de aplicativos de desenvolvedores não verificados. O processo é feito apenas uma vez, porém sempre que for instalar um aplicativo será exibido o aviso de que pertence a um desenvolvedor não verificado.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Quais são os riscos dessa mudança?
&lt;/h2&gt;

&lt;p&gt;Aqui a preocupação fica principalmente do lado dos fornecedores das aplicações, o maior risco está em começar a ter reclamações de clientes, novos ou mesmo clientes que já usavam o aplicativo e precisam fazer uma atualização, relatando problemas em realizar a instalação e ficando impossibilitados de usar o aplicativo. &lt;/p&gt;

&lt;p&gt;Isso ainda pode gerar uma desconfiança dos clientes em relação a empresa e/ou desenvolvedores devido a eles terem um pensamento de que a aplicação não é segura, pois precisa-se fazer todo um processo complexo para instalar a aplicação que antes conseguiam fazer com poucos toques.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como regularizar a aplicação e se tornar um desenvolvedor verificado?
&lt;/h2&gt;

&lt;p&gt;A adequação às novas políticas pode ser feita de forma simples e dar entrada ao processo é bem rápido, o maior empecilho que pode surgir é o tempo que a Google vai levar para analisar a documentação, e ainda podem ser necessárias adequações na documentação ou solicitado o envio de novas informações.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Para fazer o processo de regularização são basicamente 3 passos:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Para desenvolvedores que já usam a &lt;strong&gt;Google Play&lt;/strong&gt; para distribuir os aplicativos o processo de vinculação é automático (desde que tenha concluído a verificação de identidade do Play Console). Porém quem faz a distribuição por fora precisa se cadastrar com uma conta do &lt;a href="https://android.google.com/developerconsole?hl=pt-br" rel="noopener noreferrer"&gt;Android Developer Console&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Fornecer as informações e documentos solicitados pela Google para confirmar a identidade da pessoa ou empresa e garantir que existe uma entidade real por trás da conta.&lt;/li&gt;
&lt;li&gt;Registrar os nomes dos pacotes das aplicações através do APK assinado com o certificado de forma a vincular os aplicativos com a conta do desenvolvedor verificada.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Se eu não aderir às mudanças meu aplicativo para de funcionar?
&lt;/h2&gt;

&lt;p&gt;A resposta simples é não e como foi mencionado alguns parágrafos acima o aplicativo continua funcionando normalmente para usuários que já possuem o aplicativo instalado. Porém se eles precisarem instalar um &lt;code&gt;.apk&lt;/code&gt; de uma versão de atualização ou caso um usuário novo precise instalar a aplicação será necessária a execução de um passo a passo específico que já foi explicado anteriormente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Temos mais alguma mudança prevista no futuro?
&lt;/h2&gt;

&lt;p&gt;Relacionado especificamente a esse tema de melhorias da segurança através da identidade do desenvolvedor, a única mudança que temos realmente é em &lt;strong&gt;2027&lt;/strong&gt; a alteração passar a valer globalmente. &lt;/p&gt;

&lt;p&gt;Porém para quem nessa data já estiver adequado a nova política não existe mais nada divulgado pela Google que possa mudar o processo, pelo menos até a escrita deste artigo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Espero que tenha ficado mais claro quais serão as mudanças e que elas podem ser resolvidas de forma relativamente simples. Com essas novas medidas acredito que no longo prazo será possível levar mais confiança para os clientes finais dos aplicativos e vai gerar uma maior autoridade e melhorar a imagem da empresa/desenvolvedor para eles.&lt;/p&gt;

&lt;p&gt;Caso você tenha sido pego de surpresa por essa notícia das alterações na política sugiro que você acompanhe o &lt;a href="https://developer.android.com/blog/" rel="noopener noreferrer"&gt;Blog Oficial do Android Developers&lt;/a&gt; para ficar por dentro de qualquer mudança futura que ocorra na plataforma.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fontes:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;[1] “Verificação de desenvolvedor Android,” Android Developers, 2026. &lt;a href="https://developer.android.com/developer-verification/guides?hl=pt-br" rel="noopener noreferrer"&gt;https://developer.android.com/developer-verification/guides?hl=pt-br&lt;/a&gt; (acessado em 30/09/2026).&lt;/p&gt;

&lt;p&gt;[2] “A new layer of security for certified Android devices,” Android Developers Blog, 2025. &lt;a href="https://android-developers.googleblog.com/2025/08/elevating-android-security.html" rel="noopener noreferrer"&gt;https://android-developers.googleblog.com/2025/08/elevating-android-security.html&lt;/a&gt; (acessado em 30/09/2026).&lt;/p&gt;

&lt;p&gt;[3] M. Forsythe, “Verificação de desenvolvedor Android: equilibrando abertura e escolha com segurança | Android Developers’ Blog,” Android Developers, Mar. 2026. &lt;a href="https://developer.android.com/blog/posts/android-developer-verification-balancing-openness-and-choice-with-safety?hl=pt-br" rel="noopener noreferrer"&gt;https://developer.android.com/blog/posts/android-developer-verification-balancing-openness-and-choice-with-safety?hl=pt-br&lt;/a&gt; (acessado em 30/09/2026).&lt;/p&gt;

&lt;p&gt;[4] M. Forsythe, “Verificação de desenvolvedor Android: lançamento para todos os desenvolvedores no Play Console e no Android Developer Console | Android Developers’ Blog,” Android Developers, Mar. 2026. &lt;a href="https://developer.android.com/blog/posts/android-developer-verification-rolling-out-to-all-developers-on-play-console-and-android-developer-console?hl=pt-br" rel="noopener noreferrer"&gt;https://developer.android.com/blog/posts/android-developer-verification-rolling-out-to-all-developers-on-play-console-and-android-developer-console?hl=pt-br&lt;/a&gt; (acessado em 30/09/2026).&lt;/p&gt;

</description>
      <category>android</category>
      <category>mobile</category>
      <category>google</category>
      <category>braziliandevs</category>
    </item>
  </channel>
</rss>
