<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>victor&apos;s hacker blog</title>
    <description>meu blog sobre aprendizados relacionados a tecnologia, desenvolvimento e segurança.
</description>
    <link>https://blog.victorlpgazolli.dev/</link>
    <atom:link href="https://blog.victorlpgazolli.dev/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Sun, 15 Mar 2026 19:22:39 +0000</pubDate>
    <lastBuildDate>Sun, 15 Mar 2026 19:22:39 +0000</lastBuildDate>
    <generator>Jekyll v4.4.1</generator>
    
      <item>
        <title>Entender a Interoperabilidade Kotlin-Swift pode evitar que você cause bugs em produção</title>
        <description>&lt;p&gt;Interoperabilidade = A capacidade de sistemas distintos conversarem e compartilhar dados.&lt;/p&gt;

&lt;p&gt;Talvez isso seja óbvio para alguns devs mobile, mas para quem desenvolve projetos que utilizam &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Kotlin Multiplatform&lt;/code&gt; e ainda não deu a devida atenção e realmente parou para ler sobre a interoperabilidade entre &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Kotlin&lt;/code&gt; e &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Swift&lt;/code&gt;, esse post é minha chance de te convencer a dominar esse tema.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;No desenvolvimento com &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Kotlin Multiplatform&lt;/code&gt;, dominar a &lt;a href=&quot;https://github.com/kotlin-hands-on/kotlin-swift-interopedia/&quot;&gt;interoperabilidade do Kotlin com Swift&lt;/a&gt; é uma peça chave pra não gerar problemas em produção.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Tudo que vai no &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;commonMain&lt;/code&gt; vale pro Android e iOS, portanto nós temos como expectativa que o código seja essencialmente a mesma coisa entre as plataformas: tenha as mesmas funções, classes e se comporte igual.&lt;/p&gt;

&lt;p&gt;Esse compartilhamento de código entre a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;commonMain&lt;/code&gt; e código &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Swift&lt;/code&gt; é totalmente transparente para nós devs, tudo que eu escrevo em um aparece “igual” no outro… e após várias iterações disso é fácil esquecer que o código do &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;commonMain&lt;/code&gt; passa por uma “etapa intermediária”, onde pode sofrer mudanças para que o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Swift&lt;/code&gt; consiga entender nativamente.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;De uma forma simplista, o código que o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Swift&lt;/code&gt; vê é o produto da soma &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;commonMain&lt;/code&gt; + &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;iosMain&lt;/code&gt; + um processo de multiplas compilações, e não somente &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;commonMain&lt;/code&gt; + &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;iosMain&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Esse “processo de multiplas compilações” ou essa “etapa intermediária” que eu disse foi apenas uma forma de resumir, se você tiver interesse em como isso funciona vou deixar um link que dá explicações e detalhes técnicos sobre isso:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/JetBrains/kotlin/blob/master/docs/native/compilation-model.md&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;kotlin/docs/native/compilation-model.md&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Quantas vezes você já fez um código que no &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Kotlin&lt;/code&gt; ficou belíssimo, mas quando você abriu o XCode notou que esse mesmo código tava péssimo pra usar?
Ou até mesmo tinha coisas a mais nele que você não desenvolveu? Ou coisas faltando… “Cadê os parametros default que configurei??”&lt;/p&gt;

&lt;p&gt;Vou te falar um bug que eu causei em produção por não ter conhecimento 100% de como meu código &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Kotlin&lt;/code&gt; ficava para o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Swift&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Para quem não manja de swift, quando você faz qualquer código que pode gerar uma exception você é obrigado a declarar isso com uma palavra chave no código: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;throws&lt;/code&gt;.
Se sua função tem essa palavra chave, quem chamar ela também é obrigado a tratar senão o projeto não compila.&lt;/p&gt;

&lt;div class=&quot;language-swift highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;canThrowErrors&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;throws&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;cannotThrowErrors&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;String&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Tem cenários onde você sabe que não vai gerar uma exception, como por exemplo carregar uma imagem local… Nesse caso voce ainda precisa manualmente desabilitar a propagação do erro.&lt;/p&gt;

&lt;div class=&quot;language-swift highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;photo&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;try!&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;loadImage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;atPath&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;./Resources/John Appleseed.jpg&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href=&quot;https://docs.swift.org/swift-book/documentation/the-swift-programming-language/errorhandling/&quot;&gt;link para o restante da documentação da apple sobre isso&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Qualquer exception lançada onde não está explícito que pode gerar uma exception (ou seja, não está marcada por &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;throws&lt;/code&gt;) faz com que o app feche imediatamente.
Mesmo quando ela estiver dentro de um &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;do-catch&lt;/code&gt; (vulgo &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;try-catch&lt;/code&gt;)!!! Esse é o comportamento padrão.&lt;/p&gt;

