很多人一聽到 Android Vibe,第一個直覺會把它想成某種 Android 版的 RAG:先切 chunk、再做 embedding、再查 Top-K。這樣講不能算錯,但也不夠準。因為一旦只剩下「向量搜尋」這四個字,Android Framework 最難的那一段,反而會被掩蓋掉。

真正困難的地方,從來不是把 code 收進資料庫,而是如何讓系統知道這段 code 在架構裡扮演什麼角色。它是 framework API?是 service entry?是 Binder transaction boundary?還是 HAL 的後段實作?若這一層沒有被整理出來,搜尋最後往往只會退化成字面上的相似,而不是工程師真正需要的閱讀路徑。

因此,Android Vibe 的定位,並不是單純的 text embedding + AST。更精確地說,它是一套面向 Android Framework 的 code-indexing 與 retrieval 系統:一邊讀 source tree,一邊把 method、path、subsystem、module 與結構線索整理成可檢索的索引。等到工程師提出一個功能問題時,系統回給你的,不只是一份關鍵字命中的清單,而是一組值得先讀的候選節點。

Android Vibe 真正要解決的,不是「有沒有找到 code」,而是「能不能替工程師整理出一條合理的實作閱讀路徑」。

為什麼 Android Framework 需要這一層?

因為 Android Framework 不是一般 app 專案。一個看似簡單的功能意圖,背後可能同時跨過 Java API、system service、Binder、native service,甚至 HAL。若工程師只靠 grep 或檔名直覺,很容易找到很多「看起來像」的地方,卻還是不知道第一步應該從哪裡開始。

這正是 Android Vibe 有價值的地方。它先把大型 source tree 變成一張可被查詢的結構圖,再讓查詢問題不是停留在字面,而是逐步逼近真正的實作主線。也因此,Android Vibe 的 retrieve 結果,不應被理解成最終答案,而應理解成一份閱讀順序建議

camera permission enforcement path 為例

假設我們今天想理解的,不是 Camera API 怎麼呼叫,而是這個功能背後的權限檢查路徑。換句話說,我們真正要問的是:

camera permission enforcement path 這條功能,實作路徑究竟落在哪裡?

這時可以直接執行:

% npm run android-vibe:retrieve -- --query "camera permission enforcement path" --topK 8

若只從第一輪 retrieve 來看,系統可能回傳像下面這樣的候選節點:

{
  "query": "camera permission enforcement path",
  "query_tokens": ["camera", "permission", "enforcement", "path"],
  "matches": [
    {
      "path": "frameworks/base/core/java/android/hardware/Camera.java",
      "method_name": "setPreviewCallback",
      "score": 0.962915,
      "why_ranked": "lexical:camera | path-boost | exact:0.26"
    },
    {
      "path": "frameworks/base/core/java/android/hardware/Camera.java",
      "method_name": "handleMessage",
      "score": 0.945753,
      "why_ranked": "lexical:camera | path-boost | exact:0.26"
    },
    {
      "path": "hardware/ti/omap4xxx/camera/CameraHal.cpp",
      "method_name": "CameraHal::autoFocus",
      "score": 0.82969,
      "why_ranked": "lexical:camera | path-boost | exact:0.08"
    },
    {
      "path": "frameworks/base/services/camera/libcameraservice/CameraService.cpp",
      "method_name": "CameraService::onTransact",
      "score": 0.822687,
      "why_ranked": "lexical:permission,camera | path-boost | exact:0.08"
    }
  ]
}

乍看之下,前兩筆會讓人以為起點應該在 Camera.java。因為它們分數更高,也確實帶有 camera 這個關鍵字。可是若從 Android Framework 的結構來看,事情不能只看排序分數。因為 setPreviewCallback() 比較像 framework API 的使用界面,handleMessage() 也比較偏向 Java 層流程;若查詢目標是 permission enforcement path,真正值得警覺的,反而是那筆分數沒那麼高、卻同時命中 permissioncameraCameraService::onTransact

這裡的判讀關鍵,不在於「哪個分數最高」,而在於「哪個節點更像權限檢查真正會發生的邊界」。而在 Android 裡,這樣的邊界往往不在 UI callback,也不在單純的 Java API 包裝層,而更接近 service 與 Binder transaction 的接點。

所以,第一輪 retrieve 告訴了我們什麼?

它沒有直接替我們回答整條 call path,但它已經做了一件非常重要的事:把原本整棵 source tree 的搜尋範圍,縮小到幾個值得先讀的區域。這一步本身,就已經足夠改變工程師的工作節奏。

如果從閱讀順序來看,我會建議先從這三層開始:

  • frameworks/base/services/camera/libcameraservice/CameraService.cpp
    先看 CameraService::onTransact。因為它更接近 Binder transaction boundary,也比較像 permission enforcement 真正會穿過的位置。
  • frameworks/base/core/java/android/hardware/Camera.java
    接著讀 setPreviewCallbackhandleMessage。這一層有助於理解 Java API 如何把 camera 操作交給更底層的 service。
  • hardware/ti/omap4xxx/camera/CameraHal.cpp
    HAL 層可以先記下,但閱讀優先順序應放在 framework service 之後。因為在這個查詢裡,它更像下游實作,而不是權限檢查的第一現場。

也就是說,Android Vibe 的 retrieve 不是替你回答,而是先替你排出一條更合理的閱讀順序。這個差別很關鍵。因為大型 codebase 真正浪費時間的,往往不是讀 code,而是不知道先讀哪裡。

這不是單純的向量搜尋

若只是單純的向量搜尋,我們最後得到的,很可能只是很多和 camera 相關的 method。這些 method 當然不是錯的,但它們未必是這次問題真正的主線。Android Vibe 要處理的,正是這個差異:不是只找語意相近的 code,而是盡可能把 code 放回 Android Framework 的結構裡,讓工程師能從功能意圖,逼近真正的實作路徑。

因此,Android Vibe 的價值不在於它有沒有用到 embedding,而在於它有沒有把 embedding、AST、path、symbol metadata 與 Android-specific structure 組成一層可工作的 indexing。只有這樣,retrieve 出來的結果才不是一堆相似段落,而是一組能拿來做 tracing、planning 與 AI handoff 的候選節點。

從 retrieve 到工作流

從工程角度來看,這樣的輸出已經足夠成為下一步工作的起點。工程師可以先根據 retrieve 結果做第一輪 code reading,再把關鍵 method、可能的 permission boundary 與相鄰實作整理成 handoff bundle,最後才讓 Claude 這類 LLM 進場做說明、比較與 patch planning。

這也是 Android Vibe 在整條工作線裡的角色:它不是直接替你改 framework,而是先把 Android-specific truth 整理出來。等到 truth 被整理好,LLM 才比較有機會真的幫上忙。否則,模型只是對著巨大的 source tree 碰運氣而已。

快速整理

  • Android Vibe 不是單純的 RAG chunk search,而是一套面向 Android Framework 的 code-indexing 與 retrieval 系統。
  • 它的目標不是直接給最終答案,而是先整理出合理的閱讀順序與候選實作節點。
  • camera permission enforcement path 這種查詢,重點不是誰分數最高,而是誰更接近 permission enforcement 真正發生的邊界。
  • 第一輪 retrieve 往往先縮小搜尋範圍,再由工程師依 Android 結構判讀 service、Binder 與 HAL 的閱讀順序。
  • 當 code indexing 與 retrieval 做對之後,LLM 才真正適合接手 explanation、planning 與 handoff。