<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <author>
    <name>어썸블로그</name>
  </author>
  <id>국내의 좋은 블로그 글들을 매일 배달해줍니다.</id>
  <title>개발자 어썸블로그</title>
  <updated>2026-11-01T21:19:12+09:00</updated>
  <entry>
    <author>
      <name>김재호</name>
    </author>
    <content type="html">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"&gt;
&lt;html&gt;&lt;body&gt;
&lt;p&gt;며칠 전 코엑스에서 열린 &lt;a href="https://startup.asan-nanum.org/"&gt;2026 정주영 창업경진대회 데모데이&lt;/a&gt;에 다녀왔습니다.&lt;br&gt;
무료 행사인데다 장병규 의장님이 키노트를 한다길래, 바람이나 쐴 겸 절친과 다녀왔답니다.&lt;br&gt;
오랜만에 젊은 창업가들의 에너지도 느끼고 좋은 이야기도 듣고 왔습니다.&lt;/p&gt;

&lt;p&gt;키노트에서 가장 기억에 남은 것은 컴포트 존에 대한 이야기였습니다.&lt;br&gt;
장병규 의장님 자신도 계속 컴포트 존을 벗어나려고 애쓰고 있고, 그렇게 할 때 또 다른 가능성이 열린다는 말.&lt;/p&gt;

&lt;p&gt;사실 처음 듣는 이야기는 아니었습니다.&lt;br&gt;
오래전 카카오의 브라이언이 NHN을 떠나면서 했던 말이 떠올랐습니다.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;배는 항구에 있을 때 가장 안전하지만, 그것이 배의 존재 이유는 아니다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;저는 컴포트 존에 관한 이야기를 그때 처음 들었던 것 같습니다.&lt;br&gt;
이미 잘하고 있고 편하게 머무를 수 있는 곳을 떠나서 다시 도전한다는 것.&lt;br&gt;
그 말이 저에게는 꽤 큰 영향을 줬습니다.&lt;/p&gt;

&lt;p&gt;회사에서 일이 익숙해지고 편해졌다 싶으면 또 다른 도전을 하곤 했습니다.&lt;br&gt;
지금 1인 개발자로 10년 가까이 돈을 벌고 살고 있는 건 그때 했던 도전들이 거름이 된 것이 분명합니다.&lt;br&gt;
편해진다는 생각이 들때마다 불편함을 기꺼기 찾아갈 용기와 에너지가 있었던 것 같습니다.&lt;/p&gt;

&lt;p&gt;시간이 오래 흘러 다시 이 이야기를 들으면서 지금의 제 모습을 돌아보지 않을 수 없었습니다.&lt;br&gt;
지난 몇 년 동안 너무 편하게 살았습니다.&lt;br&gt;
컴포트 존 안에 머물러 있으면서, 밖으로 나가려는 노력은 거의 하지 않았던 것 같습니다.&lt;br&gt;
이보다 더 좋은 인생이 어디 있냐는 오만한 생각을 하면서요.&lt;/p&gt;

&lt;p&gt;&lt;img src="https://jeho.page/assets/img/asan.jpg" alt="아산나눔재단 창업경진대회 장병규 의장 키노트"&gt;&lt;/p&gt;

&lt;p&gt;어린 창업가들의 발표를 보면서 또 한 번 놀랐습니다.&lt;br&gt;
다들 너무 자연스럽게 영어를 하는 겁니다.&lt;/p&gt;

&lt;p&gt;요즘 젊은 사람들은 영어가 그냥 기본이구나.&lt;br&gt;
처음부터 세계를 무대로 생각하는구나.&lt;/p&gt;

&lt;p&gt;외국인 창업가들이 한국에서 창업하고 발표하는 모습도 인상적이었습니다.&lt;br&gt;
요즘 강남역이든 코엑스 앞이든 어딜 가도 외국인들이 참 많아졌다고 느끼는데…&lt;br&gt;
행사장 안에서도 그랬습니다.&lt;br&gt;
말로만 듣던 글로벌 세상이 갑자기 눈앞에 툭 떨어진 것 같았습니다.&lt;/p&gt;

&lt;p&gt;그중에서도 가장 인상적인 장면은 심사위원들의 질문 시간.&lt;br&gt;
외국인 창업가에게 질문해야 하는데, 저는 당연히 통역을 쓸 줄 알았습니다.&lt;br&gt;
심사위원들은 나이가 좀 있으니까.&lt;/p&gt;

&lt;p&gt;그런데 웬걸.&lt;br&gt;
너무나 유창한 영어로 질문하고 답변을 주고받는 겁니다.&lt;/p&gt;

&lt;p&gt;젊은 사람들만 달라진 줄 알았는데 그것도 아니었네. 허허…&lt;br&gt;
늙은 것은 나뿐이었구나.&lt;br&gt;
어느새 옛날 기준으로 세상을 보고 있는 늙은이가 되어 있는 저를 보았습니다.&lt;/p&gt;

&lt;p&gt;아이들 교육도, 저 자신을 발전시키는 일도 다시 생각하게 됐습니다.&lt;br&gt;
편하게 바람이나 쐬러 갔다가 되려 불편해져서 돌아왔네요. (웃음)&lt;/p&gt;

&lt;div class="section-divider"&gt;&lt;span class="ornament"&gt;✔️&lt;/span&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;함께 읽으면 좋은 글:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://jeho.page/essay/2023/06/05/miss-the-busy-days.html"&gt;가끔씩은 바쁘게 일했던 때가 그립다&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://jeho.page/essay/2024/04/02/again-english.html"&gt;다시 한 번 영어 공부&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://jeho.page/essay/2026/10/05/dont-hold-back.html"&gt;쫄지 말고 과감하게&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/body&gt;&lt;/html&gt;
</content>
    <id>https://jeho.page/essay/2026/10/31/out-of-comfort-zone.html</id>
    <link href="https://jeho.page/essay/2026/10/31/out-of-comfort-zone.html"/>
    <summary type="html">며칠 전 코엑스에서 열린 2026 정주영 창업경진대회 데모데이에 다녀왔습니다. 무료 행사인데다 장병규 의장님이 키노트를 한다길래, 바람이나 쐴 겸 절친과 다녀왔답니다. 오랜만에 젊은 창업가들의 에너지도 느끼고 좋은 이야기도 듣고 왔습니다.</summary>
    <title>늙은 것은 나뿐이었다</title>
    <updated>2026-10-31T10:02:00+09:00</updated>
    <dc:date>2026-10-31T10:02:00+09:00</dc:date>
  </entry>
  <entry>
    <author>
      <name>contact@roboco.io (ROBOCO)</name>
    </author>
    <content type="html">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"&gt;
&lt;html&gt;&lt;body&gt;
&lt;blockquote&gt;
&lt;p&gt;Anthropic은 S-1에서 같은 수준의 모델 성능을 제공하는 데 필요한 추론 연산을 줄이고, 운영 환경에서 연산 자원의 활용 효율도 높여 왔다고 설명한다. – 「Compute Efficiency」 요약&lt;sup id="fnref:1"&gt;&lt;a href="https://roboco.io/posts/how-llm-caching-works/#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure&gt;&lt;img src="https://roboco.io/posts/images/Dohyun.png"&gt;&lt;figcaption&gt;
      &lt;h4&gt;정도현 - 로보코 수석 컨설턴트&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;hr&gt;
&lt;h2 id="tldr"&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;LLM 인프라는 같은 성능의 작업에 필요한 연산을 줄이고, 확보한 자원을 더 잘 활용하는 방향으로 발전하고 있다. Anthropic S-1의 추론 효율 설명은 이 흐름을 보여주는 근거 중 하나다.&lt;/li&gt;
&lt;li&gt;프롬프트 캐시는 동일한 입력 앞부분을 처리하며 만든 KV 캐시를 재사용한다. 긴 문서를 다시 계산하는 일을 줄이되, 새 질문의 처리와 답변 생성은 계속 수행한다.&lt;/li&gt;
&lt;li&gt;대규모 인프라에서는 공통 계산을 메모리 블록으로 공유하고, 캐시 위치와 부하를 고려해 요청을 분산한다. 일부 시스템은 GPU 밖의 메모리와 저장소에도 캐시를 보관한다.&lt;/li&gt;
&lt;li&gt;캐시 효율을 높이려면 누구의 계산을 누구와 공유할지 먼저 정해야 한다. 사용자별 격리는 재사용 범위를 줄일 수 있으며, GPU 밖으로 옮긴 캐시에도 같은 권한 경계를 유지해야 한다.&lt;/li&gt;
&lt;li&gt;캐시의 효과는 재사용 빈도, 메모리 여유, 전송 비용에 따라 달라진다. 재처리하는 입력 토큰이 줄어든 비율을 전체 비용 절감률로 해석해서는 안 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;같은 제품 설명서를 들고 상담원을 찾아간다고 생각해 보자. 첫날에는 설명서를 처음부터 읽어야 한다. 다음 날 다른 질문을 했는데, 상담원이 그 설명서를 또 처음부터 읽는다면 어떨까. 질문에 답하는 시간보다 같은 자료를 반복해서 읽는 시간이 더 길어질 수 있다.&lt;/p&gt;
&lt;/body&gt;&lt;/html&gt;
</content>
    <id>https://roboco.io/posts/how-llm-caching-works/</id>
    <link href="https://roboco.io/posts/how-llm-caching-works/"/>
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;Anthropic은 S-1에서 같은 수준의 모델 성능을 제공하는 데 필요한 추론 연산을 줄이고, 운영 환경에서 연산 자원의 활용 효율도 높여 왔다고 설명한다. – 「Compute Efficiency」 요약&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure&gt;&lt;img src="https://roboco.io/posts/images/Dohyun.png"&gt;&lt;figcaption&gt;
      &lt;h4&gt;정도현 - 로보코 수석 컨설턴트&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;hr&gt;
&lt;h2 id="tldr"&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;LLM 인프라는 같은 성능의 작업에 필요한 연산을 줄이고, 확보한 자원을 더 잘 활용하는 방향으로 발전하고 있다. Anthropic S-1의 추론 효율 설명은 이 흐름을 보여주는 근거 중 하나다.&lt;/li&gt;
&lt;li&gt;프롬프트 캐시는 동일한 입력 앞부분을 처리하며 만든 KV 캐시를 재사용한다. 긴 문서를 다시 계산하는 일을 줄이되, 새 질문의 처리와 답변 생성은 계속 수행한다.&lt;/li&gt;
&lt;li&gt;대규모 인프라에서는 공통 계산을 메모리 블록으로 공유하고, 캐시 위치와 부하를 고려해 요청을 분산한다. 일부 시스템은 GPU 밖의 메모리와 저장소에도 캐시를 보관한다.&lt;/li&gt;
&lt;li&gt;캐시 효율을 높이려면 누구의 계산을 누구와 공유할지 먼저 정해야 한다. 사용자별 격리는 재사용 범위를 줄일 수 있으며, GPU 밖으로 옮긴 캐시에도 같은 권한 경계를 유지해야 한다.&lt;/li&gt;
&lt;li&gt;캐시의 효과는 재사용 빈도, 메모리 여유, 전송 비용에 따라 달라진다. 재처리하는 입력 토큰이 줄어든 비율을 전체 비용 절감률로 해석해서는 안 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;같은 제품 설명서를 들고 상담원을 찾아간다고 생각해 보자. 첫날에는 설명서를 처음부터 읽어야 한다. 다음 날 다른 질문을 했는데, 상담원이 그 설명서를 또 처음부터 읽는다면 어떨까. 질문에 답하는 시간보다 같은 자료를 반복해서 읽는 시간이 더 길어질 수 있다.&lt;/p&gt;</summary>
    <title>LLM 캐시는 어떻게 작동할까: 앤트로픽 S-1 보고서로 읽는 AI 인프라 효율화</title>
    <updated>2026-10-28T10:00:00+09:00</updated>
    <dc:date>2026-10-28T10:00:00+09:00</dc:date>
  </entry>
  <entry>
    <author>
      <name>코딩하는 오징어</name>
    </author>
    <content type="html">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"&gt;
&lt;html&gt;&lt;body&gt;
&lt;p data-ke-size="size16"&gt; 대략 2년 만에 글을 쓰기 위해 키보드를 타이핑해 본다. 그동안 주로 연말에 작성하는 회고록이나 지식을 전달하기 위한 정보성 및 트러블 슈팅 경험을 위해 글을 작성해 왔다. 하지만, LLM(이하 AI로 명칭 하겠다.)의 발전으로 인해 지식 전달을 위한 글은 stack overflow의 감소된 트래픽처럼 사람들이 많이 찾지 않고 있기에 &lt;a href="https://github.com/gksxodnd007/TIL" target="_blank" rel="noopener"&gt;TIL Repository&lt;/a&gt;에 정제되지 않은 상태로 업데이트하거나, 개인 Notion에만 정리를 하게 된 것 같다. 글을 쓰는 것도 운동처럼 관성인 것 같다. 한 번 놓게 되면, 글을 쓰기 위해 다시 시간을 내어 자세를 잡기까지 꽤나 큰 준비가 필요하다. 필자도 이 글을 쓰기 위해 손가락 스트레칭을 2년 정도 했다 ㅋ. &lt;b&gt;요즘 너무 많은 사람들이 AI가 주는 환상으로 인해 잘못된 위기를 느끼거나, 느끼게 하는 것 같아 조금은 바로 잡고 싶은 마음에 이 글을 작성하게 되었다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size="size16"&gt;&lt;b&gt; &lt;/b&gt;이야기에 앞서 LLM의 동작에 대해 간단하게 정리해보고자 한다. Provider에 따라 핵심 알고리즘과 Architecture는 다르겠지만 큰 맥락은 다음과 같다고 생각한다.&lt;/p&gt;
&lt;pre id="code_1793165353658" class="bash" data-ke-language="bash" data-ke-type="codeblock"&gt;&lt;code&gt;1. Tokenize input text
2. Convert tokens into embeddings (add positional information)
3. Process them through Transformer layers with self-attention
4. Predict a probability distribution for the next token
5. Select a token, append it, and repeat until completion
6. Detokenize tokens into output text&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size="size16"&gt;위의 과정을 한 줄 요약하면 다음과 같다. &lt;b&gt;"LLM은 입력 토큰을 벡터로 바꾼 뒤, Transformer가 문맥을 반영해 만든 내부 표현(hidden vector)과 각 후보 토큰의 출력 벡터의 내적을 계산하여 다음 토큰의 확률을 예측한다."&lt;/b&gt; 즉, LLM은 학습 데이터로부터 학습한 파라미터를 바탕으로 현재 문맥에서 다음에 올 가능성이 높은 토큰을 예측한다. &lt;b&gt;기억하자. LLM은 다음 토큰을 예측하는 것이 핵심이다. 이 내용을 토대로 다음의 주제들에 대한 필자의 견해를 풀어가 보려고 한다.&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h4 data-ke-size="size20"&gt;&lt;b&gt;"우린 다 필요 없어"&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size="size16"&gt; LinkedIn이나 Youtube에 올라오는 AI 관련 글, 영상들을 보면 서로가 서로를 필요 없다고 하고 있다. 개발자들은 디자이너와 PM이 필요 없다 하고, 디자이너는 개발자와 PM이 필요 없고, PM은 개발자와 디자이너가 필요 없다고 한다. AI Agent를 통해 다른 영역까지 Leverage 할 수 있게 되어 발생하는 현상이라고 생각한다. (다른 업계는 어떻게 생각할지 모르겠다. 필자는 백엔드 엔지니어이기 때문에 이 글에서는 IT업계에 한정해서 이야기하려고 한다.) 필자는 이런 이야기를 하는 사람들을 보면 그들은 애매한 전문가 포지션에서만 일을 했기 때문에 저런 말들을 한다고 생각한다. AI로 인해 IT업계의 인력이 감축될 수 있다는 것에는 동의한다. 다만, 방향을 잘못짚었다고 생각한다. 우리는 여전히 각 필드의 전문가들이 필요하다. 하지만 코로나 영향으로 많은 영역에서 디지털 전환이 시작됐고, IT 업계로 수많은 인력이 쏠리기 시작했다. 회사는 애매한 전문가들도 필요에 의해 그들이 갖고 있는 역량보다 높은 금액을 지불하고 채용하게 됐다고 생각한다. 개발자를 예로 들면, 요구 사항을 코드로 잘 작성하기만 하면 전문가로 모셔왔다. 이로 인해 수많은 부트캠프들이 생겼고, 비슷한 수준의 개발자들이 양산되기 시작했다. 조금 공격적으로 표현하자면 필자는 이런 사람들을 개발자라고 생각하지 않는다. &lt;b&gt;요구 사항을 컴퓨터가 실행할 수 있는 기능으로 번역해 주는 Code Translator일 뿐이다.&lt;/b&gt; 이 정도의 전문성을 갖고 있는 사람들은 AI가 대체하게 될 것이다. &lt;b&gt;추론의 방향이 명확하기 때문이다. &lt;/b&gt;IT 업계에서 Software Engineer 포지션으로 계속 일하고 싶다면, 코드는 수단일 뿐이라는 것을 이해해야 한다. &lt;b&gt;엔터프라이즈 급의 서비스를 지탱하고 있는 분산 환경의 Backend System을 PM이나 디자이너에게 AI를 쥐어주고 운영하라고 하면 그들이 할 수 있을까? 반대로, 서비스의 10x 성장을 위한 Branding, Marketing, Design, VOC Operation에 대한 전략 수립과 실행을 Engineer에게 AI를 쥐어주고 해내라고 한다면 폭발적인 결과를 낼 수 있을까? &lt;span style="color: #ee2323;"&gt;한두 달 운영하면서 바이럴로 한탕해 먹고 튀는 도파민 용 서비스를 제공하는 게 목적이 아니라면 물음표를 던지고 싶다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size="size16"&gt; 필자는 현재 시기를 지식 산업에서 "진짜" 필요한 사람이 누구인지를 필터링하는 시기라고 생각한다. 우리가 풀어가야 할 문제가 너무나도 많기에 애매한 전문가도 우리는 전문가로 대우해 주었다. 하지만 AI로 인해 애매한 전문가는 이제 필요 없어졌다. 우리는 각 영역의 진짜 전문가만 필요하게 됐다고 생각한다. 아이러니한 상황이다. AI로 인해 모두가 전문가가 될 수 있고, 정보의 빈부격차가 해소될 것이라고 하지만 필자가 생각하는 미래는 정보의 빈부격차가 더 심해질 것이고, 전문가의 수는 더욱 적어질 것이라고 생각한다. &lt;b&gt;엄밀히 말하면, 정보의 빈부격차보다는 지능의 빈부격차라고 생각한다.&lt;/b&gt; 여기서 필자가 이야기하는 전문가는 한 분야를 오랫동안 갈고닦은 사람을 칭하는 것이 아니다. &lt;b&gt;어떠한 지식을 얼마나 능동적으로 빠르고 깊이 있게 학습하고, 현재 상황에 필요한 solution을 AI와 함께 도출해 내는 사람을 전문가라고 말하고 싶다.&lt;/b&gt; &lt;b&gt;기술의 발전으로 정보를 얻을 수 있는 과정은 정말 싸졌지만, 반대로 그 정보를 학습하고, 이해하고 사용하는 비용은 비싸졌다. &lt;span style="color: #ee2323;"&gt;많은 사람들이 바보가 되고 있기 때문이다.&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #000000;"&gt; 그렇기에 필자는 말하고 싶다. 지식산업에서 살아남고 싶다면 더욱 전문가가 되어야 한다고. 애매한 전문가는 이제 필요 없을 것이다. &lt;b&gt;AI는 전문가에게 쥐어주는 증폭기일 뿐이다. 모든 걸 알잘딱깔센으로 처리 해주는 도구가 아니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h4 style="color: #000000; text-align: start;" data-ke-size="size20"&gt;&lt;b&gt;"There is no Silver Bullet"&lt;/b&gt;&lt;/h4&gt;
&lt;p style="color: #333333; text-align: start;" data-ke-size="size16"&gt; 소프트웨어 공학은 AI 시대 이전에도 추상화되는 방향으로 발전했다. 사실 소프트웨어 공학뿐만 아니라 모든 공학은 성숙해질수록 추상화 단계가 올라간다. 자율주행도 같은 맥락이다. 우리는 더 이상 운전하는 법을 몰라도 자동차를 이용하여 목적지까지 갈 수 있게 됐다. 사람은 그저 출발지와 목적지, 경로를 선택하면 된다. 사용자는 운전에 대해 더 이상 학습하지 않아도 되지만, 교통 공학자들은 이런 환경에서 어떻게 하면 더 효율적으로 도로를 설계하는 게 좋을지 고민해야 한다. 소프트웨어도 마찬가지이다. 코드를 구현하는 일들은 이제 추상화되겠지만, 그 코드가 실행되는 전체적인 시스템을 디자인해야 하고, AI가 이해하기 쉽도록 더 좋은 구조로 코드가 설계되어야 한다. 우리는 AI 덕분에 더 본질적인 고민을 할 수 있는 시대가 되었다. 이 고민 또한 AI가 추론해 주겠지만 앞서 이야기한 Code Translator와 다르게 이 과정은 추론의 방향이 명확하지 않다. 여러 추론들의 결과들이 나올 수 있고, 우리는 현재 상황과 미래를 고려하여 선택해야 한다. 선택을 하기 위해서는 기존보다 더 많은 지식을 요구하게 될 수 있다. &lt;b&gt;중요한 것은 이러한 방향은 기존의 발전 방향과 크게 다르지 않다는 것이다.&lt;/b&gt;&lt;/p&gt;
&lt;p style="color: #333333; text-align: start;" data-ke-size="size16"&gt; 우리는 어떤 기술이 나올 때마다 Silver Bullet은 없다는 것을 명심해야 한다. 기존에도 그랬고, LLM도 마찬가지이다. &lt;b&gt;LLM은 절대 소프트웨어 공학의 Silver Bullet이 아니다. Context Window라는 명확한 한계가 존재하고, 이로 인해 할루시네이션이 발생하는 문제가 있다. 모든 결과는 추론이기 때문에 비결정적인 문제를 안고 있다.&lt;/b&gt; 같은 input을 넣어도 같은 output이 나오지 않기 때문에 소프트웨어 공학의 근간이라고 할 수 있는 함수라는 개념을 만족시키지 못한다.&lt;/p&gt;
&lt;h4 data-ke-size="size20"&gt;&lt;b&gt;"AI Slop"&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size="size16"&gt; Youtube나 LinkedIn을 보다 보면 "토스", "쿠팡" 출신의 PO가 퇴사 후 AI Agent 팀을 만들어 토스의 스쿼드 팀을 만들었다는 영상이나 글들이 종종 올라오곤 한다. 그들의 행보를 보고 있노라면 솔직히 말해 안쓰러울 때가 있다. 그들은 대부분 AI를 Leverage 하여 좋은 서비스를 출시해서 승부하려는 사람들이 아닌 AI를 잘 모르는 사람들을 현혹하여 강의를 팔고 있거나, 인플루언서를 꿈꾸는 사람들이다. 필자는 아직까지 그들이 어떤 서비스를 만들고 있고, 어떤 유의미한 결과를 도출하고 있는지 모르겠다. AI를 활용하여 릴스 공장을 만드는 것..? 그 이상 그 이하도 아니라고 생각한다. 좋은 서비스는 AI 딸깍으로 나오는 것이 아니다. 그리고 그들은 서비스를 만드는 것만 이야기한다. &lt;b&gt;하지만 서비스를 만드는 것보다 서비스를 성공적으로 운영하는 것이 &lt;b&gt;서비스의 성공을 좌지우지하는 데 더 큰 요소로 작용한다.&lt;/b&gt; 각 영역의 전문가들이 필요한 때이다.&lt;/b&gt; 물론, AI를 활용하여 서비스를 운영하면 10명이 붙어야 가능한 일을 1~2명이 처리할 수도 있다. 한두 달 운영하고 폐기할 서비스를 몇 십 개 만들어서 생활에 필요한 돈을 벌 목적이 아니라면 AI를 사용하더라도 혼자서 할 수 있는 일은 없다. &lt;b&gt;Vibe Coding을 통해 수많은 App들이 출시되고 있지만, 모바일 시장의 수요는 전혀 증가하지 않았다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class="imageblock alignCenter" data-ke-mobilestyle="widthOrigin" data-origin-width="557" data-origin-height="484"&gt;&lt;span data-url="https://blog.kakaocdn.net/dn/ctmSKf/dJMcaa8wYwA/oaqgr36KJBy30heUwHpEQ0/img.png" data-phocus="https://blog.kakaocdn.net/dn/ctmSKf/dJMcaa8wYwA/oaqgr36KJBy30heUwHpEQ0/img.png"&gt;&lt;img src="https://blog.kakaocdn.net/dn/ctmSKf/dJMcaa8wYwA/oaqgr36KJBy30heUwHpEQ0/img.png" srcset="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctmSKf%2FdJMcaa8wYwA%2Foaqgr36KJBy30heUwHpEQ0%2Fimg.png" onerror="this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';" loading="lazy" width="557" height="484" data-origin-width="557" data-origin-height="484"&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size="size16"&gt;AI로 인해 1인 창업의 시대가 열린 것은 확실하다. 하지만 창업 아이템이 App 서비스이고, AI 군단을 전두지휘하여 성공해 보겠다는 생각이라면 본인 결정에 AI가 주는 환상은 없었는지 검토를 해보자.&lt;/p&gt;
&lt;h4 data-ke-size="size20"&gt;&lt;b&gt;"진짜만 살아남는 시대"&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size="size16"&gt; 블라인드 혹은 LinkedIn을 보고 있다 보면 많은 개발자, 디자이너들이 자신의 직업을 잃을까 걱정하는 글을 많이 볼 수 있다. 그와 반대로 PM, PO 직군은 이상할 정도로 자아가 비대해져 있다. 솔직하게 말하면 그들은 어떠한 분야도 제대로 파고들어 보지 않은 조율자에 불과하다. 미래의 인재는 AI Agent를 전두지휘할 수 있는 Supervisor, Operator라는 분위기 덕분에 조율자 역할을 하고 있는 PM, PO 직군의 사람들이 환상을 갖게 된 게 아닐까 싶다.&lt;/p&gt;
&lt;p data-ke-size="size16"&gt; 앞서 이야기했듯이 AI로 인해 애매한 전문가 포지션으로 일하는 사람들은 모두 위기인 세상이 온 것에 이견은 없다. 하지만 필자는 이야기하고 싶다. 미래의 지식산업은 단언컨대, 진짜 전문가만 살아남을 것이다. 지식의 가치는 낮아지겠지만 지능의 가치는 더욱 희소성을 갖게 될 것이다. &lt;b&gt;문제를 정확하게 정의하고, 여러 Solution들 중 감수할 수 있는 trade off가 뭔지 고민할 수 있고, 선택한 Solution에 대해 정확히 이해하고 있고, 어떤 방법을 통해 검증할 것 인지를 명확하게 정의할 수 있는 전문가는&lt;/b&gt; 앞으로도 필요한 사람일 것이다. 문제는 Engineering의 이슈일 수도, Marketing의 이슈일 수도, 서비스의 방향성의 이슈일 수도 있다. 어떠한 직군이든 각 이슈를 정확하게 진단하여 문제를 해결할 수 있는 전문가들만 지식 산업에서 살아남을 것이다. &lt;/p&gt;
&lt;p data-ke-size="size16"&gt; &lt;/p&gt;
&lt;p data-ke-size="size16"&gt;하지만 꼭 지식산업에서 살아남을 필요는 없다. ROI가 안 나올 수도 있고, 업계에서 살아남는다고 행복한 삶은 아닐 수 있다. 다만, 가짜들이 떠드는 말들로 불안해하지는 말자. 각자의 가치관과 비전으로 정진하면 된다. "빈 수레가 요란하다"라는 말을 명심하자. 지금이야말로 누군가의 달콤한 말에 현혹되지말고, 각자의 길을 스스로 결정할 때이다.&lt;/p&gt;
&lt;/body&gt;&lt;/html&gt;
</content>
    <id>https://effectivesquid.tistory.com/entry/LLM%EC%9D%80-Silver-Bullet-%EC%9D%BC%EA%B9%8C</id>
    <link href="https://effectivesquid.tistory.com/entry/LLM%EC%9D%80-Silver-Bullet-%EC%9D%BC%EA%B9%8C"/>
    <summary type="html">&lt;p data-ke-size="size16"&gt;&amp;nbsp;대략 2년 만에 글을 쓰기 위해 키보드를 타이핑해 본다. 그동안 주로 연말에 작성하는 회고록이나 지식을 전달하기 위한 정보성 및 트러블 슈팅 경험을 위해 글을 작성해 왔다. 하지만,&amp;nbsp;LLM(이하 AI로 명칭 하겠다.)의 발전으로 인해 지식 전달을 위한 글은 stack overflow의 감소된 트래픽처럼 사람들이 많이 찾지 않고 있기에 &lt;a href="https://github.com/gksxodnd007/TIL" target="_blank" rel="noopener"&gt;TIL Repository&lt;/a&gt;에 정제되지 않은 상태로 업데이트하거나, 개인 Notion에만 정리를 하게 된 것 같다. 글을 쓰는 것도 운동처럼 관성인 것 같다. 한 번 놓게 되면, 글을 쓰기 위해 다시 시간을 내어 자세를 잡기까지 꽤나 큰 준비가 필요하다. 필자도 이 글을 쓰기 위해 손가락 스트레칭을 2년 정도 했다 ㅋ. &lt;b&gt;요즘 너무 많은 사람들이 AI가 주는 환상으로 인해 잘못된 위기를 느끼거나, 느끼게 하는 것 같아 조금은 바로 잡고 싶은 마음에 이 글을 작성하게 되었다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size="size16"&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;이야기에 앞서 LLM의 동작에 대해 간단하게 정리해보고자 한다. Provider에 따라 핵심 알고리즘과 Architecture는 다르겠지만 큰 맥락은 다음과 같다고 생각한다.&lt;/p&gt;
&lt;pre id="code_1793165353658" class="bash" data-ke-language="bash" data-ke-type="codeblock"&gt;&lt;code&gt;1. Tokenize input text
2. Convert tokens into embeddings (add positional information)
3. Process them through Transformer layers with self-attention
4. Predict a probability distribution for the next token
5. Select a token, append it, and repeat until completion
6. Detokenize tokens into output text&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size="size16"&gt;위의 과정을 한 줄 요약하면 다음과 같다. &lt;b&gt;"LLM은 입력 토큰을 벡터로 바꾼 뒤, Transformer가 문맥을 반영해 만든 내부 표현(hidden vector)과 각 후보 토큰의 출력 벡터의 내적을 계산하여 다음 토큰의 확률을 예측한다."&lt;/b&gt; 즉, LLM은 학습 데이터로부터 학습한 파라미터를 바탕으로 현재 문맥에서 다음에 올 가능성이 높은 토큰을 예측한다. &lt;b&gt;기억하자. LLM은 다음 토큰을 예측하는 것이 핵심이다. 이 내용을 토대로 다음의 주제들에 대한 필자의 견해를 풀어가 보려고 한다.&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h4 data-ke-size="size20"&gt;&lt;b&gt;"우린 다 필요 없어"&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size="size16"&gt;&amp;nbsp;LinkedIn이나 Youtube에 올라오는 AI 관련 글, 영상들을 보면 서로가 서로를 필요 없다고 하고 있다. 개발자들은 디자이너와 PM이 필요 없다 하고, 디자이너는 개발자와 PM이 필요 없고, PM은 개발자와 디자이너가 필요 없다고 한다. AI Agent를 통해 다른 영역까지 Leverage 할 수 있게 되어 발생하는 현상이라고 생각한다. (다른 업계는 어떻게 생각할지 모르겠다. 필자는 백엔드 엔지니어이기 때문에 이 글에서는 IT업계에 한정해서 이야기하려고 한다.) 필자는 이런 이야기를 하는 사람들을 보면 그들은 애매한 전문가 포지션에서만 일을 했기 때문에 저런 말들을 한다고 생각한다. AI로 인해 IT업계의 인력이 감축될 수 있다는 것에는 동의한다. 다만, 방향을 잘못짚었다고 생각한다. 우리는 여전히 각 필드의 전문가들이 필요하다. 하지만 코로나 영향으로 많은 영역에서 디지털 전환이 시작됐고, IT 업계로 수많은 인력이 쏠리기 시작했다. 회사는 애매한 전문가들도 필요에 의해 그들이 갖고 있는 역량보다 높은 금액을 지불하고 채용하게 됐다고 생각한다. 개발자를 예로 들면, 요구 사항을 코드로 잘 작성하기만 하면 전문가로 모셔왔다. 이로 인해 수많은 부트캠프들이 생겼고, 비슷한 수준의 개발자들이 양산되기 시작했다. 조금 공격적으로 표현하자면 필자는 이런 사람들을 개발자라고 생각하지 않는다. &lt;b&gt;요구 사항을 컴퓨터가 실행할 수 있는 기능으로 번역해 주는 Code Translator일 뿐이다.&lt;/b&gt; 이 정도의 전문성을 갖고 있는 사람들은 AI가 대체하게 될 것이다. &lt;b&gt;추론의 방향이 명확하기 때문이다.&amp;nbsp;&lt;/b&gt;IT 업계에서 Software Engineer 포지션으로 계속 일하고 싶다면, 코드는 수단일 뿐이라는 것을 이해해야 한다. &lt;b&gt;엔터프라이즈 급의 서비스를 지탱하고 있는 분산 환경의 Backend System을 PM이나 디자이너에게 AI를 쥐어주고 운영하라고 하면 그들이 할 수 있을까? 반대로, 서비스의 10x 성장을 위한 Branding, Marketing, Design, VOC Operation에 대한 전략 수립과 실행을 Engineer에게 AI를 쥐어주고 해내라고 한다면 폭발적인 결과를 낼 수 있을까? &lt;span style="color: #ee2323;"&gt;한두 달 운영하면서 바이럴로 한탕해 먹고 튀는 도파민 용 서비스를 제공하는 게 목적이 아니라면 물음표를 던지고 싶다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size="size16"&gt;&amp;nbsp;필자는 현재 시기를 지식 산업에서 "진짜" 필요한 사람이 누구인지를 필터링하는 시기라고 생각한다. 우리가 풀어가야 할 문제가 너무나도 많기에 애매한 전문가도 우리는 전문가로 대우해 주었다. 하지만 AI로 인해 애매한 전문가는 이제 필요 없어졌다. 우리는 각 영역의 진짜 전문가만 필요하게 됐다고 생각한다. 아이러니한 상황이다. AI로 인해 모두가 전문가가 될 수 있고, 정보의 빈부격차가 해소될 것이라고 하지만 필자가 생각하는 미래는 정보의 빈부격차가 더 심해질 것이고, 전문가의 수는 더욱 적어질 것이라고 생각한다. &lt;b&gt;엄밀히 말하면, 정보의 빈부격차보다는 지능의 빈부격차라고 생각한다.&lt;/b&gt; 여기서 필자가 이야기하는 전문가는 한 분야를 오랫동안 갈고닦은 사람을 칭하는 것이 아니다. &lt;b&gt;어떠한 지식을 얼마나 능동적으로 빠르고 깊이 있게 학습하고, 현재 상황에 필요한 solution을 AI와 함께 도출해 내는 사람을 전문가라고 말하고 싶다.&lt;/b&gt; &lt;b&gt;기술의 발전으로 정보를 얻을 수 있는 과정은 정말 싸졌지만, 반대로 그 정보를 학습하고, 이해하고 사용하는 비용은 비싸졌다. &lt;span style="color: #ee2323;"&gt;많은 사람들이 바보가 되고 있기 때문이다.&lt;/span&gt;&lt;/b&gt;&lt;span style="color: #000000;"&gt; 그렇기에 필자는 말하고 싶다. 지식산업에서 살아남고 싶다면 더욱 전문가가 되어야 한다고. 애매한 전문가는 이제 필요 없을 것이다. &lt;b&gt;AI는 전문가에게 쥐어주는 증폭기일 뿐이다. 모든 걸 알잘딱깔센으로 처리 해주는 도구가 아니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h4 style="color: #000000; text-align: start;" data-ke-size="size20"&gt;&lt;b&gt;"There is no Silver Bullet"&lt;/b&gt;&lt;/h4&gt;
&lt;p style="color: #333333; text-align: start;" data-ke-size="size16"&gt;&amp;nbsp;소프트웨어 공학은 AI 시대 이전에도 추상화되는 방향으로 발전했다. 사실 소프트웨어 공학뿐만 아니라 모든 공학은 성숙해질수록 추상화 단계가 올라간다. 자율주행도 같은 맥락이다. 우리는 더 이상 운전하는 법을 몰라도 자동차를 이용하여 목적지까지 갈 수 있게 됐다. 사람은 그저 출발지와 목적지, 경로를 선택하면 된다. 사용자는 운전에 대해 더 이상 학습하지 않아도 되지만, 교통 공학자들은 이런 환경에서 어떻게 하면 더 효율적으로 도로를 설계하는 게 좋을지 고민해야 한다. 소프트웨어도 마찬가지이다. 코드를 구현하는 일들은 이제 추상화되겠지만, 그 코드가 실행되는 전체적인 시스템을 디자인해야 하고, AI가 이해하기 쉽도록 더 좋은 구조로 코드가 설계되어야 한다. 우리는 AI 덕분에 더 본질적인 고민을 할 수 있는 시대가 되었다. 이 고민 또한 AI가 추론해 주겠지만 앞서 이야기한 Code Translator와 다르게 이 과정은 추론의 방향이 명확하지 않다. 여러 추론들의 결과들이 나올 수 있고, 우리는 현재 상황과 미래를 고려하여 선택해야 한다. 선택을 하기 위해서는 기존보다 더 많은 지식을 요구하게 될 수 있다. &lt;b&gt;중요한 것은&amp;nbsp;이러한 방향은 기존의 발전 방향과 크게 다르지 않다는 것이다.&lt;/b&gt;&lt;/p&gt;
&lt;p style="color: #333333; text-align: start;" data-ke-size="size16"&gt;&amp;nbsp;우리는 어떤 기술이 나올 때마다 Silver Bullet은 없다는 것을 명심해야 한다. 기존에도 그랬고, LLM도 마찬가지이다. &lt;b&gt;LLM은 절대 소프트웨어 공학의 Silver Bullet이 아니다. Context Window라는 명확한 한계가 존재하고, 이로 인해 할루시네이션이 발생하는 문제가 있다. 모든 결과는 추론이기 때문에 비결정적인 문제를 안고 있다.&lt;/b&gt; 같은 input을 넣어도 같은 output이 나오지 않기 때문에 소프트웨어 공학의 근간이라고 할 수 있는 함수라는 개념을 만족시키지 못한다.&lt;/p&gt;
&lt;h4 data-ke-size="size20"&gt;&lt;b&gt;"AI Slop"&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size="size16"&gt;&amp;nbsp;Youtube나 LinkedIn을 보다 보면 "토스", "쿠팡" 출신의 PO가 퇴사 후 AI Agent 팀을 만들어 토스의 스쿼드 팀을 만들었다는 영상이나 글들이 종종 올라오곤 한다. 그들의 행보를 보고 있노라면 솔직히 말해 안쓰러울 때가 있다. 그들은 대부분 AI를 Leverage 하여 좋은 서비스를 출시해서 승부하려는 사람들이 아닌 AI를 잘 모르는 사람들을 현혹하여 강의를 팔고 있거나, 인플루언서를 꿈꾸는 사람들이다. 필자는 아직까지 그들이 어떤 서비스를 만들고 있고, 어떤 유의미한 결과를 도출하고 있는지 모르겠다. AI를 활용하여 릴스 공장을 만드는 것..? 그 이상 그 이하도 아니라고 생각한다. 좋은 서비스는 AI 딸깍으로 나오는 것이 아니다. 그리고 그들은 서비스를 만드는 것만 이야기한다. &lt;b&gt;하지만 서비스를 만드는 것보다 서비스를 성공적으로 운영하는 것이 &lt;b&gt;서비스의 성공을 좌지우지하는 데 더 큰 요소로 작용한다.&lt;/b&gt;&amp;nbsp;각 영역의 전문가들이 필요한 때이다.&lt;/b&gt; 물론, AI를 활용하여 서비스를 운영하면 10명이 붙어야 가능한 일을 1~2명이 처리할 수도 있다. 한두 달 운영하고 폐기할 서비스를 몇 십 개 만들어서 생활에 필요한 돈을 벌 목적이 아니라면 AI를 사용하더라도 혼자서 할 수 있는 일은 없다. &lt;b&gt;Vibe Coding을 통해 수많은 App들이 출시되고 있지만, 모바일 시장의 수요는 전혀 증가하지 않았다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class="imageblock alignCenter" data-ke-mobileStyle="widthOrigin" data-origin-width="557" data-origin-height="484"&gt;&lt;span data-url="https://blog.kakaocdn.net/dn/ctmSKf/dJMcaa8wYwA/oaqgr36KJBy30heUwHpEQ0/img.png" data-phocus="https://blog.kakaocdn.net/dn/ctmSKf/dJMcaa8wYwA/oaqgr36KJBy30heUwHpEQ0/img.png"&gt;&lt;img src="https://blog.kakaocdn.net/dn/ctmSKf/dJMcaa8wYwA/oaqgr36KJBy30heUwHpEQ0/img.png" srcset="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctmSKf%2FdJMcaa8wYwA%2Foaqgr36KJBy30heUwHpEQ0%2Fimg.png" onerror="this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';" loading="lazy" width="557" height="484" data-origin-width="557" data-origin-height="484"/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size="size16"&gt;AI로 인해 1인 창업의 시대가 열린 것은 확실하다. 하지만 창업 아이템이 App 서비스이고, AI 군단을 전두지휘하여 성공해 보겠다는 생각이라면 본인 결정에 AI가 주는 환상은 없었는지 검토를 해보자.&lt;/p&gt;
&lt;h4 data-ke-size="size20"&gt;&lt;b&gt;"진짜만 살아남는 시대"&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size="size16"&gt;&amp;nbsp;블라인드 혹은 LinkedIn을 보고 있다 보면 많은 개발자, 디자이너들이 자신의 직업을 잃을까 걱정하는 글을 많이 볼 수 있다. 그와 반대로 PM, PO 직군은 이상할 정도로 자아가 비대해져 있다. 솔직하게 말하면 그들은 어떠한 분야도 제대로 파고들어 보지 않은 조율자에 불과하다. 미래의 인재는 AI Agent를 전두지휘할 수 있는 Supervisor, Operator라는 분위기 덕분에 조율자 역할을 하고 있는 PM, PO 직군의 사람들이 환상을 갖게 된 게 아닐까 싶다.&lt;/p&gt;
&lt;p data-ke-size="size16"&gt;&amp;nbsp;앞서 이야기했듯이 AI로 인해 애매한 전문가 포지션으로 일하는 사람들은 모두 위기인 세상이 온 것에 이견은 없다. 하지만 필자는 이야기하고 싶다. 미래의 지식산업은 단언컨대, 진짜 전문가만 살아남을 것이다. 지식의 가치는 낮아지겠지만 지능의 가치는 더욱 희소성을 갖게 될 것이다. &lt;b&gt;문제를 정확하게 정의하고, 여러 Solution들 중 감수할 수 있는 trade off가 뭔지 고민할 수 있고, 선택한 Solution에 대해 정확히 이해하고 있고, 어떤 방법을 통해 검증할 것 인지를 명확하게 정의할 수 있는 전문가는&lt;/b&gt; 앞으로도 필요한 사람일 것이다.&amp;nbsp;문제는 Engineering의 이슈일 수도, Marketing의 이슈일 수도, 서비스의 방향성의 이슈일 수도 있다. 어떠한 직군이든 각 이슈를 정확하게 진단하여 문제를 해결할 수 있는 전문가들만 지식 산업에서 살아남을 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size="size16"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size="size16"&gt;하지만 꼭 지식산업에서 살아남을 필요는 없다. ROI가 안 나올 수도 있고, 업계에서 살아남는다고 행복한 삶은 아닐 수 있다. 다만, 가짜들이 떠드는 말들로 불안해하지는 말자. 각자의 가치관과 비전으로 정진하면 된다. "빈 수레가 요란하다"라는 말을 명심하자. 지금이야말로 누군가의 달콤한 말에 현혹되지말고, 각자의 길을 스스로 결정할 때이다.&lt;/p&gt;</summary>
    <title>LLM은 Silver Bullet 일까?</title>
    <updated>2026-10-28T15:33:08+09:00</updated>
    <dc:date>2026-10-28T15:33:08+09:00</dc:date>
  </entry>
  <entry>
    <author>
      <name>Pluu</name>
    </author>
    <content type="html">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"&gt;
&lt;html&gt;&lt;body&gt;
&lt;p&gt;Android CLI의 &lt;code class="language-plaintext highlighter-rouge"&gt;android install&lt;/code&gt;은 단순한 &lt;code class="language-plaintext highlighter-rouge"&gt;adb install&lt;/code&gt;의 래퍼(Wrapper)가 아닙니다. 소스 빌드 연동 기능과 함께, 변경된 바이트만 전송하는 &lt;strong&gt;증분 설치(Delta Install)&lt;/strong&gt;를 기본값으로 사용합니다.&lt;/p&gt;

&lt;p&gt;두 도구의 내부 동작 차이를 분석하고, 로컬 에뮬레이터와 네트워크 대역폭 제한 환경에서 설치 속도를 비교했습니다.&lt;/p&gt;

&lt;!--more--&gt;

&lt;blockquote&gt;
  &lt;p&gt;본 글은 Gemini를 사용하여 초안을 작성한 후 검수하였습니다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr&gt;

&lt;p&gt;본 글에서 사용된 도구 버전 및 환경(2026년 10월 31일 기준)은 다음과 같습니다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Android CLI: 1.1.16717390&lt;/li&gt;
  &lt;li&gt;Android Debug Bridge (adb): 1.0.41 (platform-tools 37.0.1-15733141)&lt;/li&gt;
  &lt;li&gt;Android Gradle Plugin (AGP): 9.5.0&lt;/li&gt;
  &lt;li&gt;Kotlin: 2.4.21&lt;/li&gt;
  &lt;li&gt;Target Device: Android Virtual Device (Pixel 9a, API 37, arm64-v8a)&lt;/li&gt;
&lt;/ul&gt;

&lt;hr&gt;

&lt;h2 id="1-핵심-차이점-한눈에-보기"&gt;1. 핵심 차이점 한눈에 보기&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;비교 항목&lt;/th&gt;
      &lt;th&gt;adb install&lt;/th&gt;
      &lt;th&gt;android install&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;도구 성격&lt;/td&gt;
      &lt;td&gt;Low-level 범용 기기 통신 도구 (&lt;code class="language-plaintext highlighter-rouge"&gt;platform-tools&lt;/code&gt;)&lt;/td&gt;
      &lt;td&gt;High-level Android 개발자/에이전트 워크플로 CLI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;입력 형태&lt;/td&gt;
      &lt;td&gt;로컬 APK 파일 경로만 지원&lt;/td&gt;
      &lt;td&gt;로컬 APK 경로뿐만 아니라 빌드 참조 ([system://][path]?[target]) 지원&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;빌드 연동&lt;/td&gt;
      &lt;td&gt;불가 (사전에 빌드 완료된 APK 필요)&lt;/td&gt;
      &lt;td&gt;소스 빌드와 배포를 한 번에 연동 가능 (– &lt;build_args&gt;)&lt;/build_args&gt;
&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;증분 설치 (Delta)&lt;/td&gt;
      &lt;td&gt;
&lt;code class="language-plaintext highlighter-rouge"&gt;--fastdeploy&lt;/code&gt; 옵션 필요 (별도 agent)&lt;/td&gt;
      &lt;td&gt;
&lt;code class="language-plaintext highlighter-rouge"&gt;--use-delta-install&lt;/code&gt; 기본 활성화 (default: true)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;전송 최적화&lt;/td&gt;
      &lt;td&gt;Streaming Install 지원 (&lt;code class="language-plaintext highlighter-rouge"&gt;--streaming&lt;/code&gt;)&lt;/td&gt;
      &lt;td&gt;변경된 delta 패치 파일만 기기로 전송 (Zero-copy 활용)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;다중 APK 지원&lt;/td&gt;
      &lt;td&gt;install-multiple, install-multi-package 분리&lt;/td&gt;
      &lt;td&gt;–apks=a.apk,b.apk 로 단순화&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;실행 연계&lt;/td&gt;
      &lt;td&gt;설치만 수행&lt;/td&gt;
      &lt;td&gt;설치만 수행 (&lt;code class="language-plaintext highlighter-rouge"&gt;android run&lt;/code&gt; 시 설치 후 launch까지 연동)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id="1-소스-빌드-참조build-reference-지원"&gt;(1) 소스 빌드 참조(Build Reference) 지원&lt;/h3&gt;
&lt;p&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;adb install&lt;/code&gt;은 오직 디스크에 존재하는 &lt;code class="language-plaintext highlighter-rouge"&gt;.apk&lt;/code&gt; 파일만을 대상으로 동작합니다.
반면 &lt;code class="language-plaintext highlighter-rouge"&gt;android install&lt;/code&gt;은 Android CLI 1.1부터 &lt;strong&gt;빌드 참조 문법&lt;/strong&gt;을 직접 인식합니다.&lt;/p&gt;

&lt;div class="language-bash highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="c"&gt;# 로컬 APK 파일 설치&lt;/span&gt;
android &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--apks&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;app/build/outputs/apk/debug/app-debug.apk

&lt;span class="c"&gt;# Gradle 프로젝트 빌드 후 설치까지 한 번에 수행&lt;/span&gt;
android &lt;span class="nb"&gt;install&lt;/span&gt; :app
android &lt;span class="nb"&gt;install&lt;/span&gt; ~/MyProject?:app@debug &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--offline&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;빌드 타깃을 지정하면 CLI가 프로젝트 구조를 분석해 빌드를 실행하고, 생성된 APK를 찾아 기기에 바로 설치합니다.&lt;/p&gt;

&lt;h3 id="2-기본-delta-install-증분-패치-지원"&gt;(2) 기본 Delta Install (증분 패치) 지원&lt;/h3&gt;
&lt;p&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;android install&lt;/code&gt;은 증분 설치 옵션(&lt;code class="language-plaintext highlighter-rouge"&gt;--use-delta-install&lt;/code&gt;)을 기본값(true)으로 사용합니다.&lt;/p&gt;

&lt;p&gt;기기에 이전 버전의 앱이 이미 설치되어 있다면, APK 전체를 보내지 않고 로컬 APK와 기기 설치본의 차이(Delta)만 계산해 패치 파일(&lt;code class="language-plaintext highlighter-rouge"&gt;.seq&lt;/code&gt;)을 전송합니다.&lt;/p&gt;

&lt;p&gt;기기의 임시 디렉터리(/data/local/tmp)에 배포 에이전트(&lt;code class="language-plaintext highlighter-rouge"&gt;installer.jar&lt;/code&gt;)를 올려 커널의 Zero-copy 시스템 콜로 패치를 적용한 뒤 Package Manager에 반영합니다.&lt;/p&gt;

&lt;h2 id="2-벤치마크-환경-구성"&gt;2. 벤치마크 환경 구성&lt;/h2&gt;

&lt;p&gt;두 도구의 설치 소요 시간과 Delta Install의 데이터 전송 절감량을 확인하기 위해 아래 시나리오별로 테스트를 진행했습니다.&lt;/p&gt;

&lt;h3 id="테스트-시나리오"&gt;테스트 시나리오&lt;/h3&gt;
&lt;p&gt;APK 내 특정 영역만 변경되는 상황을 시뮬레이션하기 위해 4종류의 APK 변형(Variant)을 생성했습니다.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;fresh: 앱을 완전히 삭제(&lt;code class="language-plaintext highlighter-rouge"&gt;uninstall&lt;/code&gt;)한 상태에서 최초 설치&lt;/li&gt;
  &lt;li&gt;same: 동일한 APK를 덮어쓰기 재설치&lt;/li&gt;
  &lt;li&gt;code: Kotlin 코드 상수만 변경 (&lt;code class="language-plaintext highlighter-rouge"&gt;classes*.dex&lt;/code&gt;만 변경)&lt;/li&gt;
  &lt;li&gt;res: 문자열 리소스만 변경 (&lt;code class="language-plaintext highlighter-rouge"&gt;resources.arsc&lt;/code&gt;만 변경)&lt;/li&gt;
  &lt;li&gt;asset: 에셋 파일 1개만 변경 (&lt;code class="language-plaintext highlighter-rouge"&gt;assets/marker.txt&lt;/code&gt;만 변경)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;또한 APK 크기에 따른 전송 대역폭 영향을 보기 위해 두 가지 크기로 측정했습니다.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;기본 Compose 앱: 약 11~12MB&lt;/li&gt;
  &lt;li&gt;대용량 리소스 포함 앱: 약 52MB (비압축 40MB 더미 페이로드 포함)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="3-결과-비교"&gt;3. 결과 비교&lt;/h2&gt;

&lt;h3 id="1-로컬-에뮬레이터-환경"&gt;1) 로컬 에뮬레이터 환경&lt;/h3&gt;

&lt;p&gt;로컬 에뮬레이터는 호스트 메모리 버퍼를 통해 데이터를 전달하므로 네트워크 전송 병목이 없습니다. 5회 반복 측정 후 중앙값 기준입니다.&lt;/p&gt;

&lt;h4 id="-기본-compose-앱-약-1112mb"&gt;① 기본 Compose 앱 (약 11~12MB)&lt;/h4&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;시나리오&lt;/th&gt;
      &lt;th style="text-align: right"&gt;adb install -r&lt;/th&gt;
      &lt;th style="text-align: right"&gt;android install (기본 delta)&lt;/th&gt;
      &lt;th style="text-align: right"&gt;android install (delta OFF)&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;fresh&lt;/td&gt;
      &lt;td style="text-align: right"&gt;0.26s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.17s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.13s&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;same&lt;/td&gt;
      &lt;td style="text-align: right"&gt;0.32s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.01s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.03s&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;code&lt;/td&gt;
      &lt;td style="text-align: right"&gt;0.32s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.01s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.07s&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;res&lt;/td&gt;
      &lt;td style="text-align: right"&gt;0.36s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.04s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.05s&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;asset&lt;/td&gt;
      &lt;td style="text-align: right"&gt;0.33s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.06s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.03s&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h4 id="-52mb-앱-대용량-에셋-포함"&gt;② 52MB 앱 (대용량 에셋 포함)&lt;/h4&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;시나리오&lt;/th&gt;
      &lt;th style="text-align: right"&gt;adb install -r&lt;/th&gt;
      &lt;th style="text-align: right"&gt;android install (기본 delta)&lt;/th&gt;
      &lt;th style="text-align: right"&gt;android install (delta OFF)&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;fresh&lt;/td&gt;
      &lt;td style="text-align: right"&gt;0.46s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.50s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.22s&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;same&lt;/td&gt;
      &lt;td style="text-align: right"&gt;0.57s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.54s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.30s&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;code&lt;/td&gt;
      &lt;td style="text-align: right"&gt;0.52s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.47s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.24s&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;res&lt;/td&gt;
      &lt;td style="text-align: right"&gt;0.48s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.42s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.28s&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;asset&lt;/td&gt;
      &lt;td style="text-align: right"&gt;0.52s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.38s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.28s&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id="결과-분석"&gt;결과 분석&lt;/h3&gt;
&lt;p&gt;로컬 에뮬레이터에서는 &lt;code class="language-plaintext highlighter-rouge"&gt;adb install -r&lt;/code&gt;이 더 빠릅니다.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Android CLI 자체를 기동하는 데 약 0.45초의 기본 오버헤드가 발생합니다.&lt;/li&gt;
  &lt;li&gt;전송 지연이 없는 환경에서는 50MB 전체를 전송하더라도 0.5초 안에 끝나므로, 차이점(Delta)을 계산하고 기기에서 패치 에이전트를 구동하는 시간이 전송 절약 시간보다 더 깁니다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id="2-실기기--wi-fi-디버깅-환경-5-mbs-대역폭-제한"&gt;2) 실기기 / Wi-Fi 디버깅 환경 (5 MB/s 대역폭 제한)&lt;/h3&gt;

&lt;p&gt;실제 개발 환경에서는 Wi-Fi 페어링 무선 디버깅이나 USB 2.0 케이블 연결처럼 &lt;strong&gt;전송 대역폭이 제한되는 환경&lt;/strong&gt;이 많습니다. 이를 재현하기 위해 에뮬레이터 포트 앞에 5 MB/s 전송 속도 제한 프록시를 두고 재측정했습니다.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;※ 배수 비교는 &lt;code class="language-plaintext highlighter-rouge"&gt;adb install -r&lt;/code&gt; 대비 &lt;code class="language-plaintext highlighter-rouge"&gt;android install&lt;/code&gt;의 소요 시간 기준이며, 절감율은 전체 APK 크기 대비 실제 전송된 패치 크기 기준입니다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4 id="-52mb-앱-대역폭-5-mbs"&gt;① 52MB 앱 (대역폭 5 MB/s)&lt;/h4&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;시나리오&lt;/th&gt;
      &lt;th style="text-align: right"&gt;adb install -r&lt;/th&gt;
      &lt;th style="text-align: right"&gt;android install (Delta ON)&lt;/th&gt;
      &lt;th&gt;절감율 / 전송량&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;fresh&lt;/td&gt;
      &lt;td style="text-align: right"&gt;10.41s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;11.63s&lt;/td&gt;
      &lt;td&gt;전체 전송 (51.80 MB)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;same&lt;/td&gt;
      &lt;td style="text-align: right"&gt;10.44s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.52s (adb 대비 약 6.8배 빠름)&lt;/td&gt;
      &lt;td&gt;554 KB 전송 (98.9% 절감)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;code&lt;/td&gt;
      &lt;td style="text-align: right"&gt;10.44s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.45s (adb 대비 약 7.2배 빠름)&lt;/td&gt;
      &lt;td&gt;584 KB 전송 (98.9% 절감)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;res&lt;/td&gt;
      &lt;td style="text-align: right"&gt;10.53s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.68s (adb 대비 약 6.3배 빠름)&lt;/td&gt;
      &lt;td&gt;1.46 MB 전송 (97.2% 절감)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;asset&lt;/td&gt;
      &lt;td style="text-align: right"&gt;10.52s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.63s (adb 대비 약 6.4배 빠름)&lt;/td&gt;
      &lt;td&gt;1.46 MB 전송 (97.2% 절감)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h4 id="-1112mb-기본-앱-대역폭-5-mbs"&gt;② 11~12MB 기본 앱 (대역폭 5 MB/s)&lt;/h4&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;시나리오&lt;/th&gt;
      &lt;th style="text-align: right"&gt;adb install -r&lt;/th&gt;
      &lt;th style="text-align: right"&gt;android install (Delta ON)&lt;/th&gt;
      &lt;th&gt;절감율 / 전송량&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;fresh&lt;/td&gt;
      &lt;td style="text-align: right"&gt;2.30s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;3.48s&lt;/td&gt;
      &lt;td&gt;전체 전송 (11.33 MB)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;same&lt;/td&gt;
      &lt;td style="text-align: right"&gt;2.31s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.28s (adb 대비 약 1.8배 빠름)&lt;/td&gt;
      &lt;td&gt;89 KB 전송 (99.2% 절감)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;code&lt;/td&gt;
      &lt;td style="text-align: right"&gt;2.32s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.29s (adb 대비 약 1.8배 빠름)&lt;/td&gt;
      &lt;td&gt;140 KB 전송 (98.8% 절감)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;res&lt;/td&gt;
      &lt;td style="text-align: right"&gt;2.40s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.54s (adb 대비 약 1.6배 빠름)&lt;/td&gt;
      &lt;td&gt;1.02 MB 전송 (91.4% 절감)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;asset&lt;/td&gt;
      &lt;td style="text-align: right"&gt;2.40s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.49s (adb 대비 약 1.6배 빠름)&lt;/td&gt;
      &lt;td&gt;1.02 MB 전송 (91.4% 절감)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id="결과-분석-1"&gt;결과 분석&lt;/h3&gt;
&lt;p&gt;전송 속도가 제한되는 네트워크나 USB 환경에서는 &lt;code class="language-plaintext highlighter-rouge"&gt;android install&lt;/code&gt;이 훨씬 빠릅니다.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;
&lt;code class="language-plaintext highlighter-rouge"&gt;adb install -r&lt;/code&gt;은 변경된 내용이 적더라도 52MB 전체를 스트리밍 전송하므로 매번 &lt;strong&gt;10초 이상(10.44s~10.53s)&lt;/strong&gt; 걸립니다.&lt;/li&gt;
  &lt;li&gt;반면 &lt;code class="language-plaintext highlighter-rouge"&gt;android install&lt;/code&gt;은 &lt;strong&gt;584KB 패치 파일만 전송(전송량 98.9% 절감)&lt;/strong&gt;하므로 전송 시간을 0.1초대로 줄여 전체 설치를 &lt;strong&gt;1.45초(약 7.2배 빠름)&lt;/strong&gt;에 마칩니다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="4-adb-fastdeploy와의-차이"&gt;4. “adb –fastdeploy”와의 차이&lt;/h2&gt;

&lt;p&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;adb install&lt;/code&gt;에도 &lt;code class="language-plaintext highlighter-rouge"&gt;--fastdeploy&lt;/code&gt; 옵션이 있지만, 아래 경고를 출력하며 일반 전체 설치로 전환될 수도 있습니다.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Fast Deploy is only compatible with devices of API version 24 or higher, ignoring.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;반면 &lt;code class="language-plaintext highlighter-rouge"&gt;android install&lt;/code&gt;의 Delta Install은 Android Studio 배포 시스템(Deployer)의 기술을 CLI에 적용해 최신 OS에서도 정상적으로 패치 설치를 수행합니다.&lt;/p&gt;

&lt;h2 id="5-요약-및-상황별-추천"&gt;5. 요약 및 상황별 추천&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;
&lt;code class="language-plaintext highlighter-rouge"&gt;android install&lt;/code&gt;을 써야 하는 경우
    &lt;ul&gt;
      &lt;li&gt;실기기 디버깅(특히 Wi-Fi 무선 디버깅): 코드나 리소스 일부만 수정하고 재설치할 때 전송 시간이 대폭 줄어듭니다.&lt;/li&gt;
      &lt;li&gt;대용량 프로젝트: APK 크기가 클수록 Delta 패치 전송의 절약 효과가 큽니다.&lt;/li&gt;
      &lt;li&gt;빌드와 배포 연동: &lt;code class="language-plaintext highlighter-rouge"&gt;:app&lt;/code&gt; 같은 타깃 참조를 넘겨 빌드와 설치를 명령어 하나로 실행할 때 적합합니다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
&lt;code class="language-plaintext highlighter-rouge"&gt;adb install&lt;/code&gt;을 써야 하는 경우
    &lt;ul&gt;
      &lt;li&gt;로컬 에뮬레이터 반복 테스트: 전송 병목이 없어 CLI 기동 오버헤드가 없는 &lt;code class="language-plaintext highlighter-rouge"&gt;adb&lt;/code&gt;가 0.2초대로 가장 빠릅니다.&lt;/li&gt;
      &lt;li&gt;가벼운 CI/CD 파이프라인: 별도의 Android CLI 스택 없이 &lt;code class="language-plaintext highlighter-rouge"&gt;platform-tools&lt;/code&gt;만 설치된 환경에서 배포할 때 유리합니다.&lt;/li&gt;
      &lt;li&gt;세부 설치 옵션 제어: &lt;code class="language-plaintext highlighter-rouge"&gt;--instant&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;--abi&lt;/code&gt;, 다중 패키지 원자적 설치 등 저수준 Package Manager 옵션이 필요할 때 사용합니다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;
&lt;/body&gt;&lt;/html&gt;
</content>
    <id>http://pluu.github.io/blog/android/2026/11/01/adb-install-vs-android-install/</id>
    <link href="http://pluu.github.io/blog/android/2026/11/01/adb-install-vs-android-install/"/>
    <summary type="html">&lt;p&gt;Android CLI의 &lt;code class="language-plaintext highlighter-rouge"&gt;android install&lt;/code&gt;은 단순한 &lt;code class="language-plaintext highlighter-rouge"&gt;adb install&lt;/code&gt;의 래퍼(Wrapper)가 아닙니다. 소스 빌드 연동 기능과 함께, 변경된 바이트만 전송하는 &lt;strong&gt;증분 설치(Delta Install)&lt;/strong&gt;를 기본값으로 사용합니다.&lt;/p&gt;

&lt;p&gt;두 도구의 내부 동작 차이를 분석하고, 로컬 에뮬레이터와 네트워크 대역폭 제한 환경에서 설치 속도를 비교했습니다.&lt;/p&gt;

&lt;!--more--&gt;

&lt;blockquote&gt;
  &lt;p&gt;본 글은 Gemini를 사용하여 초안을 작성한 후 검수하였습니다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;p&gt;본 글에서 사용된 도구 버전 및 환경(2026년 10월 31일 기준)은 다음과 같습니다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Android CLI: 1.1.16717390&lt;/li&gt;
  &lt;li&gt;Android Debug Bridge (adb): 1.0.41 (platform-tools 37.0.1-15733141)&lt;/li&gt;
  &lt;li&gt;Android Gradle Plugin (AGP): 9.5.0&lt;/li&gt;
  &lt;li&gt;Kotlin: 2.4.21&lt;/li&gt;
  &lt;li&gt;Target Device: Android Virtual Device (Pixel 9a, API 37, arm64-v8a)&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h2 id="1-핵심-차이점-한눈에-보기"&gt;1. 핵심 차이점 한눈에 보기&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;비교 항목&lt;/th&gt;
      &lt;th&gt;adb install&lt;/th&gt;
      &lt;th&gt;android install&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;도구 성격&lt;/td&gt;
      &lt;td&gt;Low-level 범용 기기 통신 도구 (&lt;code class="language-plaintext highlighter-rouge"&gt;platform-tools&lt;/code&gt;)&lt;/td&gt;
      &lt;td&gt;High-level Android 개발자/에이전트 워크플로 CLI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;입력 형태&lt;/td&gt;
      &lt;td&gt;로컬 APK 파일 경로만 지원&lt;/td&gt;
      &lt;td&gt;로컬 APK 경로뿐만 아니라 빌드 참조 ([system://][path]?[target]) 지원&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;빌드 연동&lt;/td&gt;
      &lt;td&gt;불가 (사전에 빌드 완료된 APK 필요)&lt;/td&gt;
      &lt;td&gt;소스 빌드와 배포를 한 번에 연동 가능 (– &lt;build_args&gt;)&lt;/build_args&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;증분 설치 (Delta)&lt;/td&gt;
      &lt;td&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;--fastdeploy&lt;/code&gt; 옵션 필요 (별도 agent)&lt;/td&gt;
      &lt;td&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;--use-delta-install&lt;/code&gt; 기본 활성화 (default: true)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;전송 최적화&lt;/td&gt;
      &lt;td&gt;Streaming Install 지원 (&lt;code class="language-plaintext highlighter-rouge"&gt;--streaming&lt;/code&gt;)&lt;/td&gt;
      &lt;td&gt;변경된 delta 패치 파일만 기기로 전송 (Zero-copy 활용)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;다중 APK 지원&lt;/td&gt;
      &lt;td&gt;install-multiple, install-multi-package 분리&lt;/td&gt;
      &lt;td&gt;–apks=a.apk,b.apk 로 단순화&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;실행 연계&lt;/td&gt;
      &lt;td&gt;설치만 수행&lt;/td&gt;
      &lt;td&gt;설치만 수행 (&lt;code class="language-plaintext highlighter-rouge"&gt;android run&lt;/code&gt; 시 설치 후 launch까지 연동)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id="1-소스-빌드-참조build-reference-지원"&gt;(1) 소스 빌드 참조(Build Reference) 지원&lt;/h3&gt;
&lt;p&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;adb install&lt;/code&gt;은 오직 디스크에 존재하는 &lt;code class="language-plaintext highlighter-rouge"&gt;.apk&lt;/code&gt; 파일만을 대상으로 동작합니다.
반면 &lt;code class="language-plaintext highlighter-rouge"&gt;android install&lt;/code&gt;은 Android CLI 1.1부터 &lt;strong&gt;빌드 참조 문법&lt;/strong&gt;을 직접 인식합니다.&lt;/p&gt;

&lt;div class="language-bash highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="c"&gt;# 로컬 APK 파일 설치&lt;/span&gt;
android &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--apks&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;app/build/outputs/apk/debug/app-debug.apk

&lt;span class="c"&gt;# Gradle 프로젝트 빌드 후 설치까지 한 번에 수행&lt;/span&gt;
android &lt;span class="nb"&gt;install&lt;/span&gt; :app
android &lt;span class="nb"&gt;install&lt;/span&gt; ~/MyProject?:app@debug &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--offline&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;빌드 타깃을 지정하면 CLI가 프로젝트 구조를 분석해 빌드를 실행하고, 생성된 APK를 찾아 기기에 바로 설치합니다.&lt;/p&gt;

&lt;h3 id="2-기본-delta-install-증분-패치-지원"&gt;(2) 기본 Delta Install (증분 패치) 지원&lt;/h3&gt;
&lt;p&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;android install&lt;/code&gt;은 증분 설치 옵션(&lt;code class="language-plaintext highlighter-rouge"&gt;--use-delta-install&lt;/code&gt;)을 기본값(true)으로 사용합니다.&lt;/p&gt;

&lt;p&gt;기기에 이전 버전의 앱이 이미 설치되어 있다면, APK 전체를 보내지 않고 로컬 APK와 기기 설치본의 차이(Delta)만 계산해 패치 파일(&lt;code class="language-plaintext highlighter-rouge"&gt;.seq&lt;/code&gt;)을 전송합니다.&lt;/p&gt;

&lt;p&gt;기기의 임시 디렉터리(/data/local/tmp)에 배포 에이전트(&lt;code class="language-plaintext highlighter-rouge"&gt;installer.jar&lt;/code&gt;)를 올려 커널의 Zero-copy 시스템 콜로 패치를 적용한 뒤 Package Manager에 반영합니다.&lt;/p&gt;

&lt;h2 id="2-벤치마크-환경-구성"&gt;2. 벤치마크 환경 구성&lt;/h2&gt;

&lt;p&gt;두 도구의 설치 소요 시간과 Delta Install의 데이터 전송 절감량을 확인하기 위해 아래 시나리오별로 테스트를 진행했습니다.&lt;/p&gt;

&lt;h3 id="테스트-시나리오"&gt;테스트 시나리오&lt;/h3&gt;
&lt;p&gt;APK 내 특정 영역만 변경되는 상황을 시뮬레이션하기 위해 4종류의 APK 변형(Variant)을 생성했습니다.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;fresh: 앱을 완전히 삭제(&lt;code class="language-plaintext highlighter-rouge"&gt;uninstall&lt;/code&gt;)한 상태에서 최초 설치&lt;/li&gt;
  &lt;li&gt;same: 동일한 APK를 덮어쓰기 재설치&lt;/li&gt;
  &lt;li&gt;code: Kotlin 코드 상수만 변경 (&lt;code class="language-plaintext highlighter-rouge"&gt;classes*.dex&lt;/code&gt;만 변경)&lt;/li&gt;
  &lt;li&gt;res: 문자열 리소스만 변경 (&lt;code class="language-plaintext highlighter-rouge"&gt;resources.arsc&lt;/code&gt;만 변경)&lt;/li&gt;
  &lt;li&gt;asset: 에셋 파일 1개만 변경 (&lt;code class="language-plaintext highlighter-rouge"&gt;assets/marker.txt&lt;/code&gt;만 변경)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;또한 APK 크기에 따른 전송 대역폭 영향을 보기 위해 두 가지 크기로 측정했습니다.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;기본 Compose 앱: 약 11~12MB&lt;/li&gt;
  &lt;li&gt;대용량 리소스 포함 앱: 약 52MB (비압축 40MB 더미 페이로드 포함)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="3-결과-비교"&gt;3. 결과 비교&lt;/h2&gt;

&lt;h3 id="1-로컬-에뮬레이터-환경"&gt;1) 로컬 에뮬레이터 환경&lt;/h3&gt;

&lt;p&gt;로컬 에뮬레이터는 호스트 메모리 버퍼를 통해 데이터를 전달하므로 네트워크 전송 병목이 없습니다. 5회 반복 측정 후 중앙값 기준입니다.&lt;/p&gt;

&lt;h4 id="-기본-compose-앱-약-1112mb"&gt;① 기본 Compose 앱 (약 11~12MB)&lt;/h4&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;시나리오&lt;/th&gt;
      &lt;th style="text-align: right"&gt;adb install -r&lt;/th&gt;
      &lt;th style="text-align: right"&gt;android install (기본 delta)&lt;/th&gt;
      &lt;th style="text-align: right"&gt;android install (delta OFF)&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;fresh&lt;/td&gt;
      &lt;td style="text-align: right"&gt;0.26s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.17s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.13s&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;same&lt;/td&gt;
      &lt;td style="text-align: right"&gt;0.32s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.01s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.03s&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;code&lt;/td&gt;
      &lt;td style="text-align: right"&gt;0.32s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.01s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.07s&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;res&lt;/td&gt;
      &lt;td style="text-align: right"&gt;0.36s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.04s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.05s&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;asset&lt;/td&gt;
      &lt;td style="text-align: right"&gt;0.33s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.06s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.03s&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h4 id="-52mb-앱-대용량-에셋-포함"&gt;② 52MB 앱 (대용량 에셋 포함)&lt;/h4&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;시나리오&lt;/th&gt;
      &lt;th style="text-align: right"&gt;adb install -r&lt;/th&gt;
      &lt;th style="text-align: right"&gt;android install (기본 delta)&lt;/th&gt;
      &lt;th style="text-align: right"&gt;android install (delta OFF)&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;fresh&lt;/td&gt;
      &lt;td style="text-align: right"&gt;0.46s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.50s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.22s&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;same&lt;/td&gt;
      &lt;td style="text-align: right"&gt;0.57s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.54s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.30s&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;code&lt;/td&gt;
      &lt;td style="text-align: right"&gt;0.52s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.47s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.24s&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;res&lt;/td&gt;
      &lt;td style="text-align: right"&gt;0.48s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.42s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.28s&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;asset&lt;/td&gt;
      &lt;td style="text-align: right"&gt;0.52s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.38s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.28s&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id="결과-분석"&gt;결과 분석&lt;/h3&gt;
&lt;p&gt;로컬 에뮬레이터에서는 &lt;code class="language-plaintext highlighter-rouge"&gt;adb install -r&lt;/code&gt;이 더 빠릅니다.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Android CLI 자체를 기동하는 데 약 0.45초의 기본 오버헤드가 발생합니다.&lt;/li&gt;
  &lt;li&gt;전송 지연이 없는 환경에서는 50MB 전체를 전송하더라도 0.5초 안에 끝나므로, 차이점(Delta)을 계산하고 기기에서 패치 에이전트를 구동하는 시간이 전송 절약 시간보다 더 깁니다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id="2-실기기--wi-fi-디버깅-환경-5-mbs-대역폭-제한"&gt;2) 실기기 / Wi-Fi 디버깅 환경 (5 MB/s 대역폭 제한)&lt;/h3&gt;

&lt;p&gt;실제 개발 환경에서는 Wi-Fi 페어링 무선 디버깅이나 USB 2.0 케이블 연결처럼 &lt;strong&gt;전송 대역폭이 제한되는 환경&lt;/strong&gt;이 많습니다. 이를 재현하기 위해 에뮬레이터 포트 앞에 5 MB/s 전송 속도 제한 프록시를 두고 재측정했습니다.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;※ 배수 비교는 &lt;code class="language-plaintext highlighter-rouge"&gt;adb install -r&lt;/code&gt; 대비 &lt;code class="language-plaintext highlighter-rouge"&gt;android install&lt;/code&gt;의 소요 시간 기준이며, 절감율은 전체 APK 크기 대비 실제 전송된 패치 크기 기준입니다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4 id="-52mb-앱-대역폭-5-mbs"&gt;① 52MB 앱 (대역폭 5 MB/s)&lt;/h4&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;시나리오&lt;/th&gt;
      &lt;th style="text-align: right"&gt;adb install -r&lt;/th&gt;
      &lt;th style="text-align: right"&gt;android install (Delta ON)&lt;/th&gt;
      &lt;th&gt;절감율 / 전송량&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;fresh&lt;/td&gt;
      &lt;td style="text-align: right"&gt;10.41s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;11.63s&lt;/td&gt;
      &lt;td&gt;전체 전송 (51.80 MB)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;same&lt;/td&gt;
      &lt;td style="text-align: right"&gt;10.44s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.52s (adb 대비 약 6.8배 빠름)&lt;/td&gt;
      &lt;td&gt;554 KB 전송 (98.9% 절감)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;code&lt;/td&gt;
      &lt;td style="text-align: right"&gt;10.44s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.45s (adb 대비 약 7.2배 빠름)&lt;/td&gt;
      &lt;td&gt;584 KB 전송 (98.9% 절감)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;res&lt;/td&gt;
      &lt;td style="text-align: right"&gt;10.53s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.68s (adb 대비 약 6.3배 빠름)&lt;/td&gt;
      &lt;td&gt;1.46 MB 전송 (97.2% 절감)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;asset&lt;/td&gt;
      &lt;td style="text-align: right"&gt;10.52s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.63s (adb 대비 약 6.4배 빠름)&lt;/td&gt;
      &lt;td&gt;1.46 MB 전송 (97.2% 절감)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h4 id="-1112mb-기본-앱-대역폭-5-mbs"&gt;② 11~12MB 기본 앱 (대역폭 5 MB/s)&lt;/h4&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;시나리오&lt;/th&gt;
      &lt;th style="text-align: right"&gt;adb install -r&lt;/th&gt;
      &lt;th style="text-align: right"&gt;android install (Delta ON)&lt;/th&gt;
      &lt;th&gt;절감율 / 전송량&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;fresh&lt;/td&gt;
      &lt;td style="text-align: right"&gt;2.30s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;3.48s&lt;/td&gt;
      &lt;td&gt;전체 전송 (11.33 MB)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;same&lt;/td&gt;
      &lt;td style="text-align: right"&gt;2.31s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.28s (adb 대비 약 1.8배 빠름)&lt;/td&gt;
      &lt;td&gt;89 KB 전송 (99.2% 절감)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;code&lt;/td&gt;
      &lt;td style="text-align: right"&gt;2.32s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.29s (adb 대비 약 1.8배 빠름)&lt;/td&gt;
      &lt;td&gt;140 KB 전송 (98.8% 절감)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;res&lt;/td&gt;
      &lt;td style="text-align: right"&gt;2.40s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.54s (adb 대비 약 1.6배 빠름)&lt;/td&gt;
      &lt;td&gt;1.02 MB 전송 (91.4% 절감)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;asset&lt;/td&gt;
      &lt;td style="text-align: right"&gt;2.40s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.49s (adb 대비 약 1.6배 빠름)&lt;/td&gt;
      &lt;td&gt;1.02 MB 전송 (91.4% 절감)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id="결과-분석-1"&gt;결과 분석&lt;/h3&gt;
&lt;p&gt;전송 속도가 제한되는 네트워크나 USB 환경에서는 &lt;code class="language-plaintext highlighter-rouge"&gt;android install&lt;/code&gt;이 훨씬 빠릅니다.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;adb install -r&lt;/code&gt;은 변경된 내용이 적더라도 52MB 전체를 스트리밍 전송하므로 매번 &lt;strong&gt;10초 이상(10.44s~10.53s)&lt;/strong&gt; 걸립니다.&lt;/li&gt;
  &lt;li&gt;반면 &lt;code class="language-plaintext highlighter-rouge"&gt;android install&lt;/code&gt;은 &lt;strong&gt;584KB 패치 파일만 전송(전송량 98.9% 절감)&lt;/strong&gt;하므로 전송 시간을 0.1초대로 줄여 전체 설치를 &lt;strong&gt;1.45초(약 7.2배 빠름)&lt;/strong&gt;에 마칩니다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="4-adb-fastdeploy와의-차이"&gt;4. “adb –fastdeploy”와의 차이&lt;/h2&gt;

&lt;p&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;adb install&lt;/code&gt;에도 &lt;code class="language-plaintext highlighter-rouge"&gt;--fastdeploy&lt;/code&gt; 옵션이 있지만, 아래 경고를 출력하며 일반 전체 설치로 전환될 수도 있습니다.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Fast Deploy is only compatible with devices of API version 24 or higher, ignoring.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;반면 &lt;code class="language-plaintext highlighter-rouge"&gt;android install&lt;/code&gt;의 Delta Install은 Android Studio 배포 시스템(Deployer)의 기술을 CLI에 적용해 최신 OS에서도 정상적으로 패치 설치를 수행합니다.&lt;/p&gt;

&lt;h2 id="5-요약-및-상황별-추천"&gt;5. 요약 및 상황별 추천&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;android install&lt;/code&gt;을 써야 하는 경우
    &lt;ul&gt;
      &lt;li&gt;실기기 디버깅(특히 Wi-Fi 무선 디버깅): 코드나 리소스 일부만 수정하고 재설치할 때 전송 시간이 대폭 줄어듭니다.&lt;/li&gt;
      &lt;li&gt;대용량 프로젝트: APK 크기가 클수록 Delta 패치 전송의 절약 효과가 큽니다.&lt;/li&gt;
      &lt;li&gt;빌드와 배포 연동: &lt;code class="language-plaintext highlighter-rouge"&gt;:app&lt;/code&gt; 같은 타깃 참조를 넘겨 빌드와 설치를 명령어 하나로 실행할 때 적합합니다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;adb install&lt;/code&gt;을 써야 하는 경우
    &lt;ul&gt;
      &lt;li&gt;로컬 에뮬레이터 반복 테스트: 전송 병목이 없어 CLI 기동 오버헤드가 없는 &lt;code class="language-plaintext highlighter-rouge"&gt;adb&lt;/code&gt;가 0.2초대로 가장 빠릅니다.&lt;/li&gt;
      &lt;li&gt;가벼운 CI/CD 파이프라인: 별도의 Android CLI 스택 없이 &lt;code class="language-plaintext highlighter-rouge"&gt;platform-tools&lt;/code&gt;만 설치된 환경에서 배포할 때 유리합니다.&lt;/li&gt;
      &lt;li&gt;세부 설치 옵션 제어: &lt;code class="language-plaintext highlighter-rouge"&gt;--instant&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;--abi&lt;/code&gt;, 다중 패키지 원자적 설치 등 저수준 Package Manager 옵션이 필요할 때 사용합니다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;
</summary>
    <title>Blog: [메모] adb install vs android install 차이점 분석 및 비교</title>
    <updated>2026-11-01T18:00:00+09:00</updated>
    <dc:date>2026-11-01T18:00:00+09:00</dc:date>
  </entry>
  <entry>
    <author>
      <name>Pluu</name>
    </author>
    <content type="html">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"&gt;
&lt;html&gt;&lt;body&gt;
&lt;div class="youtube"&gt;
    &lt;iframe width="560" height="315" src="https://www.youtube.com/embed/w-auFZP5gJo" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""&gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;!--more--&gt;

&lt;p&gt;기존 안드로이드 CLI 도구는 사용자 대화형 입력(Interactive Prompt)을 요구해 AI 에이전트가 자동으로 처리하기 어려웠습니다.&lt;/p&gt;

&lt;p&gt;Android Dev Summit 2026의 “The latest in Android dev tools” 세션에서는 터미널, 데스크톱 에이전트 앱, Android Studio에서 AI 에이전트가 직접 제어할 수 있는 새로운 안드로이드 도구 체인을 발표했습니다.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;본 글은 Gemini를 사용하여 초안을 작성한 후 검수하였습니다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr&gt;

&lt;h1 id="개요-ai-코딩-에이전트-시대의-안드로이드-개발-도구"&gt;개요: AI 코딩 에이전트 시대의 안드로이드 개발 도구&lt;/h1&gt;

&lt;p&gt;&lt;img class="img-responsive" src="http://pluu.github.io/assets/img/blog/ads26/whats-new-in-android-dev-tools/01.png"&gt;&lt;/p&gt;

&lt;h3 id="핵심-구성-요소"&gt;핵심 구성 요소&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Android CLI: 터미널 스크립트, CI, 에이전트 앱, Android Studio 전체를 관통하는 단일 엔트리 포인트 도구&lt;/li&gt;
  &lt;li&gt;Agent Applications: Google Antigravity, Claude Code, OpenAI Codex 등과의 딥 인테그레이션(공식 플러그인 &amp;amp; Sidecar)&lt;/li&gt;
  &lt;li&gt;Android Studio Rabbit 2/3: ACP(Agent Client Protocol) 기반 BYOA(Bring Your Own Agent) 및 AI Change Review&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;데모 전반에는 40개 모듈로 구성된 대규모 오픈소스 오디오/비디오 팟캐스트 앱인 Pocket Casts가 사용되었습니다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr&gt;

&lt;h1 id="1-android-cli"&gt;1. Android CLI&lt;/h1&gt;

&lt;p&gt;Android CLI는 AI 에이전트가 안드로이드 도구를 실행할 때 생기는 파싱 오류와 불필요한 대기를 없애도록 만들었습니다.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;예측 가능한 명령어 체계 (Predictable commands)&lt;/li&gt;
  &lt;li&gt;JSON 등 기계가 읽기 쉬운 구조화된 출력 (Structured outputs)&lt;/li&gt;
  &lt;li&gt;추가 입력 프롬프트 없이 즉시 끝나는 비대화형 실행 (Zero interactive prompts)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img class="img-responsive" src="http://pluu.github.io/assets/img/blog/ads26/whats-new-in-android-dev-tools/02.png"&gt;&lt;/p&gt;

&lt;h3 id="주요-신규-명령어-android---ads"&gt;주요 신규 명령어 (&lt;code class="language-plaintext highlighter-rouge"&gt;android --ads&lt;/code&gt;)&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;명령어&lt;/th&gt;
      &lt;th&gt;주요 기능 및 특징&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;signals&lt;/td&gt;
      &lt;td&gt;Crashlytics의 크래시 목록 및 현장 텔레메트리 데이터를 조회&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;device&lt;/td&gt;
      &lt;td&gt;연결된 기기/에뮬레이터 미러링(device hub) 및 원격 물리 기기 대여(Reservation) 관리&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;profiler&lt;/td&gt;
      &lt;td&gt;앱, 게임, 디바이스의 시스템 트레이스(Perfetto) 및 힙 덤프 수집&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;build&lt;/td&gt;
      &lt;td&gt;Gradle 등의 빌드 아티팩트를 CLI에서 직접 빌드&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;preview&lt;/td&gt;
      &lt;td&gt;Android Studio나 실제 기기 없이 터미널에서 Jetpack Compose @Preview를 PNG 및 JSON 컴포넌트 트리로 렌더링&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;install&lt;/td&gt;
      &lt;td&gt;변경된 바이트만 전송하는 델타 푸시(Delta push) 배포 (기존 ADB 대비 대폭 시간 절약)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;input&lt;/td&gt;
      &lt;td&gt;복잡한 좌표 계산 대신 시맨틱 UI 요소를 대상으로 제스처 및 키 이벤트 전송&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;analyze&lt;/td&gt;
      &lt;td&gt;AAB/APK의 R8 설정, 난독화 비율, DEX 크기 및 리소스 분석&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;docs&lt;/td&gt;
      &lt;td&gt;공식 안드로이드 지식 베이스(KB)에서 최신 가이드 문서를 온디맨드로 로컬 검색 및 fetch&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;auth&lt;/td&gt;
      &lt;td&gt;안드로이드 CLI 도구용 Google 서비스 인증 로그인/로그아웃&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;hr&gt;

&lt;h1 id="2-터미널-환경의-에이전트-자동화-데모-claude-code"&gt;2. 터미널 환경의 에이전트 자동화 데모 (Claude Code)&lt;/h1&gt;

&lt;h2 id="1-프로덕션-크래시-재현-및-핫픽스"&gt;(1) 프로덕션 크래시 재현 및 핫픽스&lt;/h2&gt;

&lt;p&gt;Firebase Crashlytics에 보고된 실제 크래시를 에이전트가 탐색, 재현, 코드 수정, 배포 및 검증까지 단 1분 42초 만에 수정했습니다.&lt;/p&gt;

&lt;p&gt;&lt;img class="img-responsive" src="http://pluu.github.io/assets/img/blog/ads26/whats-new-in-android-dev-tools/03.png"&gt;&lt;/p&gt;

&lt;h4 id="데모"&gt;데모&lt;/h4&gt;

&lt;ol&gt;
  &lt;li&gt;크래시 탐색: &lt;code class="language-plaintext highlighter-rouge"&gt;android signals&lt;/code&gt; 명령어로 지난 30일간 사용자 발생 수가 가장 높은 크래시를 조회
    &lt;ul&gt;
      &lt;li&gt;원인: 비밀번호 재설정(“I forgot my password”) 버튼을 연속 두 번 탭하면 네비게이션이 중복 실행되어 &lt;strong&gt;IllegalArgumentException&lt;/strong&gt;이 발생
        &lt;blockquote&gt;
          &lt;p&gt;IllegalArgumentException: Navigation action … cannot be found from the current destination&lt;/p&gt;
        &lt;/blockquote&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;기기에서 재현: &lt;code class="language-plaintext highlighter-rouge"&gt;android layout&lt;/code&gt;으로 버튼 좌표를 확인한 뒤 &lt;code class="language-plaintext highlighter-rouge"&gt;android input tap&lt;/code&gt;으로 버튼을 두 번 탭해 실제 기기에서 크래시 발생&lt;/li&gt;
  &lt;li&gt;코드 수정: 중복 화면 이동을 막도록 SignInFragment.kt와 PromoCodeFragment.kt의 네비게이션 로직에 &lt;code class="language-plaintext highlighter-rouge"&gt;currentDestination&lt;/code&gt; 확인 가드를 추가&lt;/li&gt;
  &lt;li&gt;고속 재배포: &lt;code class="language-plaintext highlighter-rouge"&gt;android build&lt;/code&gt;로 빌드한 뒤 &lt;code class="language-plaintext highlighter-rouge"&gt;android install&lt;/code&gt;을 실행해 전체 84MB APK 대신 &lt;strong&gt;3.84MB 델타 패치&lt;/strong&gt;만 기기로 전송&lt;/li&gt;
  &lt;li&gt;검증: 기기에서 다시 더블 탭을 실행해 크래시 로그가 남지 않고(0 lines) 화면이 정상 유지됨을 확인&lt;/li&gt;
&lt;/ol&gt;

&lt;h4 id="사용된-android-cli-commands"&gt;사용된 Android CLI commands&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;
&lt;code class="language-plaintext highlighter-rouge"&gt;android signals crashes list --firebase-app ... --sort-by=users --timeframe=30d&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;최근 30일간 사용자 수 기준 상위 크래시 이슈 랭킹 조회&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
&lt;code class="language-plaintext highlighter-rouge"&gt;android signals crashes describe &amp;lt;issue&amp;gt; --timeframe=30d&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;해당 크래시의 상세 스택 트레이스 및 디바이스/안드로이드 OS 버전별 분포 확인&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
&lt;code class="language-plaintext highlighter-rouge"&gt;android layout --device=... --flat&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;수정 전/후 비밀번호 재설정 버튼의 좌표를 파악하기 위한 UI 레이아웃 트리 조회&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
&lt;code class="language-plaintext highlighter-rouge"&gt;android input tap --device=... "id:btnSignIn"&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;구버전 로그인 화면으로 진입하기 위한 시맨틱 탭 전송 (2회 실행)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
&lt;code class="language-plaintext highlighter-rouge"&gt;android build "gradle://?:app:assembleDebugProd"&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;수정된 코드의 빌드 산출물 생성&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
&lt;code class="language-plaintext highlighter-rouge"&gt;android install --device=...&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;초기 수정 전 빌드 설치, 핫픽스 빌드 델타 패치 주입 (84MB 중 3.84MB만 전송)&lt;br&gt;
&lt;em&gt;(참고: CLI가 지원하지 않는 화면 회전 고정, 딥링크 호출, 백키 입력, 더블탭 등 일부 작업에는 &lt;code class="language-plaintext highlighter-rouge"&gt;adb&lt;/code&gt;를 보조로 사용)&lt;/em&gt;
&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="2-apk-최적화-r8-configuration-analyzer"&gt;(2) APK 최적화: R8 Configuration Analyzer&lt;/h2&gt;

&lt;p&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;Release Bundle이 너무 크다&lt;/code&gt;는 요청에 대해 에이전트가 ProGuard/R8 룰을 분석하고 불필요한 keep 룰을 제거했습니다.&lt;/p&gt;

&lt;p&gt;&lt;img class="img-responsive" src="http://pluu.github.io/assets/img/blog/ads26/whats-new-in-android-dev-tools/04.png"&gt;&lt;/p&gt;

&lt;h4 id="데모-1"&gt;데모&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;원인 파악: Protocol Buffers keep 룰이 지나치게 포괄적이어서 불필요한 클래스까지 난독화 대상에서 제외되고 있었습니다.&lt;/p&gt;

    &lt;blockquote&gt;
      &lt;ul&gt;
        &lt;li&gt;수정 전 : -keep class * extends com.google.protobuf.GeneratedMessageLite { *; }&lt;/li&gt;
        &lt;li&gt;수정 후 : -keepclassmembers class * extends com.google.protobuf.GeneratedMessageLite { &lt;fields&gt;; }&lt;/fields&gt;
&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;클래스 전체를 유지하지 않고, 실제 사용하는 필드 멤버와 Retrofit 반환 타입으로 호출되는 API 메시지만 유지(keep)하도록 수정&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;개선 결과:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;비압축 DEX 크기: 19,485,804 B → 18,957,388 B (-528 KB, -2.7%)&lt;/li&gt;
  &lt;li&gt;APK 압축 크기: 42,311,672 B → 42,147,832 B (-164 KB)&lt;/li&gt;
  &lt;li&gt;Keep된 메서드 수: 17,940개 → 11,757개 (-6,183개 제거, -34%)&lt;/li&gt;
  &lt;li&gt;Keep된 필드 수: 7,944개 → 7,209개 (-735개 감소)&lt;/li&gt;
  &lt;li&gt;Keep된 클래스 수: 2,342개 → 2,268개 (-74개 감소)&lt;/li&gt;
  &lt;li&gt;DEX 난독화 비율: 92.72% → 93.06% (+0.34%p)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id="사용된-android-cli-commands-1"&gt;사용된 Android CLI commands&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;
&lt;code class="language-plaintext highlighter-rouge"&gt;android analyze ./before/app-release.apk&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;수정 전 베이스라인 APK의 DEX 크기, R8 설정 및 난독화 비율(Obfuscation ratio) 측정&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
&lt;code class="language-plaintext highlighter-rouge"&gt;android analyze ./after/app-release.apk&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;룰 수정 후 생성된 APK의 수치를 동일하게 추출하여 개선 지표 비교&lt;br&gt;
&lt;em&gt;(참고: CLI에 Configuration Analyzer 출력 파싱 명령어가 없어 상위 룰 랭킹에는 보조 스크립트 활용)&lt;/em&gt;
&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="3-앱-시작-시간startup-time-최적화-baseline-profile--profiler"&gt;(3) 앱 시작 시간(Startup Time) 최적화: Baseline Profile &amp;amp; Profiler&lt;/h2&gt;

&lt;p&gt;앱 시작 성능 개선 요청 시 에이전트가 공식 문서를 읽고 프로파일러를 통한 측정을 수행했습니다.&lt;/p&gt;

&lt;p&gt;&lt;img class="img-responsive" src="http://pluu.github.io/assets/img/blog/ads26/whats-new-in-android-dev-tools/05.png"&gt;&lt;/p&gt;

&lt;h4 id="데모-2"&gt;데모&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;원인 분석: 출시 버전 프로토타입 APK의 &lt;strong&gt;baseline.prof&lt;/strong&gt;가 약 8KB에 불과하며, 포함된 6,690개 룰 중 Pocket Casts 자체 코드 룰이 0개(전체 프로필 로드 룰 중에서도 단 66개)여서 시작 코드가 JIT/인터프리터로 구동되고 있음을 확인&lt;/li&gt;
  &lt;li&gt;최적화 수행: 공식 문서를 읽어 무루팅 환경(Android 14+)에서 베이스라인 프로필을 수집 및 생성하는 절차를 확인하고, 콜드 스타트 프로필 룰(Pocket Casts 룰 2,621개 포함)을 갱신&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id="사용된-android-cli-commands-2"&gt;사용된 Android CLI commands&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;
&lt;code class="language-plaintext highlighter-rouge"&gt;android profiler systemtrace start --launch --duration=8&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;앱 콜드 런치(Cold start) 시점의 시스템 트레이스를 Perfetto 형식(&lt;code class="language-plaintext highlighter-rouge"&gt;*.pftrace&lt;/code&gt;)으로 수집 (수집된 트레이스는 &lt;code class="language-plaintext highlighter-rouge"&gt;ui.perfetto.dev&lt;/code&gt;에서 분석)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
&lt;code class="language-plaintext highlighter-rouge"&gt;android docs fetch kb://android/topic/performance/baselineprofiles/manually-create-measure&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;Android 14+ 기기에서 루팅 없이 Baseline Profile을 수동 생성하고 측정하는 최신 공식 기술 가이드라인 로컬 fetch 및 학습&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;개선 수치 (Pixel 6 Pro 기준):&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Main-thread CPU 시간: 297.7ms → 244.7ms (-17.8%)&lt;/li&gt;
  &lt;li&gt;Total app CPU 시간: 809.3ms → 600.4ms (-25.8%)&lt;/li&gt;
  &lt;li&gt;JIT thread CPU 시간: 56.3ms → 15.6ms (-72.2%)&lt;/li&gt;
  &lt;li&gt;Time to initial display (TTID): 463.2ms → 383.4ms (-17.2% 단축)&lt;/li&gt;
&lt;/ul&gt;

&lt;hr&gt;

&lt;h1 id="3-linux-데스크탑에서-android-앱-네이티브-실행-실험적-프로토타입"&gt;3. Linux 데스크탑에서 Android 앱 네이티브 실행 (실험적 프로토타입)&lt;/h1&gt;

&lt;p&gt;별도의 무거운 에뮬레이터나 중첩 가상화(Nested Virtualization) 없이, &lt;strong&gt;Linux 데스크톱 상에서 Android x86 APK를 단일 네이티브 프로세스로 직접 실행&lt;/strong&gt;하는 새로운 기술이 공개되었습니다.&lt;/p&gt;

&lt;p&gt;&lt;img class="img-responsive" src="http://pluu.github.io/assets/img/blog/ads26/whats-new-in-android-dev-tools/06.png"&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;초경량 구조: 단일 프로세스로 실행되며 stdout/stdin으로 로그가 직접 출력됨&lt;/li&gt;
  &lt;li&gt;클라우드 에이전트 환경 최적화: 중첩 가상화를 지원하지 않는 클라우드 VM이나 CI 컨테이너에서도 에이전트가 앱을 직접 실행하고 테스트 가능&lt;/li&gt;
  &lt;li&gt;높은 완성도:
    &lt;ul&gt;
      &lt;li&gt;순수 Compose 앱 실행&lt;/li&gt;
      &lt;li&gt;네트워크 통신이 포함된 Google 레퍼런스 앱 실행&lt;/li&gt;
      &lt;li&gt;네이티브 .so 라이브러리 변환 계층을 통해 C++ 라이브러리와 오디오 출력이 포함된 실제 Pocket Casts 앱 구동&lt;/li&gt;
      &lt;li&gt;데스크톱 변환 계층을 통한 OpenGL ES 1 네이티브 게임 앱 렌더링&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;hr&gt;

&lt;h1 id="4-ai-에이전트를-위한-공식-android-플러그인"&gt;4. AI 에이전트를 위한 공식 Android 플러그인&lt;/h1&gt;

&lt;p&gt;Google Antigravity, Claude Code, OpenAI Codex를 위한 공식 Android 플러그인이 배포되었습니다.&lt;/p&gt;

&lt;p&gt;&lt;img class="img-responsive" src="http://pluu.github.io/assets/img/blog/ads26/whats-new-in-android-dev-tools/07.png"&gt;&lt;/p&gt;

&lt;p&gt;플러그인을 활성화하면 Android CLI 뿐만 아니라, 공식 최신 지식/가이드가 포함된 &lt;code class="language-plaintext highlighter-rouge"&gt;Android Skills&lt;/code&gt;가 주입되어 모델의 오래된 학습 데이터 대신 항상 최신 아키텍처 표준을 따릅니다.&lt;/p&gt;

&lt;h3 id="google-antigravity"&gt;Google Antigravity&lt;/h3&gt;

&lt;h4 id="1-android-compose-preview"&gt;(1) Android Compose Preview&lt;/h4&gt;
&lt;p&gt;AI 에이전트에게 기존 View 코드를 Compose로 변환하고 대화면(폴더블·태블릿)에 맞게 최적화하도록 요청하면, 에이전트가 &lt;code class="language-plaintext highlighter-rouge"&gt;@Preview&lt;/code&gt; 어노테이션을 작성하고 Sidecar 패널에 프리뷰 화면을 즉시 렌더링합니다.&lt;/p&gt;

&lt;p&gt;&lt;img class="img-responsive" src="http://pluu.github.io/assets/img/blog/ads26/whats-new-in-android-dev-tools/08.png"&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;전체 앱 컴파일 및 기기 배포를 반복하지 않고, Sidecar 창에서 프리뷰 렌더링을 즉시 갱신&lt;/li&gt;
  &lt;li&gt;대화면에서 1열 스크롤 대신 헤더와 에피소드 목록을 좌우로 나누는 듀얼 창(Dual-pane) 레이아웃을 제안&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id="2-android-device-hub"&gt;(2) Android Device Hub&lt;/h4&gt;
&lt;p&gt;Antigravity 내에서 가상 기기(AVD) 및 물리 기기를 통합 관리하고 화면을 직접 미러링할 수 있습니다.&lt;/p&gt;

&lt;p&gt;&lt;img class="img-responsive" src="http://pluu.github.io/assets/img/blog/ads26/whats-new-in-android-dev-tools/09.png"&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Pixel 10 Pro Fold 등 실제 연결된 기기 목록과 가상 기기(AI Glasses, Medium Phone, Small Phone 등)를 Sidecar 패널에서 통합 관리&lt;/li&gt;
  &lt;li&gt;미러링된 기기 화면을 보며 실시간 터치와 제스처로 상호작용 가능&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img class="img-responsive" src="http://pluu.github.io/assets/img/blog/ads26/whats-new-in-android-dev-tools/09_split_screen.png"&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;화면 분할(Split Screen) 전환 시 앱이 싱글 페인(Single-pane)과 듀얼 페인(Dual-pane) 사이를 적응형(Adaptive)으로 올바르게 전환하는지 실시간 검증&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id="android-cli-연동에-따른-에이전트-효율성-벤치마크"&gt;Android CLI 연동에 따른 에이전트 효율성 벤치마크&lt;/h3&gt;

&lt;p&gt;Claude Opus를 대상으로 6개 사용자 Journeys 및 6개 디바이스에서 메모리 누수를 찾고 수정하는 과제를 Android CLI 사용 여부에 따라 A/B 테스트한 결과입니다.&lt;/p&gt;

&lt;p&gt;&lt;img class="img-responsive" src="http://pluu.github.io/assets/img/blog/ads26/whats-new-in-android-dev-tools/10.png"&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;작업 완료 속도: 1.9배 향상 (88분 → 46분, 42분 단축)&lt;/li&gt;
  &lt;li&gt;토큰 사용량: 1.3배 절감 (4.6M 토큰 → 3.5M 토큰)&lt;/li&gt;
  &lt;li&gt;Compose Preview: 전통적인 컴파일/실행 반복 대비 반복 시간 77% 단축&lt;/li&gt;
  &lt;li&gt;Analyze 명령어: 다중 왕복 검사를 단일 구조화 명령어로 대체하여 출력 토큰 5.5배 절감&lt;/li&gt;
  &lt;li&gt;Semantic Input: 화면 좌표 추정 환각(Hallucination)을 없애 작업 실행 속도 25% 향상&lt;/li&gt;
&lt;/ul&gt;

&lt;hr&gt;

&lt;h1 id="5-android-studio와-ai-에이전트의-진화"&gt;5. Android Studio와 AI 에이전트의 진화&lt;/h1&gt;

&lt;h2 id="1-bring-your-own-agent-byoa-via-agent-client-protocol-acp"&gt;(1) Bring Your Own Agent (BYOA) via Agent Client Protocol (ACP)&lt;/h2&gt;

&lt;p&gt;Android Studio는 내장 Gemini 외에도, 개발자와 팀이 이미 사용 및 구독 중인 외부 에이전트를 IDE로 가져올 수 있는 BYOA 기능을 도입했습니다.&lt;/p&gt;

&lt;p&gt;&lt;img class="img-responsive" src="http://pluu.github.io/assets/img/blog/ads26/whats-new-in-android-dev-tools/11.png"&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;경로: &lt;code class="language-plaintext highlighter-rouge"&gt;Settings &amp;gt; Tools &amp;gt; AI &amp;gt; Agents&lt;/code&gt;
&lt;/li&gt;
  &lt;li&gt;Agent Client Protocol (ACP) 기반으로 다양한 에이전트 연결 지원:
    &lt;ul&gt;
      &lt;li&gt;Built-in Agent v2.0&lt;/li&gt;
      &lt;li&gt;Google Antigravity&lt;/li&gt;
      &lt;li&gt;Claude Agent (Claude Code / Anthropic API 연동)&lt;/li&gt;
      &lt;li&gt;OpenAI Codex&lt;/li&gt;
      &lt;li&gt;JetBrains Junie&lt;/li&gt;
      &lt;li&gt;ACP Agent Marketplace&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;기존 개인 구독이나 기업용 계정을 그대로 활용 가능&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img class="img-responsive" src="http://pluu.github.io/assets/img/blog/ads26/whats-new-in-android-dev-tools/12.png"&gt;&lt;/p&gt;

&lt;p&gt;연결된 에이전트(예: Claude Opus 5.5)는 Android Studio의 모든 도구 체인(파일 수정, 정적 분석, 빌드, Gradle 싱크, Compose 프리뷰 렌더링, 기기 배포, 공식 문서 조회)에 직접 접근할 수 있습니다.&lt;/p&gt;

&lt;h2 id="2-ai-change-review"&gt;(2) AI Change Review&lt;/h2&gt;

&lt;p&gt;대량의 코드를 검토할 때 버그를 사전에 잡을 수 있도록 지원하는 코드 리뷰 기능입니다. 로컬 변경점뿐만 아니라 PR도 분석합니다.&lt;/p&gt;

&lt;p&gt;&lt;img class="img-responsive" src="http://pluu.github.io/assets/img/blog/ads26/whats-new-in-android-dev-tools/13.png"&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;15개 파일, 800줄의 PR 변경점을 분석해 잠재적 버그를 사전에 감지&lt;/li&gt;
  &lt;li&gt;데모에서 발견된 실제 이슈:
    &lt;ul&gt;
      &lt;li&gt;북마크 스와이프 행 컴포저블(SwipeRow.kt)에서 LaunchedEffect 키가 람다 객체로 설정되어 있어, 행이 Recomposition될 때마다 풀 스와이프 동작이 중복 실행되는 버그&lt;/li&gt;
      &lt;li&gt;삭제 다이얼로그가 뜬 상태에서 북마크 삭제 확인 다이얼로그가 계속 중복 노출되는 문제&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;해결책 제시 및 일괄 반영: 원인을 설명하고 rememberUpdatedState를 적용한 코드 diff를 제공합니다. 체크박스로 선택한 이슈를 버튼 한 번으로 일괄 수정(Fix all selected issues) 가능&lt;/li&gt;
  &lt;li&gt;주제별 워크스루(&lt;code class="language-plaintext highlighter-rouge"&gt;Walkthrough&lt;/code&gt;): PR 내 변경 사항을 기능 단위로 묶어 코드 변경 내역을 확인하고 승인 가능&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="3-android-studio-rabbit-릴리스-현황"&gt;(3) Android Studio Rabbit 릴리스 현황&lt;/h2&gt;

&lt;p&gt;&lt;img class="img-responsive" src="http://pluu.github.io/assets/img/blog/ads26/whats-new-in-android-dev-tools/14.png"&gt;&lt;/p&gt;

&lt;p&gt;&lt;img class="img-responsive" src="http://pluu.github.io/assets/img/blog/ads26/whats-new-in-android-dev-tools/15.png"&gt;&lt;/p&gt;

&lt;h1 id="관련-링크"&gt;관련 링크&lt;/h1&gt;
&lt;ul&gt;
  &lt;li&gt;Watch Tools &amp;amp; Performance sessions: &lt;a href="https://goo.gle/ADS26-Tools-and-Perf"&gt;goo.gle/ADS26-Tools-and-Perf&lt;/a&gt;
&lt;/li&gt;
  &lt;li&gt;Watch all sessions from Android Dev Summit 2026: &lt;a href="https://goo.gle/ADS26-All-Sessions"&gt;goo.gle/ADS26-All-Sessions&lt;/a&gt;
&lt;/li&gt;
  &lt;li&gt;Android CLI 피드백: &lt;a href="https://d.android.com/cli"&gt;d.android.com/cli&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/body&gt;&lt;/html&gt;
</content>
    <id>http://pluu.github.io/blog/android/androiddevsummit/2026/10/31/ads26-whats-new-in-android-dev-tools/</id>
    <link href="http://pluu.github.io/blog/android/androiddevsummit/2026/10/31/ads26-whats-new-in-android-dev-tools/"/>
    <summary type="html">&lt;div class="youtube"&gt;
    &lt;iframe width="560" height="315" src="https://www.youtube.com/embed/w-auFZP5gJo" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""&gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;!--more--&gt;

&lt;p&gt;기존 안드로이드 CLI 도구는 사용자 대화형 입력(Interactive Prompt)을 요구해 AI 에이전트가 자동으로 처리하기 어려웠습니다.&lt;/p&gt;

&lt;p&gt;Android Dev Summit 2026의 “The latest in Android dev tools” 세션에서는 터미널, 데스크톱 에이전트 앱, Android Studio에서 AI 에이전트가 직접 제어할 수 있는 새로운 안드로이드 도구 체인을 발표했습니다.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;본 글은 Gemini를 사용하여 초안을 작성한 후 검수하였습니다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h1 id="개요-ai-코딩-에이전트-시대의-안드로이드-개발-도구"&gt;개요: AI 코딩 에이전트 시대의 안드로이드 개발 도구&lt;/h1&gt;

&lt;p&gt;&lt;img class="img-responsive" src="/assets/img/blog/ads26/whats-new-in-android-dev-tools/01.png" /&gt;&lt;/p&gt;

&lt;h3 id="핵심-구성-요소"&gt;핵심 구성 요소&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Android CLI: 터미널 스크립트, CI, 에이전트 앱, Android Studio 전체를 관통하는 단일 엔트리 포인트 도구&lt;/li&gt;
  &lt;li&gt;Agent Applications: Google Antigravity, Claude Code, OpenAI Codex 등과의 딥 인테그레이션(공식 플러그인 &amp;amp; Sidecar)&lt;/li&gt;
  &lt;li&gt;Android Studio Rabbit 2/3: ACP(Agent Client Protocol) 기반 BYOA(Bring Your Own Agent) 및 AI Change Review&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;데모 전반에는 40개 모듈로 구성된 대규모 오픈소스 오디오/비디오 팟캐스트 앱인 Pocket Casts가 사용되었습니다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h1 id="1-android-cli"&gt;1. Android CLI&lt;/h1&gt;

&lt;p&gt;Android CLI는 AI 에이전트가 안드로이드 도구를 실행할 때 생기는 파싱 오류와 불필요한 대기를 없애도록 만들었습니다.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;예측 가능한 명령어 체계 (Predictable commands)&lt;/li&gt;
  &lt;li&gt;JSON 등 기계가 읽기 쉬운 구조화된 출력 (Structured outputs)&lt;/li&gt;
  &lt;li&gt;추가 입력 프롬프트 없이 즉시 끝나는 비대화형 실행 (Zero interactive prompts)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img class="img-responsive" src="/assets/img/blog/ads26/whats-new-in-android-dev-tools/02.png" /&gt;&lt;/p&gt;

&lt;h3 id="주요-신규-명령어-android---ads"&gt;주요 신규 명령어 (&lt;code class="language-plaintext highlighter-rouge"&gt;android --ads&lt;/code&gt;)&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;명령어&lt;/th&gt;
      &lt;th&gt;주요 기능 및 특징&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;signals&lt;/td&gt;
      &lt;td&gt;Crashlytics의 크래시 목록 및 현장 텔레메트리 데이터를 조회&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;device&lt;/td&gt;
      &lt;td&gt;연결된 기기/에뮬레이터 미러링(device hub) 및 원격 물리 기기 대여(Reservation) 관리&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;profiler&lt;/td&gt;
      &lt;td&gt;앱, 게임, 디바이스의 시스템 트레이스(Perfetto) 및 힙 덤프 수집&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;build&lt;/td&gt;
      &lt;td&gt;Gradle 등의 빌드 아티팩트를 CLI에서 직접 빌드&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;preview&lt;/td&gt;
      &lt;td&gt;Android Studio나 실제 기기 없이 터미널에서 Jetpack Compose @Preview를 PNG 및 JSON 컴포넌트 트리로 렌더링&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;install&lt;/td&gt;
      &lt;td&gt;변경된 바이트만 전송하는 델타 푸시(Delta push) 배포 (기존 ADB 대비 대폭 시간 절약)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;input&lt;/td&gt;
      &lt;td&gt;복잡한 좌표 계산 대신 시맨틱 UI 요소를 대상으로 제스처 및 키 이벤트 전송&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;analyze&lt;/td&gt;
      &lt;td&gt;AAB/APK의 R8 설정, 난독화 비율, DEX 크기 및 리소스 분석&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;docs&lt;/td&gt;
      &lt;td&gt;공식 안드로이드 지식 베이스(KB)에서 최신 가이드 문서를 온디맨드로 로컬 검색 및 fetch&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;auth&lt;/td&gt;
      &lt;td&gt;안드로이드 CLI 도구용 Google 서비스 인증 로그인/로그아웃&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;hr /&gt;

&lt;h1 id="2-터미널-환경의-에이전트-자동화-데모-claude-code"&gt;2. 터미널 환경의 에이전트 자동화 데모 (Claude Code)&lt;/h1&gt;

&lt;h2 id="1-프로덕션-크래시-재현-및-핫픽스"&gt;(1) 프로덕션 크래시 재현 및 핫픽스&lt;/h2&gt;

&lt;p&gt;Firebase Crashlytics에 보고된 실제 크래시를 에이전트가 탐색, 재현, 코드 수정, 배포 및 검증까지 단 1분 42초 만에 수정했습니다.&lt;/p&gt;

&lt;p&gt;&lt;img class="img-responsive" src="/assets/img/blog/ads26/whats-new-in-android-dev-tools/03.png" /&gt;&lt;/p&gt;

&lt;h4 id="데모"&gt;데모&lt;/h4&gt;

&lt;ol&gt;
  &lt;li&gt;크래시 탐색: &lt;code class="language-plaintext highlighter-rouge"&gt;android signals&lt;/code&gt; 명령어로 지난 30일간 사용자 발생 수가 가장 높은 크래시를 조회
    &lt;ul&gt;
      &lt;li&gt;원인: 비밀번호 재설정(“I forgot my password”) 버튼을 연속 두 번 탭하면 네비게이션이 중복 실행되어 &lt;strong&gt;IllegalArgumentException&lt;/strong&gt;이 발생
        &lt;blockquote&gt;
          &lt;p&gt;IllegalArgumentException: Navigation action … cannot be found from the current destination&lt;/p&gt;
        &lt;/blockquote&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;기기에서 재현: &lt;code class="language-plaintext highlighter-rouge"&gt;android layout&lt;/code&gt;으로 버튼 좌표를 확인한 뒤 &lt;code class="language-plaintext highlighter-rouge"&gt;android input tap&lt;/code&gt;으로 버튼을 두 번 탭해 실제 기기에서 크래시 발생&lt;/li&gt;
  &lt;li&gt;코드 수정: 중복 화면 이동을 막도록 SignInFragment.kt와 PromoCodeFragment.kt의 네비게이션 로직에 &lt;code class="language-plaintext highlighter-rouge"&gt;currentDestination&lt;/code&gt; 확인 가드를 추가&lt;/li&gt;
  &lt;li&gt;고속 재배포: &lt;code class="language-plaintext highlighter-rouge"&gt;android build&lt;/code&gt;로 빌드한 뒤 &lt;code class="language-plaintext highlighter-rouge"&gt;android install&lt;/code&gt;을 실행해 전체 84MB APK 대신 &lt;strong&gt;3.84MB 델타 패치&lt;/strong&gt;만 기기로 전송&lt;/li&gt;
  &lt;li&gt;검증: 기기에서 다시 더블 탭을 실행해 크래시 로그가 남지 않고(0 lines) 화면이 정상 유지됨을 확인&lt;/li&gt;
&lt;/ol&gt;

&lt;h4 id="사용된-android-cli-commands"&gt;사용된 Android CLI commands&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;android signals crashes list --firebase-app ... --sort-by=users --timeframe=30d&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;최근 30일간 사용자 수 기준 상위 크래시 이슈 랭킹 조회&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;android signals crashes describe &amp;lt;issue&amp;gt; --timeframe=30d&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;해당 크래시의 상세 스택 트레이스 및 디바이스/안드로이드 OS 버전별 분포 확인&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;android layout --device=... --flat&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;수정 전/후 비밀번호 재설정 버튼의 좌표를 파악하기 위한 UI 레이아웃 트리 조회&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;android input tap --device=... "id:btnSignIn"&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;구버전 로그인 화면으로 진입하기 위한 시맨틱 탭 전송 (2회 실행)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;android build "gradle://?:app:assembleDebugProd"&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;수정된 코드의 빌드 산출물 생성&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;android install --device=...&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;초기 수정 전 빌드 설치, 핫픽스 빌드 델타 패치 주입 (84MB 중 3.84MB만 전송)&lt;br /&gt;
&lt;em&gt;(참고: CLI가 지원하지 않는 화면 회전 고정, 딥링크 호출, 백키 입력, 더블탭 등 일부 작업에는 &lt;code class="language-plaintext highlighter-rouge"&gt;adb&lt;/code&gt;를 보조로 사용)&lt;/em&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="2-apk-최적화-r8-configuration-analyzer"&gt;(2) APK 최적화: R8 Configuration Analyzer&lt;/h2&gt;

&lt;p&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;Release Bundle이 너무 크다&lt;/code&gt;는 요청에 대해 에이전트가 ProGuard/R8 룰을 분석하고 불필요한 keep 룰을 제거했습니다.&lt;/p&gt;

&lt;p&gt;&lt;img class="img-responsive" src="/assets/img/blog/ads26/whats-new-in-android-dev-tools/04.png" /&gt;&lt;/p&gt;

&lt;h4 id="데모-1"&gt;데모&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;원인 파악: Protocol Buffers keep 룰이 지나치게 포괄적이어서 불필요한 클래스까지 난독화 대상에서 제외되고 있었습니다.&lt;/p&gt;

    &lt;blockquote&gt;
      &lt;ul&gt;
        &lt;li&gt;수정 전 : -keep class * extends com.google.protobuf.GeneratedMessageLite { *; }&lt;/li&gt;
        &lt;li&gt;수정 후 : -keepclassmembers class * extends com.google.protobuf.GeneratedMessageLite { &lt;fields&gt;; }&lt;/fields&gt;&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;클래스 전체를 유지하지 않고, 실제 사용하는 필드 멤버와 Retrofit 반환 타입으로 호출되는 API 메시지만 유지(keep)하도록 수정&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;개선 결과:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;비압축 DEX 크기: 19,485,804 B → 18,957,388 B (-528 KB, -2.7%)&lt;/li&gt;
  &lt;li&gt;APK 압축 크기: 42,311,672 B → 42,147,832 B (-164 KB)&lt;/li&gt;
  &lt;li&gt;Keep된 메서드 수: 17,940개 → 11,757개 (-6,183개 제거, -34%)&lt;/li&gt;
  &lt;li&gt;Keep된 필드 수: 7,944개 → 7,209개 (-735개 감소)&lt;/li&gt;
  &lt;li&gt;Keep된 클래스 수: 2,342개 → 2,268개 (-74개 감소)&lt;/li&gt;
  &lt;li&gt;DEX 난독화 비율: 92.72% → 93.06% (+0.34%p)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id="사용된-android-cli-commands-1"&gt;사용된 Android CLI commands&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;android analyze ./before/app-release.apk&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;수정 전 베이스라인 APK의 DEX 크기, R8 설정 및 난독화 비율(Obfuscation ratio) 측정&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;android analyze ./after/app-release.apk&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;룰 수정 후 생성된 APK의 수치를 동일하게 추출하여 개선 지표 비교&lt;br /&gt;
&lt;em&gt;(참고: CLI에 Configuration Analyzer 출력 파싱 명령어가 없어 상위 룰 랭킹에는 보조 스크립트 활용)&lt;/em&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="3-앱-시작-시간startup-time-최적화-baseline-profile--profiler"&gt;(3) 앱 시작 시간(Startup Time) 최적화: Baseline Profile &amp;amp; Profiler&lt;/h2&gt;

&lt;p&gt;앱 시작 성능 개선 요청 시 에이전트가 공식 문서를 읽고 프로파일러를 통한 측정을 수행했습니다.&lt;/p&gt;

&lt;p&gt;&lt;img class="img-responsive" src="/assets/img/blog/ads26/whats-new-in-android-dev-tools/05.png" /&gt;&lt;/p&gt;

&lt;h4 id="데모-2"&gt;데모&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;원인 분석: 출시 버전 프로토타입 APK의 &lt;strong&gt;baseline.prof&lt;/strong&gt;가 약 8KB에 불과하며, 포함된 6,690개 룰 중 Pocket Casts 자체 코드 룰이 0개(전체 프로필 로드 룰 중에서도 단 66개)여서 시작 코드가 JIT/인터프리터로 구동되고 있음을 확인&lt;/li&gt;
  &lt;li&gt;최적화 수행: 공식 문서를 읽어 무루팅 환경(Android 14+)에서 베이스라인 프로필을 수집 및 생성하는 절차를 확인하고, 콜드 스타트 프로필 룰(Pocket Casts 룰 2,621개 포함)을 갱신&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id="사용된-android-cli-commands-2"&gt;사용된 Android CLI commands&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;android profiler systemtrace start --launch --duration=8&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;앱 콜드 런치(Cold start) 시점의 시스템 트레이스를 Perfetto 형식(&lt;code class="language-plaintext highlighter-rouge"&gt;*.pftrace&lt;/code&gt;)으로 수집 (수집된 트레이스는 &lt;code class="language-plaintext highlighter-rouge"&gt;ui.perfetto.dev&lt;/code&gt;에서 분석)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;android docs fetch kb://android/topic/performance/baselineprofiles/manually-create-measure&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;Android 14+ 기기에서 루팅 없이 Baseline Profile을 수동 생성하고 측정하는 최신 공식 기술 가이드라인 로컬 fetch 및 학습&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;개선 수치 (Pixel 6 Pro 기준):&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Main-thread CPU 시간: 297.7ms → 244.7ms (-17.8%)&lt;/li&gt;
  &lt;li&gt;Total app CPU 시간: 809.3ms → 600.4ms (-25.8%)&lt;/li&gt;
  &lt;li&gt;JIT thread CPU 시간: 56.3ms → 15.6ms (-72.2%)&lt;/li&gt;
  &lt;li&gt;Time to initial display (TTID): 463.2ms → 383.4ms (-17.2% 단축)&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h1 id="3-linux-데스크탑에서-android-앱-네이티브-실행-실험적-프로토타입"&gt;3. Linux 데스크탑에서 Android 앱 네이티브 실행 (실험적 프로토타입)&lt;/h1&gt;

&lt;p&gt;별도의 무거운 에뮬레이터나 중첩 가상화(Nested Virtualization) 없이, &lt;strong&gt;Linux 데스크톱 상에서 Android x86 APK를 단일 네이티브 프로세스로 직접 실행&lt;/strong&gt;하는 새로운 기술이 공개되었습니다.&lt;/p&gt;

&lt;p&gt;&lt;img class="img-responsive" src="/assets/img/blog/ads26/whats-new-in-android-dev-tools/06.png" /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;초경량 구조: 단일 프로세스로 실행되며 stdout/stdin으로 로그가 직접 출력됨&lt;/li&gt;
  &lt;li&gt;클라우드 에이전트 환경 최적화: 중첩 가상화를 지원하지 않는 클라우드 VM이나 CI 컨테이너에서도 에이전트가 앱을 직접 실행하고 테스트 가능&lt;/li&gt;
  &lt;li&gt;높은 완성도:
    &lt;ul&gt;
      &lt;li&gt;순수 Compose 앱 실행&lt;/li&gt;
      &lt;li&gt;네트워크 통신이 포함된 Google 레퍼런스 앱 실행&lt;/li&gt;
      &lt;li&gt;네이티브 .so 라이브러리 변환 계층을 통해 C++ 라이브러리와 오디오 출력이 포함된 실제 Pocket Casts 앱 구동&lt;/li&gt;
      &lt;li&gt;데스크톱 변환 계층을 통한 OpenGL ES 1 네이티브 게임 앱 렌더링&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h1 id="4-ai-에이전트를-위한-공식-android-플러그인"&gt;4. AI 에이전트를 위한 공식 Android 플러그인&lt;/h1&gt;

&lt;p&gt;Google Antigravity, Claude Code, OpenAI Codex를 위한 공식 Android 플러그인이 배포되었습니다.&lt;/p&gt;

&lt;p&gt;&lt;img class="img-responsive" src="/assets/img/blog/ads26/whats-new-in-android-dev-tools/07.png" /&gt;&lt;/p&gt;

&lt;p&gt;플러그인을 활성화하면 Android CLI 뿐만 아니라, 공식 최신 지식/가이드가 포함된 &lt;code class="language-plaintext highlighter-rouge"&gt;Android Skills&lt;/code&gt;가 주입되어 모델의 오래된 학습 데이터 대신 항상 최신 아키텍처 표준을 따릅니다.&lt;/p&gt;

&lt;h3 id="google-antigravity"&gt;Google Antigravity&lt;/h3&gt;

&lt;h4 id="1-android-compose-preview"&gt;(1) Android Compose Preview&lt;/h4&gt;
&lt;p&gt;AI 에이전트에게 기존 View 코드를 Compose로 변환하고 대화면(폴더블·태블릿)에 맞게 최적화하도록 요청하면, 에이전트가 &lt;code class="language-plaintext highlighter-rouge"&gt;@Preview&lt;/code&gt; 어노테이션을 작성하고 Sidecar 패널에 프리뷰 화면을 즉시 렌더링합니다.&lt;/p&gt;

&lt;p&gt;&lt;img class="img-responsive" src="/assets/img/blog/ads26/whats-new-in-android-dev-tools/08.png" /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;전체 앱 컴파일 및 기기 배포를 반복하지 않고, Sidecar 창에서 프리뷰 렌더링을 즉시 갱신&lt;/li&gt;
  &lt;li&gt;대화면에서 1열 스크롤 대신 헤더와 에피소드 목록을 좌우로 나누는 듀얼 창(Dual-pane) 레이아웃을 제안&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id="2-android-device-hub"&gt;(2) Android Device Hub&lt;/h4&gt;
&lt;p&gt;Antigravity 내에서 가상 기기(AVD) 및 물리 기기를 통합 관리하고 화면을 직접 미러링할 수 있습니다.&lt;/p&gt;

&lt;p&gt;&lt;img class="img-responsive" src="/assets/img/blog/ads26/whats-new-in-android-dev-tools/09.png" /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Pixel 10 Pro Fold 등 실제 연결된 기기 목록과 가상 기기(AI Glasses, Medium Phone, Small Phone 등)를 Sidecar 패널에서 통합 관리&lt;/li&gt;
  &lt;li&gt;미러링된 기기 화면을 보며 실시간 터치와 제스처로 상호작용 가능&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img class="img-responsive" src="/assets/img/blog/ads26/whats-new-in-android-dev-tools/09_split_screen.png" /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;화면 분할(Split Screen) 전환 시 앱이 싱글 페인(Single-pane)과 듀얼 페인(Dual-pane) 사이를 적응형(Adaptive)으로 올바르게 전환하는지 실시간 검증&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id="android-cli-연동에-따른-에이전트-효율성-벤치마크"&gt;Android CLI 연동에 따른 에이전트 효율성 벤치마크&lt;/h3&gt;

&lt;p&gt;Claude Opus를 대상으로 6개 사용자 Journeys 및 6개 디바이스에서 메모리 누수를 찾고 수정하는 과제를 Android CLI 사용 여부에 따라 A/B 테스트한 결과입니다.&lt;/p&gt;

&lt;p&gt;&lt;img class="img-responsive" src="/assets/img/blog/ads26/whats-new-in-android-dev-tools/10.png" /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;작업 완료 속도: 1.9배 향상 (88분 → 46분, 42분 단축)&lt;/li&gt;
  &lt;li&gt;토큰 사용량: 1.3배 절감 (4.6M 토큰 → 3.5M 토큰)&lt;/li&gt;
  &lt;li&gt;Compose Preview: 전통적인 컴파일/실행 반복 대비 반복 시간 77% 단축&lt;/li&gt;
  &lt;li&gt;Analyze 명령어: 다중 왕복 검사를 단일 구조화 명령어로 대체하여 출력 토큰 5.5배 절감&lt;/li&gt;
  &lt;li&gt;Semantic Input: 화면 좌표 추정 환각(Hallucination)을 없애 작업 실행 속도 25% 향상&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h1 id="5-android-studio와-ai-에이전트의-진화"&gt;5. Android Studio와 AI 에이전트의 진화&lt;/h1&gt;

&lt;h2 id="1-bring-your-own-agent-byoa-via-agent-client-protocol-acp"&gt;(1) Bring Your Own Agent (BYOA) via Agent Client Protocol (ACP)&lt;/h2&gt;

&lt;p&gt;Android Studio는 내장 Gemini 외에도, 개발자와 팀이 이미 사용 및 구독 중인 외부 에이전트를 IDE로 가져올 수 있는 BYOA 기능을 도입했습니다.&lt;/p&gt;

&lt;p&gt;&lt;img class="img-responsive" src="/assets/img/blog/ads26/whats-new-in-android-dev-tools/11.png" /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;경로: &lt;code class="language-plaintext highlighter-rouge"&gt;Settings &amp;gt; Tools &amp;gt; AI &amp;gt; Agents&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Agent Client Protocol (ACP) 기반으로 다양한 에이전트 연결 지원:
    &lt;ul&gt;
      &lt;li&gt;Built-in Agent v2.0&lt;/li&gt;
      &lt;li&gt;Google Antigravity&lt;/li&gt;
      &lt;li&gt;Claude Agent (Claude Code / Anthropic API 연동)&lt;/li&gt;
      &lt;li&gt;OpenAI Codex&lt;/li&gt;
      &lt;li&gt;JetBrains Junie&lt;/li&gt;
      &lt;li&gt;ACP Agent Marketplace&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;기존 개인 구독이나 기업용 계정을 그대로 활용 가능&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img class="img-responsive" src="/assets/img/blog/ads26/whats-new-in-android-dev-tools/12.png" /&gt;&lt;/p&gt;

&lt;p&gt;연결된 에이전트(예: Claude Opus 5.5)는 Android Studio의 모든 도구 체인(파일 수정, 정적 분석, 빌드, Gradle 싱크, Compose 프리뷰 렌더링, 기기 배포, 공식 문서 조회)에 직접 접근할 수 있습니다.&lt;/p&gt;

&lt;h2 id="2-ai-change-review"&gt;(2) AI Change Review&lt;/h2&gt;

&lt;p&gt;대량의 코드를 검토할 때 버그를 사전에 잡을 수 있도록 지원하는 코드 리뷰 기능입니다. 로컬 변경점뿐만 아니라 PR도 분석합니다.&lt;/p&gt;

&lt;p&gt;&lt;img class="img-responsive" src="/assets/img/blog/ads26/whats-new-in-android-dev-tools/13.png" /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;15개 파일, 800줄의 PR 변경점을 분석해 잠재적 버그를 사전에 감지&lt;/li&gt;
  &lt;li&gt;데모에서 발견된 실제 이슈:
    &lt;ul&gt;
      &lt;li&gt;북마크 스와이프 행 컴포저블(SwipeRow.kt)에서 LaunchedEffect 키가 람다 객체로 설정되어 있어, 행이 Recomposition될 때마다 풀 스와이프 동작이 중복 실행되는 버그&lt;/li&gt;
      &lt;li&gt;삭제 다이얼로그가 뜬 상태에서 북마크 삭제 확인 다이얼로그가 계속 중복 노출되는 문제&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;해결책 제시 및 일괄 반영: 원인을 설명하고 rememberUpdatedState를 적용한 코드 diff를 제공합니다. 체크박스로 선택한 이슈를 버튼 한 번으로 일괄 수정(Fix all selected issues) 가능&lt;/li&gt;
  &lt;li&gt;주제별 워크스루(&lt;code class="language-plaintext highlighter-rouge"&gt;Walkthrough&lt;/code&gt;): PR 내 변경 사항을 기능 단위로 묶어 코드 변경 내역을 확인하고 승인 가능&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="3-android-studio-rabbit-릴리스-현황"&gt;(3) Android Studio Rabbit 릴리스 현황&lt;/h2&gt;

&lt;p&gt;&lt;img class="img-responsive" src="/assets/img/blog/ads26/whats-new-in-android-dev-tools/14.png" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img class="img-responsive" src="/assets/img/blog/ads26/whats-new-in-android-dev-tools/15.png" /&gt;&lt;/p&gt;

&lt;h1 id="관련-링크"&gt;관련 링크&lt;/h1&gt;
&lt;ul&gt;
  &lt;li&gt;Watch Tools &amp;amp; Performance sessions: &lt;a href="https://goo.gle/ADS26-Tools-and-Perf"&gt;goo.gle/ADS26-Tools-and-Perf&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Watch all sessions from Android Dev Summit 2026: &lt;a href="https://goo.gle/ADS26-All-Sessions"&gt;goo.gle/ADS26-All-Sessions&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Android CLI 피드백: &lt;a href="https://d.android.com/cli"&gt;d.android.com/cli&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</summary>
    <title>Blog: [요약] The latest in Android dev tools (Android Dev Summit '26)</title>
    <updated>2026-10-31T21:00:00+09:00</updated>
    <dc:date>2026-10-31T21:00:00+09:00</dc:date>
  </entry>
  <entry>
    <author>
      <name>Outsider</name>
    </author>
    <content type="html">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"&gt;
&lt;html&gt;&lt;body&gt;
&lt;h2&gt;웹개발 관련&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.joshwcomeau.com/css/interop-2027/"&gt;The Future of CSS ✨&lt;/a&gt;&lt;/strong&gt; : 브라우저 업체들이 협력해 브라우저 간 새로운 기능 도입을 원활하게 하는 Interop 프로젝트에서 2027년에 원하는 기능을 투표받고 있다. Josh Comeau가 자신이 투표한 10가지 기능을 정리했다. 함수 기능을 지원하는 CSS Function, 다양한 모서리를 지원하는 &lt;code&gt;corner-shape&lt;/code&gt;, 테두리를 원하는 대로 그릴 수 있는 &lt;code&gt;border-shape&lt;/code&gt;, 앵커 위치 지정 API 레벨 2, 상속 값을 계산에 사용할 수 있는 &lt;code&gt;inherit()&lt;/code&gt;를 소개한다. 스크롤 트리거 애니메이션, 반응형 디자인에서 요소의 순서를 조정할 수 있는 &lt;code&gt;reading-flow&lt;/code&gt;와 &lt;code&gt;reading-order&lt;/code&gt;도 다룬다. &lt;code&gt;auto&lt;/code&gt; 같은 키워드 값 사이에서 애니메이션을 적용할 수 있는 &lt;code&gt;interpolate-size&lt;/code&gt;와 &lt;code&gt;calc-size()&lt;/code&gt;, 그리드 갭 꾸미기 기능, 스크롤 상태 컨테이너 쿼리 기능도 소개한다.(영어)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://blog.cloudflare.com/typescript-rust-port"&gt;Introducing tsrs: a Port of TypeScript to Rust&lt;/a&gt;&lt;/strong&gt; : Cloudflare와 VoidZero가 Max Schwenk와 함께 TypeScript 컴파일러를 Rust로 포팅한 &lt;a href="https://building.owner.com/tsrs"&gt;tsrs&lt;/a&gt;를 개발하고 있다. 언어의 설계와 방향은 TypeScript 팀이 주도할 수 있도록 긴밀하게 협력하고 있고 &lt;a href="https://building.owner.com/tsrs"&gt;tsrs&lt;/a&gt;는 개발자들이 기다리는 시간을 줄이는 것을 목표로 하고 있고 초기 벤치마크 결과는 TypeScript 7.0보다 최대 8배 빠르고 메모리는 70% 더 적게 사용한다.(영어)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://blog.cloudflare.com/deploy-with-void/"&gt;Deploy with Void&lt;/a&gt;&lt;/strong&gt; : VoidZero를 인수한 Cloudflare에서 Cloudflare 배포를 Vite 워크플로와 통합한 Void Platform, Void SDK, Void CLI를 오픈소스로 공개했다.(영어)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;그 밖의 개발 관련&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://claude.dev/blog/solving-code-review-at-anthropic/"&gt;How the Claude Code team does code review&lt;/a&gt;&lt;/strong&gt; : Anthropic에서 코드 변경 사항이 많아지면서 개선하고 있는 코드리뷰 방식을 설명한 글이다. 코드 리뷰의 주요 목적은 배포 전에 문제를 찾아내는 것인데, 사람의 검토 자원은 희소하므로 대부분을 자동화한다. 사람의 검토는 최소한으로 하면서도 롤백이나 사고 없이 병합되는 것을 목표로 한다. 모든 Pull Request에 AI 코드리뷰를 사용하고 여러 에이전트가 검토해서 실제로 문제라고 동의한 경우에만 해당 내용을 게시하고 이에 AI가 대응하게 하고 별도의 보안검토까지 끝나면 변경 등급에 따라 1명 내지 2명의 사람이 리뷰하도록 하고 있고 버그가 발생하거나 리뷰를 작성자가 대응하는 방식을 검토해서 리뷰를 계속 개선하고 있다. 사람은 diff를 읽기보다는 기계가 잘하지 못하는 의사 결정에 집중하고, 문제가 생겼을 때는 직접 해결한다.(영어)
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://machinelearning.apple.com/research/mlx-distributed-inference"&gt;Local and Distributed Large LLM Inference with MLX and RDMA on Mac Studio&lt;/a&gt;&lt;/strong&gt; : Apple silicon에서 오픈소스 배열 프레임워크인 MLX를 사용해서 Meta의 오픈 웨이트 모델인 &lt;a href="https://huggingface.co/meta-models/Muse-Spark-Open-816B-A42B"&gt;Muse Spark Open&lt;/a&gt;을 실행하는 방법을 설명한다. 512GB Mac Studio 단일 머신에서 오픈 웨이트 모델의 성능을 측정했다. 한 대에 담을 수 없는 &lt;a href="https://huggingface.co/meta-models/Muse-Spark-Open-816B-A42B"&gt;Muse Spark Open&lt;/a&gt;은 2대를 연결해 Thunderbolt 5 기반 RDMA로 통신하고, 텐서 병렬화로 추론 속도를 높인다. 이러한 개선을 통해 Mac Studio 4대의 클러스터로 초당 36개의 토큰을 생성할 수 있게 되었다.(영어)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://shopify.engineering/remote-dev"&gt;We gave AI agents a mobile dev environment&lt;/a&gt;&lt;/strong&gt; : Shopify에서 모바일 개발을 병렬로 처리할 수 있는 에이전트 기반 워크플로우를 구축했지만 로컬 컴퓨팅 자원의 제한을 해결하기 위해 작업을 위임할 수 있는 Remote Dev를 제공하게 되었다. 이는 백엔드와 웹은 River라는 Slack의 AI 에이전트로 일하던 방식을 모바일에도 적용한 것이다. 모바일의 특성을 고려해서 스크린샷을 보는 것 외에도 시뮬레이터와 WebSocket으로 연결해서 실시간으로 조작할 수 있다.(영어)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://auth0.com/blog/what-is-id-jag/"&gt;ID-JAG, Explained: The New OAuth Grant for Cross-App Access&lt;/a&gt;&lt;/strong&gt; : AI 에이전트나 SaaS 앱에서 사용자가 권한을 허용하는 과정을 계속 반복하는 문제를 해결하기 위해 새로 만든 OAuth 권한 부여 명세가 ID-JAG(Identity Assertion JWT Authorization Grant)다. AI 에이전트가 앱에 연결할 때 사용자 주도 OAuth로 매번 동의를 요청하면 사용자는 피로해져 나중에는 자동으로 동의하게 된다. 중앙에서 통제하기도 어렵고, 기존 인증은 여러 앱에 접근하는 에이전트에 맞게 설계되어 있지 않다. ID-JAG는 사용자의 동의 대신 기업 정책에 따라 접근 권한을 결정하는 방식으로 바꾼다.(영어)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://netflixtechblog.com/beyond-api-compatibility-building-a-tool-to-measure-the-blast-radius-of-library-changes-9474f2fd4f90"&gt;Beyond API Compatibility: Building a Tool to Measure the Blast Radius of Library Changes
&lt;/a&gt;&lt;/strong&gt; : Netflix에서 API나 라이브러리의 호환성을 깨뜨리는 변경 사항을 사전에 알 수 있게 저장소 전반의 심볼 정의와 참조를 색인화한 Quasar를 만들었다. Quasar를 통해 공개 API에서 무엇이 바뀌었고 변경된 심볼을 사용하는 저장소가 어디인지를 파악할 수 있다. 각 저장소의 CI에서 &lt;a href="https://github.com/scip-code/scip"&gt;SCIP&lt;/a&gt;를 사용해 언어별로 식별자의 관계를 인코딩하고 라이브러리 버전과 API 정의를 Quasar에 전송한다. Quasar에서 이 정보를 바탕으로 해당 API를 사용하는 곳을 파악할 수 있다.(영어)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.blog/news-insights/company-news/github-universe-2026-evolving-every-layer-of-the-stack/"&gt;GitHub Universe 2026: Evolving every layer of the stack&lt;/a&gt;&lt;/strong&gt; : GitHub Universe 컨퍼런스에서 에이전트를 사용할 수 있는 &lt;a href="https://github.com/features/copilot?locale=ko-kr"&gt;GitHub Copilot 앱&lt;/a&gt;, 작업에 필요한 내용을 분석한 뒤 하나 이상의 모델을 선택해서 작업하는 &lt;a href="https://docs.github.com/ko/copilot/concepts/models/copilot-fusion"&gt;Copilot Fusion&lt;/a&gt;, 병렬 세션으로 작업할 수 있는 &lt;a href="https://docs.github.com/ko/copilot/how-tos/github-copilot-app/working-with-projects"&gt;Copilot project&lt;/a&gt;를 발표했다. 기기나 도구를 바꿔도 세션을 이어갈 수 있는 &lt;a href="https://docs.github.com/ko/copilot/how-tos/copilot-on-github/use-copilot-agents/manage-and-track-agents"&gt;Session continuity&lt;/a&gt;, 저장소에서 AI 기반 워크플로우를 만들 수 있는 &lt;a href="https://docs.github.com/ko/copilot/concepts/agent-capabilities/agent-powered-workflows-and-operations/about-automations"&gt;Copilot automations&lt;/a&gt;, AI로 코드 리뷰를 하는 &lt;a href="https://docs.github.com/ko/copilot/concepts/agent-capabilities/agent-powered-workflows-and-operations/code-review"&gt;Copilot code review&lt;/a&gt;도 공개했다.(영어)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;AI 관련&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://blog.google/innovation-and-ai/models-and-research/gemini-models/introducing-gemini-4-carbon/"&gt;Introducing Gemini 4 Carbon&lt;/a&gt;&lt;/strong&gt; : Google에서 사이버 보안 역량과 장기 과제 수행 능력을 갖춘 최고 성능 모델인 Gemini 4 Carbon을 발표했다.(영어)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://openai.com/ko-KR/index/introducing-gpt-6-1-terra/"&gt;GPT-6.1 Terra 소개&lt;/a&gt;&lt;/strong&gt; : OpenAI가 빠르고 효율적인 모델인 GPT-6.1 Terra를 발표했다. GPT-5.6 Terra보다 크게 발전했고 비용도 50% 낮아졌다.(영어)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://research.meta.ai/blog/muse-spark-open"&gt;Introducing Muse Spark Open, The Most Capable US Open‑Weight Model to Date&lt;/a&gt;&lt;/strong&gt; : Meta가 미국에서 공개된 오픈 웨이트 모델 중 가장 뛰어난 &lt;a href="https://huggingface.co/meta-models/Muse-Spark-Open-816B-A42B"&gt;Muse Spark Open&lt;/a&gt;의 가중치를 공개했다. Muse Spark Open은 816B 파라미터에 42B 활성 파라미터와 1M 컨텍스트 윈도우를 갖춘 멀티모달 모델로, 장기간에 걸친 작업에서 탁월한 성능을 보여준다. 또한 Muse Spark Open은 최신 MLX 프레임워크로 Apple M5 Ultra Mac Studio 2대에서 실행되는 최초의 모델이다.(영어)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.minimax.io/blog/minimax-m31f"&gt;MiniMax M3.1 Flash: Redefining Agent Performance and Cost&lt;/a&gt;&lt;/strong&gt; : Space Bunny라는 익명의 모델로 알려진 MiniMax의 M3.1 Flash가 공개되었다. M3.1 Flash는 온라인 추론 속도를 거의 3배 높이고 비용은 70% 싸졌다.(영어)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.kimi.ai/blog/kimi-k3-1-pro"&gt;Introducing Kimi K3.1 Pro&lt;/a&gt;&lt;/strong&gt; : Moonshot에서 가장 성능이 뛰어난 3T급 오픈 웨이트 모델인 Kimi K3.1 Pro와 속도가 2~3배 빠른 Kimi K3.1 Pro Highspeed를 출시했고 모델 가중치는 11월 4일에 발표할 예정이다. Kimi K3.1 Pro는 K3를 후처리 학습한 모델로, 이 과정에 훨씬 더 많은 자원을 투입해 성능을 높였다. 벤치마크 전반에서 가장 강력한 독점 모델들과 대등하거나 근접한 성능을 보여주었다.(영어)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://huggingface.co/deepseek-ai/DeepSeek-V4.1-Flash-1017"&gt;DeepSeek-V4.1-Flash-1017&lt;/a&gt;&lt;/strong&gt; : DeepSeek-V4.1-Flash의 마이너 업데이트 버전으로 기존보다 성능이 상당히 향상되었다.(영어)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://mistral.ai/news/mistral-large-4-oss/"&gt;Mistral Large 4 (Le Chonk) is now open weight&lt;/a&gt;&lt;/strong&gt; : 10월 초에 공개되었던 1조 개의 파라미터를 가진 멀티모달 모델인 Mistral Large 4(Le Chonk)의 가중치가 공개되었다.(영어)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://block.xyz/dessa"&gt;Dessa - the Conversation Model trained only on speech&lt;/a&gt;&lt;/strong&gt; : Block에서 음성만으로 학습시킨 음성 모델 Dessa를 만들었다. 녹음 파일을 들어보면 사람처럼 자연스럽게 대화하고 리액션하는 걸 볼 수 있다. 음성만으로 학습시켜서 텍스트보다 수백 배 적은 단어로 언어를 익혔다. 덕분에 NVIDIA GB200 NVL72 한 대로 학습할 수 있었고, MacBook Pro M4 Max에서 로컬로 실행할 수 있다.(영어)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://deepmind.google/blog/genie-4-a-new-generation-of-world-simulation/"&gt;Genie 4: A new generation of world simulation&lt;/a&gt;&lt;/strong&gt; : Google이 새로운 월드 모델 Genie 4를 발표했다. Genie 4는 기존보다 훨씬 뛰어난 사실감으로 시뮬레이션을 한층 발전시켰고, 멀티모달 기능으로 오디오와 대화까지 담긴 세계를 동시에 생성할 수 있다.(영어)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://claude.com/ko/resources/articles/claude-duet"&gt;Introducing Claude Duet&lt;/a&gt;&lt;/strong&gt; : Anthropic이 능동적으로 일하는 에이전트인 Claude Duet을 리서치 프리뷰로 공개했다. iOS, Android 앱으로 사용할 수 있고 현재는 대기 신청을 하고 승인 받아야 사용할 수 있다.(영어)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://x.com/claudeai/status/2116220869479428500"&gt;We’re renaming our Max plans&lt;/a&gt;&lt;/strong&gt; : Anthropic이 Claude Max 5x 플랜을 Max로 Max 20x 플랜을 Ultra로 이름을 변경했다.(영어)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;인프라 관련&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://netflixtechblog.com/ontology-driven-observability-building-an-end-to-end-knowledge-graph-at-netflix-scale-421392cf5adf"&gt;Ontology-Driven Observability: Building an End-to-End Knowledge Graph at Netflix Scale&lt;/a&gt;&lt;/strong&gt; : Netflix는 장애의 원인을 찾을 때 Metrics, Events, Logs, Traces를 살펴보며 서로 간의 관계를 재구성하는 데 대부분의 시간을 썼다. 각 시스템은 자신의 정보만 알고 있으므로 온톨로지를 구축해 지식 그래프를 만들고 그래프 데이터베이스에 저장했다. 이제 쿼리로 한 번에 조회할 수 있다. 이는 이전에 사람이 하던 작업이지만 지식 그래프로 빠르게 할 수 있게 되었고 이를 통해 자동 근본 원인을 분석할 수 있게 되고 이를 통해 자동 복구도 할 수 있게 된다.(영어)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.linkedin.com/blog/engineering/infrastructure/rebuilding-linkedins-tracking-infrastructure-scaling-migrating-and-hardening-a-high-volume-event-pipeline"&gt;Rebuilding LinkedIn's Tracking Infrastructure: Scaling, Migrating, and Hardening a High-Volume Event Pipeline&lt;/a&gt;&lt;/strong&gt; : LinkedIn에서 사용자의 상호작용 이벤트를 수집 추적하는 시스템은 하루 수천억건의 이벤트를 처리하고 있다. 이 시스템의 기술도 낙후되고 성능 개선을 위해서 병렬로 재구축을 했다. 새 시스템에서는 공유 컨텍스트를 사용해 이벤트를 재사용함으로써 네트워크 수신량을 1/10로 줄였다. 트래픽은 점진적으로 전환하면서 이벤트의 10%를 대조해보면서 전환했고 비용 이슈상 의도적으로 100%를 이중으로 전송하지는 않았다. 비교 절차와 롤백 방법을 검증한 뒤 대용량 이벤트를 먼저 전환해서 마이그레이션에 대한 정보를 얻을 수 있었다. protocol-buffer를 Apache Avro로 전환하고 zstd 압축을 사용해서 성능을 크게 높이고 실 데이터에서 병목 구간을 최적화했다.(영어)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://mistral.ai/news/timestral/"&gt;Timestral: Mistral's time-series foundation models&lt;/a&gt;&lt;/strong&gt; : Mistral에서 시계열 파운데이션 모델인 Timestral을 발표했다. 다른 시계열 모델보다 적은 2억 900만 개의 파라미터로 여러 시계열 분야의 벤치마크에서 1위를 차지했다.(영어)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://blog.ashon.dev/blog/2026/10/24/fault-tree-to-sli.html"&gt;언제 고장 났다고 말할 수 있을까?&lt;/a&gt;&lt;/strong&gt; : 서비스가 정상인가를 판단하기 위해 FTA(Fault Tree Analysis)를 적용해서 메트릭이 아니라 무엇을 실패라고 부를지를 정의하고 그 실패가 발생할 수 있는 원인을 트리로 만들어서 SLI로 정리한다.(영어)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://engineering.fb.com/2026/10/19/data-center-engineering/inside-prometheus-meta-gigawatt-scale-supercluster/"&gt;Inside Prometheus: Meta’s Journey to a Gigawatt-Scale Supercluster&lt;/a&gt;&lt;/strong&gt; : Meta가 오하이오주 뉴올버니에 구축한 기가와트급 슈퍼클러스터 데이터센터 Prometheus의 내부를 소개했다. Prometheus의 1단계 구축은 이미 완료했고 GPU 100만개 규모로 확장하려고 준비하고 있다.(영어)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;보안 및 장애&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://cybersecuritynews.com/opencode-security-breach/"&gt;OpenCode Security Breach Exposes Third-Party API Keys of its Console Users&lt;/a&gt;&lt;/strong&gt; : 코딩 에이전트 &lt;a href="https://opencode.ai/"&gt;OpenCode&lt;/a&gt;의 Console 사용자 중 1.4%가 영향을 받은 보안 침해 사고가 발생했다. 이번 공격은 대규모 모델 증류 공격과 관련이 있고 워크스페이스에 저장된 서드파티 API가 노출되었을 수 있으므로 &lt;a href="https://x.com/opencode/status/2111519637049319818"&gt;Anthropic, OpenAI, Google과 협력 중&lt;/a&gt;이라고 밝혔다. 사용자에게는 알림이 나갔으며, 알림을 받은 사용자에게 해당 키를 폐기하고 무단 사용 내역이 있는지 살펴보라고 권하고 있다.(영어)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.php2shell.com/"&gt;PHP2Shell&lt;/a&gt;&lt;/strong&gt; : PHP에서 메모리 부족으로 인한 손상(CVE-2026-109618)과 요청 사이에 전역 상태가 남아 있는 문제(CVE-2026-109619)로 원격 코드 실행(RCE)이 가능한 취약점이 발견되었다. WordPress, Drupal 등 PHP를 사용하는 서비스도 모두 영향 받으므로 패치 버전으로 즉시 업데이트해야 한다.(영어)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.aikido.dev/blog/python-packages-vulnerable-node2shell-brotli-cve-2026-111497"&gt;Node2Shell Brotli vuln (CVE-2026-111497) evolves to HTTP2Shell, as libraries and apps using HTTP are affected.&lt;/a&gt;&lt;/strong&gt; : Brotli 압축 디코더에서 범위를 벗어난 쓰기 취약점이 발견되어 CVSS 점수 9.2를 받았으며, 치명적인 취약점으로 판정되었다. 이 취약점은 Node.js에서 발견되어 &lt;a href="https://app.opencve.io/cve/CVE-2026-111497"&gt;CVE-2026-111497&lt;/a&gt;로 분류되고 Node2Shell이라고 불렸다. 하지만 &lt;a href="https://broccoli2shell.com/"&gt;Brotli의 취약점&lt;/a&gt;이어서 Node.js뿐 아니라 Bun, Envoy, Istio, curl에도 영향을 준 것으로 밝혀졌다. OpenAI가 올해 2월 이 취약점을 발견해 Brotli에서 수정되었지만, 보안 문제로 인식되지 않아 지금까지 보안 릴리스가 나오지 않았다.(영어)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://emudhra.we-have-a-problem.com/"&gt;eMudhra Intermediate CA Compromise&lt;/a&gt;&lt;/strong&gt; : 인도의 인증기관(CA, Certificate Authority)인 eMudhra의 중간 CA 인증서 8개의 프라이빗 키가 유출되었다. 이 인증서는 루트 인증서로 이어지기 때문에 Firefox, Chrome, Microsoft, Apple이 10월 17일부터 22일 사이에 이 인증서를 차단했다. eMudhra가 2025년 4월 중간 인증서를 생성하던 중 약한 키로 잘못 만들어서 누구나 해당 키를 복구할 수 있었다.(영어)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://socket.dev/blog/litellm-compromise"&gt;LiteLLM PyPI Package and Docker Images Compromised to Steal Cloud and AI Credentials&lt;/a&gt;&lt;/strong&gt; : AI 게이트웨이인 LiteLLM 1.107.0에 자격 증명을 탈취하는 악성 코드가 포함되어 배포되었다. 이번 사고에는 LiteLLM 컨테이너 이미지에도 동일한 악성 코드가 포함되었고 이미지는 정상 저장소인 &lt;code&gt;BerriAI/litellm&lt;/code&gt;이 아니라 &lt;code&gt;Berri-AI/litellm&lt;/code&gt;에서 배포된 것으로 기록되었다. 이 악성 버전은 10월 21일 11:39:51 UTC에 게시되고 11:46:30 UTC에 악성 코드 경보가 발생했고 &lt;a href="https://docs.litellm.ai/blog/security-incident-oct-21-2026"&gt;13:23 UTC까지 공개&lt;/a&gt;되어 있었다. Socket의 조사에 따르면 공격자는 이보다 빠른 &lt;a href="https://socket.dev/blog/litellm-attack-timeline"&gt;10월 10일에 LiteLLM 저장소에서 공격을 위한 2개의 커밋을 통해 워크플로우를 실행한 것을 발견&lt;/a&gt;했다.(영어)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://cybersecuritynews.com/tailscale-ssh-flaws/"&gt;Tailscale SSH Flaws Could Let Hackers Gain Root Access Across Servers From One Compromised Device&lt;/a&gt;&lt;/strong&gt; : Tailscale SSH 기능의 결함으로 공격자가 기기 한 대에 침투하면 다른 서버의 루트 권한까지 얻을 수 있는 취약점이 발견되었다.(영어)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://bitquery.io/investigations/binance-hack"&gt;Binance Hack: $6.3B Drained on 9 Chains, $2.7B Frozen&lt;/a&gt;&lt;/strong&gt; : 지난 29일 Binance의 DevOps 엔지니어 노트북이 침해되었다. 공격자는 4시간 동안 Binance의 자체 출금 시스템에서 9개 체인에 걸쳐 핫월렛 17개에서 63억 달러(약 8조 원)를 탈취했다. 이 중 27억 달러는 동결되었고, 공격자는 여전히 31억 달러를 보유하고 있으며 대부분 ETH와 BTC다.(영어)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://1password.com/personal-ai-agent-integrations"&gt;1Password for Agents: Secure AI Password Manager&lt;/a&gt;&lt;/strong&gt; : 에이전트가 1Password에게 비밀번호 입력을 요청하면 1Password에서 승인 후 자동 입력하도록 해 에이전트가 직접 비밀번호를 보지 않아도 되게 하는 기능이 발표되었다. 현재는 대기 명단에 등록한 후 승인받아야 사용할 수 있다.(영어)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;볼만한 링크&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://newsletter.signoz.io/p/ai-isnt-replacing-sres-its-deskilling"&gt;AI Isn't Replacing SREs. It's Deskilling Them.&lt;/a&gt;&lt;/strong&gt; : “AI가 장애 대응의 95%를 맡게 되면 정작 중요한 5%를 처리하는 능력이 떨어질까?”라는 질문으로 시작하는 글이다. 장애에 대응하면서 기본적인 직관과 숙련도를 쌓아야 하는데, AI 자동화로 사람이 새로운 장애만 다루게 되면 그런 장애에 대응할 능력마저 점점 잃게 된다. 역량이 떨어질수록 AI에 더 의존하게 되어 악순환에 빠진다. 이를 위해 의도적인 비효율을 만들어야 하고 AI로 SRE의 역량을 끌어올려야 한다.(영어)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://chriskiehl.com/article/it-is-still-ok-to-enjoy-programming"&gt;It's still OK to enjoy programming&lt;/a&gt;&lt;/strong&gt; : 코드를 손으로 작성하는 방식의 경제성이 완전히 달라져서 인터넷에서 그 슬픔이 퍼져나가고 있다. 하지만 여전히 주말에 프로그래밍을 재밌게 하고 있고 직접 코드를 작성하면서 다른 주제로 빠져서 공부를 하기도 한다. 이제는 이런 일을 하면 안 되는 것 같은 분위기이지만, 계속 즐겨도 괜찮고 경제적인 정당성을 갖출 필요도 없다.(영어)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://x.com/Alisvolatprop12/article/2114746394183704746"&gt;Anthropic, 상장 신청서(S-1) 전문 읽기&lt;/a&gt;&lt;/strong&gt; : &lt;a href="https://www.sec.gov/Archives/edgar/data/2130357/000162828026067168/anthropicpbc-sx1.htm"&gt;Anthropic의 상장 신청서 S-1&lt;/a&gt;을 정리한 글이다. Nasdaq 티커는 ANT가 될 것이고 매출이 1년 만에 14배가 되어 26년 상반기 매출이 162억 9천만 달러였고 2분기에는 처음으로 영업이익을 냈다. 연간 10만 달러 이상 쓰는 고객은 11,900곳 이상이 되었고 순매출유지율은 약 900%다. 컴퓨팅 약정 비용은 조 단위로 보인다. 창업자 7명의 Class F 주식은 주식 수가 아무리 늘어도 총 의결권의 50.1%를 갖게 된다.(한국어)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.blog/news-insights/octoverse/octoverse-commits-pushes-reach-new-highs-in-2026-as-developers-build-with-agents/"&gt;Octoverse: Commits, pushes, reach new highs in 2026 as developers build with agents&lt;/a&gt;&lt;/strong&gt; : GitHub이 매년 공개하는 Octoverse 보고서가 공개되었다. 지난 12개월 동안 푸시가 179억 번 발생해 2024년과 2025년을 합친 것보다 많았고, 커밋과 풀 리퀘스트도 2년 전보다 3배 이상 늘었다. 6월 이후 전체 커밋의 55%가 새로운 저장소에서 발생했고, 오픈소스 기여도 25억 건으로 작년의 2배를 넘어섰다. GitHub은 이제 2억 2,500만 명이 이용 중이다. 에이전트와 함께 작업한 풀 리퀘스트의 비율은 3월 17%에서 9월 40% 이상으로 늘었다. 가장 많이 사용하는 언어는 여전히 TypeScript, Python, JavaScript 순이다.(영어)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://vercel.com/blog/introducing-geist-serif"&gt;Introducing Geist Serif&lt;/a&gt;&lt;/strong&gt; : Vercel에서 만든 개발자를 위한 고정폭 폰트 Geist 패밀리에 Geist Serif가 추가되었다.(영어)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;IT 업계 뉴스&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.cnbc.com/2026/10/21/meta-new-mexico-cambridge-analytica-penalty.html"&gt;Meta ordered to pay $25 billion penalty in New Mexico Cambridge Analytica case&lt;/a&gt;&lt;/strong&gt; : 10년전 케임브리지 애널리티카 스캔들에서 시작된 개인정보 보호 사건과 관련해서 미국 뉴멕시코 법원이 Meta에 250억 달러의 벌금을 부과했다. 배심원단은 Meta가 사용자 데이터를 수집하고 보호하는 방식을 안전한 것처럼 설명했지만 그렇지 않았고 혐오와 허위 정보에 대한 관리도 잘못 홍보했다고 벌금을 부과했다.(영어)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://css-tricks.com/css-tricks-has-a-new-owner/"&gt;CSS-Tricks has a new owner!&lt;/a&gt;&lt;/strong&gt; : 2022년 DigitalOcean이 CSS-Tricks를 사고 방치하고 있었는데 CSS-Tricks에서 12년간 글을 쓰고 편집해온 Geoff Graham이 다시 인수해서 독립적으로 운영할 수 있게 되었다. CSS-Tricks를 본업으로 운영하면서 광고, 스폰서십, 멤버십, 교육 콘텐츠로 유지비를 마련할 계획이라고 밝혔다.(영어)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://abcnews.com/Technology/wireStory/microsoft-offers-quarter-global-workforce-voluntary-buyouts-ai-137578868"&gt;Microsoft offers quarter of global workforce voluntary buyouts&lt;/a&gt;&lt;/strong&gt; : Microsoft가 전 세계 직원의 27%인 6만 명에게 자발적 퇴직 보상을 제안했다.(영어)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://about.doordash.com/en-us/news/doordash-to-acquire-instacart"&gt;DoorDash to Acquire Instacart to Help Local Stores Win&lt;/a&gt;&lt;/strong&gt; : 배달 서비스인 DoorDash가 식료품 배달 서비스인 Instacart를 인수했다. Instacart의 22일 종가보다 26% 높은 주당 65달러로 평가해 약 170억 달러에 인수하기로 했다. 총 거래 대금의 최소 75%는 현금으로 지급될 예정이다.(영어)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;프로젝트&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://tsc-ts.dev/"&gt;tsc-ts&lt;/a&gt;&lt;/strong&gt; : Vercel이 만든 TypeScript 컴파일러(TypeScript-Go, tsgo)의 실험적 TypeScript 포트.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://scriptc.dev/"&gt;scriptc&lt;/a&gt;&lt;/strong&gt; : TypeScript와 JavaScript를 네이티브 실행 파일이나 WebAssembly로 컴파일하는 컴파일러.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://surflane.page/"&gt;Surflane&lt;/a&gt;&lt;/strong&gt; : 플랫폼 개발을 위한 디자인 시스템.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/google/artemis"&gt;Artemis&lt;/a&gt;&lt;/strong&gt; : AI가 안드로이드 폰을 사용하거나 테스트 자동화를 할 수 있게 하는 Google의 프로젝트.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/deepseek-ai/DeepInfer"&gt;DeepInfer&lt;/a&gt;&lt;/strong&gt; : DeepSeek이 내부에서 사용하던 추론 프레임워크를 공개했다. &lt;a href="https://github.com/deepseek-ai/DeepInfer"&gt;DeepInfer&lt;/a&gt;는 DeepSeek-V4.1-Flash 모델을 지원하고 최적화, 병렬화 등을 지원한다.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://fx0.vercel.dev/"&gt;fx0&lt;/a&gt;&lt;/strong&gt; : Vercel에서 만든 libfx 기반의 디자인 에이전트.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://pele.run/"&gt;Pele&lt;/a&gt;&lt;/strong&gt; : Mermaid 다이어그램을 SVG로 만들어주는 라이브러리.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/tywr/Nordwand-Mono"&gt;Nordwand Mono&lt;/a&gt;&lt;/strong&gt; : 코딩용 네오그로테스트 폰트&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://herdrui.dev/"&gt;Herdr UI&lt;/a&gt;&lt;/strong&gt; : &lt;a href="https://herdr.dev/"&gt;Herdr&lt;/a&gt; 데몬을 위한 클라이언트&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://agent-browser.dev/desktop"&gt;agent-desktop&lt;/a&gt;&lt;/strong&gt; : AI 에이전트가 컴퓨터를 사용할 수 있게 해주는 CLI 및 라이브러리로 Vercel이 만들었다.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/anthropics/sandbox-runtime"&gt;Anthropic Sandbox Runtime (srt)&lt;/a&gt;&lt;/strong&gt; : Anthropic이 OS 수준에서 임의의 프로세스에 파일 시스템과 네트워크를 제한하는 경량 샌드박스를 공개했다.(영어)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;버전 업데이트&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://duckdb.org/"&gt;DuckDB&lt;/a&gt; v2.0.0 LTS "Cinnamon Teal"&lt;/strong&gt; : 데이터베이스 시스템, &lt;a href="https://duckdb.org/2026/10/21/announcing-duckdb-200"&gt;릴리스 공지&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://documentdb.io/"&gt;DocumentDB&lt;/a&gt; v1.0&lt;/strong&gt; : MongoDB 호환 오픈소스 데이터베이스, &lt;a href="https://documentdb.io/blogs/posts/documentdb-1-0/"&gt;릴리스 공지&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://dagger.io/"&gt;Dagger&lt;/a&gt; v1.0 Beta&lt;/strong&gt; : CI/CD Pipeline as Code, &lt;a href="https://dagger.io/blog/dagger-10-beta/"&gt;릴리스 공지&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.electronjs.org/"&gt;Electron&lt;/a&gt; v45.0.0&lt;/strong&gt; : 크로스 플랫폼 데스크톱 애플리케이션 플랫폼, &lt;a href="https://www.electronjs.org/blog/electron-45-0"&gt;릴리스 공지&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://opencode.ai/"&gt;OpenCode&lt;/a&gt; v2.0&lt;/strong&gt; : 코딩 에이전트, &lt;a href="https://anoma.ly/notes/opencode-2-0"&gt;릴리스 공지&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://lkml.org/"&gt;Linux Kernel&lt;/a&gt; v7.3&lt;/strong&gt; : 리눅스 커널, &lt;a href="https://lwn.net/Articles/1101143/"&gt;릴리스 공지&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://nodejs.org/en"&gt;Node.js&lt;/a&gt; v26.13.0 'Lithium'(LTS)&lt;/strong&gt; : 자바스크립트 런타임, &lt;a href="https://nodejs.org/en/blog/release/v26.13.0"&gt;릴리스 공지&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;26.x가 LTS 단계에 들어갔다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://nodejs.org/en"&gt;Node.js&lt;/a&gt; v27.0.0-alpha.0.0.0 (Alpha)&lt;/strong&gt; : 자바스크립트 런타임, &lt;a href="https://nodejs.org/en/blog/release/v27.0.0-alpha.0.0.0"&gt;릴리스 공지&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://nx.dev/"&gt;Nx&lt;/a&gt; v24.0.0&lt;/strong&gt; : 모노레포 빌드 시스템, &lt;a href="https://nx.dev/blog/nx-24-release"&gt;릴리스 공지&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://reactnative.dev/"&gt;React Native&lt;/a&gt; v0.88.0&lt;/strong&gt; : React를 이용한 모바일 앱 개발 프레임워크, &lt;a href="https://github.com/react/react-native/releases/tag/v0.88.0"&gt;릴리스 공지&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://expo.dev/"&gt;Expo SDK&lt;/a&gt; v58.0.0&lt;/strong&gt; : React로 네이티브 앱을 만드는 플랫폼 SDK, &lt;a href="https://expo.dev/changelog/sdk-58"&gt;릴리스 공지&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://biomejs.dev/"&gt;Biome&lt;/a&gt; v2.6.0&lt;/strong&gt; : 프론트엔드 툴체인, &lt;a href="https://biomejs.dev/blog/biome-v2-6/"&gt;릴리스 공지&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://shopify.github.io/react-native-skia/"&gt;React Native Skia&lt;/a&gt; v3.8&lt;/strong&gt; : React Native용 Skia, &lt;a href="https://github.com/wcandillon/react-native-skia/releases/tag/v3.8.0"&gt;릴리스 공지&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://fastapi.tiangolo.com/ko/"&gt;FastAPI&lt;/a&gt; v0.162.0&lt;/strong&gt; : Python 웹 프레임워크, &lt;a href="https://fastapi.tiangolo.com/release-notes/#01620-2026-10-23"&gt;릴리스 공지&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://grafana.com/"&gt;Grafana&lt;/a&gt; v13.3&lt;/strong&gt; : 메트릭 대시보드, &lt;a href="https://grafana.com/blog/grafana-13-3-release-all-the-latest-features/"&gt;릴리스 공지&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://ghostty.org/"&gt;Ghostty&lt;/a&gt; v1.4.0&lt;/strong&gt; : 터미널 에뮬레이터, &lt;a href="https://ghostty.org/docs/install/release-notes/1-4-0"&gt;릴리스 공지&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://kafka.apache.org/"&gt;Kafka&lt;/a&gt; v4.4.0&lt;/strong&gt; : 분산 이벤트 스트리밍 플랫폼, &lt;a href="https://kafka.apache.org/blog/2026/10/22/apache-kafka-4.4.0-release-announcement/"&gt;릴리스 공지&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://gitbutler.com/"&gt;GitButler&lt;/a&gt; v0.23.0&lt;/strong&gt; : Git 클라이언트, &lt;a href="https://blog.gitbutler.com/gitbutler-0-23"&gt;릴리스 공지&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://volcano.sh/"&gt;Volcano&lt;/a&gt; v1.16.0&lt;/strong&gt; : 클라우드 네이티브 배치 스케줄링 시스템, &lt;a href="https://volcano.sh/blog/Volcano-1.16.0-release"&gt;릴리스 공지&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/body&gt;&lt;/html&gt;
</content>
    <id>https://blog.outsider.ne.kr/1817</id>
    <link href="https://blog.outsider.ne.kr/1817"/>
    <summary type="html">&lt;h2&gt;웹개발 관련&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://www.joshwcomeau.com/css/interop-2027/"&gt;The Future of CSS ✨&lt;/a&gt;&lt;/strong&gt; : 브라우저 업체들이 협력해 브라우저 간 새로운 기능 도입을 원활하게 하는 Interop 프로젝트에서 2027년에 원하는 기능을 투표받고 있다. Josh Comeau가 자신이 투표한 10가지 기능을 정리했다. 함수 기능을 지원하는 CSS Function, 다양한 모서리를 지원하는 &lt;code&gt;corner-shape&lt;/code&gt;, 테두리를 원하는 대로 그릴 수 있는 &lt;code&gt;border-shape&lt;/code&gt;, 앵커 위치 지정 API 레벨 2, 상속 값을 계산에 사용할 수 있는 &lt;code&gt;inherit()&lt;/code&gt;를 소개한다. 스크롤 트리거 애니메이션, 반응형 디자인에서 요소의 순서를 조정할 수 있는 &lt;code&gt;reading-flow&lt;/code&gt;와 &lt;code&gt;reading-order&lt;/code&gt;도 다룬다. &lt;code&gt;auto&lt;/code&gt; 같은 키워드 값 사이에서 애니메이션을 적용할 수 있는 &lt;code&gt;interpolate-size&lt;/code&gt;와 &lt;code&gt;calc-size()&lt;/code&gt;, 그리드 갭 꾸미기 기능, 스크롤 상태 컨테이너 쿼리 기능도 소개한다.(영어)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://blog.cloudflare.com/typescript-rust-port"&gt;Introducing tsrs: a Port of TypeScript to Rust&lt;/a&gt;&lt;/strong&gt; : Cloudflare와 VoidZero가 Max Schwenk와 함께 TypeScript 컴파일러를 Rust로 포팅한 &lt;a href="https://building.owner.com/tsrs"&gt;tsrs&lt;/a&gt;를 개발하고 있다. 언어의 설계와 방향은 TypeScript 팀이 주도할 수 있도록 긴밀하게 협력하고 있고 &lt;a href="https://building.owner.com/tsrs"&gt;tsrs&lt;/a&gt;는 개발자들이 기다리는 시간을 줄이는 것을 목표로 하고 있고 초기 벤치마크 결과는 TypeScript 7.0보다 최대 8배 빠르고 메모리는 70% 더 적게 사용한다.(영어)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://blog.cloudflare.com/deploy-with-void/"&gt;Deploy with Void&lt;/a&gt;&lt;/strong&gt; : VoidZero를 인수한 Cloudflare에서 Cloudflare 배포를 Vite 워크플로와 통합한 Void Platform, Void SDK, Void CLI를 오픈소스로 공개했다.(영어)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;그 밖의 개발 관련&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://claude.dev/blog/solving-code-review-at-anthropic/"&gt;How the Claude Code team does code review&lt;/a&gt;&lt;/strong&gt; : Anthropic에서 코드 변경 사항이 많아지면서 개선하고 있는 코드리뷰 방식을 설명한 글이다. 코드 리뷰의 주요 목적은 배포 전에 문제를 찾아내는 것인데, 사람의 검토 자원은 희소하므로 대부분을 자동화한다. 사람의 검토는 최소한으로 하면서도 롤백이나 사고 없이 병합되는 것을 목표로 한다. 모든 Pull Request에 AI 코드리뷰를 사용하고 여러 에이전트가 검토해서 실제로 문제라고 동의한 경우에만 해당 내용을 게시하고 이에 AI가 대응하게 하고 별도의 보안검토까지 끝나면 변경 등급에 따라 1명 내지 2명의 사람이 리뷰하도록 하고 있고 버그가 발생하거나 리뷰를 작성자가 대응하는 방식을 검토해서 리뷰를 계속 개선하고 있다. 사람은 diff를 읽기보다는 기계가 잘하지 못하는 의사 결정에 집중하고, 문제가 생겼을 때는 직접 해결한다.(영어)
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://machinelearning.apple.com/research/mlx-distributed-inference"&gt;Local and Distributed Large LLM Inference with MLX and RDMA on Mac Studio&lt;/a&gt;&lt;/strong&gt; : Apple silicon에서 오픈소스 배열 프레임워크인 MLX를 사용해서 Meta의 오픈 웨이트 모델인 &lt;a href="https://huggingface.co/meta-models/Muse-Spark-Open-816B-A42B"&gt;Muse Spark Open&lt;/a&gt;을 실행하는 방법을 설명한다. 512GB Mac Studio 단일 머신에서 오픈 웨이트 모델의 성능을 측정했다. 한 대에 담을 수 없는 &lt;a href="https://huggingface.co/meta-models/Muse-Spark-Open-816B-A42B"&gt;Muse Spark Open&lt;/a&gt;은 2대를 연결해 Thunderbolt 5 기반 RDMA로 통신하고, 텐서 병렬화로 추론 속도를 높인다. 이러한 개선을 통해 Mac Studio 4대의 클러스터로 초당 36개의 토큰을 생성할 수 있게 되었다.(영어)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://shopify.engineering/remote-dev"&gt;We gave AI agents a mobile dev environment&lt;/a&gt;&lt;/strong&gt; : Shopify에서 모바일 개발을 병렬로 처리할 수 있는 에이전트 기반 워크플로우를 구축했지만 로컬 컴퓨팅 자원의 제한을 해결하기 위해 작업을 위임할 수 있는 Remote Dev를 제공하게 되었다. 이는 백엔드와 웹은 River라는 Slack의 AI 에이전트로 일하던 방식을 모바일에도 적용한 것이다. 모바일의 특성을 고려해서 스크린샷을 보는 것 외에도 시뮬레이터와 WebSocket으로 연결해서 실시간으로 조작할 수 있다.(영어)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://auth0.com/blog/what-is-id-jag/"&gt;ID-JAG, Explained: The New OAuth Grant for Cross-App Access&lt;/a&gt;&lt;/strong&gt; : AI 에이전트나 SaaS 앱에서 사용자가 권한을 허용하는 과정을 계속 반복하는 문제를 해결하기 위해 새로 만든 OAuth 권한 부여 명세가 ID-JAG(Identity Assertion JWT Authorization Grant)다. AI 에이전트가 앱에 연결할 때 사용자 주도 OAuth로 매번 동의를 요청하면 사용자는 피로해져 나중에는 자동으로 동의하게 된다. 중앙에서 통제하기도 어렵고, 기존 인증은 여러 앱에 접근하는 에이전트에 맞게 설계되어 있지 않다. ID-JAG는 사용자의 동의 대신 기업 정책에 따라 접근 권한을 결정하는 방식으로 바꾼다.(영어)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://netflixtechblog.com/beyond-api-compatibility-building-a-tool-to-measure-the-blast-radius-of-library-changes-9474f2fd4f90"&gt;Beyond API Compatibility: Building a Tool to Measure the Blast Radius of Library Changes
&lt;/a&gt;&lt;/strong&gt; : Netflix에서 API나 라이브러리의 호환성을 깨뜨리는 변경 사항을 사전에 알 수 있게 저장소 전반의 심볼 정의와 참조를 색인화한 Quasar를 만들었다. Quasar를 통해 공개 API에서 무엇이 바뀌었고 변경된 심볼을 사용하는 저장소가 어디인지를 파악할 수 있다. 각 저장소의 CI에서 &lt;a href="https://github.com/scip-code/scip"&gt;SCIP&lt;/a&gt;를 사용해 언어별로 식별자의 관계를 인코딩하고 라이브러리 버전과 API 정의를 Quasar에 전송한다. Quasar에서 이 정보를 바탕으로 해당 API를 사용하는 곳을 파악할 수 있다.(영어)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.blog/news-insights/company-news/github-universe-2026-evolving-every-layer-of-the-stack/"&gt;GitHub Universe 2026: Evolving every layer of the stack&lt;/a&gt;&lt;/strong&gt; : GitHub Universe 컨퍼런스에서 에이전트를 사용할 수 있는 &lt;a href="https://github.com/features/copilot?locale=ko-kr"&gt;GitHub Copilot 앱&lt;/a&gt;, 작업에 필요한 내용을 분석한 뒤 하나 이상의 모델을 선택해서 작업하는 &lt;a href="https://docs.github.com/ko/copilot/concepts/models/copilot-fusion"&gt;Copilot Fusion&lt;/a&gt;, 병렬 세션으로 작업할 수 있는 &lt;a href="https://docs.github.com/ko/copilot/how-tos/github-copilot-app/working-with-projects"&gt;Copilot project&lt;/a&gt;를 발표했다. 기기나 도구를 바꿔도 세션을 이어갈 수 있는 &lt;a href="https://docs.github.com/ko/copilot/how-tos/copilot-on-github/use-copilot-agents/manage-and-track-agents"&gt;Session continuity&lt;/a&gt;, 저장소에서 AI 기반 워크플로우를 만들 수 있는 &lt;a href="https://docs.github.com/ko/copilot/concepts/agent-capabilities/agent-powered-workflows-and-operations/about-automations"&gt;Copilot automations&lt;/a&gt;, AI로 코드 리뷰를 하는 &lt;a href="https://docs.github.com/ko/copilot/concepts/agent-capabilities/agent-powered-workflows-and-operations/code-review"&gt;Copilot code review&lt;/a&gt;도 공개했다.(영어)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;AI 관련&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://blog.google/innovation-and-ai/models-and-research/gemini-models/introducing-gemini-4-carbon/"&gt;Introducing Gemini 4 Carbon&lt;/a&gt;&lt;/strong&gt; : Google에서 사이버 보안 역량과 장기 과제 수행 능력을 갖춘 최고 성능 모델인 Gemini 4 Carbon을 발표했다.(영어)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://openai.com/ko-KR/index/introducing-gpt-6-1-terra/"&gt;GPT-6.1 Terra 소개&lt;/a&gt;&lt;/strong&gt; : OpenAI가 빠르고 효율적인 모델인 GPT-6.1 Terra를 발표했다. GPT-5.6 Terra보다 크게 발전했고 비용도 50% 낮아졌다.(영어)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://research.meta.ai/blog/muse-spark-open"&gt;Introducing Muse Spark Open, The Most Capable US Open‑Weight Model to Date&lt;/a&gt;&lt;/strong&gt; : Meta가 미국에서 공개된 오픈 웨이트 모델 중 가장 뛰어난 &lt;a href="https://huggingface.co/meta-models/Muse-Spark-Open-816B-A42B"&gt;Muse Spark Open&lt;/a&gt;의 가중치를 공개했다. Muse Spark Open은 816B 파라미터에 42B 활성 파라미터와 1M 컨텍스트 윈도우를 갖춘 멀티모달 모델로, 장기간에 걸친 작업에서 탁월한 성능을 보여준다. 또한 Muse Spark Open은 최신 MLX 프레임워크로 Apple M5 Ultra Mac Studio 2대에서 실행되는 최초의 모델이다.(영어)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://www.minimax.io/blog/minimax-m31f"&gt;MiniMax M3.1 Flash: Redefining Agent Performance and Cost&lt;/a&gt;&lt;/strong&gt; : Space Bunny라는 익명의 모델로 알려진 MiniMax의 M3.1 Flash가 공개되었다. M3.1 Flash는 온라인 추론 속도를 거의 3배 높이고 비용은 70% 싸졌다.(영어)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://www.kimi.ai/blog/kimi-k3-1-pro"&gt;Introducing Kimi K3.1 Pro&lt;/a&gt;&lt;/strong&gt; : Moonshot에서 가장 성능이 뛰어난 3T급 오픈 웨이트 모델인 Kimi K3.1 Pro와 속도가 2~3배 빠른 Kimi K3.1 Pro Highspeed를 출시했고 모델 가중치는 11월 4일에 발표할 예정이다. Kimi K3.1 Pro는 K3를 후처리 학습한 모델로, 이 과정에 훨씬 더 많은 자원을 투입해 성능을 높였다. 벤치마크 전반에서 가장 강력한 독점 모델들과 대등하거나 근접한 성능을 보여주었다.(영어)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://huggingface.co/deepseek-ai/DeepSeek-V4.1-Flash-1017"&gt;DeepSeek-V4.1-Flash-1017&lt;/a&gt;&lt;/strong&gt; : DeepSeek-V4.1-Flash의 마이너 업데이트 버전으로 기존보다 성능이 상당히 향상되었다.(영어)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://mistral.ai/news/mistral-large-4-oss/"&gt;Mistral Large 4 (Le Chonk) is now open weight&lt;/a&gt;&lt;/strong&gt; : 10월 초에 공개되었던 1조 개의 파라미터를 가진 멀티모달 모델인 Mistral Large 4(Le Chonk)의 가중치가 공개되었다.(영어)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://block.xyz/dessa"&gt;Dessa - the Conversation Model trained only on speech&lt;/a&gt;&lt;/strong&gt; : Block에서 음성만으로 학습시킨 음성 모델 Dessa를 만들었다. 녹음 파일을 들어보면 사람처럼 자연스럽게 대화하고 리액션하는 걸 볼 수 있다. 음성만으로 학습시켜서 텍스트보다 수백 배 적은 단어로 언어를 익혔다. 덕분에 NVIDIA GB200 NVL72 한 대로 학습할 수 있었고, MacBook Pro M4 Max에서 로컬로 실행할 수 있다.(영어)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://deepmind.google/blog/genie-4-a-new-generation-of-world-simulation/"&gt;Genie 4: A new generation of world simulation&lt;/a&gt;&lt;/strong&gt; : Google이 새로운 월드 모델 Genie 4를 발표했다. Genie 4는 기존보다 훨씬 뛰어난 사실감으로 시뮬레이션을 한층 발전시켰고, 멀티모달 기능으로 오디오와 대화까지 담긴 세계를 동시에 생성할 수 있다.(영어)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://claude.com/ko/resources/articles/claude-duet"&gt;Introducing Claude Duet&lt;/a&gt;&lt;/strong&gt; : Anthropic이 능동적으로 일하는 에이전트인 Claude Duet을 리서치 프리뷰로 공개했다. iOS, Android 앱으로 사용할 수 있고 현재는 대기 신청을 하고 승인 받아야 사용할 수 있다.(영어)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://x.com/claudeai/status/2116220869479428500"&gt;We’re renaming our Max plans&lt;/a&gt;&lt;/strong&gt; : Anthropic이 Claude Max 5x 플랜을 Max로 Max 20x 플랜을 Ultra로 이름을 변경했다.(영어)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;인프라 관련&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://netflixtechblog.com/ontology-driven-observability-building-an-end-to-end-knowledge-graph-at-netflix-scale-421392cf5adf"&gt;Ontology-Driven Observability: Building an End-to-End Knowledge Graph at Netflix Scale&lt;/a&gt;&lt;/strong&gt; : Netflix는 장애의 원인을 찾을 때 Metrics, Events, Logs, Traces를 살펴보며 서로 간의 관계를 재구성하는 데 대부분의 시간을 썼다. 각 시스템은 자신의 정보만 알고 있으므로 온톨로지를 구축해 지식 그래프를 만들고 그래프 데이터베이스에 저장했다. 이제 쿼리로 한 번에 조회할 수 있다. 이는 이전에 사람이 하던 작업이지만 지식 그래프로 빠르게 할 수 있게 되었고 이를 통해 자동 근본 원인을 분석할 수 있게 되고 이를 통해 자동 복구도 할 수 있게 된다.(영어)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://www.linkedin.com/blog/engineering/infrastructure/rebuilding-linkedins-tracking-infrastructure-scaling-migrating-and-hardening-a-high-volume-event-pipeline"&gt;Rebuilding LinkedIn's Tracking Infrastructure: Scaling, Migrating, and Hardening a High-Volume Event Pipeline&lt;/a&gt;&lt;/strong&gt; : LinkedIn에서 사용자의 상호작용 이벤트를 수집 추적하는 시스템은 하루 수천억건의 이벤트를 처리하고 있다. 이 시스템의 기술도 낙후되고 성능 개선을 위해서 병렬로 재구축을 했다. 새 시스템에서는 공유 컨텍스트를 사용해 이벤트를 재사용함으로써 네트워크 수신량을 1/10로 줄였다. 트래픽은 점진적으로 전환하면서 이벤트의 10%를 대조해보면서 전환했고 비용 이슈상 의도적으로 100%를 이중으로 전송하지는 않았다. 비교 절차와 롤백 방법을 검증한 뒤 대용량 이벤트를 먼저 전환해서 마이그레이션에 대한 정보를 얻을 수 있었다. protocol-buffer를 Apache Avro로 전환하고 zstd 압축을 사용해서 성능을 크게 높이고 실 데이터에서 병목 구간을 최적화했다.(영어)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://mistral.ai/news/timestral/"&gt;Timestral: Mistral's time-series foundation models&lt;/a&gt;&lt;/strong&gt; : Mistral에서 시계열 파운데이션 모델인 Timestral을 발표했다. 다른 시계열 모델보다 적은 2억 900만 개의 파라미터로 여러 시계열 분야의 벤치마크에서 1위를 차지했다.(영어)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://blog.ashon.dev/blog/2026/10/24/fault-tree-to-sli.html"&gt;언제 고장 났다고 말할 수 있을까?&lt;/a&gt;&lt;/strong&gt; : 서비스가 정상인가를 판단하기 위해 FTA(Fault Tree Analysis)를 적용해서 메트릭이 아니라 무엇을 실패라고 부를지를 정의하고 그 실패가 발생할 수 있는 원인을 트리로 만들어서 SLI로 정리한다.(영어)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://engineering.fb.com/2026/10/19/data-center-engineering/inside-prometheus-meta-gigawatt-scale-supercluster/"&gt;Inside Prometheus: Meta’s Journey to a Gigawatt-Scale Supercluster&lt;/a&gt;&lt;/strong&gt; : Meta가 오하이오주 뉴올버니에 구축한 기가와트급 슈퍼클러스터 데이터센터 Prometheus의 내부를 소개했다. Prometheus의 1단계 구축은 이미 완료했고 GPU 100만개 규모로 확장하려고 준비하고 있다.(영어)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;보안 및 장애&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://cybersecuritynews.com/opencode-security-breach/"&gt;OpenCode Security Breach Exposes Third-Party API Keys of its Console Users&lt;/a&gt;&lt;/strong&gt; : 코딩 에이전트 &lt;a href="https://opencode.ai/"&gt;OpenCode&lt;/a&gt;의 Console 사용자 중 1.4%가 영향을 받은 보안 침해 사고가 발생했다. 이번 공격은 대규모 모델 증류 공격과 관련이 있고 워크스페이스에 저장된 서드파티 API가 노출되었을 수 있으므로 &lt;a href="https://x.com/opencode/status/2111519637049319818"&gt;Anthropic, OpenAI, Google과 협력 중&lt;/a&gt;이라고 밝혔다. 사용자에게는 알림이 나갔으며, 알림을 받은 사용자에게 해당 키를 폐기하고 무단 사용 내역이 있는지 살펴보라고 권하고 있다.(영어)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://www.php2shell.com/"&gt;PHP2Shell&lt;/a&gt;&lt;/strong&gt; : PHP에서 메모리 부족으로 인한 손상(CVE-2026-109618)과 요청 사이에 전역 상태가 남아 있는 문제(CVE-2026-109619)로 원격 코드 실행(RCE)이 가능한 취약점이 발견되었다. WordPress, Drupal 등 PHP를 사용하는 서비스도 모두 영향 받으므로 패치 버전으로 즉시 업데이트해야 한다.(영어)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://www.aikido.dev/blog/python-packages-vulnerable-node2shell-brotli-cve-2026-111497"&gt;Node2Shell Brotli vuln (CVE-2026-111497) evolves to HTTP2Shell, as libraries and apps using HTTP are affected.&lt;/a&gt;&lt;/strong&gt; : Brotli 압축 디코더에서 범위를 벗어난 쓰기 취약점이 발견되어 CVSS 점수 9.2를 받았으며, 치명적인 취약점으로 판정되었다. 이 취약점은 Node.js에서 발견되어 &lt;a href="https://app.opencve.io/cve/CVE-2026-111497"&gt;CVE-2026-111497&lt;/a&gt;로 분류되고 Node2Shell이라고 불렸다. 하지만 &lt;a href="https://broccoli2shell.com/"&gt;Brotli의 취약점&lt;/a&gt;이어서 Node.js뿐 아니라 Bun, Envoy, Istio, curl에도 영향을 준 것으로 밝혀졌다. OpenAI가 올해 2월 이 취약점을 발견해 Brotli에서 수정되었지만, 보안 문제로 인식되지 않아 지금까지 보안 릴리스가 나오지 않았다.(영어)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://emudhra.we-have-a-problem.com/"&gt;eMudhra Intermediate CA Compromise&lt;/a&gt;&lt;/strong&gt; : 인도의 인증기관(CA, Certificate Authority)인 eMudhra의 중간 CA 인증서 8개의 프라이빗 키가 유출되었다. 이 인증서는 루트 인증서로 이어지기 때문에 Firefox, Chrome, Microsoft, Apple이 10월 17일부터 22일 사이에 이 인증서를 차단했다. eMudhra가 2025년 4월 중간 인증서를 생성하던 중 약한 키로 잘못 만들어서 누구나 해당 키를 복구할 수 있었다.(영어)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://socket.dev/blog/litellm-compromise"&gt;LiteLLM PyPI Package and Docker Images Compromised to Steal Cloud and AI Credentials&lt;/a&gt;&lt;/strong&gt; : AI 게이트웨이인 LiteLLM 1.107.0에 자격 증명을 탈취하는 악성 코드가 포함되어 배포되었다. 이번 사고에는 LiteLLM 컨테이너 이미지에도 동일한 악성 코드가 포함되었고 이미지는 정상 저장소인 &lt;code&gt;BerriAI/litellm&lt;/code&gt;이 아니라 &lt;code&gt;Berri-AI/litellm&lt;/code&gt;에서 배포된 것으로 기록되었다. 이 악성 버전은 10월 21일 11:39:51 UTC에 게시되고 11:46:30 UTC에 악성 코드 경보가 발생했고 &lt;a href="https://docs.litellm.ai/blog/security-incident-oct-21-2026"&gt;13:23 UTC까지 공개&lt;/a&gt;되어 있었다. Socket의 조사에 따르면 공격자는 이보다 빠른 &lt;a href="https://socket.dev/blog/litellm-attack-timeline"&gt;10월 10일에 LiteLLM 저장소에서 공격을 위한 2개의 커밋을 통해 워크플로우를 실행한 것을 발견&lt;/a&gt;했다.(영어)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://cybersecuritynews.com/tailscale-ssh-flaws/"&gt;Tailscale SSH Flaws Could Let Hackers Gain Root Access Across Servers From One Compromised Device&lt;/a&gt;&lt;/strong&gt; : Tailscale SSH 기능의 결함으로 공격자가 기기 한 대에 침투하면 다른 서버의 루트 권한까지 얻을 수 있는 취약점이 발견되었다.(영어)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://bitquery.io/investigations/binance-hack"&gt;Binance Hack: $6.3B Drained on 9 Chains, $2.7B Frozen&lt;/a&gt;&lt;/strong&gt; : 지난 29일 Binance의 DevOps 엔지니어 노트북이 침해되었다. 공격자는 4시간 동안 Binance의 자체 출금 시스템에서 9개 체인에 걸쳐 핫월렛 17개에서 63억 달러(약 8조 원)를 탈취했다. 이 중 27억 달러는 동결되었고, 공격자는 여전히 31억 달러를 보유하고 있으며 대부분 ETH와 BTC다.(영어)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://1password.com/personal-ai-agent-integrations"&gt;1Password for Agents: Secure AI Password Manager&lt;/a&gt;&lt;/strong&gt; : 에이전트가 1Password에게 비밀번호 입력을 요청하면 1Password에서 승인 후 자동 입력하도록 해 에이전트가 직접 비밀번호를 보지 않아도 되게 하는 기능이 발표되었다. 현재는 대기 명단에 등록한 후 승인받아야 사용할 수 있다.(영어)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;볼만한 링크&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://newsletter.signoz.io/p/ai-isnt-replacing-sres-its-deskilling"&gt;AI Isn't Replacing SREs. It's Deskilling Them.&lt;/a&gt;&lt;/strong&gt; : “AI가 장애 대응의 95%를 맡게 되면 정작 중요한 5%를 처리하는 능력이 떨어질까?”라는 질문으로 시작하는 글이다. 장애에 대응하면서 기본적인 직관과 숙련도를 쌓아야 하는데, AI 자동화로 사람이 새로운 장애만 다루게 되면 그런 장애에 대응할 능력마저 점점 잃게 된다. 역량이 떨어질수록 AI에 더 의존하게 되어 악순환에 빠진다. 이를 위해 의도적인 비효율을 만들어야 하고 AI로 SRE의 역량을 끌어올려야 한다.(영어)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://chriskiehl.com/article/it-is-still-ok-to-enjoy-programming"&gt;It's still OK to enjoy programming&lt;/a&gt;&lt;/strong&gt; : 코드를 손으로 작성하는 방식의 경제성이 완전히 달라져서 인터넷에서 그 슬픔이 퍼져나가고 있다. 하지만 여전히 주말에 프로그래밍을 재밌게 하고 있고 직접 코드를 작성하면서 다른 주제로 빠져서 공부를 하기도 한다. 이제는 이런 일을 하면 안 되는 것 같은 분위기이지만, 계속 즐겨도 괜찮고 경제적인 정당성을 갖출 필요도 없다.(영어)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://x.com/Alisvolatprop12/article/2114746394183704746"&gt;Anthropic, 상장 신청서(S-1) 전문 읽기&lt;/a&gt;&lt;/strong&gt; : &lt;a href="https://www.sec.gov/Archives/edgar/data/2130357/000162828026067168/anthropicpbc-sx1.htm"&gt;Anthropic의 상장 신청서 S-1&lt;/a&gt;을 정리한 글이다. Nasdaq 티커는 ANT가 될 것이고 매출이 1년 만에 14배가 되어 26년 상반기 매출이 162억 9천만 달러였고 2분기에는 처음으로 영업이익을 냈다. 연간 10만 달러 이상 쓰는 고객은 11,900곳 이상이 되었고 순매출유지율은 약 900%다. 컴퓨팅 약정 비용은 조 단위로 보인다. 창업자 7명의 Class F 주식은 주식 수가 아무리 늘어도 총 의결권의 50.1%를 갖게 된다.(한국어)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.blog/news-insights/octoverse/octoverse-commits-pushes-reach-new-highs-in-2026-as-developers-build-with-agents/"&gt;Octoverse: Commits, pushes, reach new highs in 2026 as developers build with agents&lt;/a&gt;&lt;/strong&gt; : GitHub이 매년 공개하는 Octoverse 보고서가 공개되었다. 지난 12개월 동안 푸시가 179억 번 발생해 2024년과 2025년을 합친 것보다 많았고, 커밋과 풀 리퀘스트도 2년 전보다 3배 이상 늘었다. 6월 이후 전체 커밋의 55%가 새로운 저장소에서 발생했고, 오픈소스 기여도 25억 건으로 작년의 2배를 넘어섰다. GitHub은 이제 2억 2,500만 명이 이용 중이다. 에이전트와 함께 작업한 풀 리퀘스트의 비율은 3월 17%에서 9월 40% 이상으로 늘었다. 가장 많이 사용하는 언어는 여전히 TypeScript, Python, JavaScript 순이다.(영어)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://vercel.com/blog/introducing-geist-serif"&gt;Introducing Geist Serif&lt;/a&gt;&lt;/strong&gt; : Vercel에서 만든 개발자를 위한 고정폭 폰트 Geist 패밀리에 Geist Serif가 추가되었다.(영어)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;IT 업계 뉴스&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://www.cnbc.com/2026/10/21/meta-new-mexico-cambridge-analytica-penalty.html"&gt;Meta ordered to pay $25 billion penalty in New Mexico Cambridge Analytica case&lt;/a&gt;&lt;/strong&gt; : 10년전 케임브리지 애널리티카 스캔들에서 시작된 개인정보 보호 사건과 관련해서 미국 뉴멕시코 법원이 Meta에 250억 달러의 벌금을 부과했다. 배심원단은 Meta가 사용자 데이터를 수집하고 보호하는 방식을 안전한 것처럼 설명했지만 그렇지 않았고 혐오와 허위 정보에 대한 관리도 잘못 홍보했다고 벌금을 부과했다.(영어)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://css-tricks.com/css-tricks-has-a-new-owner/"&gt;CSS-Tricks has a new owner!&lt;/a&gt;&lt;/strong&gt; : 2022년 DigitalOcean이 CSS-Tricks를 사고 방치하고 있었는데 CSS-Tricks에서 12년간 글을 쓰고 편집해온 Geoff Graham이 다시 인수해서 독립적으로 운영할 수 있게 되었다. CSS-Tricks를 본업으로 운영하면서 광고, 스폰서십, 멤버십, 교육 콘텐츠로 유지비를 마련할 계획이라고 밝혔다.(영어)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://abcnews.com/Technology/wireStory/microsoft-offers-quarter-global-workforce-voluntary-buyouts-ai-137578868"&gt;Microsoft offers quarter of global workforce voluntary buyouts&lt;/a&gt;&lt;/strong&gt; : Microsoft가 전 세계 직원의 27%인 6만 명에게 자발적 퇴직 보상을 제안했다.(영어)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://about.doordash.com/en-us/news/doordash-to-acquire-instacart"&gt;DoorDash to Acquire Instacart to Help Local Stores Win&lt;/a&gt;&lt;/strong&gt; : 배달 서비스인 DoorDash가 식료품 배달 서비스인 Instacart를 인수했다. Instacart의 22일 종가보다 26% 높은 주당 65달러로 평가해 약 170억 달러에 인수하기로 했다. 총 거래 대금의 최소 75%는 현금으로 지급될 예정이다.(영어)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;프로젝트&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://tsc-ts.dev/"&gt;tsc-ts&lt;/a&gt;&lt;/strong&gt; : Vercel이 만든 TypeScript 컴파일러(TypeScript-Go, tsgo)의 실험적 TypeScript 포트.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://scriptc.dev/"&gt;scriptc&lt;/a&gt;&lt;/strong&gt; : TypeScript와 JavaScript를 네이티브 실행 파일이나 WebAssembly로 컴파일하는 컴파일러.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://surflane.page/"&gt;Surflane&lt;/a&gt;&lt;/strong&gt; : 플랫폼 개발을 위한 디자인 시스템.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/google/artemis"&gt;Artemis&lt;/a&gt;&lt;/strong&gt; : AI가 안드로이드 폰을 사용하거나 테스트 자동화를 할 수 있게 하는 Google의 프로젝트.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/deepseek-ai/DeepInfer"&gt;DeepInfer&lt;/a&gt;&lt;/strong&gt; : DeepSeek이 내부에서 사용하던 추론 프레임워크를 공개했다. &lt;a href="https://github.com/deepseek-ai/DeepInfer"&gt;DeepInfer&lt;/a&gt;는 DeepSeek-V4.1-Flash 모델을 지원하고 최적화, 병렬화 등을 지원한다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://fx0.vercel.dev/"&gt;fx0&lt;/a&gt;&lt;/strong&gt; : Vercel에서 만든 libfx 기반의 디자인 에이전트.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://pele.run/"&gt;Pele&lt;/a&gt;&lt;/strong&gt; : Mermaid 다이어그램을 SVG로 만들어주는 라이브러리.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/tywr/Nordwand-Mono"&gt;Nordwand Mono&lt;/a&gt;&lt;/strong&gt; : 코딩용 네오그로테스트 폰트&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://herdrui.dev/"&gt;Herdr UI&lt;/a&gt;&lt;/strong&gt; : &lt;a href="https://herdr.dev/"&gt;Herdr&lt;/a&gt; 데몬을 위한 클라이언트&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://agent-browser.dev/desktop"&gt;agent-desktop&lt;/a&gt;&lt;/strong&gt; : AI 에이전트가 컴퓨터를 사용할 수 있게 해주는 CLI 및 라이브러리로 Vercel이 만들었다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/anthropics/sandbox-runtime"&gt;Anthropic Sandbox Runtime (srt)&lt;/a&gt;&lt;/strong&gt; : Anthropic이 OS 수준에서 임의의 프로세스에 파일 시스템과 네트워크를 제한하는 경량 샌드박스를 공개했다.(영어)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;버전 업데이트&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://duckdb.org/"&gt;DuckDB&lt;/a&gt; v2.0.0 LTS &amp;quot;Cinnamon Teal&amp;quot;&lt;/strong&gt; : 데이터베이스 시스템, &lt;a href="https://duckdb.org/2026/10/21/announcing-duckdb-200"&gt;릴리스 공지&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://documentdb.io/"&gt;DocumentDB&lt;/a&gt; v1.0&lt;/strong&gt; : MongoDB 호환 오픈소스 데이터베이스, &lt;a href="https://documentdb.io/blogs/posts/documentdb-1-0/"&gt;릴리스 공지&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://dagger.io/"&gt;Dagger&lt;/a&gt; v1.0 Beta&lt;/strong&gt; : CI/CD Pipeline as Code, &lt;a href="https://dagger.io/blog/dagger-10-beta/"&gt;릴리스 공지&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://www.electronjs.org/"&gt;Electron&lt;/a&gt; v45.0.0&lt;/strong&gt; : 크로스 플랫폼 데스크톱 애플리케이션 플랫폼, &lt;a href="https://www.electronjs.org/blog/electron-45-0"&gt;릴리스 공지&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://opencode.ai/"&gt;OpenCode&lt;/a&gt; v2.0&lt;/strong&gt; : 코딩 에이전트, &lt;a href="https://anoma.ly/notes/opencode-2-0"&gt;릴리스 공지&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://lkml.org/"&gt;Linux Kernel&lt;/a&gt; v7.3&lt;/strong&gt; : 리눅스 커널, &lt;a href="https://lwn.net/Articles/1101143/"&gt;릴리스 공지&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://nodejs.org/en"&gt;Node.js&lt;/a&gt; v26.13.0 'Lithium'(LTS)&lt;/strong&gt; : 자바스크립트 런타임, &lt;a href="https://nodejs.org/en/blog/release/v26.13.0"&gt;릴리스 공지&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;26.x가 LTS 단계에 들어갔다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://nodejs.org/en"&gt;Node.js&lt;/a&gt; v27.0.0-alpha.0.0.0 (Alpha)&lt;/strong&gt; : 자바스크립트 런타임, &lt;a href="https://nodejs.org/en/blog/release/v27.0.0-alpha.0.0.0"&gt;릴리스 공지&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://nx.dev/"&gt;Nx&lt;/a&gt; v24.0.0&lt;/strong&gt; : 모노레포 빌드 시스템, &lt;a href="https://nx.dev/blog/nx-24-release"&gt;릴리스 공지&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://reactnative.dev/"&gt;React Native&lt;/a&gt; v0.88.0&lt;/strong&gt; : React를 이용한 모바일 앱 개발 프레임워크, &lt;a href="https://github.com/react/react-native/releases/tag/v0.88.0"&gt;릴리스 공지&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://expo.dev/"&gt;Expo SDK&lt;/a&gt; v58.0.0&lt;/strong&gt; : React로 네이티브 앱을 만드는 플랫폼 SDK, &lt;a href="https://expo.dev/changelog/sdk-58"&gt;릴리스 공지&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://biomejs.dev/"&gt;Biome&lt;/a&gt; v2.6.0&lt;/strong&gt; : 프론트엔드 툴체인, &lt;a href="https://biomejs.dev/blog/biome-v2-6/"&gt;릴리스 공지&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://shopify.github.io/react-native-skia/"&gt;React Native Skia&lt;/a&gt; v3.8&lt;/strong&gt; : React Native용 Skia, &lt;a href="https://github.com/wcandillon/react-native-skia/releases/tag/v3.8.0"&gt;릴리스 공지&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://fastapi.tiangolo.com/ko/"&gt;FastAPI&lt;/a&gt; v0.162.0&lt;/strong&gt; : Python 웹 프레임워크, &lt;a href="https://fastapi.tiangolo.com/release-notes/#01620-2026-10-23"&gt;릴리스 공지&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://grafana.com/"&gt;Grafana&lt;/a&gt; v13.3&lt;/strong&gt; : 메트릭 대시보드, &lt;a href="https://grafana.com/blog/grafana-13-3-release-all-the-latest-features/"&gt;릴리스 공지&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://ghostty.org/"&gt;Ghostty&lt;/a&gt; v1.4.0&lt;/strong&gt; : 터미널 에뮬레이터, &lt;a href="https://ghostty.org/docs/install/release-notes/1-4-0"&gt;릴리스 공지&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://kafka.apache.org/"&gt;Kafka&lt;/a&gt; v4.4.0&lt;/strong&gt; : 분산 이벤트 스트리밍 플랫폼, &lt;a href="https://kafka.apache.org/blog/2026/10/22/apache-kafka-4.4.0-release-announcement/"&gt;릴리스 공지&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://gitbutler.com/"&gt;GitButler&lt;/a&gt; v0.23.0&lt;/strong&gt; : Git 클라이언트, &lt;a href="https://blog.gitbutler.com/gitbutler-0-23"&gt;릴리스 공지&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://volcano.sh/"&gt;Volcano&lt;/a&gt; v1.16.0&lt;/strong&gt; : 클라우드 네이티브 배치 스케줄링 시스템, &lt;a href="https://volcano.sh/blog/Volcano-1.16.0-release"&gt;릴리스 공지&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</summary>
    <title>기술 뉴스 #305 : 2026-11-01</title>
    <updated>2026-11-01T14:46:18+09:00</updated>
    <dc:date>2026-11-01T14:46:18+09:00</dc:date>
  </entry>
  <entry>
    <author>
      <name>이경원</name>
    </author>
    <content type="html">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"&gt;
&lt;html&gt;&lt;body&gt;&lt;p&gt;토론토 할로윈 파티에서 당근(Karrot)을 설명하다 느낀 것. 13년 전 카카오 신입 시절처럼 다시 시작하지만, 이번엔 선배의 자리에서 캐나다에 Karrot을 알리고 싶어요.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;
</content>
    <id>https://kyoungwon.me/life/2026/11/01/after-the-ending-dlc/</id>
    <link href="https://kyoungwon.me/life/2026/11/01/after-the-ending-dlc/"/>
    <summary type="html">토론토 할로윈 파티에서 당근(Karrot)을 설명하다 느낀 것. 13년 전 카카오 신입 시절처럼 다시 시작하지만, 이번엔 선배의 자리에서 캐나다에 Karrot을 알리고 싶어요.</summary>
    <title>엔딩 이후의 DLC: 토론토에서 당근(Karrot)을 다시 소개하며</title>
    <updated>2026-11-01T09:00:00+09:00</updated>
    <dc:date>2026-11-01T09:00:00+09:00</dc:date>
  </entry>
  <entry>
    <author>
      <name>ashon</name>
    </author>
    <content type="html">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"&gt;
&lt;html&gt;&lt;body&gt;
&lt;p&gt;&lt;strong&gt;Riftlancer does not collect anything.&lt;/strong&gt; The game has no network permission, so it
cannot send data anywhere: no account, no sign-in, no analytics, no crash reporting,
no ads. Your high scores, stage grades, chosen ship and settings are stored on your
device only, and removing the app removes them. We receive nothing about you or your
play, and there is nothing for us to delete, sell or share.&lt;/p&gt;
&lt;p&gt;Contact: &lt;a href="mailto:lab.ashon.dev@gmail.com"&gt;lab.ashon.dev@gmail.com&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Riftlancer는 아무것도 수집하지 않습니다.&lt;/strong&gt; 이 게임에는 네트워크 권한이 없어서 데이터를
어딘가로 보낼 수 없습니다. 계정 없음, 로그인 없음, 분석 없음, 크래시 리포트 없음, 광고
없음. 최고 점수, 스테이지 등급, 고른 함선과 설정은 기기에만 저장되며 앱을 지우면 함께
사라집니다. 저희는 당신이나 당신의 플레이에 대해 아무것도 받지 않으며, 삭제할 것도,
판매할 것도, 공유할 것도 없습니다.&lt;/p&gt;
&lt;/body&gt;&lt;/html&gt;
</content>
    <id>https://blog.ashon.dev/projects/riftlancer/privacy/</id>
    <link href="https://blog.ashon.dev/projects/riftlancer/privacy/"/>
    <summary type="html">&lt;p&gt;&lt;strong&gt;Riftlancer does not collect anything.&lt;/strong&gt; The game has no network permission, so it
cannot send data anywhere: no account, no sign-in, no analytics, no crash reporting,
no ads. Your high scores, stage grades, chosen ship and settings are stored on your
device only, and removing the app removes them. We receive nothing about you or your
play, and there is nothing for us to delete, sell or share.&lt;/p&gt;
&lt;p&gt;Contact: &lt;a href="mailto:lab.ashon.dev@gmail.com"&gt;lab.ashon.dev@gmail.com&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Riftlancer는 아무것도 수집하지 않습니다.&lt;/strong&gt; 이 게임에는 네트워크 권한이 없어서 데이터를
어딘가로 보낼 수 없습니다. 계정 없음, 로그인 없음, 분석 없음, 크래시 리포트 없음, 광고
없음. 최고 점수, 스테이지 등급, 고른 함선과 설정은 기기에만 저장되며 앱을 지우면 함께
사라집니다. 저희는 당신이나 당신의 플레이에 대해 아무것도 받지 않으며, 삭제할 것도,
판매할 것도, 공유할 것도 없습니다.&lt;/p&gt;</summary>
    <title>Riftlancer: Privacy Policy</title>
    <updated>2026-10-31T09:00:00+09:00</updated>
    <dc:date>2026-10-31T09:00:00+09:00</dc:date>
  </entry>
  <entry>
    <author>
      <name>GREEN.1229</name>
    </author>
    <content type="html">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"&gt;
&lt;html&gt;&lt;body&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;안녕하세요. &lt;span style="color: #409d00;"&gt;&lt;b&gt;그린&lt;/b&gt;&lt;/span&gt;입니다  &lt;/span&gt;&lt;br&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;이번 포스팅에서는 &lt;span style="background-color: #9feec3;"&gt;&lt;b&gt;SE-0553 — Task Identity에 대해 정리&lt;/b&gt;&lt;/span&gt;해보겠습니다  &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class="imageblock alignCenter" data-ke-mobilestyle="widthOrigin" data-filename="티스토리_썸네일_샘플.001.jpeg" data-origin-width="400" data-origin-height="400"&gt;&lt;span data-url="https://blog.kakaocdn.net/dn/SqXCL/dJMcagOuMzV/LPPjzzsGrp1UbTzEST9tI1/img.jpg" data-phocus="https://blog.kakaocdn.net/dn/SqXCL/dJMcagOuMzV/LPPjzzsGrp1UbTzEST9tI1/img.jpg"&gt;&lt;img src="https://blog.kakaocdn.net/dn/SqXCL/dJMcagOuMzV/LPPjzzsGrp1UbTzEST9tI1/img.jpg" srcset="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSqXCL%2FdJMcagOuMzV%2FLPPjzzsGrp1UbTzEST9tI1%2Fimg.jpg" onerror="this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';" loading="lazy" width="400" height="400" data-filename="티스토리_썸네일_샘플.001.jpeg" data-origin-width="400" data-origin-height="400"&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style="border-left: 4px solid #3a8c28; padding-left: 12px; margin-top: 32px;" data-ke-size="size26"&gt;&lt;b&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;Intro&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;div style="background: #f2f8ee; border-radius: 10px; padding: 16px 20px; margin: 16px 0;"&gt;
&lt;p style="margin: 4px 0;" data-ke-size="size16"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;b&gt;Proposal:&lt;/b&gt; SE-0553&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 4px 0;" data-ke-size="size16"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;b&gt;Authors:&lt;/b&gt; Joakim Hassila, Konrad 'ktoso' Malawski&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 4px 0;" data-ke-size="size16"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;b&gt;Review Manager:&lt;/b&gt; Joe Groff&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 4px 0;" data-ke-size="size16"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;b&gt;Status:&lt;/b&gt; Accepted&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 4px 0;" data-ke-size="size16"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;b&gt;Implementation:&lt;/b&gt; swiftlang/swift#89237&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h2 style="border-left: 4px solid #3a8c28; padding-left: 12px; margin-top: 32px;" data-ke-size="size26"&gt;&lt;b&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;Summary of Changes&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;현재 실행 중인 &lt;code&gt;Task&lt;/code&gt;에 대한 &lt;b&gt;저렴하고, 안정적이고, 프로세스 내에서 유일한&lt;/b&gt; 식별자를 추가해요. &lt;code&gt;Task.currentID&lt;/code&gt;와 &lt;code&gt;Task&lt;/code&gt;, &lt;code&gt;UnsafeCurrentTask&lt;/code&gt;의 인스턴스 접근자가 불투명한 &lt;code&gt;Task.ID&lt;/code&gt;를 반환하는데, 비용이 thread-local 읽기와 비슷한 수준이라 트레이싱이나 구조화된 로깅 같은 상시 계측을 hot path에서도 쓸 수 있게 해줍니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;이 식별자는 관찰 결과와 태스크별 상태를 태스크에 귀속시키기 위한 것이고, 제어 흐름을 컨트롤하기 위한 게 아닙니다  &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt; &lt;/p&gt;
&lt;h2 style="border-left: 4px solid #3a8c28; padding-left: 12px; margin-top: 32px;" data-ke-size="size26"&gt;&lt;b&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;Motivation&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;Swift Concurrency는 현재 태스크를 들여다보는 &lt;code&gt;withUnsafeCurrentTask&lt;/code&gt;, &lt;code&gt;Task.currentPriority&lt;/code&gt;, &lt;code&gt;Task.name&lt;/code&gt; 같은 API를 제공해요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;b&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;대부분의 앱 코드에는 충분하지만, 매 이벤트마다 실행되는 상시 계측 경로를 위해 설계된 API는 아니에요.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt; &lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;트레이싱이나 구조화된 로깅 라이브러리가 모든 이벤트에 "어느 태스크에서 발생했는지"를 붙이려면, 이 귀속 비용이 사실상 프리, 즉 수 나노초 수준이어야 해요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;사용자의 hot path에서 이벤트마다 실행되기 때문이에요. 지금 가장 가까운 방법은 &lt;code&gt;withUnsafeCurrentTask&lt;/code&gt;에 숫자 식별을 뽑는 &lt;code&gt;unsafeBitCast&lt;/code&gt;나 해시 가능한 값을 얻는 &lt;code&gt;hashValue&lt;/code&gt;를 조합하는 건데, 제안서가 Apple Silicon(M 시리즈)에서 표준 라이브러리 opt 빌드로 측정한 바로는 런타임 진입점은 몇 나노초지만 이 방식은 약 15배 더 들어요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt; &lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;벤치마크 설정과 방식별 수치는 pitch 스레드에 있어요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;클로저 형태의 API가 비싼 이유는 런타임 호출이 느려서가 아니에요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;제네릭 &lt;code&gt;withUnsafeCurrentTask&lt;/code&gt; 진입점에서 클로저의 existential boxing, 동적 스택 할당, witness table 간접 참조, 타입 메타데이터 조회가 쌓이기 때문이에요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt; &lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;참고로 이 제네릭 클로저 경로를 우회하는 자체 span 라이브러리는 같은 하드웨어에서 span 시작/종료 한 쌍을 약 25ns에 끝낼 수 있어서, 프로덕션에서도 계측을 켜둘 만하다고 해요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt; &lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;저렴한 태스크 식별은 이걸 가능하게 하는 구성 요소 중 하나입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;런타임은 이미 필요한 식별자를 유지하고 있으니, 안정적인 API로 노출하면 계측 라이브러리가 내부 런타임 진입점에 기대지 않고도 이 성능에 도달할 수 있어요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt; &lt;/p&gt;
&lt;blockquote data-ke-style="style1"&gt;&lt;span style="font-family: 'Noto Serif KR';"&gt;이런 요구는 트레이싱에만 국한되지 않아요.&lt;br&gt;&lt;br&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;ul style="list-style-type: disc;" data-ke-list-type="disc"&gt;
&lt;li&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;b&gt;실시간/지연에 민감한 시스템&lt;/b&gt; — 트레이딩 인프라, 오디오 파이프라인, 게임 엔진처럼 프로덕션 계측이 기본으로 켜져 있어야 하고 프로파일에서 사실상 보이지 않아야 하는 곳&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;b&gt;프로파일러와 개발자 도구&lt;/b&gt; — 관찰 대상 프로그램에 측정 가능한 비용을 주지 않고 샘플이나 이벤트를 태스크에 귀속시키려는 경우&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;b&gt;lock-free 자료구조&lt;/b&gt; — 태스크별 상태를 키로 관리하는데, 런타임이 해제된 태스크의 힙 주소를 재사용할 수 있어서 포인터 동일성은 위험한 경우&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;b&gt;커스텀 executor&lt;/b&gt; — 태스크별 회계처럼 태스크 식별자로 인덱싱한 side table이 필요한 경우&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;b&gt;구조화된 로깅&lt;/b&gt; — 모든 로그 줄에 원본 태스크 식별자를 메타데이터로 실어서, 여러 태스크가 한 스레드를 공유해도 나중에 태스크별 흐름을 복원할 수 있게 하는 경우&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;이 모든 경우의 요구는 같아요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;현재 태스크에 대한 안정적이고, 비교 가능하고, 해시 가능한 식별자를 한 자릿수 나노초 범위에서 얻는 것이에요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt; &lt;/p&gt;
&lt;h2 style="border-left: 4px solid #3a8c28; padding-left: 12px; margin-top: 32px;" data-ke-size="size26"&gt;&lt;b&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;Proposed Solution&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style="style1"&gt;&lt;span style="font-family: 'Noto Serif KR';"&gt;Swift 런타임이 이미 유지하고 있는 프로세스 내 유일한 태스크 식별자를 Task의 공개 API로 노출해요.&lt;br&gt;&lt;br&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;pre class="swift" style="background: #1e1e1e; color: #d4d4d4; padding: 16px; border-radius: 8px; overflow: auto;" data-ke-language="swift"&gt;&lt;code&gt;// Constrained to Task&amp;lt;Never, Never&amp;gt; so callers can write `Task.currentID`
// without specifying generic arguments — matches the shape of Task.sleep.
extension Task where Success == Never, Failure == Never {
  /// The identifier of the currently executing task, or `nil` if no Swift
  /// `Task` is currently running on this thread.
  public static var currentID: Task.ID? { get }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size="size18"&gt; &lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;결과 타입으로는 새 불투명 값 타입이 도입돼요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;최상위에 선언하고 &lt;code&gt;Task&lt;/code&gt;의 typealias로 노출해서, &lt;code&gt;Task.ID&lt;/code&gt;가 &lt;code&gt;Task&lt;/code&gt;의 제네릭 인자에 따라 갈라지는 타입 가족이 아니라 하나의 표준 타입이 되게 했어요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt; &lt;/p&gt;
&lt;pre class="swift" style="background: #1e1e1e; color: #d4d4d4; padding: 16px; border-radius: 8px; overflow: auto;" data-ke-language="swift"&gt;&lt;code&gt;@frozen
public struct TaskID: Sendable, Hashable {
  public var rawValue: UInt64 { get }
}

extension Task {
  public typealias ID = TaskID
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size="size18"&gt; &lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;code&gt;rawValue&lt;/code&gt;는 64비트 정수 표현이 필요한 곳, 즉 바이너리 와이어 포맷, 공유 메모리 영역, 비 Swift 소비자와의 브리지에서 직렬화를 위해 쓰는 문서화된 탈출구입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;이 타입에는 의도적으로 공개 이니셜라이저가 없어요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;이유는 Alternatives Considered에서 다뤄요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt; &lt;/p&gt;
&lt;blockquote data-ke-style="style1"&gt;&lt;span style="font-family: 'Noto Serif KR';"&gt;같은 식별자를 들고 있는 Task 참조나 UnsafeCurrentTask에서도 읽을 수 있어요.&lt;br&gt;&lt;br&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;pre class="swift" style="background: #1e1e1e; color: #d4d4d4; padding: 16px; border-radius: 8px; overflow: auto;"&gt;&lt;code&gt;extension Task {
  public var id: Task.ID { get }
}

extension UnsafeCurrentTask {
  public var id: Task.ID { get }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size="size18"&gt; &lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;code&gt;Task.ID&lt;/code&gt; / &lt;code&gt;task.id&lt;/code&gt;라는 이름은 Swift의 &lt;code&gt;Identifiable&lt;/code&gt; 프로토콜 관례와 일부러 맞춘 거에요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;표준 라이브러리에서 식별자를 가진 타입에 대해 사용자가 이미 기대하는 이름과 같아져요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt; &lt;/p&gt;
&lt;blockquote data-ke-style="style1"&gt;&lt;span style="font-family: 'Noto Serif KR';"&gt;hot path 계측은 이런 모습이 돼요.&lt;br&gt;&lt;br&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;pre class="swift" style="background: #1e1e1e; color: #d4d4d4; padding: 16px; border-radius: 8px; overflow: auto;"&gt;&lt;code&gt;@inline(__always)
func emit(_ event: Event) {
  let id = Task.currentID  // a few nanoseconds, no allocations
  buffer.append(event, taskID: id)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size="size16"&gt; &lt;/p&gt;
&lt;h2 style="border-left: 4px solid #3a8c28; padding-left: 12px; margin-top: 32px;" data-ke-size="size26"&gt;&lt;b&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;Detailed Design&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size="size23"&gt;&lt;b&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;Intended use and pitfalls&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;위 사용 사례들은 같은 모양이에요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;일이 일어나는 곳에서 식별자를 기록하고, 나중에 로그, 트레이스, 프로파일러 샘플, side table에서 찾아본다는 거죠. &lt;code&gt;Task.ID&lt;/code&gt;는 관찰 결과와 태스크별 상태를 태스크에 귀속시키는 키이지, 어느 태스크가 실행 중인지에 따라 제어 흐름을 바꾸는 방법이 아니에요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt; &lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;태스크 식별자로 분기하는 코드는 스레드 식별자로 분기하는 코드와 같은 의심을 받아야 해요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt; &lt;/p&gt;
&lt;blockquote data-ke-style="style1"&gt;&lt;span style="font-family: 'Noto Serif KR';"&gt;특히 다음을 주의해야 해요.&lt;br&gt;&lt;br&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;ul style="list-style-type: disc;" data-ke-list-type="disc"&gt;
&lt;li&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;b&gt;태스크 구조는 계약이 아니에요.&lt;/b&gt; 어떤 API가 호출자가 준 클로저를 호출 태스크에서 돌리는지 자식 태스크에서 돌리는지는, 그 API가 문서화하지 않았다면 구현 세부사항이에요. 문서화 없이 &lt;code&gt;Task.currentID&lt;/code&gt;를 알려진 &lt;code&gt;task.id&lt;/code&gt;와 비교하면, 릴리스 사이에 바뀔 수 있는 구현의 우연을 관찰하는 셈이에요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;b&gt;취소는 컨텍스트 안에서 관찰되지만, 식별자는 그렇지 않아요.&lt;/b&gt; 태스크 취소 방패(&lt;a style="color: #000000;" href="https://github.com/swiftlang/swift-evolution/blob/main/proposals/0504-task-cancellation-shields.md" target="_blank" rel="noopener"&gt;SE-0504&lt;/a&gt;) 안에서는, 바깥 스코프에서 취소된 태스크의 &lt;code&gt;Task.isCancelled&lt;/code&gt;는 &lt;code&gt;false&lt;/code&gt;를 보고하지만 그 태스크의 핸들에 대한 &lt;code&gt;task.isCancelled&lt;/code&gt;는 &lt;code&gt;true&lt;/code&gt;를 보고해요. &lt;code&gt;Task.ID&lt;/code&gt;는 두 관찰이 같은 태스크에 대한 것임을 확인해줄 수 있어요. 그건 식별자가 제 역할을 하는 것이지, 의지하거나 우회해야 할 모순이 아니에요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;b&gt;식별자는 핸들이 아니에요.&lt;/b&gt; &lt;code&gt;Task.ID&lt;/code&gt;로는 태스크를 취소하거나 await하거나 접근할 수 없고, 부모/자식, 그룹, executor 관계도 담고 있지 않아요. 자식 태스크로 일을 따라가야 하는 값은 식별자 키 side table이 아니라 태스크 로컬(&lt;a style="color: #000000;" href="https://github.com/swiftlang/swift-evolution/blob/main/proposals/0311-task-locals.md" target="_blank" rel="noopener"&gt;SE-0311&lt;/a&gt;)을 통해 자동으로 상속돼요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;b&gt;side table은 소유자가 정리해야 해요.&lt;/b&gt; 식별자는 재사용되지 않으므로 오래된 항목이 이후 태스크에 의해 회수되지 않아요. &lt;code&gt;Task.ID&lt;/code&gt;를 키로 쓰는 테이블(예: 커스텀 executor의 태스크별 회계)은 소유자가 항목을 비우지 않으면 끝없이 커져요.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;태스크 식별은 이미 디버거, Instruments, &lt;code&gt;swift-inspect&lt;/code&gt;, 또는 &lt;code&gt;UnsafeCurrentTask&lt;/code&gt;의 포인터 동일성으로도 관찰할 수 있어요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;이 제안은 그걸 필요한 계측에 맞게 저렴하고 안정적으로 만들 뿐이고, 런타임 동작으로 가는 우회 채널로 쓰는 건 권장하지 않아요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt; &lt;/p&gt;
&lt;h3 data-ke-size="size23"&gt;&lt;b&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;Task.ID&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;code&gt;Task.ID&lt;/code&gt;는 런타임이 만든 64비트 부호 없는 정수를 감싼 불투명 값 타입이에요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;기반 정수는 직렬화를 위해 &lt;code&gt;rawValue&lt;/code&gt;로 꺼낼 수 있고, 공개 이니셜라이저는 없어요.&lt;/span&gt;&lt;/p&gt;
&lt;pre class="swift" style="background: #1e1e1e; color: #d4d4d4; padding: 16px; border-radius: 8px; overflow: auto;" data-ke-language="swift"&gt;&lt;code&gt;@frozen
public struct TaskID: Sendable, Hashable {
  public var rawValue: UInt64 { get }
}

extension Task {
  public typealias ID = TaskID
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size="size18"&gt; &lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;이 구조체를 &lt;code&gt;Task&lt;/code&gt; 안에 중첩하지 않고 최상위에 선언한 이유가 있어요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;code&gt;Task&lt;/code&gt;는 &lt;code&gt;Success&lt;/code&gt;, &lt;code&gt;Failure&lt;/code&gt;에 대해 제네릭이라, 직접 중첩한 &lt;code&gt;Task.ID&lt;/code&gt;는 &lt;code&gt;Task&amp;lt;Success, Failure&amp;gt;.ID&lt;/code&gt;, 즉 인스턴스화마다 별개의 타입이 되어버려요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;단일 표준 식별자 타입에는 맞지 않는 모델이죠. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt; &lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;typealias는 사용자에게는 &lt;code&gt;Task.ID&lt;/code&gt; 표기를 주면서 기반 타입은 하나로 유지해줘요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;이 구조의 결과로 &lt;code&gt;Task.ID&lt;/code&gt;와 기반 &lt;code&gt;TaskID&lt;/code&gt;는 같은 타입으로 해석되고 호출 지점에서 둘 다 쓸 수 있어요. &lt;code&gt;Task.ID&lt;/code&gt;가 표준이고 문서화된 표기라서 이쪽을 선호해야 하고, &lt;code&gt;TaskID&lt;/code&gt;는 Swift의 이름 해석이 제네릭 enclosing 타입 안에 비제네릭 타입을 공개적으로 중첩하는 걸 지원하지 않기 때문에 존재하는 비매개변수 기반 타입이에요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt; &lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;이 타입은 두 가지 사용 형태를 위한 거예요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;b&gt;프로세스 내 소비자&lt;/b&gt;는 태스크 식별자로 키를 잡은 딕셔너리, 살아 있는 태스크의 집합, 모듈 경계를 넘어 식별자를 나르는 타입 있는 API 파라미터처럼 &lt;code&gt;Task.ID&lt;/code&gt;를 직접 다루고 기반 정수를 건드릴 일이 없어요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;b&gt;와이어 포맷과 다른 언어 소비자&lt;/b&gt;는 &lt;code&gt;rawValue&lt;/code&gt;를 꺼내 안정적인 64비트 정수를 전송해요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;API는 두 경우 모두 편하도록 만들어졌어요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt; &lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;code&gt;rawValue&lt;/code&gt;는 래퍼에서 나오는 유일하게 지원되는 탈출구예요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;와이어 포맷 작성자는 생산자 쪽에서 &lt;code&gt;rawValue&lt;/code&gt;를 내보내고, 소비자 쪽에서는 그 값을 불투명한 정수로 취급해요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;소비자는 보통 로그를 남기거나, 키로 쓰거나, 다른 데이터와 조인하기 위해 &lt;code&gt;Task.ID&lt;/code&gt; 인스턴스를 복원할 필요가 없어요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;직렬화된 값은 관찰 결과(로그, 트레이스, 다른 데이터와의 조인)를 내보내기 위한 것이지, 다른 프로세스에서 태스크 동일성을 단언하기 위한 게 아니에요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt; &lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;다른 프로세스에서 그 값은 64비트 정수라는 것 외에는 의미 보장이 없어요. &lt;code&gt;MemoryLayout&amp;lt;Task.ID&amp;gt;.size&lt;/code&gt;는 &lt;code&gt;@frozen&lt;/code&gt;으로 고정된 컴파일 타임 상수 &lt;code&gt;8&lt;/code&gt;이에요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;code&gt;Codable&lt;/code&gt;, &lt;code&gt;Encodable&lt;/code&gt;, &lt;code&gt;Decodable&lt;/code&gt; 채택은 제안하지 않아요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;문서화된 직렬화 경로는 호출자가 쓰는 스키마에 &lt;code&gt;rawValue&lt;/code&gt;를 직접 인코딩하는 거예요. 채택을 넣으면 스키마 설계가 정해야 할 인코딩 표현을 표준 라이브러리가 대신 고르게 되거나, &lt;code&gt;rawValue&lt;/code&gt;가 이미 제공하는 걸 중복하게 돼요. 사용 사례가 생기면 별도 제안에서 고려할 수 있어요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt; &lt;/p&gt;
&lt;blockquote data-ke-style="style1"&gt;&lt;span style="font-family: 'Noto Serif KR';"&gt;식별자는 다음 의미를 보장해요.&lt;br&gt;&lt;br&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;ul style="list-style-type: disc;" data-ke-list-type="disc"&gt;
&lt;li&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;b&gt;프로세스 내 유일:&lt;/b&gt; 같은 프로세스에서 살아 있는 두 태스크는 항상 서로 다른 식별자를 가져요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;b&gt;재사용되지 않음:&lt;/b&gt; 한 번 부여된 식별자는 원래 태스크가 소멸된 뒤에도 다른 태스크에 다시 부여되지 않아요. 오래 사는 side table의 키로 안전하게 만드는 속성이고, 포인터 동일성이 주는 것보다 강한 보장이에요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;b&gt;태스크 수명 동안 안정:&lt;/b&gt; 태스크 생성 시점에 정해지고 바뀌지 않아요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;b&gt;프로세스 간에는 안정적이지 않음:&lt;/b&gt; 식별자는 프로세스 로컬이라, 프로세스 간에 의미가 있을 거라 기대하며 저장하거나 전송하면 안 돼요.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;런타임은 현재 식별자를 단조 증가로 할당하지만, 이건 구현 속성이지 계약의 일부가 아니에요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;code&gt;Task.ID&lt;/code&gt;는 &lt;code&gt;Comparable&lt;/code&gt;을 채택하지 않아요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt; &lt;code&gt;rawValue&lt;/code&gt;는 직렬화를 위해 노출된 것이지 순서 추론을 위한 게 아니에요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;위 보장이 유지되는 한, 미래 런타임은 카운터를 샤딩하거나, 시작 시점 nonce를 섞거나, 할당 방식을 바꿔도 소스를 깨지 않아요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt; &lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;카운터 공간 고갈(한 프로세스에서 2⁶⁴번의 식별자 할당)은 명세된 동작이 아니에요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;64비트 공간은 현실적인 프로세스 수명 안에서 도달할 수 없을 만큼 커서(초당 10억 번 태스크를 할당해도 한 바퀴 도는 데 약 584년), 제안은 특정 결과를 강제하지 않아요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt; &lt;/p&gt;
&lt;h3 data-ke-size="size23"&gt;&lt;b&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;Task.currentID&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre class="swift" style="background: #1e1e1e; color: #d4d4d4; padding: 16px; border-radius: 8px; overflow: auto;"&gt;&lt;code&gt;extension Task where Success == Never, Failure == Never {
  public static var currentID: Task.ID? { get }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size="size18"&gt; &lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;이 제약은 오늘날 &lt;code&gt;Task.sleep&lt;/code&gt; 같은 static 멤버가 선언되는 방식을 따라요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;static 접근자는 &lt;code&gt;Success&lt;/code&gt;, &lt;code&gt;Failure&lt;/code&gt;에 의존하지 않으므로, 표준 &lt;code&gt;Task&amp;lt;Never, Never&amp;gt;&lt;/code&gt; 네임스페이스에 묶으면 호출자가 제네릭 인자를 지정하지 않고도 &lt;code&gt;Task.currentID&lt;/code&gt;라고 쓸 수 있어요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt; &lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;이 스레드에서 현재 실행 중인 태스크의 식별자를 반환하고, 현재 실행 중인 Swift &lt;code&gt;Task&lt;/code&gt;가 없으면 &lt;code&gt;nil&lt;/code&gt;을 반환해요(예: 동시성 런타임 밖에서 시작한 동기 컨텍스트에서 호출한 경우). &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;이 접근자가 성능이 가장 중요한 진입점이에요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;설계 목표는 thread-local 읽기에 견줄 만한 한 자릿수 나노초이고, 할당은 없어요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt; &lt;/p&gt;
&lt;h3 data-ke-size="size23"&gt;&lt;b&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;Instance accessors&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre class="swift" style="background: #1e1e1e; color: #d4d4d4; padding: 16px; border-radius: 8px; overflow: auto;"&gt;&lt;code&gt;extension Task {
  public var id: Task.ID { get }
}

extension UnsafeCurrentTask {
  public var id: Task.ID { get }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size="size18"&gt; &lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;code&gt;Task.id&lt;/code&gt;는 태스크가 끝난 뒤에도 항상 안전하게 호출할 수 있어요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;식별자는 태스크 생성 시점에 고정되어 이후 바뀌지 않으므로 동기화가 필요 없어요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt; &lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;code&gt;UnsafeCurrentTask.id&lt;/code&gt;는 &lt;code&gt;UnsafeCurrentTask&lt;/code&gt;의 다른 모든 프로퍼티와 같은 안전 계약을 가져요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;unsafe 태스크 참조는 태스크를 살려두지 않으므로, 해제된 태스크에서 읽는 건 정의되지 않은 동작이에요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;다만 반환값이 trivial 값 타입이라, &lt;code&gt;withUnsafeCurrentTask&lt;/code&gt; 클로저 안에서 식별자를 읽어두면 클로저가 끝난 뒤에도 그 값을 계속 쓸 수 있어요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt; &lt;/p&gt;
&lt;h3 data-ke-size="size23"&gt;&lt;b&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;Performance contract&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;런타임은 이미 모든 태스크에 대해 64비트 식별자를 유지하고 있어서, 구현은 그 필드를 호출자가 믿을 수 있는 비용으로 안정적인 API를 통해 노출하는 문제예요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt; &lt;/p&gt;
&lt;blockquote data-ke-style="style1"&gt;&lt;span style="font-family: 'Noto Serif KR';"&gt;이 제안이 구현에 요구하는 계약은 아래와 같아요.&lt;/span&gt;&lt;/blockquote&gt;
&lt;ul style="list-style-type: disc;" data-ke-list-type="disc"&gt;
&lt;li&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;code&gt;Task.currentID&lt;/code&gt;의 평상시 비용은 최신 Apple Silicon에서 한 자릿수 나노초이고, 다른 최신 64비트 하드웨어에서도 비슷해야 해요. thread-local 읽기보다 비싸면 안 돼요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;할당이 없고, 일반 경로에서 동적 디스패치도 없으며, 기반 런타임 읽기가 이미 요구하는 것 이상의 동기화도 없어요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;code&gt;Task&lt;/code&gt;와 &lt;code&gt;UnsafeCurrentTask&lt;/code&gt;의 인스턴스 접근자도 같은 비용 특성을 제공해요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;code&gt;Task.ID&lt;/code&gt;의 합성된 &lt;code&gt;Equatable&lt;/code&gt;, &lt;code&gt;Hashable&lt;/code&gt; 연산은 구체 타입 호출 지점에서 &lt;code&gt;UInt64&lt;/code&gt; 대응 연산과 같은 명령어 시퀀스로 컴파일돼요.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;구체적인 인라이닝 전략, ABI 심볼 모양, back-deployment 하한은 구현 리뷰에서 다룰 문제입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt; &lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;code&gt;Task.ID&lt;/code&gt;는 레이아웃을 고정하기 위해 &lt;code&gt;@frozen&lt;/code&gt;이에요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;이건 인라이닝 힌트가 아니라 API 계약의 일부예요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;code&gt;rawValue&lt;/code&gt; 접근자와 &lt;code&gt;MemoryLayout&amp;lt;Task.ID&amp;gt;.size == 8&lt;/code&gt; 보장이 둘 다 여기에 의존해요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;64비트 폭도 &lt;code&gt;rawValue&lt;/code&gt;를 통해 계약의 일부예요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt; &lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;다만 그 비트의 내부 &lt;i&gt;해석&lt;/i&gt;(예: &lt;code&gt;(generation, slot)&lt;/code&gt; 쌍으로 나누거나 프로세스 시작 nonce를 섞는 것)은, 프로세스 내 유일하고 재사용되지 않는다는 의미 보장이 유지되는 한 구현이 자유롭게 정할 수 있어요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt; &lt;/p&gt;
&lt;h3 data-ke-size="size23"&gt;&lt;b&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;Interaction with task names&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;code&gt;Task.name&lt;/code&gt;(&lt;a style="color: #000000;" href="https://github.com/swiftlang/swift-evolution/blob/main/proposals/0469-task-names.md" target="_blank" rel="noopener"&gt;SE-0469&lt;/a&gt;)은 태스크 생성 시점에 부여하는 사람이 읽는 레이블이에요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;이 제안의 식별자는 그와 상호 보완적이에요. 작고, 저렴하고, 항상 존재하고, 프로세스 내에서 유일하죠. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;계측 시스템은 식별자를 조인 키(로그, 테이블, side 자료구조)로 쓰고, 사람이 보도록 렌더링할 때만 이름을 만들어 쓰기를 기대해요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;OS 스레드가 숫자 &lt;code&gt;tid&lt;/code&gt;와 선택적인 pthread 이름을 둘 다 갖는 것과 같아요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt; &lt;/p&gt;
&lt;h2 style="border-left: 4px solid #3a8c28; padding-left: 12px; margin-top: 32px;" data-ke-size="size26"&gt;&lt;b&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;Future Directions&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size="size18"&gt;&lt;b&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;Comparable 채택&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;code&gt;Task.ID&lt;/code&gt; 항목에서 말했듯이 순서는 API 계약의 일부가 아니라서 &lt;code&gt;Comparable&lt;/code&gt;을 채택하지 않아요. 사용 사례가 생기면 별도 제안에서 고려할 수 있어요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt; &lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;b&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;프로세스 간 상관관계&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;프로세스나 호스트 경계를 넘는 분산 트레이싱에는 이 제안의 식별자로는 의도적으로 충분하지 않아요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;프로세스 로컬이기 때문이에요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;프로세스 간 상관관계는 자체적으로 전역 유일 식별자를 만드는 &lt;code&gt;swift-distributed-tracing&lt;/code&gt; 같은 라이브러리의 영역으로 남아요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt; &lt;/p&gt;
&lt;h2 style="border-left: 4px solid #3a8c28; padding-left: 12px; margin-top: 32px;" data-ke-size="size26"&gt;&lt;b&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;Conclusion&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;그동안 태스크를 식별하려면 &lt;code&gt;withUnsafeCurrentTask&lt;/code&gt;를 거쳐야 해서 상시 계측에는 비용이 너무 컸고, 포인터를 키로 쓰면 주소 재사용 때문에 위험했어요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt; &lt;code&gt;Task.currentID&lt;/code&gt;는 런타임이 이미 갖고 있는 "재사용되지 않는 64비트 식별자"를 thread-local 읽기 수준의 비용으로 꺼내 쓰게 해주는 작은 API예요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;다만 식별자는 제어 흐름용이 아니라 관찰과 귀속을 위한 키라는 점을 제안서가 분명히 강조하고 있는 것도 인상적이었습니다  &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt; &lt;/p&gt;
&lt;h2 style="border-left: 4px solid #3a8c28; padding-left: 12px; margin-top: 32px;" data-ke-size="size26"&gt;&lt;b&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;References&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;figure id="og_1793535481959" contenteditable="false" data-ke-type="opengraph" data-ke-align="alignCenter" data-og-type="object" data-og-title="swift-evolution/proposals/0553-task-identity.md at main · swiftlang/swift-evolution" data-og-description="This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - swiftlang/swift-evolution" data-og-host="github.com" data-og-source-url="https://github.com/swiftlang/swift-evolution/blob/main/proposals/0553-task-identity.md" data-og-url="https://github.com/swiftlang/swift-evolution/blob/main/proposals/0553-task-identity.md" data-og-image="https://scrap.kakaocdn.net/dn/biwOQn/dJMb9hDreHi/e7XjcBy4OphPellVhpcwo0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/jDErR/dJMb9bwsuyJ/O9OQCdEOK3Rd79qbeFp261/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600"&gt;&lt;a href="https://github.com/swiftlang/swift-evolution/blob/main/proposals/0553-task-identity.md" target="_blank" rel="noopener" data-source-url="https://github.com/swiftlang/swift-evolution/blob/main/proposals/0553-task-identity.md"&gt;
&lt;div class="og-image" style="background-image: url('https://scrap.kakaocdn.net/dn/biwOQn/dJMb9hDreHi/e7XjcBy4OphPellVhpcwo0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/jDErR/dJMb9bwsuyJ/O9OQCdEOK3Rd79qbeFp261/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');"&gt; &lt;/div&gt;
&lt;div class="og-text"&gt;
&lt;p class="og-title" data-ke-size="size16"&gt;swift-evolution/proposals/0553-task-identity.md at main · swiftlang/swift-evolution&lt;/p&gt;
&lt;p class="og-desc" data-ke-size="size16"&gt;This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - swiftlang/swift-evolution&lt;/p&gt;
&lt;p class="og-host" data-ke-size="size16"&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;/body&gt;&lt;/html&gt;
</content>
    <id>https://green1229.tistory.com/642</id>
    <link href="https://green1229.tistory.com/642"/>
    <summary type="html">&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;안녕하세요. &lt;span style="color: #409d00;"&gt;&lt;b&gt;그린&lt;/b&gt;&lt;/span&gt;입니다  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;이번 포스팅에서는 &lt;span style="background-color: #9feec3;"&gt;&lt;b&gt;SE-0553 &amp;mdash; Task Identity에 대해 정리&lt;/b&gt;&lt;/span&gt;해보겠습니다  &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class="imageblock alignCenter" data-ke-mobileStyle="widthOrigin" data-filename="티스토리_썸네일_샘플.001.jpeg" data-origin-width="400" data-origin-height="400"&gt;&lt;span data-url="https://blog.kakaocdn.net/dn/SqXCL/dJMcagOuMzV/LPPjzzsGrp1UbTzEST9tI1/img.jpg" data-phocus="https://blog.kakaocdn.net/dn/SqXCL/dJMcagOuMzV/LPPjzzsGrp1UbTzEST9tI1/img.jpg"&gt;&lt;img src="https://blog.kakaocdn.net/dn/SqXCL/dJMcagOuMzV/LPPjzzsGrp1UbTzEST9tI1/img.jpg" srcset="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSqXCL%2FdJMcagOuMzV%2FLPPjzzsGrp1UbTzEST9tI1%2Fimg.jpg" onerror="this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';" loading="lazy" width="400" height="400" data-filename="티스토리_썸네일_샘플.001.jpeg" data-origin-width="400" data-origin-height="400"/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style="border-left: 4px solid #3a8c28; padding-left: 12px; margin-top: 32px;" data-ke-size="size26"&gt;&lt;b&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;Intro&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;div style="background: #f2f8ee; border-radius: 10px; padding: 16px 20px; margin: 16px 0;"&gt;
&lt;p style="margin: 4px 0;" data-ke-size="size16"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;b&gt;Proposal:&lt;/b&gt; SE-0553&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 4px 0;" data-ke-size="size16"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;b&gt;Authors:&lt;/b&gt; Joakim Hassila, Konrad 'ktoso' Malawski&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 4px 0;" data-ke-size="size16"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;b&gt;Review Manager:&lt;/b&gt; Joe Groff&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 4px 0;" data-ke-size="size16"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;b&gt;Status:&lt;/b&gt; Accepted&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 4px 0;" data-ke-size="size16"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;b&gt;Implementation:&lt;/b&gt; swiftlang/swift#89237&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h2 style="border-left: 4px solid #3a8c28; padding-left: 12px; margin-top: 32px;" data-ke-size="size26"&gt;&lt;b&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;Summary of Changes&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;현재 실행 중인 &lt;code&gt;Task&lt;/code&gt;에 대한 &lt;b&gt;저렴하고, 안정적이고, 프로세스 내에서 유일한&lt;/b&gt; 식별자를 추가해요. &lt;code&gt;Task.currentID&lt;/code&gt;와 &lt;code&gt;Task&lt;/code&gt;, &lt;code&gt;UnsafeCurrentTask&lt;/code&gt;의 인스턴스 접근자가 불투명한 &lt;code&gt;Task.ID&lt;/code&gt;를 반환하는데, 비용이 thread-local 읽기와 비슷한 수준이라 트레이싱이나 구조화된 로깅 같은 상시 계측을 hot path에서도 쓸 수 있게 해줍니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;이 식별자는 관찰 결과와 태스크별 상태를 태스크에 귀속시키기 위한 것이고, 제어 흐름을 컨트롤하기 위한 게 아닙니다  &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style="border-left: 4px solid #3a8c28; padding-left: 12px; margin-top: 32px;" data-ke-size="size26"&gt;&lt;b&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;Motivation&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;Swift Concurrency는 현재 태스크를 들여다보는 &lt;code&gt;withUnsafeCurrentTask&lt;/code&gt;, &lt;code&gt;Task.currentPriority&lt;/code&gt;, &lt;code&gt;Task.name&lt;/code&gt; 같은 API를 제공해요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;b&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;대부분의 앱 코드에는 충분하지만, 매 이벤트마다 실행되는 상시 계측 경로를 위해 설계된 API는 아니에요.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;트레이싱이나 구조화된 로깅 라이브러리가 모든 이벤트에 "어느 태스크에서 발생했는지"를 붙이려면, 이 귀속 비용이 사실상 프리, 즉 수 나노초 수준이어야 해요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;사용자의 hot path에서 이벤트마다 실행되기 때문이에요. 지금 가장 가까운 방법은 &lt;code&gt;withUnsafeCurrentTask&lt;/code&gt;에 숫자 식별을 뽑는 &lt;code&gt;unsafeBitCast&lt;/code&gt;나 해시 가능한 값을 얻는 &lt;code&gt;hashValue&lt;/code&gt;를 조합하는 건데, 제안서가 Apple Silicon(M 시리즈)에서 표준 라이브러리 opt 빌드로 측정한 바로는 런타임 진입점은 몇 나노초지만 이 방식은 약 15배 더 들어요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;벤치마크 설정과 방식별 수치는 pitch 스레드에 있어요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;클로저 형태의 API가 비싼 이유는 런타임 호출이 느려서가 아니에요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;제네릭 &lt;code&gt;withUnsafeCurrentTask&lt;/code&gt; 진입점에서 클로저의 existential boxing, 동적 스택 할당, witness table 간접 참조, 타입 메타데이터 조회가 쌓이기 때문이에요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;참고로 이 제네릭 클로저 경로를 우회하는 자체 span 라이브러리는 같은 하드웨어에서 span 시작/종료 한 쌍을 약 25ns에 끝낼 수 있어서, 프로덕션에서도 계측을 켜둘 만하다고 해요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;저렴한 태스크 식별은 이걸 가능하게 하는 구성 요소 중 하나입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;런타임은 이미 필요한 식별자를 유지하고 있으니, 안정적인 API로 노출하면 계측 라이브러리가 내부 런타임 진입점에 기대지 않고도 이 성능에 도달할 수 있어요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style="style1"&gt;&lt;span style="font-family: 'Noto Serif KR';"&gt;이런 요구는 트레이싱에만 국한되지 않아요.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;ul style="list-style-type: disc;" data-ke-list-type="disc"&gt;
&lt;li&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;b&gt;실시간/지연에 민감한 시스템&lt;/b&gt; &amp;mdash; 트레이딩 인프라, 오디오 파이프라인, 게임 엔진처럼 프로덕션 계측이 기본으로 켜져 있어야 하고 프로파일에서 사실상 보이지 않아야 하는 곳&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;b&gt;프로파일러와 개발자 도구&lt;/b&gt; &amp;mdash; 관찰 대상 프로그램에 측정 가능한 비용을 주지 않고 샘플이나 이벤트를 태스크에 귀속시키려는 경우&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;b&gt;lock-free 자료구조&lt;/b&gt; &amp;mdash; 태스크별 상태를 키로 관리하는데, 런타임이 해제된 태스크의 힙 주소를 재사용할 수 있어서 포인터 동일성은 위험한 경우&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;b&gt;커스텀 executor&lt;/b&gt; &amp;mdash; 태스크별 회계처럼 태스크 식별자로 인덱싱한 side table이 필요한 경우&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;b&gt;구조화된 로깅&lt;/b&gt; &amp;mdash; 모든 로그 줄에 원본 태스크 식별자를 메타데이터로 실어서, 여러 태스크가 한 스레드를 공유해도 나중에 태스크별 흐름을 복원할 수 있게 하는 경우&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;이 모든 경우의 요구는 같아요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;현재 태스크에 대한 안정적이고, 비교 가능하고, 해시 가능한 식별자를 한 자릿수 나노초 범위에서 얻는 것이에요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style="border-left: 4px solid #3a8c28; padding-left: 12px; margin-top: 32px;" data-ke-size="size26"&gt;&lt;b&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;Proposed Solution&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style="style1"&gt;&lt;span style="font-family: 'Noto Serif KR';"&gt;Swift 런타임이 이미 유지하고 있는 프로세스 내 유일한 태스크 식별자를 Task의 공개 API로 노출해요.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;pre class="swift" style="background: #1e1e1e; color: #d4d4d4; padding: 16px; border-radius: 8px; overflow: auto;" data-ke-language="swift"&gt;&lt;code&gt;// Constrained to Task&amp;lt;Never, Never&amp;gt; so callers can write `Task.currentID`
// without specifying generic arguments &amp;mdash; matches the shape of Task.sleep.
extension Task where Success == Never, Failure == Never {
  /// The identifier of the currently executing task, or `nil` if no Swift
  /// `Task` is currently running on this thread.
  public static var currentID: Task.ID? { get }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size="size18"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;결과 타입으로는 새 불투명 값 타입이 도입돼요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;최상위에 선언하고 &lt;code&gt;Task&lt;/code&gt;의 typealias로 노출해서, &lt;code&gt;Task.ID&lt;/code&gt;가 &lt;code&gt;Task&lt;/code&gt;의 제네릭 인자에 따라 갈라지는 타입 가족이 아니라 하나의 표준 타입이 되게 했어요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="swift" style="background: #1e1e1e; color: #d4d4d4; padding: 16px; border-radius: 8px; overflow: auto;" data-ke-language="swift"&gt;&lt;code&gt;@frozen
public struct TaskID: Sendable, Hashable {
  public var rawValue: UInt64 { get }
}

extension Task {
  public typealias ID = TaskID
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size="size18"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;code&gt;rawValue&lt;/code&gt;는 64비트 정수 표현이 필요한 곳, 즉 바이너리 와이어 포맷, 공유 메모리 영역, 비 Swift 소비자와의 브리지에서 직렬화를 위해 쓰는 문서화된 탈출구입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;이 타입에는 의도적으로 공개 이니셜라이저가 없어요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;이유는 Alternatives Considered에서 다뤄요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style="style1"&gt;&lt;span style="font-family: 'Noto Serif KR';"&gt;같은 식별자를 들고 있는 Task 참조나 UnsafeCurrentTask에서도 읽을 수 있어요.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;pre class="swift" style="background: #1e1e1e; color: #d4d4d4; padding: 16px; border-radius: 8px; overflow: auto;"&gt;&lt;code&gt;extension Task {
  public var id: Task.ID { get }
}

extension UnsafeCurrentTask {
  public var id: Task.ID { get }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size="size18"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;code&gt;Task.ID&lt;/code&gt; / &lt;code&gt;task.id&lt;/code&gt;라는 이름은 Swift의 &lt;code&gt;Identifiable&lt;/code&gt; 프로토콜 관례와 일부러 맞춘 거에요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;표준 라이브러리에서 식별자를 가진 타입에 대해 사용자가 이미 기대하는 이름과 같아져요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style="style1"&gt;&lt;span style="font-family: 'Noto Serif KR';"&gt;hot path 계측은 이런 모습이 돼요.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;pre class="swift" style="background: #1e1e1e; color: #d4d4d4; padding: 16px; border-radius: 8px; overflow: auto;"&gt;&lt;code&gt;@inline(__always)
func emit(_ event: Event) {
  let id = Task.currentID  // a few nanoseconds, no allocations
  buffer.append(event, taskID: id)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size="size16"&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style="border-left: 4px solid #3a8c28; padding-left: 12px; margin-top: 32px;" data-ke-size="size26"&gt;&lt;b&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;Detailed Design&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size="size23"&gt;&lt;b&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;Intended use and pitfalls&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;위 사용 사례들은 같은 모양이에요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;일이 일어나는 곳에서 식별자를 기록하고, 나중에 로그, 트레이스, 프로파일러 샘플, side table에서 찾아본다는 거죠. &lt;code&gt;Task.ID&lt;/code&gt;는 관찰 결과와 태스크별 상태를 태스크에 귀속시키는 키이지, 어느 태스크가 실행 중인지에 따라 제어 흐름을 바꾸는 방법이 아니에요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;태스크 식별자로 분기하는 코드는 스레드 식별자로 분기하는 코드와 같은 의심을 받아야 해요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style="style1"&gt;&lt;span style="font-family: 'Noto Serif KR';"&gt;특히 다음을 주의해야 해요.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;ul style="list-style-type: disc;" data-ke-list-type="disc"&gt;
&lt;li&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;b&gt;태스크 구조는 계약이 아니에요.&lt;/b&gt; 어떤 API가 호출자가 준 클로저를 호출 태스크에서 돌리는지 자식 태스크에서 돌리는지는, 그 API가 문서화하지 않았다면 구현 세부사항이에요. 문서화 없이 &lt;code&gt;Task.currentID&lt;/code&gt;를 알려진 &lt;code&gt;task.id&lt;/code&gt;와 비교하면, 릴리스 사이에 바뀔 수 있는 구현의 우연을 관찰하는 셈이에요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;b&gt;취소는 컨텍스트 안에서 관찰되지만, 식별자는 그렇지 않아요.&lt;/b&gt; 태스크 취소 방패(&lt;a style="color: #000000;" href="https://github.com/swiftlang/swift-evolution/blob/main/proposals/0504-task-cancellation-shields.md" target="_blank" rel="noopener"&gt;SE-0504&lt;/a&gt;) 안에서는, 바깥 스코프에서 취소된 태스크의 &lt;code&gt;Task.isCancelled&lt;/code&gt;는 &lt;code&gt;false&lt;/code&gt;를 보고하지만 그 태스크의 핸들에 대한 &lt;code&gt;task.isCancelled&lt;/code&gt;는 &lt;code&gt;true&lt;/code&gt;를 보고해요. &lt;code&gt;Task.ID&lt;/code&gt;는 두 관찰이 같은 태스크에 대한 것임을 확인해줄 수 있어요. 그건 식별자가 제 역할을 하는 것이지, 의지하거나 우회해야 할 모순이 아니에요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;b&gt;식별자는 핸들이 아니에요.&lt;/b&gt; &lt;code&gt;Task.ID&lt;/code&gt;로는 태스크를 취소하거나 await하거나 접근할 수 없고, 부모/자식, 그룹, executor 관계도 담고 있지 않아요. 자식 태스크로 일을 따라가야 하는 값은 식별자 키 side table이 아니라 태스크 로컬(&lt;a style="color: #000000;" href="https://github.com/swiftlang/swift-evolution/blob/main/proposals/0311-task-locals.md" target="_blank" rel="noopener"&gt;SE-0311&lt;/a&gt;)을 통해 자동으로 상속돼요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;b&gt;side table은 소유자가 정리해야 해요.&lt;/b&gt; 식별자는 재사용되지 않으므로 오래된 항목이 이후 태스크에 의해 회수되지 않아요. &lt;code&gt;Task.ID&lt;/code&gt;를 키로 쓰는 테이블(예: 커스텀 executor의 태스크별 회계)은 소유자가 항목을 비우지 않으면 끝없이 커져요.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;태스크 식별은 이미 디버거, Instruments, &lt;code&gt;swift-inspect&lt;/code&gt;, 또는 &lt;code&gt;UnsafeCurrentTask&lt;/code&gt;의 포인터 동일성으로도 관찰할 수 있어요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;이 제안은 그걸 필요한 계측에 맞게 저렴하고 안정적으로 만들 뿐이고, 런타임 동작으로 가는 우회 채널로 쓰는 건 권장하지 않아요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size="size23"&gt;&lt;b&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;Task.ID&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;code&gt;Task.ID&lt;/code&gt;는 런타임이 만든 64비트 부호 없는 정수를 감싼 불투명 값 타입이에요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;기반 정수는 직렬화를 위해 &lt;code&gt;rawValue&lt;/code&gt;로 꺼낼 수 있고, 공개 이니셜라이저는 없어요.&lt;/span&gt;&lt;/p&gt;
&lt;pre class="swift" style="background: #1e1e1e; color: #d4d4d4; padding: 16px; border-radius: 8px; overflow: auto;" data-ke-language="swift"&gt;&lt;code&gt;@frozen
public struct TaskID: Sendable, Hashable {
  public var rawValue: UInt64 { get }
}

extension Task {
  public typealias ID = TaskID
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size="size18"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;이 구조체를 &lt;code&gt;Task&lt;/code&gt; 안에 중첩하지 않고 최상위에 선언한 이유가 있어요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;code&gt;Task&lt;/code&gt;는 &lt;code&gt;Success&lt;/code&gt;, &lt;code&gt;Failure&lt;/code&gt;에 대해 제네릭이라, 직접 중첩한 &lt;code&gt;Task.ID&lt;/code&gt;는 &lt;code&gt;Task&amp;lt;Success, Failure&amp;gt;.ID&lt;/code&gt;, 즉 인스턴스화마다 별개의 타입이 되어버려요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;단일 표준 식별자 타입에는 맞지 않는 모델이죠. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;typealias는 사용자에게는 &lt;code&gt;Task.ID&lt;/code&gt; 표기를 주면서 기반 타입은 하나로 유지해줘요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;이 구조의 결과로 &lt;code&gt;Task.ID&lt;/code&gt;와 기반 &lt;code&gt;TaskID&lt;/code&gt;는 같은 타입으로 해석되고 호출 지점에서 둘 다 쓸 수 있어요. &lt;code&gt;Task.ID&lt;/code&gt;가 표준이고 문서화된 표기라서 이쪽을 선호해야 하고, &lt;code&gt;TaskID&lt;/code&gt;는 Swift의 이름 해석이 제네릭 enclosing 타입 안에 비제네릭 타입을 공개적으로 중첩하는 걸 지원하지 않기 때문에 존재하는 비매개변수 기반 타입이에요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;이 타입은 두 가지 사용 형태를 위한 거예요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;b&gt;프로세스 내 소비자&lt;/b&gt;는 태스크 식별자로 키를 잡은 딕셔너리, 살아 있는 태스크의 집합, 모듈 경계를 넘어 식별자를 나르는 타입 있는 API 파라미터처럼 &lt;code&gt;Task.ID&lt;/code&gt;를 직접 다루고 기반 정수를 건드릴 일이 없어요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;b&gt;와이어 포맷과 다른 언어 소비자&lt;/b&gt;는 &lt;code&gt;rawValue&lt;/code&gt;를 꺼내 안정적인 64비트 정수를 전송해요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;API는 두 경우 모두 편하도록 만들어졌어요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;code&gt;rawValue&lt;/code&gt;는 래퍼에서 나오는 유일하게 지원되는 탈출구예요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;와이어 포맷 작성자는 생산자 쪽에서 &lt;code&gt;rawValue&lt;/code&gt;를 내보내고, 소비자 쪽에서는 그 값을 불투명한 정수로 취급해요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;소비자는 보통 로그를 남기거나, 키로 쓰거나, 다른 데이터와 조인하기 위해 &lt;code&gt;Task.ID&lt;/code&gt; 인스턴스를 복원할 필요가 없어요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;직렬화된 값은 관찰 결과(로그, 트레이스, 다른 데이터와의 조인)를 내보내기 위한 것이지, 다른 프로세스에서 태스크 동일성을 단언하기 위한 게 아니에요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;다른 프로세스에서 그 값은 64비트 정수라는 것 외에는 의미 보장이 없어요. &lt;code&gt;MemoryLayout&amp;lt;Task.ID&amp;gt;.size&lt;/code&gt;는 &lt;code&gt;@frozen&lt;/code&gt;으로 고정된 컴파일 타임 상수 &lt;code&gt;8&lt;/code&gt;이에요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;code&gt;Codable&lt;/code&gt;, &lt;code&gt;Encodable&lt;/code&gt;, &lt;code&gt;Decodable&lt;/code&gt; 채택은 제안하지 않아요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;문서화된 직렬화 경로는 호출자가 쓰는 스키마에 &lt;code&gt;rawValue&lt;/code&gt;를 직접 인코딩하는 거예요. 채택을 넣으면 스키마 설계가 정해야 할 인코딩 표현을 표준 라이브러리가 대신 고르게 되거나, &lt;code&gt;rawValue&lt;/code&gt;가 이미 제공하는 걸 중복하게 돼요. 사용 사례가 생기면 별도 제안에서 고려할 수 있어요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style="style1"&gt;&lt;span style="font-family: 'Noto Serif KR';"&gt;식별자는 다음 의미를 보장해요.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;ul style="list-style-type: disc;" data-ke-list-type="disc"&gt;
&lt;li&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;b&gt;프로세스 내 유일:&lt;/b&gt; 같은 프로세스에서 살아 있는 두 태스크는 항상 서로 다른 식별자를 가져요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;b&gt;재사용되지 않음:&lt;/b&gt; 한 번 부여된 식별자는 원래 태스크가 소멸된 뒤에도 다른 태스크에 다시 부여되지 않아요. 오래 사는 side table의 키로 안전하게 만드는 속성이고, 포인터 동일성이 주는 것보다 강한 보장이에요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;b&gt;태스크 수명 동안 안정:&lt;/b&gt; 태스크 생성 시점에 정해지고 바뀌지 않아요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;b&gt;프로세스 간에는 안정적이지 않음:&lt;/b&gt; 식별자는 프로세스 로컬이라, 프로세스 간에 의미가 있을 거라 기대하며 저장하거나 전송하면 안 돼요.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;런타임은 현재 식별자를 단조 증가로 할당하지만, 이건 구현 속성이지 계약의 일부가 아니에요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;code&gt;Task.ID&lt;/code&gt;는 &lt;code&gt;Comparable&lt;/code&gt;을 채택하지 않아요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt; &lt;code&gt;rawValue&lt;/code&gt;는 직렬화를 위해 노출된 것이지 순서 추론을 위한 게 아니에요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;위 보장이 유지되는 한, 미래 런타임은 카운터를 샤딩하거나, 시작 시점 nonce를 섞거나, 할당 방식을 바꿔도 소스를 깨지 않아요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;카운터 공간 고갈(한 프로세스에서 2⁶⁴번의 식별자 할당)은 명세된 동작이 아니에요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;64비트 공간은 현실적인 프로세스 수명 안에서 도달할 수 없을 만큼 커서(초당 10억 번 태스크를 할당해도 한 바퀴 도는 데 약 584년), 제안은 특정 결과를 강제하지 않아요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size="size23"&gt;&lt;b&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;Task.currentID&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre class="swift" style="background: #1e1e1e; color: #d4d4d4; padding: 16px; border-radius: 8px; overflow: auto;"&gt;&lt;code&gt;extension Task where Success == Never, Failure == Never {
  public static var currentID: Task.ID? { get }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size="size18"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;이 제약은 오늘날 &lt;code&gt;Task.sleep&lt;/code&gt; 같은 static 멤버가 선언되는 방식을 따라요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;static 접근자는 &lt;code&gt;Success&lt;/code&gt;, &lt;code&gt;Failure&lt;/code&gt;에 의존하지 않으므로, 표준 &lt;code&gt;Task&amp;lt;Never, Never&amp;gt;&lt;/code&gt; 네임스페이스에 묶으면 호출자가 제네릭 인자를 지정하지 않고도 &lt;code&gt;Task.currentID&lt;/code&gt;라고 쓸 수 있어요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;이 스레드에서 현재 실행 중인 태스크의 식별자를 반환하고, 현재 실행 중인 Swift &lt;code&gt;Task&lt;/code&gt;가 없으면 &lt;code&gt;nil&lt;/code&gt;을 반환해요(예: 동시성 런타임 밖에서 시작한 동기 컨텍스트에서 호출한 경우). &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;이 접근자가 성능이 가장 중요한 진입점이에요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;설계 목표는 thread-local 읽기에 견줄 만한 한 자릿수 나노초이고, 할당은 없어요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size="size23"&gt;&lt;b&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;Instance accessors&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre class="swift" style="background: #1e1e1e; color: #d4d4d4; padding: 16px; border-radius: 8px; overflow: auto;"&gt;&lt;code&gt;extension Task {
  public var id: Task.ID { get }
}

extension UnsafeCurrentTask {
  public var id: Task.ID { get }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size="size18"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;code&gt;Task.id&lt;/code&gt;는 태스크가 끝난 뒤에도 항상 안전하게 호출할 수 있어요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;식별자는 태스크 생성 시점에 고정되어 이후 바뀌지 않으므로 동기화가 필요 없어요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;code&gt;UnsafeCurrentTask.id&lt;/code&gt;는 &lt;code&gt;UnsafeCurrentTask&lt;/code&gt;의 다른 모든 프로퍼티와 같은 안전 계약을 가져요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;unsafe 태스크 참조는 태스크를 살려두지 않으므로, 해제된 태스크에서 읽는 건 정의되지 않은 동작이에요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;다만 반환값이 trivial 값 타입이라, &lt;code&gt;withUnsafeCurrentTask&lt;/code&gt; 클로저 안에서 식별자를 읽어두면 클로저가 끝난 뒤에도 그 값을 계속 쓸 수 있어요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size="size23"&gt;&lt;b&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;Performance contract&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;런타임은 이미 모든 태스크에 대해 64비트 식별자를 유지하고 있어서, 구현은 그 필드를 호출자가 믿을 수 있는 비용으로 안정적인 API를 통해 노출하는 문제예요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style="style1"&gt;&lt;span style="font-family: 'Noto Serif KR';"&gt;이 제안이 구현에 요구하는 계약은 아래와 같아요.&lt;/span&gt;&lt;/blockquote&gt;
&lt;ul style="list-style-type: disc;" data-ke-list-type="disc"&gt;
&lt;li&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;code&gt;Task.currentID&lt;/code&gt;의 평상시 비용은 최신 Apple Silicon에서 한 자릿수 나노초이고, 다른 최신 64비트 하드웨어에서도 비슷해야 해요. thread-local 읽기보다 비싸면 안 돼요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;할당이 없고, 일반 경로에서 동적 디스패치도 없으며, 기반 런타임 읽기가 이미 요구하는 것 이상의 동기화도 없어요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;code&gt;Task&lt;/code&gt;와 &lt;code&gt;UnsafeCurrentTask&lt;/code&gt;의 인스턴스 접근자도 같은 비용 특성을 제공해요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;code&gt;Task.ID&lt;/code&gt;의 합성된 &lt;code&gt;Equatable&lt;/code&gt;, &lt;code&gt;Hashable&lt;/code&gt; 연산은 구체 타입 호출 지점에서 &lt;code&gt;UInt64&lt;/code&gt; 대응 연산과 같은 명령어 시퀀스로 컴파일돼요.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;구체적인 인라이닝 전략, ABI 심볼 모양, back-deployment 하한은 구현 리뷰에서 다룰 문제입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;code&gt;Task.ID&lt;/code&gt;는 레이아웃을 고정하기 위해 &lt;code&gt;@frozen&lt;/code&gt;이에요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;이건 인라이닝 힌트가 아니라 API 계약의 일부예요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;code&gt;rawValue&lt;/code&gt; 접근자와 &lt;code&gt;MemoryLayout&amp;lt;Task.ID&amp;gt;.size == 8&lt;/code&gt; 보장이 둘 다 여기에 의존해요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;64비트 폭도 &lt;code&gt;rawValue&lt;/code&gt;를 통해 계약의 일부예요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;다만 그 비트의 내부 &lt;i&gt;해석&lt;/i&gt;(예: &lt;code&gt;(generation, slot)&lt;/code&gt; 쌍으로 나누거나 프로세스 시작 nonce를 섞는 것)은, 프로세스 내 유일하고 재사용되지 않는다는 의미 보장이 유지되는 한 구현이 자유롭게 정할 수 있어요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size="size23"&gt;&lt;b&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;Interaction with task names&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;code&gt;Task.name&lt;/code&gt;(&lt;a style="color: #000000;" href="https://github.com/swiftlang/swift-evolution/blob/main/proposals/0469-task-names.md" target="_blank" rel="noopener"&gt;SE-0469&lt;/a&gt;)은 태스크 생성 시점에 부여하는 사람이 읽는 레이블이에요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;이 제안의 식별자는 그와 상호 보완적이에요. 작고, 저렴하고, 항상 존재하고, 프로세스 내에서 유일하죠. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;계측 시스템은 식별자를 조인 키(로그, 테이블, side 자료구조)로 쓰고, 사람이 보도록 렌더링할 때만 이름을 만들어 쓰기를 기대해요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;OS 스레드가 숫자 &lt;code&gt;tid&lt;/code&gt;와 선택적인 pthread 이름을 둘 다 갖는 것과 같아요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style="border-left: 4px solid #3a8c28; padding-left: 12px; margin-top: 32px;" data-ke-size="size26"&gt;&lt;b&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;Future Directions&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size="size18"&gt;&lt;b&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;Comparable 채택&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;&lt;code&gt;Task.ID&lt;/code&gt; 항목에서 말했듯이 순서는 API 계약의 일부가 아니라서 &lt;code&gt;Comparable&lt;/code&gt;을 채택하지 않아요. 사용 사례가 생기면 별도 제안에서 고려할 수 있어요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;b&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;프로세스 간 상관관계&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;프로세스나 호스트 경계를 넘는 분산 트레이싱에는 이 제안의 식별자로는 의도적으로 충분하지 않아요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;프로세스 로컬이기 때문이에요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;프로세스 간 상관관계는 자체적으로 전역 유일 식별자를 만드는 &lt;code&gt;swift-distributed-tracing&lt;/code&gt; 같은 라이브러리의 영역으로 남아요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style="border-left: 4px solid #3a8c28; padding-left: 12px; margin-top: 32px;" data-ke-size="size26"&gt;&lt;b&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;Conclusion&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;그동안 태스크를 식별하려면 &lt;code&gt;withUnsafeCurrentTask&lt;/code&gt;를 거쳐야 해서 상시 계측에는 비용이 너무 컸고, 포인터를 키로 쓰면 주소 재사용 때문에 위험했어요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt; &lt;code&gt;Task.currentID&lt;/code&gt;는 런타임이 이미 갖고 있는 "재사용되지 않는 64비트 식별자"를 thread-local 읽기 수준의 비용으로 꺼내 쓰게 해주는 작은 API예요. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;다만 식별자는 제어 흐름용이 아니라 관찰과 귀속을 위한 키라는 점을 제안서가 분명히 강조하고 있는 것도 인상적이었습니다  &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size="size18"&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style="border-left: 4px solid #3a8c28; padding-left: 12px; margin-top: 32px;" data-ke-size="size26"&gt;&lt;b&gt;&lt;span style="font-family: 'Nanum Gothic'; color: #000000;"&gt;References&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;figure id="og_1793535481959" contenteditable="false" data-ke-type="opengraph" data-ke-align="alignCenter" data-og-type="object" data-og-title="swift-evolution/proposals/0553-task-identity.md at main &amp;middot; swiftlang/swift-evolution" data-og-description="This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - swiftlang/swift-evolution" data-og-host="github.com" data-og-source-url="https://github.com/swiftlang/swift-evolution/blob/main/proposals/0553-task-identity.md" data-og-url="https://github.com/swiftlang/swift-evolution/blob/main/proposals/0553-task-identity.md" data-og-image="https://scrap.kakaocdn.net/dn/biwOQn/dJMb9hDreHi/e7XjcBy4OphPellVhpcwo0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/jDErR/dJMb9bwsuyJ/O9OQCdEOK3Rd79qbeFp261/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600"&gt;&lt;a href="https://github.com/swiftlang/swift-evolution/blob/main/proposals/0553-task-identity.md" target="_blank" rel="noopener" data-source-url="https://github.com/swiftlang/swift-evolution/blob/main/proposals/0553-task-identity.md"&gt;
&lt;div class="og-image" style="background-image: url('https://scrap.kakaocdn.net/dn/biwOQn/dJMb9hDreHi/e7XjcBy4OphPellVhpcwo0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/jDErR/dJMb9bwsuyJ/O9OQCdEOK3Rd79qbeFp261/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');"&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class="og-text"&gt;
&lt;p class="og-title" data-ke-size="size16"&gt;swift-evolution/proposals/0553-task-identity.md at main &amp;middot; swiftlang/swift-evolution&lt;/p&gt;
&lt;p class="og-desc" data-ke-size="size16"&gt;This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - swiftlang/swift-evolution&lt;/p&gt;
&lt;p class="og-host" data-ke-size="size16"&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</summary>
    <title>[SE-0553] Task Identity</title>
    <updated>2026-11-01T21:19:12+09:00</updated>
    <dc:date>2026-11-01T21:19:12+09:00</dc:date>
  </entry>
  <entry>
    <author>
      <name>Pluu</name>
    </author>
    <content type="html">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"&gt;
&lt;html&gt;&lt;body&gt;
&lt;p&gt;Android CLI의 &lt;code class="language-plaintext highlighter-rouge"&gt;android install&lt;/code&gt;은 단순한 &lt;code class="language-plaintext highlighter-rouge"&gt;adb install&lt;/code&gt;의 래퍼(Wrapper)가 아닙니다. 소스 빌드 연동 기능과 함께, 변경된 바이트만 전송하는 &lt;strong&gt;증분 설치(Delta Install)&lt;/strong&gt;를 기본값으로 사용합니다.&lt;/p&gt;

&lt;p&gt;두 도구의 내부 동작 차이를 분석하고, 로컬 에뮬레이터와 네트워크 대역폭 제한 환경에서 설치 속도를 비교했습니다.&lt;/p&gt;

&lt;!--more--&gt;

&lt;blockquote&gt;
  &lt;p&gt;본 글은 Gemini를 사용하여 초안을 작성한 후 검수하였습니다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr&gt;

&lt;p&gt;본 글에서 사용된 도구 버전 및 환경(2026년 10월 31일 기준)은 다음과 같습니다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Android CLI: 1.1.16717390&lt;/li&gt;
  &lt;li&gt;Android Debug Bridge (adb): 1.0.41 (platform-tools 37.0.1-15733141)&lt;/li&gt;
  &lt;li&gt;Android Gradle Plugin (AGP): 9.5.0&lt;/li&gt;
  &lt;li&gt;Kotlin: 2.4.21&lt;/li&gt;
  &lt;li&gt;Target Device: Android Virtual Device (Pixel 9a, API 37, arm64-v8a)&lt;/li&gt;
&lt;/ul&gt;

&lt;hr&gt;

&lt;h2 id="1-핵심-차이점-한눈에-보기"&gt;1. 핵심 차이점 한눈에 보기&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;비교 항목&lt;/th&gt;
      &lt;th&gt;adb install&lt;/th&gt;
      &lt;th&gt;android install&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;도구 성격&lt;/td&gt;
      &lt;td&gt;Low-level 범용 기기 통신 도구 (&lt;code class="language-plaintext highlighter-rouge"&gt;platform-tools&lt;/code&gt;)&lt;/td&gt;
      &lt;td&gt;High-level Android 개발자/에이전트 워크플로 CLI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;입력 형태&lt;/td&gt;
      &lt;td&gt;로컬 APK 파일 경로만 지원&lt;/td&gt;
      &lt;td&gt;로컬 APK 경로뿐만 아니라 빌드 참조 ([system://][path]?[target]) 지원&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;빌드 연동&lt;/td&gt;
      &lt;td&gt;불가 (사전에 빌드 완료된 APK 필요)&lt;/td&gt;
      &lt;td&gt;소스 빌드와 배포를 한 번에 연동 가능 (– &lt;build_args&gt;)&lt;/build_args&gt;
&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;증분 설치 (Delta)&lt;/td&gt;
      &lt;td&gt;
&lt;code class="language-plaintext highlighter-rouge"&gt;--fastdeploy&lt;/code&gt; 옵션 필요 (별도 agent)&lt;/td&gt;
      &lt;td&gt;
&lt;code class="language-plaintext highlighter-rouge"&gt;--use-delta-install&lt;/code&gt; 기본 활성화 (default: true)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;전송 최적화&lt;/td&gt;
      &lt;td&gt;Streaming Install 지원 (&lt;code class="language-plaintext highlighter-rouge"&gt;--streaming&lt;/code&gt;)&lt;/td&gt;
      &lt;td&gt;변경된 delta 패치 파일만 기기로 전송 (Zero-copy 활용)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;다중 APK 지원&lt;/td&gt;
      &lt;td&gt;install-multiple, install-multi-package 분리&lt;/td&gt;
      &lt;td&gt;–apks=a.apk,b.apk 로 단순화&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;실행 연계&lt;/td&gt;
      &lt;td&gt;설치만 수행&lt;/td&gt;
      &lt;td&gt;설치만 수행 (&lt;code class="language-plaintext highlighter-rouge"&gt;android run&lt;/code&gt; 시 설치 후 launch까지 연동)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id="1-소스-빌드-참조build-reference-지원"&gt;(1) 소스 빌드 참조(Build Reference) 지원&lt;/h3&gt;
&lt;p&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;adb install&lt;/code&gt;은 오직 디스크에 존재하는 &lt;code class="language-plaintext highlighter-rouge"&gt;.apk&lt;/code&gt; 파일만을 대상으로 동작합니다.
반면 &lt;code class="language-plaintext highlighter-rouge"&gt;android install&lt;/code&gt;은 Android CLI 1.1부터 &lt;strong&gt;빌드 참조 문법&lt;/strong&gt;을 직접 인식합니다.&lt;/p&gt;

&lt;div class="language-bash highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="c"&gt;# 로컬 APK 파일 설치&lt;/span&gt;
android &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--apks&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;app/build/outputs/apk/debug/app-debug.apk

&lt;span class="c"&gt;# Gradle 프로젝트 빌드 후 설치까지 한 번에 수행&lt;/span&gt;
android &lt;span class="nb"&gt;install&lt;/span&gt; :app
android &lt;span class="nb"&gt;install&lt;/span&gt; ~/MyProject?:app@debug &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--offline&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;빌드 타깃을 지정하면 CLI가 프로젝트 구조를 분석해 빌드를 실행하고, 생성된 APK를 찾아 기기에 바로 설치합니다.&lt;/p&gt;

&lt;h3 id="2-기본-delta-install-증분-패치-지원"&gt;(2) 기본 Delta Install (증분 패치) 지원&lt;/h3&gt;
&lt;p&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;android install&lt;/code&gt;은 증분 설치 옵션(&lt;code class="language-plaintext highlighter-rouge"&gt;--use-delta-install&lt;/code&gt;)을 기본값(true)으로 사용합니다.&lt;/p&gt;

&lt;p&gt;기기에 이전 버전의 앱이 이미 설치되어 있다면, APK 전체를 보내지 않고 로컬 APK와 기기 설치본의 차이(Delta)만 계산해 패치 파일(&lt;code class="language-plaintext highlighter-rouge"&gt;.seq&lt;/code&gt;)을 전송합니다.&lt;/p&gt;

&lt;p&gt;기기의 임시 디렉터리(/data/local/tmp)에 배포 에이전트(&lt;code class="language-plaintext highlighter-rouge"&gt;installer.jar&lt;/code&gt;)를 올려 커널의 Zero-copy 시스템 콜로 패치를 적용한 뒤 Package Manager에 반영합니다.&lt;/p&gt;

&lt;h2 id="2-벤치마크-환경-구성"&gt;2. 벤치마크 환경 구성&lt;/h2&gt;

&lt;p&gt;두 도구의 설치 소요 시간과 Delta Install의 데이터 전송 절감량을 확인하기 위해 아래 시나리오별로 테스트를 진행했습니다.&lt;/p&gt;

&lt;h3 id="테스트-시나리오"&gt;테스트 시나리오&lt;/h3&gt;
&lt;p&gt;APK 내 특정 영역만 변경되는 상황을 시뮬레이션하기 위해 4종류의 APK 변형(Variant)을 생성했습니다.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;fresh: 앱을 완전히 삭제(&lt;code class="language-plaintext highlighter-rouge"&gt;uninstall&lt;/code&gt;)한 상태에서 최초 설치&lt;/li&gt;
  &lt;li&gt;same: 동일한 APK를 덮어쓰기 재설치&lt;/li&gt;
  &lt;li&gt;code: Kotlin 코드 상수만 변경 (&lt;code class="language-plaintext highlighter-rouge"&gt;classes*.dex&lt;/code&gt;만 변경)&lt;/li&gt;
  &lt;li&gt;res: 문자열 리소스만 변경 (&lt;code class="language-plaintext highlighter-rouge"&gt;resources.arsc&lt;/code&gt;만 변경)&lt;/li&gt;
  &lt;li&gt;asset: 에셋 파일 1개만 변경 (&lt;code class="language-plaintext highlighter-rouge"&gt;assets/marker.txt&lt;/code&gt;만 변경)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;또한 APK 크기에 따른 전송 대역폭 영향을 보기 위해 두 가지 크기로 측정했습니다.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;기본 Compose 앱: 약 11~12MB&lt;/li&gt;
  &lt;li&gt;대용량 리소스 포함 앱: 약 52MB (비압축 40MB 더미 페이로드 포함)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="3-결과-비교"&gt;3. 결과 비교&lt;/h2&gt;

&lt;h3 id="1-로컬-에뮬레이터-환경"&gt;1) 로컬 에뮬레이터 환경&lt;/h3&gt;

&lt;p&gt;로컬 에뮬레이터는 호스트 메모리 버퍼를 통해 데이터를 전달하므로 네트워크 전송 병목이 없습니다. 5회 반복 측정 후 중앙값 기준입니다.&lt;/p&gt;

&lt;h4 id="-기본-compose-앱-약-1112mb"&gt;① 기본 Compose 앱 (약 11~12MB)&lt;/h4&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;시나리오&lt;/th&gt;
      &lt;th style="text-align: right"&gt;adb install -r&lt;/th&gt;
      &lt;th style="text-align: right"&gt;android install (기본 delta)&lt;/th&gt;
      &lt;th style="text-align: right"&gt;android install (delta OFF)&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;fresh&lt;/td&gt;
      &lt;td style="text-align: right"&gt;0.26s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.17s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.13s&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;same&lt;/td&gt;
      &lt;td style="text-align: right"&gt;0.32s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.01s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.03s&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;code&lt;/td&gt;
      &lt;td style="text-align: right"&gt;0.32s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.01s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.07s&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;res&lt;/td&gt;
      &lt;td style="text-align: right"&gt;0.36s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.04s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.05s&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;asset&lt;/td&gt;
      &lt;td style="text-align: right"&gt;0.33s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.06s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.03s&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h4 id="-52mb-앱-대용량-에셋-포함"&gt;② 52MB 앱 (대용량 에셋 포함)&lt;/h4&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;시나리오&lt;/th&gt;
      &lt;th style="text-align: right"&gt;adb install -r&lt;/th&gt;
      &lt;th style="text-align: right"&gt;android install (기본 delta)&lt;/th&gt;
      &lt;th style="text-align: right"&gt;android install (delta OFF)&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;fresh&lt;/td&gt;
      &lt;td style="text-align: right"&gt;0.46s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.50s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.22s&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;same&lt;/td&gt;
      &lt;td style="text-align: right"&gt;0.57s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.54s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.30s&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;code&lt;/td&gt;
      &lt;td style="text-align: right"&gt;0.52s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.47s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.24s&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;res&lt;/td&gt;
      &lt;td style="text-align: right"&gt;0.48s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.42s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.28s&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;asset&lt;/td&gt;
      &lt;td style="text-align: right"&gt;0.52s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.38s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.28s&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id="결과-분석"&gt;결과 분석&lt;/h3&gt;
&lt;p&gt;로컬 에뮬레이터에서는 &lt;code class="language-plaintext highlighter-rouge"&gt;adb install -r&lt;/code&gt;이 더 빠릅니다.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Android CLI 자체를 기동하는 데 약 0.45초의 기본 오버헤드가 발생합니다.&lt;/li&gt;
  &lt;li&gt;전송 지연이 없는 환경에서는 50MB 전체를 전송하더라도 0.5초 안에 끝나므로, 차이점(Delta)을 계산하고 기기에서 패치 에이전트를 구동하는 시간이 전송 절약 시간보다 더 깁니다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id="2-실기기--wi-fi-디버깅-환경-5-mbs-대역폭-제한"&gt;2) 실기기 / Wi-Fi 디버깅 환경 (5 MB/s 대역폭 제한)&lt;/h3&gt;

&lt;p&gt;실제 개발 환경에서는 Wi-Fi 페어링 무선 디버깅이나 USB 2.0 케이블 연결처럼 &lt;strong&gt;전송 대역폭이 제한되는 환경&lt;/strong&gt;이 많습니다. 이를 재현하기 위해 에뮬레이터 포트 앞에 5 MB/s 전송 속도 제한 프록시를 두고 재측정했습니다.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;※ 배수 비교는 &lt;code class="language-plaintext highlighter-rouge"&gt;adb install -r&lt;/code&gt; 대비 &lt;code class="language-plaintext highlighter-rouge"&gt;android install&lt;/code&gt;의 소요 시간 기준이며, 절감율은 전체 APK 크기 대비 실제 전송된 패치 크기 기준입니다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4 id="-52mb-앱-대역폭-5-mbs"&gt;① 52MB 앱 (대역폭 5 MB/s)&lt;/h4&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;시나리오&lt;/th&gt;
      &lt;th style="text-align: right"&gt;adb install -r&lt;/th&gt;
      &lt;th style="text-align: right"&gt;android install (Delta ON)&lt;/th&gt;
      &lt;th&gt;절감율 / 전송량&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;fresh&lt;/td&gt;
      &lt;td style="text-align: right"&gt;10.41s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;11.63s&lt;/td&gt;
      &lt;td&gt;전체 전송 (51.80 MB)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;same&lt;/td&gt;
      &lt;td style="text-align: right"&gt;10.44s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.52s (adb 대비 약 6.8배 빠름)&lt;/td&gt;
      &lt;td&gt;554 KB 전송 (98.9% 절감)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;code&lt;/td&gt;
      &lt;td style="text-align: right"&gt;10.44s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.45s (adb 대비 약 7.2배 빠름)&lt;/td&gt;
      &lt;td&gt;584 KB 전송 (98.9% 절감)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;res&lt;/td&gt;
      &lt;td style="text-align: right"&gt;10.53s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.68s (adb 대비 약 6.3배 빠름)&lt;/td&gt;
      &lt;td&gt;1.46 MB 전송 (97.2% 절감)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;asset&lt;/td&gt;
      &lt;td style="text-align: right"&gt;10.52s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.63s (adb 대비 약 6.4배 빠름)&lt;/td&gt;
      &lt;td&gt;1.46 MB 전송 (97.2% 절감)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h4 id="-1112mb-기본-앱-대역폭-5-mbs"&gt;② 11~12MB 기본 앱 (대역폭 5 MB/s)&lt;/h4&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;시나리오&lt;/th&gt;
      &lt;th style="text-align: right"&gt;adb install -r&lt;/th&gt;
      &lt;th style="text-align: right"&gt;android install (Delta ON)&lt;/th&gt;
      &lt;th&gt;절감율 / 전송량&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;fresh&lt;/td&gt;
      &lt;td style="text-align: right"&gt;2.30s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;3.48s&lt;/td&gt;
      &lt;td&gt;전체 전송 (11.33 MB)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;same&lt;/td&gt;
      &lt;td style="text-align: right"&gt;2.31s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.28s (adb 대비 약 1.8배 빠름)&lt;/td&gt;
      &lt;td&gt;89 KB 전송 (99.2% 절감)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;code&lt;/td&gt;
      &lt;td style="text-align: right"&gt;2.32s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.29s (adb 대비 약 1.8배 빠름)&lt;/td&gt;
      &lt;td&gt;140 KB 전송 (98.8% 절감)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;res&lt;/td&gt;
      &lt;td style="text-align: right"&gt;2.40s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.54s (adb 대비 약 1.6배 빠름)&lt;/td&gt;
      &lt;td&gt;1.02 MB 전송 (91.4% 절감)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;asset&lt;/td&gt;
      &lt;td style="text-align: right"&gt;2.40s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.49s (adb 대비 약 1.6배 빠름)&lt;/td&gt;
      &lt;td&gt;1.02 MB 전송 (91.4% 절감)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id="결과-분석-1"&gt;결과 분석&lt;/h3&gt;
&lt;p&gt;전송 속도가 제한되는 네트워크나 USB 환경에서는 &lt;code class="language-plaintext highlighter-rouge"&gt;android install&lt;/code&gt;이 훨씬 빠릅니다.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;
&lt;code class="language-plaintext highlighter-rouge"&gt;adb install -r&lt;/code&gt;은 변경된 내용이 적더라도 52MB 전체를 스트리밍 전송하므로 매번 &lt;strong&gt;10초 이상(10.44s~10.53s)&lt;/strong&gt; 걸립니다.&lt;/li&gt;
  &lt;li&gt;반면 &lt;code class="language-plaintext highlighter-rouge"&gt;android install&lt;/code&gt;은 &lt;strong&gt;584KB 패치 파일만 전송(전송량 98.9% 절감)&lt;/strong&gt;하므로 전송 시간을 0.1초대로 줄여 전체 설치를 &lt;strong&gt;1.45초(약 7.2배 빠름)&lt;/strong&gt;에 마칩니다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="4-adb-fastdeploy와의-차이"&gt;4. “adb –fastdeploy”와의 차이&lt;/h2&gt;

&lt;p&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;adb install&lt;/code&gt;에도 &lt;code class="language-plaintext highlighter-rouge"&gt;--fastdeploy&lt;/code&gt; 옵션이 있지만, 아래 경고를 출력하며 일반 전체 설치로 전환될 수도 있습니다.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Fast Deploy is only compatible with devices of API version 24 or higher, ignoring.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;반면 &lt;code class="language-plaintext highlighter-rouge"&gt;android install&lt;/code&gt;의 Delta Install은 Android Studio 배포 시스템(Deployer)의 기술을 CLI에 적용해 최신 OS에서도 정상적으로 패치 설치를 수행합니다.&lt;/p&gt;

&lt;h2 id="5-요약-및-상황별-추천"&gt;5. 요약 및 상황별 추천&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;
&lt;code class="language-plaintext highlighter-rouge"&gt;android install&lt;/code&gt;을 써야 하는 경우
    &lt;ul&gt;
      &lt;li&gt;실기기 디버깅(특히 Wi-Fi 무선 디버깅): 코드나 리소스 일부만 수정하고 재설치할 때 전송 시간이 대폭 줄어듭니다.&lt;/li&gt;
      &lt;li&gt;대용량 프로젝트: APK 크기가 클수록 Delta 패치 전송의 절약 효과가 큽니다.&lt;/li&gt;
      &lt;li&gt;빌드와 배포 연동: &lt;code class="language-plaintext highlighter-rouge"&gt;:app&lt;/code&gt; 같은 타깃 참조를 넘겨 빌드와 설치를 명령어 하나로 실행할 때 적합합니다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
&lt;code class="language-plaintext highlighter-rouge"&gt;adb install&lt;/code&gt;을 써야 하는 경우
    &lt;ul&gt;
      &lt;li&gt;로컬 에뮬레이터 반복 테스트: 전송 병목이 없어 CLI 기동 오버헤드가 없는 &lt;code class="language-plaintext highlighter-rouge"&gt;adb&lt;/code&gt;가 0.2초대로 가장 빠릅니다.&lt;/li&gt;
      &lt;li&gt;가벼운 CI/CD 파이프라인: 별도의 Android CLI 스택 없이 &lt;code class="language-plaintext highlighter-rouge"&gt;platform-tools&lt;/code&gt;만 설치된 환경에서 배포할 때 유리합니다.&lt;/li&gt;
      &lt;li&gt;세부 설치 옵션 제어: &lt;code class="language-plaintext highlighter-rouge"&gt;--instant&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;--abi&lt;/code&gt;, 다중 패키지 원자적 설치 등 저수준 Package Manager 옵션이 필요할 때 사용합니다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;
&lt;/body&gt;&lt;/html&gt;
</content>
    <id>http://pluu.github.io/blog/android/2026/11/01/adb-install-vs-android-install/</id>
    <link href="http://pluu.github.io/blog/android/2026/11/01/adb-install-vs-android-install/"/>
    <summary type="html">&lt;p&gt;Android CLI의 &lt;code class="language-plaintext highlighter-rouge"&gt;android install&lt;/code&gt;은 단순한 &lt;code class="language-plaintext highlighter-rouge"&gt;adb install&lt;/code&gt;의 래퍼(Wrapper)가 아닙니다. 소스 빌드 연동 기능과 함께, 변경된 바이트만 전송하는 &lt;strong&gt;증분 설치(Delta Install)&lt;/strong&gt;를 기본값으로 사용합니다.&lt;/p&gt;

&lt;p&gt;두 도구의 내부 동작 차이를 분석하고, 로컬 에뮬레이터와 네트워크 대역폭 제한 환경에서 설치 속도를 비교했습니다.&lt;/p&gt;

&lt;!--more--&gt;

&lt;blockquote&gt;
  &lt;p&gt;본 글은 Gemini를 사용하여 초안을 작성한 후 검수하였습니다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;p&gt;본 글에서 사용된 도구 버전 및 환경(2026년 10월 31일 기준)은 다음과 같습니다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Android CLI: 1.1.16717390&lt;/li&gt;
  &lt;li&gt;Android Debug Bridge (adb): 1.0.41 (platform-tools 37.0.1-15733141)&lt;/li&gt;
  &lt;li&gt;Android Gradle Plugin (AGP): 9.5.0&lt;/li&gt;
  &lt;li&gt;Kotlin: 2.4.21&lt;/li&gt;
  &lt;li&gt;Target Device: Android Virtual Device (Pixel 9a, API 37, arm64-v8a)&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h2 id="1-핵심-차이점-한눈에-보기"&gt;1. 핵심 차이점 한눈에 보기&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;비교 항목&lt;/th&gt;
      &lt;th&gt;adb install&lt;/th&gt;
      &lt;th&gt;android install&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;도구 성격&lt;/td&gt;
      &lt;td&gt;Low-level 범용 기기 통신 도구 (&lt;code class="language-plaintext highlighter-rouge"&gt;platform-tools&lt;/code&gt;)&lt;/td&gt;
      &lt;td&gt;High-level Android 개발자/에이전트 워크플로 CLI&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;입력 형태&lt;/td&gt;
      &lt;td&gt;로컬 APK 파일 경로만 지원&lt;/td&gt;
      &lt;td&gt;로컬 APK 경로뿐만 아니라 빌드 참조 ([system://][path]?[target]) 지원&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;빌드 연동&lt;/td&gt;
      &lt;td&gt;불가 (사전에 빌드 완료된 APK 필요)&lt;/td&gt;
      &lt;td&gt;소스 빌드와 배포를 한 번에 연동 가능 (– &lt;build_args&gt;)&lt;/build_args&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;증분 설치 (Delta)&lt;/td&gt;
      &lt;td&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;--fastdeploy&lt;/code&gt; 옵션 필요 (별도 agent)&lt;/td&gt;
      &lt;td&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;--use-delta-install&lt;/code&gt; 기본 활성화 (default: true)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;전송 최적화&lt;/td&gt;
      &lt;td&gt;Streaming Install 지원 (&lt;code class="language-plaintext highlighter-rouge"&gt;--streaming&lt;/code&gt;)&lt;/td&gt;
      &lt;td&gt;변경된 delta 패치 파일만 기기로 전송 (Zero-copy 활용)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;다중 APK 지원&lt;/td&gt;
      &lt;td&gt;install-multiple, install-multi-package 분리&lt;/td&gt;
      &lt;td&gt;–apks=a.apk,b.apk 로 단순화&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;실행 연계&lt;/td&gt;
      &lt;td&gt;설치만 수행&lt;/td&gt;
      &lt;td&gt;설치만 수행 (&lt;code class="language-plaintext highlighter-rouge"&gt;android run&lt;/code&gt; 시 설치 후 launch까지 연동)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id="1-소스-빌드-참조build-reference-지원"&gt;(1) 소스 빌드 참조(Build Reference) 지원&lt;/h3&gt;
&lt;p&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;adb install&lt;/code&gt;은 오직 디스크에 존재하는 &lt;code class="language-plaintext highlighter-rouge"&gt;.apk&lt;/code&gt; 파일만을 대상으로 동작합니다.
반면 &lt;code class="language-plaintext highlighter-rouge"&gt;android install&lt;/code&gt;은 Android CLI 1.1부터 &lt;strong&gt;빌드 참조 문법&lt;/strong&gt;을 직접 인식합니다.&lt;/p&gt;

&lt;div class="language-bash highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="c"&gt;# 로컬 APK 파일 설치&lt;/span&gt;
android &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--apks&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;app/build/outputs/apk/debug/app-debug.apk

&lt;span class="c"&gt;# Gradle 프로젝트 빌드 후 설치까지 한 번에 수행&lt;/span&gt;
android &lt;span class="nb"&gt;install&lt;/span&gt; :app
android &lt;span class="nb"&gt;install&lt;/span&gt; ~/MyProject?:app@debug &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--offline&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;빌드 타깃을 지정하면 CLI가 프로젝트 구조를 분석해 빌드를 실행하고, 생성된 APK를 찾아 기기에 바로 설치합니다.&lt;/p&gt;

&lt;h3 id="2-기본-delta-install-증분-패치-지원"&gt;(2) 기본 Delta Install (증분 패치) 지원&lt;/h3&gt;
&lt;p&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;android install&lt;/code&gt;은 증분 설치 옵션(&lt;code class="language-plaintext highlighter-rouge"&gt;--use-delta-install&lt;/code&gt;)을 기본값(true)으로 사용합니다.&lt;/p&gt;

&lt;p&gt;기기에 이전 버전의 앱이 이미 설치되어 있다면, APK 전체를 보내지 않고 로컬 APK와 기기 설치본의 차이(Delta)만 계산해 패치 파일(&lt;code class="language-plaintext highlighter-rouge"&gt;.seq&lt;/code&gt;)을 전송합니다.&lt;/p&gt;

&lt;p&gt;기기의 임시 디렉터리(/data/local/tmp)에 배포 에이전트(&lt;code class="language-plaintext highlighter-rouge"&gt;installer.jar&lt;/code&gt;)를 올려 커널의 Zero-copy 시스템 콜로 패치를 적용한 뒤 Package Manager에 반영합니다.&lt;/p&gt;

&lt;h2 id="2-벤치마크-환경-구성"&gt;2. 벤치마크 환경 구성&lt;/h2&gt;

&lt;p&gt;두 도구의 설치 소요 시간과 Delta Install의 데이터 전송 절감량을 확인하기 위해 아래 시나리오별로 테스트를 진행했습니다.&lt;/p&gt;

&lt;h3 id="테스트-시나리오"&gt;테스트 시나리오&lt;/h3&gt;
&lt;p&gt;APK 내 특정 영역만 변경되는 상황을 시뮬레이션하기 위해 4종류의 APK 변형(Variant)을 생성했습니다.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;fresh: 앱을 완전히 삭제(&lt;code class="language-plaintext highlighter-rouge"&gt;uninstall&lt;/code&gt;)한 상태에서 최초 설치&lt;/li&gt;
  &lt;li&gt;same: 동일한 APK를 덮어쓰기 재설치&lt;/li&gt;
  &lt;li&gt;code: Kotlin 코드 상수만 변경 (&lt;code class="language-plaintext highlighter-rouge"&gt;classes*.dex&lt;/code&gt;만 변경)&lt;/li&gt;
  &lt;li&gt;res: 문자열 리소스만 변경 (&lt;code class="language-plaintext highlighter-rouge"&gt;resources.arsc&lt;/code&gt;만 변경)&lt;/li&gt;
  &lt;li&gt;asset: 에셋 파일 1개만 변경 (&lt;code class="language-plaintext highlighter-rouge"&gt;assets/marker.txt&lt;/code&gt;만 변경)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;또한 APK 크기에 따른 전송 대역폭 영향을 보기 위해 두 가지 크기로 측정했습니다.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;기본 Compose 앱: 약 11~12MB&lt;/li&gt;
  &lt;li&gt;대용량 리소스 포함 앱: 약 52MB (비압축 40MB 더미 페이로드 포함)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="3-결과-비교"&gt;3. 결과 비교&lt;/h2&gt;

&lt;h3 id="1-로컬-에뮬레이터-환경"&gt;1) 로컬 에뮬레이터 환경&lt;/h3&gt;

&lt;p&gt;로컬 에뮬레이터는 호스트 메모리 버퍼를 통해 데이터를 전달하므로 네트워크 전송 병목이 없습니다. 5회 반복 측정 후 중앙값 기준입니다.&lt;/p&gt;

&lt;h4 id="-기본-compose-앱-약-1112mb"&gt;① 기본 Compose 앱 (약 11~12MB)&lt;/h4&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;시나리오&lt;/th&gt;
      &lt;th style="text-align: right"&gt;adb install -r&lt;/th&gt;
      &lt;th style="text-align: right"&gt;android install (기본 delta)&lt;/th&gt;
      &lt;th style="text-align: right"&gt;android install (delta OFF)&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;fresh&lt;/td&gt;
      &lt;td style="text-align: right"&gt;0.26s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.17s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.13s&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;same&lt;/td&gt;
      &lt;td style="text-align: right"&gt;0.32s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.01s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.03s&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;code&lt;/td&gt;
      &lt;td style="text-align: right"&gt;0.32s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.01s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.07s&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;res&lt;/td&gt;
      &lt;td style="text-align: right"&gt;0.36s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.04s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.05s&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;asset&lt;/td&gt;
      &lt;td style="text-align: right"&gt;0.33s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.06s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.03s&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h4 id="-52mb-앱-대용량-에셋-포함"&gt;② 52MB 앱 (대용량 에셋 포함)&lt;/h4&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;시나리오&lt;/th&gt;
      &lt;th style="text-align: right"&gt;adb install -r&lt;/th&gt;
      &lt;th style="text-align: right"&gt;android install (기본 delta)&lt;/th&gt;
      &lt;th style="text-align: right"&gt;android install (delta OFF)&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;fresh&lt;/td&gt;
      &lt;td style="text-align: right"&gt;0.46s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.50s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.22s&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;same&lt;/td&gt;
      &lt;td style="text-align: right"&gt;0.57s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.54s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.30s&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;code&lt;/td&gt;
      &lt;td style="text-align: right"&gt;0.52s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.47s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.24s&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;res&lt;/td&gt;
      &lt;td style="text-align: right"&gt;0.48s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.42s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.28s&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;asset&lt;/td&gt;
      &lt;td style="text-align: right"&gt;0.52s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.38s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.28s&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id="결과-분석"&gt;결과 분석&lt;/h3&gt;
&lt;p&gt;로컬 에뮬레이터에서는 &lt;code class="language-plaintext highlighter-rouge"&gt;adb install -r&lt;/code&gt;이 더 빠릅니다.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Android CLI 자체를 기동하는 데 약 0.45초의 기본 오버헤드가 발생합니다.&lt;/li&gt;
  &lt;li&gt;전송 지연이 없는 환경에서는 50MB 전체를 전송하더라도 0.5초 안에 끝나므로, 차이점(Delta)을 계산하고 기기에서 패치 에이전트를 구동하는 시간이 전송 절약 시간보다 더 깁니다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id="2-실기기--wi-fi-디버깅-환경-5-mbs-대역폭-제한"&gt;2) 실기기 / Wi-Fi 디버깅 환경 (5 MB/s 대역폭 제한)&lt;/h3&gt;

&lt;p&gt;실제 개발 환경에서는 Wi-Fi 페어링 무선 디버깅이나 USB 2.0 케이블 연결처럼 &lt;strong&gt;전송 대역폭이 제한되는 환경&lt;/strong&gt;이 많습니다. 이를 재현하기 위해 에뮬레이터 포트 앞에 5 MB/s 전송 속도 제한 프록시를 두고 재측정했습니다.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;※ 배수 비교는 &lt;code class="language-plaintext highlighter-rouge"&gt;adb install -r&lt;/code&gt; 대비 &lt;code class="language-plaintext highlighter-rouge"&gt;android install&lt;/code&gt;의 소요 시간 기준이며, 절감율은 전체 APK 크기 대비 실제 전송된 패치 크기 기준입니다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4 id="-52mb-앱-대역폭-5-mbs"&gt;① 52MB 앱 (대역폭 5 MB/s)&lt;/h4&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;시나리오&lt;/th&gt;
      &lt;th style="text-align: right"&gt;adb install -r&lt;/th&gt;
      &lt;th style="text-align: right"&gt;android install (Delta ON)&lt;/th&gt;
      &lt;th&gt;절감율 / 전송량&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;fresh&lt;/td&gt;
      &lt;td style="text-align: right"&gt;10.41s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;11.63s&lt;/td&gt;
      &lt;td&gt;전체 전송 (51.80 MB)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;same&lt;/td&gt;
      &lt;td style="text-align: right"&gt;10.44s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.52s (adb 대비 약 6.8배 빠름)&lt;/td&gt;
      &lt;td&gt;554 KB 전송 (98.9% 절감)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;code&lt;/td&gt;
      &lt;td style="text-align: right"&gt;10.44s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.45s (adb 대비 약 7.2배 빠름)&lt;/td&gt;
      &lt;td&gt;584 KB 전송 (98.9% 절감)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;res&lt;/td&gt;
      &lt;td style="text-align: right"&gt;10.53s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.68s (adb 대비 약 6.3배 빠름)&lt;/td&gt;
      &lt;td&gt;1.46 MB 전송 (97.2% 절감)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;asset&lt;/td&gt;
      &lt;td style="text-align: right"&gt;10.52s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.63s (adb 대비 약 6.4배 빠름)&lt;/td&gt;
      &lt;td&gt;1.46 MB 전송 (97.2% 절감)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h4 id="-1112mb-기본-앱-대역폭-5-mbs"&gt;② 11~12MB 기본 앱 (대역폭 5 MB/s)&lt;/h4&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;시나리오&lt;/th&gt;
      &lt;th style="text-align: right"&gt;adb install -r&lt;/th&gt;
      &lt;th style="text-align: right"&gt;android install (Delta ON)&lt;/th&gt;
      &lt;th&gt;절감율 / 전송량&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;fresh&lt;/td&gt;
      &lt;td style="text-align: right"&gt;2.30s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;3.48s&lt;/td&gt;
      &lt;td&gt;전체 전송 (11.33 MB)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;same&lt;/td&gt;
      &lt;td style="text-align: right"&gt;2.31s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.28s (adb 대비 약 1.8배 빠름)&lt;/td&gt;
      &lt;td&gt;89 KB 전송 (99.2% 절감)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;code&lt;/td&gt;
      &lt;td style="text-align: right"&gt;2.32s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.29s (adb 대비 약 1.8배 빠름)&lt;/td&gt;
      &lt;td&gt;140 KB 전송 (98.8% 절감)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;res&lt;/td&gt;
      &lt;td style="text-align: right"&gt;2.40s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.54s (adb 대비 약 1.6배 빠름)&lt;/td&gt;
      &lt;td&gt;1.02 MB 전송 (91.4% 절감)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;asset&lt;/td&gt;
      &lt;td style="text-align: right"&gt;2.40s&lt;/td&gt;
      &lt;td style="text-align: right"&gt;1.49s (adb 대비 약 1.6배 빠름)&lt;/td&gt;
      &lt;td&gt;1.02 MB 전송 (91.4% 절감)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id="결과-분석-1"&gt;결과 분석&lt;/h3&gt;
&lt;p&gt;전송 속도가 제한되는 네트워크나 USB 환경에서는 &lt;code class="language-plaintext highlighter-rouge"&gt;android install&lt;/code&gt;이 훨씬 빠릅니다.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;adb install -r&lt;/code&gt;은 변경된 내용이 적더라도 52MB 전체를 스트리밍 전송하므로 매번 &lt;strong&gt;10초 이상(10.44s~10.53s)&lt;/strong&gt; 걸립니다.&lt;/li&gt;
  &lt;li&gt;반면 &lt;code class="language-plaintext highlighter-rouge"&gt;android install&lt;/code&gt;은 &lt;strong&gt;584KB 패치 파일만 전송(전송량 98.9% 절감)&lt;/strong&gt;하므로 전송 시간을 0.1초대로 줄여 전체 설치를 &lt;strong&gt;1.45초(약 7.2배 빠름)&lt;/strong&gt;에 마칩니다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="4-adb-fastdeploy와의-차이"&gt;4. “adb –fastdeploy”와의 차이&lt;/h2&gt;

&lt;p&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;adb install&lt;/code&gt;에도 &lt;code class="language-plaintext highlighter-rouge"&gt;--fastdeploy&lt;/code&gt; 옵션이 있지만, 아래 경고를 출력하며 일반 전체 설치로 전환될 수도 있습니다.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Fast Deploy is only compatible with devices of API version 24 or higher, ignoring.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;반면 &lt;code class="language-plaintext highlighter-rouge"&gt;android install&lt;/code&gt;의 Delta Install은 Android Studio 배포 시스템(Deployer)의 기술을 CLI에 적용해 최신 OS에서도 정상적으로 패치 설치를 수행합니다.&lt;/p&gt;

&lt;h2 id="5-요약-및-상황별-추천"&gt;5. 요약 및 상황별 추천&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;android install&lt;/code&gt;을 써야 하는 경우
    &lt;ul&gt;
      &lt;li&gt;실기기 디버깅(특히 Wi-Fi 무선 디버깅): 코드나 리소스 일부만 수정하고 재설치할 때 전송 시간이 대폭 줄어듭니다.&lt;/li&gt;
      &lt;li&gt;대용량 프로젝트: APK 크기가 클수록 Delta 패치 전송의 절약 효과가 큽니다.&lt;/li&gt;
      &lt;li&gt;빌드와 배포 연동: &lt;code class="language-plaintext highlighter-rouge"&gt;:app&lt;/code&gt; 같은 타깃 참조를 넘겨 빌드와 설치를 명령어 하나로 실행할 때 적합합니다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;adb install&lt;/code&gt;을 써야 하는 경우
    &lt;ul&gt;
      &lt;li&gt;로컬 에뮬레이터 반복 테스트: 전송 병목이 없어 CLI 기동 오버헤드가 없는 &lt;code class="language-plaintext highlighter-rouge"&gt;adb&lt;/code&gt;가 0.2초대로 가장 빠릅니다.&lt;/li&gt;
      &lt;li&gt;가벼운 CI/CD 파이프라인: 별도의 Android CLI 스택 없이 &lt;code class="language-plaintext highlighter-rouge"&gt;platform-tools&lt;/code&gt;만 설치된 환경에서 배포할 때 유리합니다.&lt;/li&gt;
      &lt;li&gt;세부 설치 옵션 제어: &lt;code class="language-plaintext highlighter-rouge"&gt;--instant&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;--abi&lt;/code&gt;, 다중 패키지 원자적 설치 등 저수준 Package Manager 옵션이 필요할 때 사용합니다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;
</summary>
    <title>Blog: [메모] adb install vs android install 차이점 분석 및 비교</title>
    <updated>2026-11-01T18:00:00+09:00</updated>
    <dc:date>2026-11-01T18:00:00+09:00</dc:date>
  </entry>
  <entry>
    <author>
      <name>Pluu</name>
    </author>
    <content type="html">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"&gt;
&lt;html&gt;&lt;body&gt;
&lt;div class="youtube"&gt;
    &lt;iframe width="560" height="315" src="https://www.youtube.com/embed/w-auFZP5gJo" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""&gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;!--more--&gt;

&lt;p&gt;기존 안드로이드 CLI 도구는 사용자 대화형 입력(Interactive Prompt)을 요구해 AI 에이전트가 자동으로 처리하기 어려웠습니다.&lt;/p&gt;

&lt;p&gt;Android Dev Summit 2026의 “The latest in Android dev tools” 세션에서는 터미널, 데스크톱 에이전트 앱, Android Studio에서 AI 에이전트가 직접 제어할 수 있는 새로운 안드로이드 도구 체인을 발표했습니다.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;본 글은 Gemini를 사용하여 초안을 작성한 후 검수하였습니다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr&gt;

&lt;h1 id="개요-ai-코딩-에이전트-시대의-안드로이드-개발-도구"&gt;개요: AI 코딩 에이전트 시대의 안드로이드 개발 도구&lt;/h1&gt;

&lt;p&gt;&lt;img class="img-responsive" src="http://pluu.github.io/assets/img/blog/ads26/whats-new-in-android-dev-tools/01.png"&gt;&lt;/p&gt;

&lt;h3 id="핵심-구성-요소"&gt;핵심 구성 요소&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Android CLI: 터미널 스크립트, CI, 에이전트 앱, Android Studio 전체를 관통하는 단일 엔트리 포인트 도구&lt;/li&gt;
  &lt;li&gt;Agent Applications: Google Antigravity, Claude Code, OpenAI Codex 등과의 딥 인테그레이션(공식 플러그인 &amp;amp; Sidecar)&lt;/li&gt;
  &lt;li&gt;Android Studio Rabbit 2/3: ACP(Agent Client Protocol) 기반 BYOA(Bring Your Own Agent) 및 AI Change Review&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;데모 전반에는 40개 모듈로 구성된 대규모 오픈소스 오디오/비디오 팟캐스트 앱인 Pocket Casts가 사용되었습니다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr&gt;

&lt;h1 id="1-android-cli"&gt;1. Android CLI&lt;/h1&gt;

&lt;p&gt;Android CLI는 AI 에이전트가 안드로이드 도구를 실행할 때 생기는 파싱 오류와 불필요한 대기를 없애도록 만들었습니다.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;예측 가능한 명령어 체계 (Predictable commands)&lt;/li&gt;
  &lt;li&gt;JSON 등 기계가 읽기 쉬운 구조화된 출력 (Structured outputs)&lt;/li&gt;
  &lt;li&gt;추가 입력 프롬프트 없이 즉시 끝나는 비대화형 실행 (Zero interactive prompts)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img class="img-responsive" src="http://pluu.github.io/assets/img/blog/ads26/whats-new-in-android-dev-tools/02.png"&gt;&lt;/p&gt;

&lt;h3 id="주요-신규-명령어-android---ads"&gt;주요 신규 명령어 (&lt;code class="language-plaintext highlighter-rouge"&gt;android --ads&lt;/code&gt;)&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;명령어&lt;/th&gt;
      &lt;th&gt;주요 기능 및 특징&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;signals&lt;/td&gt;
      &lt;td&gt;Crashlytics의 크래시 목록 및 현장 텔레메트리 데이터를 조회&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;device&lt;/td&gt;
      &lt;td&gt;연결된 기기/에뮬레이터 미러링(device hub) 및 원격 물리 기기 대여(Reservation) 관리&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;profiler&lt;/td&gt;
      &lt;td&gt;앱, 게임, 디바이스의 시스템 트레이스(Perfetto) 및 힙 덤프 수집&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;build&lt;/td&gt;
      &lt;td&gt;Gradle 등의 빌드 아티팩트를 CLI에서 직접 빌드&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;preview&lt;/td&gt;
      &lt;td&gt;Android Studio나 실제 기기 없이 터미널에서 Jetpack Compose @Preview를 PNG 및 JSON 컴포넌트 트리로 렌더링&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;install&lt;/td&gt;
      &lt;td&gt;변경된 바이트만 전송하는 델타 푸시(Delta push) 배포 (기존 ADB 대비 대폭 시간 절약)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;input&lt;/td&gt;
      &lt;td&gt;복잡한 좌표 계산 대신 시맨틱 UI 요소를 대상으로 제스처 및 키 이벤트 전송&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;analyze&lt;/td&gt;
      &lt;td&gt;AAB/APK의 R8 설정, 난독화 비율, DEX 크기 및 리소스 분석&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;docs&lt;/td&gt;
      &lt;td&gt;공식 안드로이드 지식 베이스(KB)에서 최신 가이드 문서를 온디맨드로 로컬 검색 및 fetch&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;auth&lt;/td&gt;
      &lt;td&gt;안드로이드 CLI 도구용 Google 서비스 인증 로그인/로그아웃&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;hr&gt;

&lt;h1 id="2-터미널-환경의-에이전트-자동화-데모-claude-code"&gt;2. 터미널 환경의 에이전트 자동화 데모 (Claude Code)&lt;/h1&gt;

&lt;h2 id="1-프로덕션-크래시-재현-및-핫픽스"&gt;(1) 프로덕션 크래시 재현 및 핫픽스&lt;/h2&gt;

&lt;p&gt;Firebase Crashlytics에 보고된 실제 크래시를 에이전트가 탐색, 재현, 코드 수정, 배포 및 검증까지 단 1분 42초 만에 수정했습니다.&lt;/p&gt;

&lt;p&gt;&lt;img class="img-responsive" src="http://pluu.github.io/assets/img/blog/ads26/whats-new-in-android-dev-tools/03.png"&gt;&lt;/p&gt;

&lt;h4 id="데모"&gt;데모&lt;/h4&gt;

&lt;ol&gt;
  &lt;li&gt;크래시 탐색: &lt;code class="language-plaintext highlighter-rouge"&gt;android signals&lt;/code&gt; 명령어로 지난 30일간 사용자 발생 수가 가장 높은 크래시를 조회
    &lt;ul&gt;
      &lt;li&gt;원인: 비밀번호 재설정(“I forgot my password”) 버튼을 연속 두 번 탭하면 네비게이션이 중복 실행되어 &lt;strong&gt;IllegalArgumentException&lt;/strong&gt;이 발생
        &lt;blockquote&gt;
          &lt;p&gt;IllegalArgumentException: Navigation action … cannot be found from the current destination&lt;/p&gt;
        &lt;/blockquote&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;기기에서 재현: &lt;code class="language-plaintext highlighter-rouge"&gt;android layout&lt;/code&gt;으로 버튼 좌표를 확인한 뒤 &lt;code class="language-plaintext highlighter-rouge"&gt;android input tap&lt;/code&gt;으로 버튼을 두 번 탭해 실제 기기에서 크래시 발생&lt;/li&gt;
  &lt;li&gt;코드 수정: 중복 화면 이동을 막도록 SignInFragment.kt와 PromoCodeFragment.kt의 네비게이션 로직에 &lt;code class="language-plaintext highlighter-rouge"&gt;currentDestination&lt;/code&gt; 확인 가드를 추가&lt;/li&gt;
  &lt;li&gt;고속 재배포: &lt;code class="language-plaintext highlighter-rouge"&gt;android build&lt;/code&gt;로 빌드한 뒤 &lt;code class="language-plaintext highlighter-rouge"&gt;android install&lt;/code&gt;을 실행해 전체 84MB APK 대신 &lt;strong&gt;3.84MB 델타 패치&lt;/strong&gt;만 기기로 전송&lt;/li&gt;
  &lt;li&gt;검증: 기기에서 다시 더블 탭을 실행해 크래시 로그가 남지 않고(0 lines) 화면이 정상 유지됨을 확인&lt;/li&gt;
&lt;/ol&gt;

&lt;h4 id="사용된-android-cli-commands"&gt;사용된 Android CLI commands&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;
&lt;code class="language-plaintext highlighter-rouge"&gt;android signals crashes list --firebase-app ... --sort-by=users --timeframe=30d&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;최근 30일간 사용자 수 기준 상위 크래시 이슈 랭킹 조회&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
&lt;code class="language-plaintext highlighter-rouge"&gt;android signals crashes describe &amp;lt;issue&amp;gt; --timeframe=30d&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;해당 크래시의 상세 스택 트레이스 및 디바이스/안드로이드 OS 버전별 분포 확인&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
&lt;code class="language-plaintext highlighter-rouge"&gt;android layout --device=... --flat&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;수정 전/후 비밀번호 재설정 버튼의 좌표를 파악하기 위한 UI 레이아웃 트리 조회&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
&lt;code class="language-plaintext highlighter-rouge"&gt;android input tap --device=... "id:btnSignIn"&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;구버전 로그인 화면으로 진입하기 위한 시맨틱 탭 전송 (2회 실행)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
&lt;code class="language-plaintext highlighter-rouge"&gt;android build "gradle://?:app:assembleDebugProd"&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;수정된 코드의 빌드 산출물 생성&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
&lt;code class="language-plaintext highlighter-rouge"&gt;android install --device=...&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;초기 수정 전 빌드 설치, 핫픽스 빌드 델타 패치 주입 (84MB 중 3.84MB만 전송)&lt;br&gt;
&lt;em&gt;(참고: CLI가 지원하지 않는 화면 회전 고정, 딥링크 호출, 백키 입력, 더블탭 등 일부 작업에는 &lt;code class="language-plaintext highlighter-rouge"&gt;adb&lt;/code&gt;를 보조로 사용)&lt;/em&gt;
&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="2-apk-최적화-r8-configuration-analyzer"&gt;(2) APK 최적화: R8 Configuration Analyzer&lt;/h2&gt;

&lt;p&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;Release Bundle이 너무 크다&lt;/code&gt;는 요청에 대해 에이전트가 ProGuard/R8 룰을 분석하고 불필요한 keep 룰을 제거했습니다.&lt;/p&gt;

&lt;p&gt;&lt;img class="img-responsive" src="http://pluu.github.io/assets/img/blog/ads26/whats-new-in-android-dev-tools/04.png"&gt;&lt;/p&gt;

&lt;h4 id="데모-1"&gt;데모&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;원인 파악: Protocol Buffers keep 룰이 지나치게 포괄적이어서 불필요한 클래스까지 난독화 대상에서 제외되고 있었습니다.&lt;/p&gt;

    &lt;blockquote&gt;
      &lt;ul&gt;
        &lt;li&gt;수정 전 : -keep class * extends com.google.protobuf.GeneratedMessageLite { *; }&lt;/li&gt;
        &lt;li&gt;수정 후 : -keepclassmembers class * extends com.google.protobuf.GeneratedMessageLite { &lt;fields&gt;; }&lt;/fields&gt;
&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;클래스 전체를 유지하지 않고, 실제 사용하는 필드 멤버와 Retrofit 반환 타입으로 호출되는 API 메시지만 유지(keep)하도록 수정&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;개선 결과:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;비압축 DEX 크기: 19,485,804 B → 18,957,388 B (-528 KB, -2.7%)&lt;/li&gt;
  &lt;li&gt;APK 압축 크기: 42,311,672 B → 42,147,832 B (-164 KB)&lt;/li&gt;
  &lt;li&gt;Keep된 메서드 수: 17,940개 → 11,757개 (-6,183개 제거, -34%)&lt;/li&gt;
  &lt;li&gt;Keep된 필드 수: 7,944개 → 7,209개 (-735개 감소)&lt;/li&gt;
  &lt;li&gt;Keep된 클래스 수: 2,342개 → 2,268개 (-74개 감소)&lt;/li&gt;
  &lt;li&gt;DEX 난독화 비율: 92.72% → 93.06% (+0.34%p)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id="사용된-android-cli-commands-1"&gt;사용된 Android CLI commands&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;
&lt;code class="language-plaintext highlighter-rouge"&gt;android analyze ./before/app-release.apk&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;수정 전 베이스라인 APK의 DEX 크기, R8 설정 및 난독화 비율(Obfuscation ratio) 측정&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
&lt;code class="language-plaintext highlighter-rouge"&gt;android analyze ./after/app-release.apk&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;룰 수정 후 생성된 APK의 수치를 동일하게 추출하여 개선 지표 비교&lt;br&gt;
&lt;em&gt;(참고: CLI에 Configuration Analyzer 출력 파싱 명령어가 없어 상위 룰 랭킹에는 보조 스크립트 활용)&lt;/em&gt;
&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="3-앱-시작-시간startup-time-최적화-baseline-profile--profiler"&gt;(3) 앱 시작 시간(Startup Time) 최적화: Baseline Profile &amp;amp; Profiler&lt;/h2&gt;

&lt;p&gt;앱 시작 성능 개선 요청 시 에이전트가 공식 문서를 읽고 프로파일러를 통한 측정을 수행했습니다.&lt;/p&gt;

&lt;p&gt;&lt;img class="img-responsive" src="http://pluu.github.io/assets/img/blog/ads26/whats-new-in-android-dev-tools/05.png"&gt;&lt;/p&gt;

&lt;h4 id="데모-2"&gt;데모&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;원인 분석: 출시 버전 프로토타입 APK의 &lt;strong&gt;baseline.prof&lt;/strong&gt;가 약 8KB에 불과하며, 포함된 6,690개 룰 중 Pocket Casts 자체 코드 룰이 0개(전체 프로필 로드 룰 중에서도 단 66개)여서 시작 코드가 JIT/인터프리터로 구동되고 있음을 확인&lt;/li&gt;
  &lt;li&gt;최적화 수행: 공식 문서를 읽어 무루팅 환경(Android 14+)에서 베이스라인 프로필을 수집 및 생성하는 절차를 확인하고, 콜드 스타트 프로필 룰(Pocket Casts 룰 2,621개 포함)을 갱신&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id="사용된-android-cli-commands-2"&gt;사용된 Android CLI commands&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;
&lt;code class="language-plaintext highlighter-rouge"&gt;android profiler systemtrace start --launch --duration=8&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;앱 콜드 런치(Cold start) 시점의 시스템 트레이스를 Perfetto 형식(&lt;code class="language-plaintext highlighter-rouge"&gt;*.pftrace&lt;/code&gt;)으로 수집 (수집된 트레이스는 &lt;code class="language-plaintext highlighter-rouge"&gt;ui.perfetto.dev&lt;/code&gt;에서 분석)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
&lt;code class="language-plaintext highlighter-rouge"&gt;android docs fetch kb://android/topic/performance/baselineprofiles/manually-create-measure&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;Android 14+ 기기에서 루팅 없이 Baseline Profile을 수동 생성하고 측정하는 최신 공식 기술 가이드라인 로컬 fetch 및 학습&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;개선 수치 (Pixel 6 Pro 기준):&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Main-thread CPU 시간: 297.7ms → 244.7ms (-17.8%)&lt;/li&gt;
  &lt;li&gt;Total app CPU 시간: 809.3ms → 600.4ms (-25.8%)&lt;/li&gt;
  &lt;li&gt;JIT thread CPU 시간: 56.3ms → 15.6ms (-72.2%)&lt;/li&gt;
  &lt;li&gt;Time to initial display (TTID): 463.2ms → 383.4ms (-17.2% 단축)&lt;/li&gt;
&lt;/ul&gt;

&lt;hr&gt;

&lt;h1 id="3-linux-데스크탑에서-android-앱-네이티브-실행-실험적-프로토타입"&gt;3. Linux 데스크탑에서 Android 앱 네이티브 실행 (실험적 프로토타입)&lt;/h1&gt;

&lt;p&gt;별도의 무거운 에뮬레이터나 중첩 가상화(Nested Virtualization) 없이, &lt;strong&gt;Linux 데스크톱 상에서 Android x86 APK를 단일 네이티브 프로세스로 직접 실행&lt;/strong&gt;하는 새로운 기술이 공개되었습니다.&lt;/p&gt;

&lt;p&gt;&lt;img class="img-responsive" src="http://pluu.github.io/assets/img/blog/ads26/whats-new-in-android-dev-tools/06.png"&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;초경량 구조: 단일 프로세스로 실행되며 stdout/stdin으로 로그가 직접 출력됨&lt;/li&gt;
  &lt;li&gt;클라우드 에이전트 환경 최적화: 중첩 가상화를 지원하지 않는 클라우드 VM이나 CI 컨테이너에서도 에이전트가 앱을 직접 실행하고 테스트 가능&lt;/li&gt;
  &lt;li&gt;높은 완성도:
    &lt;ul&gt;
      &lt;li&gt;순수 Compose 앱 실행&lt;/li&gt;
      &lt;li&gt;네트워크 통신이 포함된 Google 레퍼런스 앱 실행&lt;/li&gt;
      &lt;li&gt;네이티브 .so 라이브러리 변환 계층을 통해 C++ 라이브러리와 오디오 출력이 포함된 실제 Pocket Casts 앱 구동&lt;/li&gt;
      &lt;li&gt;데스크톱 변환 계층을 통한 OpenGL ES 1 네이티브 게임 앱 렌더링&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;hr&gt;

&lt;h1 id="4-ai-에이전트를-위한-공식-android-플러그인"&gt;4. AI 에이전트를 위한 공식 Android 플러그인&lt;/h1&gt;

&lt;p&gt;Google Antigravity, Claude Code, OpenAI Codex를 위한 공식 Android 플러그인이 배포되었습니다.&lt;/p&gt;

&lt;p&gt;&lt;img class="img-responsive" src="http://pluu.github.io/assets/img/blog/ads26/whats-new-in-android-dev-tools/07.png"&gt;&lt;/p&gt;

&lt;p&gt;플러그인을 활성화하면 Android CLI 뿐만 아니라, 공식 최신 지식/가이드가 포함된 &lt;code class="language-plaintext highlighter-rouge"&gt;Android Skills&lt;/code&gt;가 주입되어 모델의 오래된 학습 데이터 대신 항상 최신 아키텍처 표준을 따릅니다.&lt;/p&gt;

&lt;h3 id="google-antigravity"&gt;Google Antigravity&lt;/h3&gt;

&lt;h4 id="1-android-compose-preview"&gt;(1) Android Compose Preview&lt;/h4&gt;
&lt;p&gt;AI 에이전트에게 기존 View 코드를 Compose로 변환하고 대화면(폴더블·태블릿)에 맞게 최적화하도록 요청하면, 에이전트가 &lt;code class="language-plaintext highlighter-rouge"&gt;@Preview&lt;/code&gt; 어노테이션을 작성하고 Sidecar 패널에 프리뷰 화면을 즉시 렌더링합니다.&lt;/p&gt;

&lt;p&gt;&lt;img class="img-responsive" src="http://pluu.github.io/assets/img/blog/ads26/whats-new-in-android-dev-tools/08.png"&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;전체 앱 컴파일 및 기기 배포를 반복하지 않고, Sidecar 창에서 프리뷰 렌더링을 즉시 갱신&lt;/li&gt;
  &lt;li&gt;대화면에서 1열 스크롤 대신 헤더와 에피소드 목록을 좌우로 나누는 듀얼 창(Dual-pane) 레이아웃을 제안&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id="2-android-device-hub"&gt;(2) Android Device Hub&lt;/h4&gt;
&lt;p&gt;Antigravity 내에서 가상 기기(AVD) 및 물리 기기를 통합 관리하고 화면을 직접 미러링할 수 있습니다.&lt;/p&gt;

&lt;p&gt;&lt;img class="img-responsive" src="http://pluu.github.io/assets/img/blog/ads26/whats-new-in-android-dev-tools/09.png"&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Pixel 10 Pro Fold 등 실제 연결된 기기 목록과 가상 기기(AI Glasses, Medium Phone, Small Phone 등)를 Sidecar 패널에서 통합 관리&lt;/li&gt;
  &lt;li&gt;미러링된 기기 화면을 보며 실시간 터치와 제스처로 상호작용 가능&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img class="img-responsive" src="http://pluu.github.io/assets/img/blog/ads26/whats-new-in-android-dev-tools/09_split_screen.png"&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;화면 분할(Split Screen) 전환 시 앱이 싱글 페인(Single-pane)과 듀얼 페인(Dual-pane) 사이를 적응형(Adaptive)으로 올바르게 전환하는지 실시간 검증&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id="android-cli-연동에-따른-에이전트-효율성-벤치마크"&gt;Android CLI 연동에 따른 에이전트 효율성 벤치마크&lt;/h3&gt;

&lt;p&gt;Claude Opus를 대상으로 6개 사용자 Journeys 및 6개 디바이스에서 메모리 누수를 찾고 수정하는 과제를 Android CLI 사용 여부에 따라 A/B 테스트한 결과입니다.&lt;/p&gt;

&lt;p&gt;&lt;img class="img-responsive" src="http://pluu.github.io/assets/img/blog/ads26/whats-new-in-android-dev-tools/10.png"&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;작업 완료 속도: 1.9배 향상 (88분 → 46분, 42분 단축)&lt;/li&gt;
  &lt;li&gt;토큰 사용량: 1.3배 절감 (4.6M 토큰 → 3.5M 토큰)&lt;/li&gt;
  &lt;li&gt;Compose Preview: 전통적인 컴파일/실행 반복 대비 반복 시간 77% 단축&lt;/li&gt;
  &lt;li&gt;Analyze 명령어: 다중 왕복 검사를 단일 구조화 명령어로 대체하여 출력 토큰 5.5배 절감&lt;/li&gt;
  &lt;li&gt;Semantic Input: 화면 좌표 추정 환각(Hallucination)을 없애 작업 실행 속도 25% 향상&lt;/li&gt;
&lt;/ul&gt;

&lt;hr&gt;

&lt;h1 id="5-android-studio와-ai-에이전트의-진화"&gt;5. Android Studio와 AI 에이전트의 진화&lt;/h1&gt;

&lt;h2 id="1-bring-your-own-agent-byoa-via-agent-client-protocol-acp"&gt;(1) Bring Your Own Agent (BYOA) via Agent Client Protocol (ACP)&lt;/h2&gt;

&lt;p&gt;Android Studio는 내장 Gemini 외에도, 개발자와 팀이 이미 사용 및 구독 중인 외부 에이전트를 IDE로 가져올 수 있는 BYOA 기능을 도입했습니다.&lt;/p&gt;

&lt;p&gt;&lt;img class="img-responsive" src="http://pluu.github.io/assets/img/blog/ads26/whats-new-in-android-dev-tools/11.png"&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;경로: &lt;code class="language-plaintext highlighter-rouge"&gt;Settings &amp;gt; Tools &amp;gt; AI &amp;gt; Agents&lt;/code&gt;
&lt;/li&gt;
  &lt;li&gt;Agent Client Protocol (ACP) 기반으로 다양한 에이전트 연결 지원:
    &lt;ul&gt;
      &lt;li&gt;Built-in Agent v2.0&lt;/li&gt;
      &lt;li&gt;Google Antigravity&lt;/li&gt;
      &lt;li&gt;Claude Agent (Claude Code / Anthropic API 연동)&lt;/li&gt;
      &lt;li&gt;OpenAI Codex&lt;/li&gt;
      &lt;li&gt;JetBrains Junie&lt;/li&gt;
      &lt;li&gt;ACP Agent Marketplace&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;기존 개인 구독이나 기업용 계정을 그대로 활용 가능&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img class="img-responsive" src="http://pluu.github.io/assets/img/blog/ads26/whats-new-in-android-dev-tools/12.png"&gt;&lt;/p&gt;

&lt;p&gt;연결된 에이전트(예: Claude Opus 5.5)는 Android Studio의 모든 도구 체인(파일 수정, 정적 분석, 빌드, Gradle 싱크, Compose 프리뷰 렌더링, 기기 배포, 공식 문서 조회)에 직접 접근할 수 있습니다.&lt;/p&gt;

&lt;h2 id="2-ai-change-review"&gt;(2) AI Change Review&lt;/h2&gt;

&lt;p&gt;대량의 코드를 검토할 때 버그를 사전에 잡을 수 있도록 지원하는 코드 리뷰 기능입니다. 로컬 변경점뿐만 아니라 PR도 분석합니다.&lt;/p&gt;

&lt;p&gt;&lt;img class="img-responsive" src="http://pluu.github.io/assets/img/blog/ads26/whats-new-in-android-dev-tools/13.png"&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;15개 파일, 800줄의 PR 변경점을 분석해 잠재적 버그를 사전에 감지&lt;/li&gt;
  &lt;li&gt;데모에서 발견된 실제 이슈:
    &lt;ul&gt;
      &lt;li&gt;북마크 스와이프 행 컴포저블(SwipeRow.kt)에서 LaunchedEffect 키가 람다 객체로 설정되어 있어, 행이 Recomposition될 때마다 풀 스와이프 동작이 중복 실행되는 버그&lt;/li&gt;
      &lt;li&gt;삭제 다이얼로그가 뜬 상태에서 북마크 삭제 확인 다이얼로그가 계속 중복 노출되는 문제&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;해결책 제시 및 일괄 반영: 원인을 설명하고 rememberUpdatedState를 적용한 코드 diff를 제공합니다. 체크박스로 선택한 이슈를 버튼 한 번으로 일괄 수정(Fix all selected issues) 가능&lt;/li&gt;
  &lt;li&gt;주제별 워크스루(&lt;code class="language-plaintext highlighter-rouge"&gt;Walkthrough&lt;/code&gt;): PR 내 변경 사항을 기능 단위로 묶어 코드 변경 내역을 확인하고 승인 가능&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="3-android-studio-rabbit-릴리스-현황"&gt;(3) Android Studio Rabbit 릴리스 현황&lt;/h2&gt;

&lt;p&gt;&lt;img class="img-responsive" src="http://pluu.github.io/assets/img/blog/ads26/whats-new-in-android-dev-tools/14.png"&gt;&lt;/p&gt;

&lt;p&gt;&lt;img class="img-responsive" src="http://pluu.github.io/assets/img/blog/ads26/whats-new-in-android-dev-tools/15.png"&gt;&lt;/p&gt;

&lt;h1 id="관련-링크"&gt;관련 링크&lt;/h1&gt;
&lt;ul&gt;
  &lt;li&gt;Watch Tools &amp;amp; Performance sessions: &lt;a href="https://goo.gle/ADS26-Tools-and-Perf"&gt;goo.gle/ADS26-Tools-and-Perf&lt;/a&gt;
&lt;/li&gt;
  &lt;li&gt;Watch all sessions from Android Dev Summit 2026: &lt;a href="https://goo.gle/ADS26-All-Sessions"&gt;goo.gle/ADS26-All-Sessions&lt;/a&gt;
&lt;/li&gt;
  &lt;li&gt;Android CLI 피드백: &lt;a href="https://d.android.com/cli"&gt;d.android.com/cli&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/body&gt;&lt;/html&gt;
</content>
    <id>http://pluu.github.io/blog/android/androiddevsummit/2026/10/31/ads26-whats-new-in-android-dev-tools/</id>
    <link href="http://pluu.github.io/blog/android/androiddevsummit/2026/10/31/ads26-whats-new-in-android-dev-tools/"/>
    <summary type="html">&lt;div class="youtube"&gt;
    &lt;iframe width="560" height="315" src="https://www.youtube.com/embed/w-auFZP5gJo" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""&gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;!--more--&gt;

&lt;p&gt;기존 안드로이드 CLI 도구는 사용자 대화형 입력(Interactive Prompt)을 요구해 AI 에이전트가 자동으로 처리하기 어려웠습니다.&lt;/p&gt;

&lt;p&gt;Android Dev Summit 2026의 “The latest in Android dev tools” 세션에서는 터미널, 데스크톱 에이전트 앱, Android Studio에서 AI 에이전트가 직접 제어할 수 있는 새로운 안드로이드 도구 체인을 발표했습니다.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;본 글은 Gemini를 사용하여 초안을 작성한 후 검수하였습니다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h1 id="개요-ai-코딩-에이전트-시대의-안드로이드-개발-도구"&gt;개요: AI 코딩 에이전트 시대의 안드로이드 개발 도구&lt;/h1&gt;

&lt;p&gt;&lt;img class="img-responsive" src="/assets/img/blog/ads26/whats-new-in-android-dev-tools/01.png" /&gt;&lt;/p&gt;

&lt;h3 id="핵심-구성-요소"&gt;핵심 구성 요소&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Android CLI: 터미널 스크립트, CI, 에이전트 앱, Android Studio 전체를 관통하는 단일 엔트리 포인트 도구&lt;/li&gt;
  &lt;li&gt;Agent Applications: Google Antigravity, Claude Code, OpenAI Codex 등과의 딥 인테그레이션(공식 플러그인 &amp;amp; Sidecar)&lt;/li&gt;
  &lt;li&gt;Android Studio Rabbit 2/3: ACP(Agent Client Protocol) 기반 BYOA(Bring Your Own Agent) 및 AI Change Review&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;데모 전반에는 40개 모듈로 구성된 대규모 오픈소스 오디오/비디오 팟캐스트 앱인 Pocket Casts가 사용되었습니다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h1 id="1-android-cli"&gt;1. Android CLI&lt;/h1&gt;

&lt;p&gt;Android CLI는 AI 에이전트가 안드로이드 도구를 실행할 때 생기는 파싱 오류와 불필요한 대기를 없애도록 만들었습니다.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;예측 가능한 명령어 체계 (Predictable commands)&lt;/li&gt;
  &lt;li&gt;JSON 등 기계가 읽기 쉬운 구조화된 출력 (Structured outputs)&lt;/li&gt;
  &lt;li&gt;추가 입력 프롬프트 없이 즉시 끝나는 비대화형 실행 (Zero interactive prompts)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img class="img-responsive" src="/assets/img/blog/ads26/whats-new-in-android-dev-tools/02.png" /&gt;&lt;/p&gt;

&lt;h3 id="주요-신규-명령어-android---ads"&gt;주요 신규 명령어 (&lt;code class="language-plaintext highlighter-rouge"&gt;android --ads&lt;/code&gt;)&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;명령어&lt;/th&gt;
      &lt;th&gt;주요 기능 및 특징&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;signals&lt;/td&gt;
      &lt;td&gt;Crashlytics의 크래시 목록 및 현장 텔레메트리 데이터를 조회&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;device&lt;/td&gt;
      &lt;td&gt;연결된 기기/에뮬레이터 미러링(device hub) 및 원격 물리 기기 대여(Reservation) 관리&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;profiler&lt;/td&gt;
      &lt;td&gt;앱, 게임, 디바이스의 시스템 트레이스(Perfetto) 및 힙 덤프 수집&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;build&lt;/td&gt;
      &lt;td&gt;Gradle 등의 빌드 아티팩트를 CLI에서 직접 빌드&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;preview&lt;/td&gt;
      &lt;td&gt;Android Studio나 실제 기기 없이 터미널에서 Jetpack Compose @Preview를 PNG 및 JSON 컴포넌트 트리로 렌더링&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;install&lt;/td&gt;
      &lt;td&gt;변경된 바이트만 전송하는 델타 푸시(Delta push) 배포 (기존 ADB 대비 대폭 시간 절약)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;input&lt;/td&gt;
      &lt;td&gt;복잡한 좌표 계산 대신 시맨틱 UI 요소를 대상으로 제스처 및 키 이벤트 전송&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;analyze&lt;/td&gt;
      &lt;td&gt;AAB/APK의 R8 설정, 난독화 비율, DEX 크기 및 리소스 분석&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;docs&lt;/td&gt;
      &lt;td&gt;공식 안드로이드 지식 베이스(KB)에서 최신 가이드 문서를 온디맨드로 로컬 검색 및 fetch&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;auth&lt;/td&gt;
      &lt;td&gt;안드로이드 CLI 도구용 Google 서비스 인증 로그인/로그아웃&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;hr /&gt;

&lt;h1 id="2-터미널-환경의-에이전트-자동화-데모-claude-code"&gt;2. 터미널 환경의 에이전트 자동화 데모 (Claude Code)&lt;/h1&gt;

&lt;h2 id="1-프로덕션-크래시-재현-및-핫픽스"&gt;(1) 프로덕션 크래시 재현 및 핫픽스&lt;/h2&gt;

&lt;p&gt;Firebase Crashlytics에 보고된 실제 크래시를 에이전트가 탐색, 재현, 코드 수정, 배포 및 검증까지 단 1분 42초 만에 수정했습니다.&lt;/p&gt;

&lt;p&gt;&lt;img class="img-responsive" src="/assets/img/blog/ads26/whats-new-in-android-dev-tools/03.png" /&gt;&lt;/p&gt;

&lt;h4 id="데모"&gt;데모&lt;/h4&gt;

&lt;ol&gt;
  &lt;li&gt;크래시 탐색: &lt;code class="language-plaintext highlighter-rouge"&gt;android signals&lt;/code&gt; 명령어로 지난 30일간 사용자 발생 수가 가장 높은 크래시를 조회
    &lt;ul&gt;
      &lt;li&gt;원인: 비밀번호 재설정(“I forgot my password”) 버튼을 연속 두 번 탭하면 네비게이션이 중복 실행되어 &lt;strong&gt;IllegalArgumentException&lt;/strong&gt;이 발생
        &lt;blockquote&gt;
          &lt;p&gt;IllegalArgumentException: Navigation action … cannot be found from the current destination&lt;/p&gt;
        &lt;/blockquote&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;기기에서 재현: &lt;code class="language-plaintext highlighter-rouge"&gt;android layout&lt;/code&gt;으로 버튼 좌표를 확인한 뒤 &lt;code class="language-plaintext highlighter-rouge"&gt;android input tap&lt;/code&gt;으로 버튼을 두 번 탭해 실제 기기에서 크래시 발생&lt;/li&gt;
  &lt;li&gt;코드 수정: 중복 화면 이동을 막도록 SignInFragment.kt와 PromoCodeFragment.kt의 네비게이션 로직에 &lt;code class="language-plaintext highlighter-rouge"&gt;currentDestination&lt;/code&gt; 확인 가드를 추가&lt;/li&gt;
  &lt;li&gt;고속 재배포: &lt;code class="language-plaintext highlighter-rouge"&gt;android build&lt;/code&gt;로 빌드한 뒤 &lt;code class="language-plaintext highlighter-rouge"&gt;android install&lt;/code&gt;을 실행해 전체 84MB APK 대신 &lt;strong&gt;3.84MB 델타 패치&lt;/strong&gt;만 기기로 전송&lt;/li&gt;
  &lt;li&gt;검증: 기기에서 다시 더블 탭을 실행해 크래시 로그가 남지 않고(0 lines) 화면이 정상 유지됨을 확인&lt;/li&gt;
&lt;/ol&gt;

&lt;h4 id="사용된-android-cli-commands"&gt;사용된 Android CLI commands&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;android signals crashes list --firebase-app ... --sort-by=users --timeframe=30d&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;최근 30일간 사용자 수 기준 상위 크래시 이슈 랭킹 조회&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;android signals crashes describe &amp;lt;issue&amp;gt; --timeframe=30d&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;해당 크래시의 상세 스택 트레이스 및 디바이스/안드로이드 OS 버전별 분포 확인&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;android layout --device=... --flat&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;수정 전/후 비밀번호 재설정 버튼의 좌표를 파악하기 위한 UI 레이아웃 트리 조회&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;android input tap --device=... "id:btnSignIn"&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;구버전 로그인 화면으로 진입하기 위한 시맨틱 탭 전송 (2회 실행)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;android build "gradle://?:app:assembleDebugProd"&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;수정된 코드의 빌드 산출물 생성&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;android install --device=...&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;초기 수정 전 빌드 설치, 핫픽스 빌드 델타 패치 주입 (84MB 중 3.84MB만 전송)&lt;br /&gt;
&lt;em&gt;(참고: CLI가 지원하지 않는 화면 회전 고정, 딥링크 호출, 백키 입력, 더블탭 등 일부 작업에는 &lt;code class="language-plaintext highlighter-rouge"&gt;adb&lt;/code&gt;를 보조로 사용)&lt;/em&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="2-apk-최적화-r8-configuration-analyzer"&gt;(2) APK 최적화: R8 Configuration Analyzer&lt;/h2&gt;

&lt;p&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;Release Bundle이 너무 크다&lt;/code&gt;는 요청에 대해 에이전트가 ProGuard/R8 룰을 분석하고 불필요한 keep 룰을 제거했습니다.&lt;/p&gt;

&lt;p&gt;&lt;img class="img-responsive" src="/assets/img/blog/ads26/whats-new-in-android-dev-tools/04.png" /&gt;&lt;/p&gt;

&lt;h4 id="데모-1"&gt;데모&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;원인 파악: Protocol Buffers keep 룰이 지나치게 포괄적이어서 불필요한 클래스까지 난독화 대상에서 제외되고 있었습니다.&lt;/p&gt;

    &lt;blockquote&gt;
      &lt;ul&gt;
        &lt;li&gt;수정 전 : -keep class * extends com.google.protobuf.GeneratedMessageLite { *; }&lt;/li&gt;
        &lt;li&gt;수정 후 : -keepclassmembers class * extends com.google.protobuf.GeneratedMessageLite { &lt;fields&gt;; }&lt;/fields&gt;&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;클래스 전체를 유지하지 않고, 실제 사용하는 필드 멤버와 Retrofit 반환 타입으로 호출되는 API 메시지만 유지(keep)하도록 수정&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;개선 결과:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;비압축 DEX 크기: 19,485,804 B → 18,957,388 B (-528 KB, -2.7%)&lt;/li&gt;
  &lt;li&gt;APK 압축 크기: 42,311,672 B → 42,147,832 B (-164 KB)&lt;/li&gt;
  &lt;li&gt;Keep된 메서드 수: 17,940개 → 11,757개 (-6,183개 제거, -34%)&lt;/li&gt;
  &lt;li&gt;Keep된 필드 수: 7,944개 → 7,209개 (-735개 감소)&lt;/li&gt;
  &lt;li&gt;Keep된 클래스 수: 2,342개 → 2,268개 (-74개 감소)&lt;/li&gt;
  &lt;li&gt;DEX 난독화 비율: 92.72% → 93.06% (+0.34%p)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id="사용된-android-cli-commands-1"&gt;사용된 Android CLI commands&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;android analyze ./before/app-release.apk&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;수정 전 베이스라인 APK의 DEX 크기, R8 설정 및 난독화 비율(Obfuscation ratio) 측정&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;android analyze ./after/app-release.apk&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;룰 수정 후 생성된 APK의 수치를 동일하게 추출하여 개선 지표 비교&lt;br /&gt;
&lt;em&gt;(참고: CLI에 Configuration Analyzer 출력 파싱 명령어가 없어 상위 룰 랭킹에는 보조 스크립트 활용)&lt;/em&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="3-앱-시작-시간startup-time-최적화-baseline-profile--profiler"&gt;(3) 앱 시작 시간(Startup Time) 최적화: Baseline Profile &amp;amp; Profiler&lt;/h2&gt;

&lt;p&gt;앱 시작 성능 개선 요청 시 에이전트가 공식 문서를 읽고 프로파일러를 통한 측정을 수행했습니다.&lt;/p&gt;

&lt;p&gt;&lt;img class="img-responsive" src="/assets/img/blog/ads26/whats-new-in-android-dev-tools/05.png" /&gt;&lt;/p&gt;

&lt;h4 id="데모-2"&gt;데모&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;원인 분석: 출시 버전 프로토타입 APK의 &lt;strong&gt;baseline.prof&lt;/strong&gt;가 약 8KB에 불과하며, 포함된 6,690개 룰 중 Pocket Casts 자체 코드 룰이 0개(전체 프로필 로드 룰 중에서도 단 66개)여서 시작 코드가 JIT/인터프리터로 구동되고 있음을 확인&lt;/li&gt;
  &lt;li&gt;최적화 수행: 공식 문서를 읽어 무루팅 환경(Android 14+)에서 베이스라인 프로필을 수집 및 생성하는 절차를 확인하고, 콜드 스타트 프로필 룰(Pocket Casts 룰 2,621개 포함)을 갱신&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id="사용된-android-cli-commands-2"&gt;사용된 Android CLI commands&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;android profiler systemtrace start --launch --duration=8&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;앱 콜드 런치(Cold start) 시점의 시스템 트레이스를 Perfetto 형식(&lt;code class="language-plaintext highlighter-rouge"&gt;*.pftrace&lt;/code&gt;)으로 수집 (수집된 트레이스는 &lt;code class="language-plaintext highlighter-rouge"&gt;ui.perfetto.dev&lt;/code&gt;에서 분석)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;android docs fetch kb://android/topic/performance/baselineprofiles/manually-create-measure&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;Android 14+ 기기에서 루팅 없이 Baseline Profile을 수동 생성하고 측정하는 최신 공식 기술 가이드라인 로컬 fetch 및 학습&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;개선 수치 (Pixel 6 Pro 기준):&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Main-thread CPU 시간: 297.7ms → 244.7ms (-17.8%)&lt;/li&gt;
  &lt;li&gt;Total app CPU 시간: 809.3ms → 600.4ms (-25.8%)&lt;/li&gt;
  &lt;li&gt;JIT thread CPU 시간: 56.3ms → 15.6ms (-72.2%)&lt;/li&gt;
  &lt;li&gt;Time to initial display (TTID): 463.2ms → 383.4ms (-17.2% 단축)&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h1 id="3-linux-데스크탑에서-android-앱-네이티브-실행-실험적-프로토타입"&gt;3. Linux 데스크탑에서 Android 앱 네이티브 실행 (실험적 프로토타입)&lt;/h1&gt;

&lt;p&gt;별도의 무거운 에뮬레이터나 중첩 가상화(Nested Virtualization) 없이, &lt;strong&gt;Linux 데스크톱 상에서 Android x86 APK를 단일 네이티브 프로세스로 직접 실행&lt;/strong&gt;하는 새로운 기술이 공개되었습니다.&lt;/p&gt;

&lt;p&gt;&lt;img class="img-responsive" src="/assets/img/blog/ads26/whats-new-in-android-dev-tools/06.png" /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;초경량 구조: 단일 프로세스로 실행되며 stdout/stdin으로 로그가 직접 출력됨&lt;/li&gt;
  &lt;li&gt;클라우드 에이전트 환경 최적화: 중첩 가상화를 지원하지 않는 클라우드 VM이나 CI 컨테이너에서도 에이전트가 앱을 직접 실행하고 테스트 가능&lt;/li&gt;
  &lt;li&gt;높은 완성도:
    &lt;ul&gt;
      &lt;li&gt;순수 Compose 앱 실행&lt;/li&gt;
      &lt;li&gt;네트워크 통신이 포함된 Google 레퍼런스 앱 실행&lt;/li&gt;
      &lt;li&gt;네이티브 .so 라이브러리 변환 계층을 통해 C++ 라이브러리와 오디오 출력이 포함된 실제 Pocket Casts 앱 구동&lt;/li&gt;
      &lt;li&gt;데스크톱 변환 계층을 통한 OpenGL ES 1 네이티브 게임 앱 렌더링&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h1 id="4-ai-에이전트를-위한-공식-android-플러그인"&gt;4. AI 에이전트를 위한 공식 Android 플러그인&lt;/h1&gt;

&lt;p&gt;Google Antigravity, Claude Code, OpenAI Codex를 위한 공식 Android 플러그인이 배포되었습니다.&lt;/p&gt;

&lt;p&gt;&lt;img class="img-responsive" src="/assets/img/blog/ads26/whats-new-in-android-dev-tools/07.png" /&gt;&lt;/p&gt;

&lt;p&gt;플러그인을 활성화하면 Android CLI 뿐만 아니라, 공식 최신 지식/가이드가 포함된 &lt;code class="language-plaintext highlighter-rouge"&gt;Android Skills&lt;/code&gt;가 주입되어 모델의 오래된 학습 데이터 대신 항상 최신 아키텍처 표준을 따릅니다.&lt;/p&gt;

&lt;h3 id="google-antigravity"&gt;Google Antigravity&lt;/h3&gt;

&lt;h4 id="1-android-compose-preview"&gt;(1) Android Compose Preview&lt;/h4&gt;
&lt;p&gt;AI 에이전트에게 기존 View 코드를 Compose로 변환하고 대화면(폴더블·태블릿)에 맞게 최적화하도록 요청하면, 에이전트가 &lt;code class="language-plaintext highlighter-rouge"&gt;@Preview&lt;/code&gt; 어노테이션을 작성하고 Sidecar 패널에 프리뷰 화면을 즉시 렌더링합니다.&lt;/p&gt;

&lt;p&gt;&lt;img class="img-responsive" src="/assets/img/blog/ads26/whats-new-in-android-dev-tools/08.png" /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;전체 앱 컴파일 및 기기 배포를 반복하지 않고, Sidecar 창에서 프리뷰 렌더링을 즉시 갱신&lt;/li&gt;
  &lt;li&gt;대화면에서 1열 스크롤 대신 헤더와 에피소드 목록을 좌우로 나누는 듀얼 창(Dual-pane) 레이아웃을 제안&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id="2-android-device-hub"&gt;(2) Android Device Hub&lt;/h4&gt;
&lt;p&gt;Antigravity 내에서 가상 기기(AVD) 및 물리 기기를 통합 관리하고 화면을 직접 미러링할 수 있습니다.&lt;/p&gt;

&lt;p&gt;&lt;img class="img-responsive" src="/assets/img/blog/ads26/whats-new-in-android-dev-tools/09.png" /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Pixel 10 Pro Fold 등 실제 연결된 기기 목록과 가상 기기(AI Glasses, Medium Phone, Small Phone 등)를 Sidecar 패널에서 통합 관리&lt;/li&gt;
  &lt;li&gt;미러링된 기기 화면을 보며 실시간 터치와 제스처로 상호작용 가능&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img class="img-responsive" src="/assets/img/blog/ads26/whats-new-in-android-dev-tools/09_split_screen.png" /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;화면 분할(Split Screen) 전환 시 앱이 싱글 페인(Single-pane)과 듀얼 페인(Dual-pane) 사이를 적응형(Adaptive)으로 올바르게 전환하는지 실시간 검증&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id="android-cli-연동에-따른-에이전트-효율성-벤치마크"&gt;Android CLI 연동에 따른 에이전트 효율성 벤치마크&lt;/h3&gt;

&lt;p&gt;Claude Opus를 대상으로 6개 사용자 Journeys 및 6개 디바이스에서 메모리 누수를 찾고 수정하는 과제를 Android CLI 사용 여부에 따라 A/B 테스트한 결과입니다.&lt;/p&gt;

&lt;p&gt;&lt;img class="img-responsive" src="/assets/img/blog/ads26/whats-new-in-android-dev-tools/10.png" /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;작업 완료 속도: 1.9배 향상 (88분 → 46분, 42분 단축)&lt;/li&gt;
  &lt;li&gt;토큰 사용량: 1.3배 절감 (4.6M 토큰 → 3.5M 토큰)&lt;/li&gt;
  &lt;li&gt;Compose Preview: 전통적인 컴파일/실행 반복 대비 반복 시간 77% 단축&lt;/li&gt;
  &lt;li&gt;Analyze 명령어: 다중 왕복 검사를 단일 구조화 명령어로 대체하여 출력 토큰 5.5배 절감&lt;/li&gt;
  &lt;li&gt;Semantic Input: 화면 좌표 추정 환각(Hallucination)을 없애 작업 실행 속도 25% 향상&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h1 id="5-android-studio와-ai-에이전트의-진화"&gt;5. Android Studio와 AI 에이전트의 진화&lt;/h1&gt;

&lt;h2 id="1-bring-your-own-agent-byoa-via-agent-client-protocol-acp"&gt;(1) Bring Your Own Agent (BYOA) via Agent Client Protocol (ACP)&lt;/h2&gt;

&lt;p&gt;Android Studio는 내장 Gemini 외에도, 개발자와 팀이 이미 사용 및 구독 중인 외부 에이전트를 IDE로 가져올 수 있는 BYOA 기능을 도입했습니다.&lt;/p&gt;

&lt;p&gt;&lt;img class="img-responsive" src="/assets/img/blog/ads26/whats-new-in-android-dev-tools/11.png" /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;경로: &lt;code class="language-plaintext highlighter-rouge"&gt;Settings &amp;gt; Tools &amp;gt; AI &amp;gt; Agents&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Agent Client Protocol (ACP) 기반으로 다양한 에이전트 연결 지원:
    &lt;ul&gt;
      &lt;li&gt;Built-in Agent v2.0&lt;/li&gt;
      &lt;li&gt;Google Antigravity&lt;/li&gt;
      &lt;li&gt;Claude Agent (Claude Code / Anthropic API 연동)&lt;/li&gt;
      &lt;li&gt;OpenAI Codex&lt;/li&gt;
      &lt;li&gt;JetBrains Junie&lt;/li&gt;
      &lt;li&gt;ACP Agent Marketplace&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;기존 개인 구독이나 기업용 계정을 그대로 활용 가능&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img class="img-responsive" src="/assets/img/blog/ads26/whats-new-in-android-dev-tools/12.png" /&gt;&lt;/p&gt;

&lt;p&gt;연결된 에이전트(예: Claude Opus 5.5)는 Android Studio의 모든 도구 체인(파일 수정, 정적 분석, 빌드, Gradle 싱크, Compose 프리뷰 렌더링, 기기 배포, 공식 문서 조회)에 직접 접근할 수 있습니다.&lt;/p&gt;

&lt;h2 id="2-ai-change-review"&gt;(2) AI Change Review&lt;/h2&gt;

&lt;p&gt;대량의 코드를 검토할 때 버그를 사전에 잡을 수 있도록 지원하는 코드 리뷰 기능입니다. 로컬 변경점뿐만 아니라 PR도 분석합니다.&lt;/p&gt;

&lt;p&gt;&lt;img class="img-responsive" src="/assets/img/blog/ads26/whats-new-in-android-dev-tools/13.png" /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;15개 파일, 800줄의 PR 변경점을 분석해 잠재적 버그를 사전에 감지&lt;/li&gt;
  &lt;li&gt;데모에서 발견된 실제 이슈:
    &lt;ul&gt;
      &lt;li&gt;북마크 스와이프 행 컴포저블(SwipeRow.kt)에서 LaunchedEffect 키가 람다 객체로 설정되어 있어, 행이 Recomposition될 때마다 풀 스와이프 동작이 중복 실행되는 버그&lt;/li&gt;
      &lt;li&gt;삭제 다이얼로그가 뜬 상태에서 북마크 삭제 확인 다이얼로그가 계속 중복 노출되는 문제&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;해결책 제시 및 일괄 반영: 원인을 설명하고 rememberUpdatedState를 적용한 코드 diff를 제공합니다. 체크박스로 선택한 이슈를 버튼 한 번으로 일괄 수정(Fix all selected issues) 가능&lt;/li&gt;
  &lt;li&gt;주제별 워크스루(&lt;code class="language-plaintext highlighter-rouge"&gt;Walkthrough&lt;/code&gt;): PR 내 변경 사항을 기능 단위로 묶어 코드 변경 내역을 확인하고 승인 가능&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="3-android-studio-rabbit-릴리스-현황"&gt;(3) Android Studio Rabbit 릴리스 현황&lt;/h2&gt;

&lt;p&gt;&lt;img class="img-responsive" src="/assets/img/blog/ads26/whats-new-in-android-dev-tools/14.png" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img class="img-responsive" src="/assets/img/blog/ads26/whats-new-in-android-dev-tools/15.png" /&gt;&lt;/p&gt;

&lt;h1 id="관련-링크"&gt;관련 링크&lt;/h1&gt;
&lt;ul&gt;
  &lt;li&gt;Watch Tools &amp;amp; Performance sessions: &lt;a href="https://goo.gle/ADS26-Tools-and-Perf"&gt;goo.gle/ADS26-Tools-and-Perf&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Watch all sessions from Android Dev Summit 2026: &lt;a href="https://goo.gle/ADS26-All-Sessions"&gt;goo.gle/ADS26-All-Sessions&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Android CLI 피드백: &lt;a href="https://d.android.com/cli"&gt;d.android.com/cli&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</summary>
    <title>Blog: [요약] The latest in Android dev tools (Android Dev Summit '26)</title>
    <updated>2026-10-31T21:00:00+09:00</updated>
    <dc:date>2026-10-31T21:00:00+09:00</dc:date>
  </entry>
  <entry>
    <author>
      <name>pangyoalto</name>
    </author>
    <content type="html">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"&gt;
&lt;html&gt;&lt;body&gt;
&lt;img src="https://images.unsplash.com/photo-1647427060118-4911c9821b82?crop=entropy&amp;amp;cs=tinysrgb&amp;amp;fit=max&amp;amp;fm=jpg&amp;amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDF8fGF1dG9tYXRpb258ZW58MHx8fHwxNzkzNDUwOTQ0fDA&amp;amp;ixlib=rb-4.1.0&amp;amp;q=80&amp;amp;w=2000" alt="AI가 만든 컨텐츠들이 범람하고 있다"&gt;&lt;p&gt;네이버 검색의 퀄리티에 대해 항상 지적받는 부분이 있다. 검색 결과 상위에 걸리는 블로그 결과 등이 사람이 쓴 글이 아니라 AI slop 들이 대부분이라는 것이다. 나 역시도 이 문제는 네이버 뿐만 아니라 모든 포털 사이트들이 마주한 문제라고 생각하고,그 회사의 운명을 좌지우지할 중요한 문제라고 생각한다.&lt;/p&gt;
&lt;p&gt;개인적으로 이 문제는 SNS 가 가진 구조가 변경되지 않는 이상 해결이 거의 불가한 일이라고 생각하고 있다. AI의 생산력이 사람에 비해 매우 높기 때문에 AI가 만든 컨텐츠의 절대량이 사람이 직접 만드는 수에 비해서 훨씬 높을 뿐만 아니라, 사람이 "직접 만드는" 컨텐츠도 줄어들고 있기 때문이다.&lt;/p&gt;
&lt;p&gt;블로그, 인스타그램, X, threads 등은 조회수가 돈으로 연결된다.  그렇기에 AI가 나오기 전에도 SNS를 전문적으로 운영하며 수익을 창출하는 사람들이 많았다. AI의 도움을 받으면 이 사람들은 파이프라인 개수를 5배, 10배로 늘릴 수 있다. 당연하게도 이렇게 N배로 파이프라인을 늘릴 때 자신의 유니크한 경험을 녹아내기는 쉽지 않을 것이다. 유니크한 경험을 하는 물리적인 시간은 AI 전이나 후나 비슷할 테니까 말이다.&lt;/p&gt;
&lt;p&gt;취미로 SNS를 운영하는 사람들도 AI 도움을 받지 않고 글이나 컨텐츠를 만들지는 않을 것이다. 글을 쓴다는 것은, 굉장히 많은 에너지를 요한다. 그림이나 동영상은 더욱 그럴 것이다. 그래서 AI에 점점 의존을 하고 있고, AI가 만든 컨텐츠들은 딱 잡아 말할 수 없지만 약간의 어색함이 있다. 일상생활에서 잘 쓰지 않을 법한 단어들을 쓰는 것이 가장 흔한 경우다.&lt;/p&gt;
&lt;p&gt;지금은 많은 사람들이 그 어색함을 느끼고 있다. 아직 AI 를 일반인들까지 본격적으로 활용한지 몇 년 안되었으니까 말이다. 그런데 이보다 더 긴 시간이 지나면 어떨까?&lt;/p&gt;
&lt;p&gt;사람들의 독서량은 점점 줄어들고 있다. 아마 AI가 나온 뒤에는 더 줄어들 것이다. 이는 사람이 직접 쓴 양질의 글에 노출되는 시간이 점점 줄어든다는 얘기다. 반면 AI가 쓴 글에 노출되는 시간은 더욱 길어질 것이다. 하다 못해 SNS를 하지 않더라도 많은 사람들이 chatGPT를 사용해서 정보를 얻지 않는가? 그러면 AI가 쓴 글이 사람이 쓴 글보다 더 익숙해질 것이고, 우리가 어색하다고 느꼈던 단어들이 AI가 계속 쓴다면 어색하지 않다고 느낄 것이다. 심지어 이제 출판되는 도서들은 AI의 도움을 받을 것이니 순수하게 사람이 쓴 양질의 글에 노출되는 기회는 매우 줄어들 것이다.&lt;/p&gt;
&lt;p&gt;그래서 그런 시대가 오면 나쁜건가? 그건 잘 모르겠다. 아직은 가치 판단이 잘 안된다. 다만 분명 두려운 지점은 있다. 내가 글을 쓰는 능력이 점점 퇴화할 것 같다는 것. 그리고 그것이 내 논리적인 사고력에도 영향을 미치지 않을까.&lt;/p&gt;
&lt;p&gt;그래서 이 블로그는 개인적인 경험을 쓸 때는 AI를 쓰지 않으려고 한다. 논문 리뷰나 지식 등을 다룰 때는 AI 도움을 쓰겠지만, '나' 에 대해서 다룰 때는 오롯이 나의 힘으로 책임을 다할 것이다.&lt;/p&gt;
&lt;/body&gt;&lt;/html&gt;
</content>
    <id>https://pangyoalto.com/ai-slope-future/</id>
    <link href="https://pangyoalto.com/ai-slope-future/"/>
    <summary type="html">&lt;p&gt;&amp;#xb124;&amp;#xc774;&amp;#xbc84; &amp;#xac80;&amp;#xc0c9;&amp;#xc758; &amp;#xd004;&amp;#xb9ac;&amp;#xd2f0;&amp;#xc5d0; &amp;#xb300;&amp;#xd574; &amp;#xd56d;&amp;#xc0c1; &amp;#xc9c0;&amp;#xc801;&amp;#xbc1b;&amp;#xb294; &amp;#xbd80;&amp;#xbd84;&amp;#xc774; &amp;#xc788;&amp;#xb2e4;. &amp;#xac80;&amp;#xc0c9; &amp;#xacb0;&amp;#xacfc; &amp;#xc0c1;&amp;#xc704;&amp;#xc5d0; &amp;#xac78;&amp;#xb9ac;&amp;#xb294; &amp;#xbe14;&amp;#xb85c;&amp;#xadf8; &amp;#xacb0;&amp;#xacfc; &amp;#xb4f1;&amp;#xc774; &amp;#xc0ac;&amp;#xb78c;&amp;#xc774; &amp;#xc4f4; &amp;#xae00;&amp;#xc774; &amp;#xc544;&amp;#xb2c8;&amp;#xb77c; AI&lt;/p&gt;</summary>
    <title>AI가 만든 컨텐츠들이 범람하고 있다</title>
    <updated>2026-10-31T22:31:40+09:00</updated>
    <dc:date>2026-10-31T22:31:40+09:00</dc:date>
  </entry>
  <dc:date>2026-11-01T21:19:12+09:00</dc:date>
</feed>