&lt;p&gt;Eu sabia que existia uma annotation chamada &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@Throws&lt;/code&gt;, mas meu pensamento era: “poxa, se eu chamo meu código que vem do &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Kotlin&lt;/code&gt; dentro de um try catch no &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Swift&lt;/code&gt;, ele ja vai ser capturado e tratado - não tem necessidade de colocar essa annotation no &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Kotlin&lt;/code&gt;”.&lt;/p&gt;

&lt;p&gt;Era uma exception esperada, ela de fato poderia acontecer eventualmente e ta tudo bem, inclusive foi pensando nisso que eu coloquei o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;try-catch&lt;/code&gt;. No final das contas minha função gerava essa exception em um cenário específico, e justamente por lançar uma exception que o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Swift&lt;/code&gt; entendeu como inesperada, o aplicativo encerrava pois pra ele foi um erro fatal.&lt;/p&gt;

&lt;p&gt;Você pode argumentar que eu só pensava assim pois tenho mais experiência em linguagens que o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;try-catch&lt;/code&gt; pode capturar todos os erros, não pela falta de conhecimento da interoperabilidade em si. E olha, você provavelmente está certo.&lt;/p&gt;

&lt;p&gt;Mas num olhar pragmático, KMP para devs mobile que já trabalhavam na área cai EXATAMENTE nesse mesmo cenário: temos uma bagagem/conhecimentos de outras linguagens que acabamos trazendo junto, e isso de um lado é ótimo, mas se não tivermos cuidado isso pode nos sabotar (vide evidência do bug que eu causei).&lt;/p&gt;

&lt;p&gt;A realidade é que:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;as plataformas/linguagens que se beneficiam com nosso código KMP tem demandas específicas, que ao subestimadas eventualmente vão trazer dores de cabeça para devs e consequentemente para os usuários finais.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Eu poderia simplesmente sair estudando &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Swift&lt;/code&gt; e todas suas particularidades, isso certamente iria fazer diferença para esse erro que comentei mais acima do post.
Porém esse caminho apesar de funcionar acaba sendo bem ineficiente.&lt;/p&gt;

&lt;p&gt;Se meu objetivo é melhorar o conhecimento e habilitade em desenvolver códigos multiplataforma, estudar uma linguagem inteira seria o equivalente a atirar para todos os lados, eu vou acertar o alvo, mas gastarei toda minha munição no processo.&lt;/p&gt;

&lt;p&gt;Seria excelente se tivesse uma documentação ou algo que me alertasse sobre essa particularidade do &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Swift&lt;/code&gt; e ainda me da uma solução? 
É ai que entra a documentação de interoperabilidade com &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Swift/ObjC&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/kotlin-hands-on/kotlin-swift-interopedia/blob/main/docs/overview/Exceptions.md&quot;&gt;Olha aqui ela dizendo exatamente sobre o problema que eu tive e como resolver ele&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se você tem interesse em evoluir as habilidades em KMP, fica como minha sugestão:
Estude a interoperabilidade entre as plataformas. Com esse conhecimento você vai saber o que deve evitar no seu código multiplataforma para não causar bugs em produção igual eu fiz.&lt;/p&gt;

</description>
        <pubDate>Sun, 15 Mar 2026 00:00:00 +0000</pubDate>
        <link>https://blog.victorlpgazolli.dev/kotlin-multiplatform-interoperability-with-swift-objc/</link>
        <guid isPermaLink="true">https://blog.victorlpgazolli.dev/kotlin-multiplatform-interoperability-with-swift-objc/</guid>
        
        
        <category>mobile</category>
        
      </item>
    
      <item>
        <title>Usando frida para fazer debug em apps mobile</title>
        <description>&lt;p&gt;&lt;img src=&quot;../_assets/xkcd_meme.png&quot; alt=&quot;xkcd&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;introdução&quot;&gt;Introdução&lt;/h2&gt;

&lt;p&gt;No desenvolvimento mobile somos quase que obrigados a usar alguma ferramenta de debug, só rodar o app e ver o comportamento dele muitas vezes não é o suficiente para entender que uma mudança deu bom ou não, ou até mesmo pra entender como que aquele bug sinistro está acontecendo.&lt;/p&gt;

&lt;p&gt;Existem várias ferramentas bem estabelecidas no mundo mobile, acho que todos conhecem &lt;a href=&quot;https://developer.android.com/studio&quot;&gt;android studio&lt;/a&gt; e &lt;a href=&quot;https://developer.apple.com/xcode/&quot;&gt;xcode&lt;/a&gt;. Quem desenvolveu apps usando react native talvez já ouviu falar de &lt;a href=&quot;https://github.com/facebook/flipper&quot;&gt;flipper&lt;/a&gt; ou &lt;a href=&quot;https://github.com/infinitered/reactotron&quot;&gt;reactotron&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Nesse post vamos ver uma ferramenta que talvez você nunca tenha ouvido falar, e que podemos usar para abordar o debug de problemas em aplicativos móveis de uma forma completamente diferente do tradicional.&lt;/p&gt;

&lt;p&gt;Além de falar sobre ela, vou mostrar um exemplo simples de como usei ela para resolver um problema que tive recentemente.&lt;/p&gt;

&lt;p&gt;Mas já adianto que acho improvável ela substituir outras ferramentas… A ideia aqui está longe disso, é muito mais sobre ter mais uma ferramenta no seu cinto de utilidades. Cada uma das ferramentas tem suas especialidades e seus casos de uso, e como engenheiro de software precisamos reconhecer quais ferramentas funcionam melhor para cada objetivo.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;../_assets/debug_with_breakpoint.png&quot; alt=&quot;debug with breakpoint&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2 id=&quot;contexto-sobre-ferramentas-usadas-em-appsec&quot;&gt;Contexto sobre ferramentas usadas em AppSec&lt;/h2&gt;

&lt;p&gt;No meu tempo livre as vezes eu me pego estudando sobre segurança da informação focado no mobile, pesquisando na internet mas também fazendo meus próprios testes e explorações, e isso contribuiu para ter novas ideias e perspectivas diferentes sobre aplicações android e ios.&lt;/p&gt;

&lt;p&gt;A área de segurança da informação tem várias ‘sub áreas’ (AppSec acho que pode se dizer como uma sub área, certo?), mas acho que todos que trabalham com isso devem conhecer a existência de uma ONG que tem como objetivo melhorar a segurança das aplicações através de projetos open source, a famosa &lt;a href=&quot;https://owasp.org/&quot;&gt;OWASP&lt;/a&gt; (Open Worldwide Application Security Project)&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Um parenteses aqui, devo ressaltar que a ideia dessa ONG é muito legal e talvez até meio comica se puxarmos essa ideia para desenvolvimento de software: imagine por exemplo uma iniciativa dessa só que com o objetivo de acabar com todos os bugs dos softwares? ou outra pra acabar com as breaking changes ao atualizar?? apesar de meio bizarro isso seria simplesmente maravilhoso kkkkk, cade a ong pra acabar com vendor-lock? fica ai a reflexão pra você.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;../_assets/imagination.webp&quot; alt=&quot;imagination meme&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;Dentro da iniciativa da &lt;a href=&quot;https://owasp.org/&quot;&gt;OWASP&lt;/a&gt; tem um sub-projeto chamado &lt;a href=&quot;https://mas.owasp.org/&quot;&gt;OWASP Mobile Application Security&lt;/a&gt; - e por se tratar de mobile vamos olhar com mais atenção.&lt;/p&gt;

&lt;p&gt;O OWASP de Mobile tem uma &lt;a href=&quot;https://mas.owasp.org/MASTG/tools/#&quot;&gt;lista com várias ferramentas open source&lt;/a&gt; para facilitar o trabalho para quem quer explorar aplicações mobile.&lt;/p&gt;

&lt;p&gt;O que eu tenho percebido é que dependendo do caso elas também podem ajudar os desenvolvedores. Vou abordar em especial a ferramenta &lt;a href=&quot;https://frida.re/&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Frida&lt;/code&gt;&lt;/a&gt;, mas essas outras que listei aqui também são interessantes e valem a pena conhecer:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href=&quot;https://mas.owasp.org/MASTG/tools/android/MASTG-TOOL-0001/#using-frida-on-android&quot;&gt;MASTG-TOOL-0001 - Frida for Android&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://mas.owasp.org/MASTG/tools/ios/MASTG-TOOL-0039/&quot;&gt;MASTG-TOOL-0039 - Frida for iOS&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://mas.owasp.org/MASTG/tools/android/MASTG-TOOL-0029/&quot;&gt;MASTG-TOOL-0029 - objection for Android&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://mas.owasp.org/MASTG/tools/ios/MASTG-TOOL-0074/&quot;&gt;MASTG-TOOL-0074 - objection for iOS&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://mas.owasp.org/MASTG/tools/network/MASTG-TOOL-0077/&quot;&gt;MASTG-TOOL-0077 - Burp Suite&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;capacidades-vantagens-e-desvantagens&quot;&gt;Capacidades, vantagens e desvantagens&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;Okok eu entendi que essas ferramentas podem ser úteis, mas pra que exatamente?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Para definir &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Frida&lt;/code&gt; em uma frase eu vou usar a que tem no site deles: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Dynamic instrumentation toolkit for developers, reverse-engineers, and security researchers.&lt;/code&gt;, dai falando mais tecnicamente: frida por baixo dos panos usa um &lt;a href=&quot;https://github.com/frida/frida-gum&quot;&gt;módulo escrito em C&lt;/a&gt; que permite você injetar códigos JS durante período de execução de tal forma que é possível interagir com APIs que esse módulo provem.&lt;/p&gt;

&lt;p&gt;Vou explicar melhor como isso pode ser aplicável no dia a dia.&lt;/p&gt;

&lt;p&gt;Você talvez já deve ter pego aquele bug cabuloso onde o uso de debug foi útil e talvez até necessário, aquele cenário de concorrência entre duas funções ou senão um erro que só ocorre quando o app está em um estado muito específico.&lt;/p&gt;

&lt;p&gt;Já deve estar cansado de saber que debug em ferramentas como android studio e xcode da pra colocar breakpoints para inspecionar e alterar variáveis, mas algo muito bacana e que não vejo muitas pessoas comentando é sobre o &lt;a href=&quot;https://developer.android.com/studio/debug#watchpoints&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;watchpoints (android)&lt;/code&gt;&lt;/a&gt; onde você consegue registrar um ‘hook’ para pausar a execução do app quando uma variável específica for alterada, ou no iOS o &lt;a href=&quot;https://www.objc.io/issues/19-debugging/lldb-debugging/&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;thread return&lt;/code&gt; (lldb no iOS)&lt;/a&gt; que permite você alterar o valor de retorno de uma função nativa.&lt;/p&gt;

&lt;p&gt;A &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Frida&lt;/code&gt; tem as mesmas capacidades de debug que falei acima (leitura, escrita e observar uma variável), mas aborda isso de uma maneira completamente diferente, e eu acredito que é ai que podemos tirar proveito dela.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;../_assets/debug_matrix_morpheus.png&quot; alt=&quot;debug matrix morpheus&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2 id=&quot;um-exemplo-simples-de-debug-que-fiz-usando-frida&quot;&gt;Um exemplo simples de debug que fiz usando Frida&lt;/h2&gt;

&lt;p&gt;Nessa semana encontrei um bug muito esquisito que acontecia apenas em dispositivos iOS em um cenário desconhecido, a única evidência ou log que eu tive sobre isso é o código do erro e uma mensagem muito superficial: &lt;a href=&quot;https://www.osstatus.com/search/results?platform=all&amp;amp;framework=Security&amp;amp;search=25291&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-25291 (errSecNotAvailable)&lt;/code&gt;&lt;/a&gt; - que se você &lt;a href=&quot;https://developer.apple.com/documentation/security/errsecnotavailable&quot;&gt;ler a doc&lt;/a&gt; basicamente diz &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;No trust results are available.&lt;/code&gt;, no log de erro a seguinte mensagem aparece: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;No keychain is available.&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Bom, depois de muito investigar e achar diversos links de pessoas que passaram pelo mesmo problema e não acharam a causa raiz, ficou muito difícil para reproduzir o erro e corrigir o que causa ele de fato, mas para não sair de mãos vazias eu decidi seguir pela abordagem de assumir que ele vai ocorrer e tratar o erro de forma elegante.&lt;/p&gt;

&lt;p&gt;Dai veio um pensamento: Ok mas quando eu fizer essa possível tratativa do erro, como que vou comprovar que minha solução de fato trata o erro se eu nem consegui reproduzir ele? É basicamente uma solução às cegas, um tiro no escuro. Até podemos lançar um &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;throw&lt;/code&gt; no meio do código pra fingir que o erro aconteceu, mas com certeza não é a mesma coisa que a API do módulo de Security te retornar esse erro de fato.&lt;/p&gt;

&lt;p&gt;Eu poderia usar o modo debug do xcode e tentar colocar um breakpoint e usar o &lt;a href=&quot;https://www.objc.io/issues/19-debugging/lldb-debugging/&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;thread return&lt;/code&gt;&lt;/a&gt; para trocar o valor, mas iria gastar um bom tempo para entender quais comandos usar no lldb para modificar o retorno do método que eu quero… dai veio a ideia de usar o &lt;a href=&quot;https://frida.re/&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Frida&lt;/code&gt;&lt;/a&gt; - lendo as docs eu vi que você pode usar &lt;a href=&quot;https://frida.re/docs/javascript-api/&quot;&gt;APIs em JS&lt;/a&gt; para poder modificar os retornos, o que pareceu bem promissor e relativamente simples de fazer, e como no passado eu já tinha configurado e instalado Frida no meu macbook, decidi tentar.&lt;/p&gt;

&lt;p&gt;No final eu cheguei nesse código para forçar esse erro a acontecer, escrevi esse script que basicamente faz o hook na função nativa que consulta a keychain e força o retorno do erro que quero.&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// keychain_hook_specific_error.js&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;secItemCopyMatching&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Module&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;findExportByName&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;Security&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;SecItemCopyMatching&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;if &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;secItemCopyMatching&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;Interceptor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;attach&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;secItemCopyMatching&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;onEnter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;SecItemCopyMatching called&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;onLeave&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;retval&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;SecItemCopyMatching returning -25291&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;nx&quot;&gt;retval&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;25291&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;SecItemCopyMatching not found&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;blockquote&gt;
  &lt;p&gt;Lembrando que para usar o frida no iOS você precisa ter o dispositivo jailbroken ou escolher &lt;a href=&quot;https://frida.re/docs/modes/&quot;&gt;outro método de operação&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Com esse script, toda vez que a função &lt;a href=&quot;https://developer.apple.com/documentation/security/secitemcopymatching(_:_:)&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SecItemCopyMatching&lt;/code&gt;&lt;/a&gt; for chamada, o retorno dela será alterado para o código de erro &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-25291&lt;/code&gt; para simular o erro que quero testar. Dai depois disso bastou executar o seguinte comando:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;ID_DO_SEU_DEVICE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;# serve tanto para simulador quanto device fisico.&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# -F pra pegar o app que estiver rodando no momento, portanto abra o app antes de rodar esse comando&lt;/span&gt;
frida &lt;span class=&quot;nt&quot;&gt;-D&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$ID_DO_SEU_DEVICE&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-F&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-l&lt;/span&gt; ./keychain_hook_specific_error.js
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Agora que que esse script está rodando, toda vez que qualquer parte do meu app chamar essa função do módulo de Security, aquele erro vai ser retornado conforme eu configurei, dessa forma eu consigo comprovar que meu código está funcionando pois o módulo literalmente retornou esse erro, só precisei dar um empurrãozinho.&lt;/p&gt;

&lt;p&gt;Esse foi um exemplo simples, mas já da pra ter uma ideia do poder do frida para fazer debug em runtime, e o melhor de tudo é que você não precisa modificar o código fonte do app para isso, muito menos saber onde que esse código está, você pode fazer o hook em qualquer função nativa ou gerenciada que quiser.&lt;/p&gt;

&lt;p&gt;Além disso vale ressaltar que eu usei apenas 2 módulos do projeto (&lt;a href=&quot;https://frida.re/docs/javascript-api/#interceptor&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Interceptor&lt;/code&gt;&lt;/a&gt; e &lt;a href=&quot;https://frida.re/docs/javascript-api/#module&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Module&lt;/code&gt;&lt;/a&gt;) mas existem outras que podem ser usados.&lt;/p&gt;

&lt;p&gt;Tiveram pelo menos mais outras 2 vezes onde eu usei Frida e ferramentas que usam Frida por baixo dos panos (como o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;objection&lt;/code&gt;) para resolver problemas como esse, eu gostei que consegui chegar em uma solução bacana mais rápido do que eu esperava, e ainda por cima com evidências sólidas que minha solução funcionava - o que é muito bom, eu poderia citar elas aqui mas o post vai ficar longo demais, com o exemplo que eu dei já deu para entender por cima como uma ferramenta dessa pode ajudar no fluxo de debug.&lt;/p&gt;

&lt;h2 id=&quot;conclusão&quot;&gt;Conclusão&lt;/h2&gt;

&lt;p&gt;Nesse post passamos um pouco sobre ferramentas de que são usadas na área de segurança da informação, dei alguns exemplos e aprofundamos um pouco mais na ferramenta &lt;a href=&quot;https://frida.re/&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Frida&lt;/code&gt;&lt;/a&gt; dando um exemplo bem simples.&lt;/p&gt;

&lt;p&gt;A principal mensagem que quero que leve desse post é não ficar preso as ferramentas tradicionais por estar acostumado a usá-la.&lt;/p&gt;

&lt;p&gt;Explore alternativas, até aquelas que são de outras áreas se realmente tiver interesse. Saber identificar as ““melhores”” ferramentas para cada caso pode te pagar dividendos, uma analogia interessante e meio exagerada para se pensar é: você consegue furar uma parede usando uma parafusadera? Não manjo muito de obras mas acredito que dependendo da potência dela e o material da parede até deve conseguir sim, mas sem dúvidas uma ferramenta própria para isso seria bem mais fácil.&lt;/p&gt;
</description>
        <pubDate>Thu, 20 Nov 2025 00:00:00 +0000</pubDate>
        <link>https://blog.victorlpgazolli.dev/using-frida-when-developing-mobile-apps/</link>
        <guid isPermaLink="true">https://blog.victorlpgazolli.dev/using-frida-when-developing-mobile-apps/</guid>
        
        
        <category>mobile</category>
        
      </item>
    
      <item>
        <title>Renderização Declarativa - React Reconciler</title>
        <description>&lt;p&gt;&lt;img src=&quot;../_assets/here_to_help.png&quot; alt=&quot;xkcd 1831: Here to Help&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;introdução&quot;&gt;Introdução&lt;/h2&gt;

&lt;p&gt;Eu fiz esse post aqui como forma de eu aprofundar no tema de renderização declarativa, minha ideia é abordar alguams bibliotecas que funcionam dessa forma e entender com mais profundidade as diferenças de abordagens entre cada ferramenta.&lt;/p&gt;

&lt;p&gt;Eu quero cobrir tanto o React Reconciler quanto o Jetpack Compose Runtime, e talvez outras ferramentas que eu for encontrando no caminho. Por hora vamos começar com o React Reconciler.&lt;/p&gt;

&lt;p&gt;Disclaimer: Nesse artigo vou procurar colocar referencias das informações que eu estou compartilhando, mas é importante ressaltar que essas informações podem mudar com o tempo ou até mesmo eu posso cometer algum erro, portanto minha recomendação é ler este artigo com o ‘livro de regras embaixo do braço’ e sempre verificar a documentação oficial das ferramentas.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;react&quot;&gt;React&lt;/h2&gt;

&lt;p&gt;É uma biblioteca bem conhecida na web, e eu particularmente já usei bastante em projetos usando react-native. Poderíamos falar especificamente do react native, mas como a ideia é falar sobre a renderização declarativa, vou abordar apenas o react.&lt;/p&gt;

&lt;p&gt;Eu imagino que você já deve ter ouvido falar algo sobre ou talvez até desenvolvido alguma aplicação que utilize react, se não teve contato com a ferramenta não tem problema, vamos aprofundando aos poucos. Para iniciar um projeto react é bem simples, basta criar um elemento “root” e chamar uma função passando um componente para ser renderizado:&lt;/p&gt;

&lt;div class=&quot;language-typescript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;createRoot&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;react-dom/client&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;//react-dom@19&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;App&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;./App&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; 

&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;domNode&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;getElementById&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;root&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;root&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;createRoot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;domNode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;root&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;App&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Vamos explorar um pouco como o react-dom funciona por baixo dos panos, e como que só esse trecho de código ja permite que voce renderize e atualize a interface do usuário de forma declarativa.&lt;/p&gt;

&lt;p&gt;Procurando no código fonte do react-dom, podemos &lt;a href=&quot;https://github.com/facebook/react/blob/v19.0.0/packages/react-dom/src/client/ReactDOMRoot.js#L161&quot;&gt;encontrar a função &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;createRoot&lt;/code&gt; aqui&lt;/a&gt;. esse é um código exemplo de como ele funciona:&lt;/p&gt;

&lt;div class=&quot;language-typescript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;RootType&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;element&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;ReactElement&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;createRoot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;container&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Element&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Document&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;DocumentFragment&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;options&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;CreateRootOptions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;RootType&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;cm&quot;&gt;/*
        usa-se o options para fazer uma serie de configurações que nesse momento não são importantes
    */&lt;/span&gt;
        
    &lt;span class=&quot;c1&quot;&gt;// react-reconciler/src/ReactFiberReconciler&lt;/span&gt;
     &lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;root&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;createContainer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; 
        &lt;span class=&quot;nx&quot;&gt;container&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;cm&quot;&gt;/* ...demais configurações... */&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ReactDOMRoot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;root&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Perceba que o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;createRoot&lt;/code&gt; faz algumas configurações que no momento não são relevantes, importante é que ele chama a função &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;createContainer&lt;/code&gt;, que vem de uma biblioteca chamada &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;react-reconciler&lt;/code&gt;. Ou seja, a lib react-dom sozinha não cuida da renderização dos elementos, ela delega essa responsabilidade para a biblioteca &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;react-reconciler&lt;/code&gt;, o que faz sentido pois ter essa logica abstraida em uma lib separada de &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;react-dom&lt;/code&gt; permite que o reconciliador possa ser importado e utilizado de forma independente.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;../_assets/meme-reconciliation-01.png&quot; alt=&quot;reconciler &amp;amp; renderer&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;reconciler--renderer&quot;&gt;Reconciler &amp;amp; Renderer&lt;/h3&gt;

&lt;p&gt;O react reconciler é responsavel em fazer a gestão das mudanças de estado e props dos componentes, basicamente ele é o motor que faz toda a lógica de comparação entre uma versão D e D+1 da árvore de componentes, e decide quais componentes precisam ser atualizados, removidos ou adicionados.&lt;/p&gt;

&lt;p&gt;Além dessa gestão de mudanças sendo feita, existe outro componente que cuida de como essas mudanças são aplicadas na interface do usuário, e é ai que entra o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;renderer&lt;/code&gt;, ele é a camada que faz a ponte entre o reconciler e a plataforma onde a aplicação está rodando, seja ela web, mobile ou desktop.&lt;/p&gt;

&lt;p&gt;Por conta dessa arquitetura desacoplada, que permite que sejam criados vários renderers, APIs que se conectam com o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;react-reconciler&lt;/code&gt; e fazem a implementação na sua plataforma especifica, uma imagem bacana sobre isso:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;../_assets/reconciler_renderer.png&quot; alt=&quot;reconciler &amp;amp; renderer&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;algoritmo&quot;&gt;Algoritmo&lt;/h3&gt;

&lt;p&gt;Agora sabemos que ele é quem faz todo o trabalho pesado de comparar e decidir o que precisa ser atualizado, varrendo toda a arvore de componentes e fazendo essas comparações.&lt;/p&gt;

&lt;p&gt;Em uma perpectiva de performance, quanto menos nós sendo atualizados desnecessáriamente, melhor. Essa comparação e identificação é a chave para uma renderização eficiente.&lt;/p&gt;

&lt;p&gt;Links para entender mais sobre o algoritmo de reconciliação:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://angular.love/inside-fiber-in-depth-overview-of-the-new-reconciliation-algorithm-in-react&quot;&gt;Inside Fiber: in-depth overview of the new reconciliation algorithm in React&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://medium.com/react-in-depth/the-how-and-why-on-reacts-usage-of-linked-list-in-fiber-67f1014d0eb7&quot;&gt;The how and why on React’s usage of linked list in Fiber to walk the component’s tree&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/facebook/react/tree/v19.0.0/packages/react-reconciler&quot;&gt;source code: react-reconciler&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;../_assets/fiber.png&quot; alt=&quot;reconciler &amp;amp; renderer&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Essas informações salvas dentro desse nó são importantes para que o Reconciler saiba qual nó ele precisa atualizar, e qual ele pode simplesmente ignorar pois não houve mudanças.&lt;/p&gt;

&lt;h4 id=&quot;stack-reconciler-e-fiber-reconciler&quot;&gt;Stack Reconciler e Fiber Reconciler&lt;/h4&gt;

&lt;p&gt;Na versão 15 e anteriores, o react utilizava um algoritmo de reconciliação chamado de “Stack Reconciler”, a desvantagem dele era a performance: ele percorria toda a arvore de componentes de forma sincrona, componente a componente fazendo aplicando as mudanças, isso é passivo a problemas de performance como drop de frames em animações.&lt;/p&gt;

&lt;p&gt;Por mais que isso fosse prejudicial, era possivel contornar esse problema de performance fazendo esse trabalho no tempo livre no final dos frames, fazendo uso do &lt;a href=&quot;https://developer.chrome.com/blog/using-requestidlecallback&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;requestIdleCallback&lt;/code&gt;&lt;/a&gt;. Essa saída ajuda mas não é bala de prata porque nós ainda teriamos que percorrer a arvore toda de qualquer forma.&lt;/p&gt;

&lt;p&gt;Para resolver de forma definitiva esse problema de performance, foi necessário permitir que o algoritmo pudesse pausar e continuar a execução de um update, além disso esse novo algoritmo introduziu formas de aplicar atualizações com base na prioridade (&lt;a href=&quot;https://www.geeksforgeeks.org/reactjs/how-does-concurrent-mode-help-in-improving-the-user-experience/&quot;&gt;link para ler mais sobre&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;../_assets/meme-fiber-reconciliation.gif&quot; alt=&quot;meme the future is now old man&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Esse esquema de pausar e continuar os trabalhos, permite que o react quebre todo o trabalho de atualização em pequenos pacotes, essa técnica é chamada de “time-slicing”:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.geeksforgeeks.org/reactjs/explain-the-concept-of-time-slicing-in-concurrent-mode/&quot;&gt;Explain the concept of time-slicing in Concurrent Mode&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A versão 16 do react foi lançada em 2017, então ja faz um tempinho que teve essa mudança para o novo algoritmo, portanto talvez você ja deve ter percebido ou ouvido falar que alguns dos updates de estados no react não ocorrem de forma sincrona, em resumo é justamente isso que o novo algoritmo permite.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://legacy.reactjs.org/blog/2017/09/26/react-v16.0.html&quot;&gt;Lançamento do React v16.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;árvore-de-componentes-react&quot;&gt;Árvore de Componentes React&lt;/h4&gt;

&lt;p&gt;O ‘Fiber Reconciler’ deu nome de cada ‘trabalho’ a ser feito nos componentes como um nodo &lt;a href=&quot;https://github.com/facebook/react/blob/6e4f7c788603dac7fccd227a4852c110b072fe16/packages/react-reconciler/src/ReactFiber.js#L78&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Fiber&lt;/code&gt;&lt;/a&gt;, ele é a representação de um trabalho pendente ou um trabalho ja feito.&lt;/p&gt;

&lt;p&gt;Esse trabalho a ser feito podem set vários tipos de tarefas, como por exemplo: Executar um ‘Efeito’ como useEffect (&lt;a href=&quot;https://github.com/facebook/react/blob/main/packages/react-reconciler/src/ReactFiberHooks.js#L2616&quot;&gt;link&lt;/a&gt;), ou atualizar o estado de um componente (&lt;a href=&quot;https://github.com/facebook/react/blob/main/packages/react-reconciler/src/ReactFiberHooks.js#L3708&quot;&gt;link&lt;/a&gt;) e assim por diante.&lt;/p&gt;

&lt;p&gt;Mas somente saber o que precisa ser feito não da para construir uma arvore de componentes, precisamos de relações entre cada nodo, portanto dentro de um Fiber temos informações extras que nos ajudam a montar uma arvore, como por exemplo o estado atual do componente, as props, e referencias para os filhos, irmãos e pai, e lista de atualizações pendentes.&lt;/p&gt;

&lt;p&gt;Tendo uma estrutura de árvore fica bem mais fácil navegar entre os nodos, saber qual deles tem alguma pendência, as dependencias dos nodos entre si, etc. E para poder fazer tudo isso acontecer foi quebrado em fases.&lt;/p&gt;

&lt;p&gt;Na primeira fase do algoritmo (normalmente chamada de “Render phase”), o reconciler precisa entender primeiro qual nó precisa ser adicionado, atualizado, deletado, e também se teve algum efeito colateral a ser computado.&lt;/p&gt;

&lt;p&gt;Esses componentes “alterados” são justamente o que vão ser usados na segunda fase!&lt;/p&gt;

&lt;p&gt;Para ficar tangível esse comportamento, &lt;a href=&quot;https://vimeo.com/302222454&quot;&gt;sugiro ver esse vídeo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Na segunda fase (normalmente chamada de “Commit phase”), o reconciler teve tempo de calcular todas as mudanças necessárias, portanto agora ele precisa fazer (nessa ordem):&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/facebook/react/blob/95a313ec0b957f71798a69d8e83408f40e76765b/packages/react-reconciler/src/ReactFiberScheduler.js#L376&quot;&gt;executar alterações na interface do usuário&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/facebook/react/blob/95a313ec0b957f71798a69d8e83408f40e76765b/packages/react-reconciler/src/ReactFiberScheduler.js#L465&quot;&gt;executar os efeitos colaterais&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Depois que todas as mudanças foram aplicadas, o reconciler limpa a fila de tarefas e espera o próximo update :)
E assim finalizamos o ciclo de vida de um update no react.&lt;/p&gt;

&lt;h3 id=&quot;referências&quot;&gt;Referências&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://legacy.reactjs.org/docs/reconciliation.html&quot;&gt;React Docs - Reconciliation&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://legacy.reactjs.org/docs/faq-internals.html&quot;&gt;React Docs - React Fiber Architecture&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
        <pubDate>Thu, 16 Jan 2025 00:00:00 +0000</pubDate>
        <link>https://blog.victorlpgazolli.dev/react-reconciler-vs-compose-runtime/</link>
        <guid isPermaLink="true">https://blog.victorlpgazolli.dev/react-reconciler-vs-compose-runtime/</guid>
        
        
        <category>mobile,</category>
        
        <category>javascript</category>
        
      </item>
    
  </channel>
</rss>
