ByteScope

APK Extractor

用傳輸線把已安裝 app 的 APK 取回電腦——base 與每一個 split——並直接在這頁讀它的 manifest、權限與簽章。

APK 會從手機直接串流寫進你選的位置。不會上傳任何東西,分析也在這個分頁裡跑完。

正在檢查瀏覽器支援…

關於這個工具、FAQ 與相關工具

關於這個工具

Android 上的每個 app 都是手機裡的一個檔案,而 adb 讀得到檔案。這頁就是靠這件事:選一個已安裝的 app,它的 APK 會經 USB 傳輸線取出到你指定的位置——不需 root、不在手機上裝任何東西、也不會上傳到任何地方。以 split 形式發布的 app 會變成一個 .apks 容器,裡面有全部部件與一份目次;任何一個 app 也可以就在這頁分析:權限、簽章、SDK 版本、DEX 與資源統計、原生程式庫。

為什麼複製已安裝的 APK 不需要 root

需要 root 的是讀*別的 app 的資料*——/data/data 底下的資料庫、設定與檔案。APK 本身不是資料,它是安裝產物,而且放在人人可讀的位置:從商店安裝或 sideload 的是 /data/app/~~<亂數>/<套件名>-<亂數>/base.apk,出廠預載的是 /system/app/product/appshell 使用者可以穿過這些目錄並讀取檔案,這也是為什麼「用 adb pull 抓 APK」這招十幾年來一直有效。這頁多做的是幫你找出路徑(pm path <套件名> 會印出該套件的每一個檔案,包含 split)、用套件名與 versionCode 命名輸出,並把一組 split 打包成裝得回去的東西,而不是一堆散檔。限制也要說清楚:/data/app 讀得到是慣例而不是官方保證,加固過或大幅改造的版本真的會拒絕。你的手機拒絕時,你會看到它自己印出來的訊息。

base.apk、split,各自裝了什麼

以 Android App Bundle 建置的 app 會一次安裝好幾個 APK。base.apk 裝的是 manifest、程式碼(classes*.dex)、資源表,以及所有跟裝置無關的東西。旁邊是設定用的 split:split_config.arm64_v8a.apk 是某個 CPU 架構的原生程式庫、split_config.xxhdpi.apk 是某個螢幕解析度密度的圖檔、split_config.en.apk 是某個語言的字串。功能 split 則加上隨需模組。手機只安裝了*符合它自己*的那些 split,這是把它們搬到別台時要先懂的第一件事:你取出來的不是 universal APK,而是剛好適合這台手機的那一組。這也是為什麼只裝 base 通常裝得起來、第一次啟動就閃退——程式碼在,要載入的程式庫不在。

取出的 APK 能不能裝到別台手機

由兩件事決定。**簽章**會跟著 APK 走,所以 app 會以原本的身分安裝;這同時代表它不能覆蓋在別人簽名的同一個 app 上面,而 Play 之後也可能用自己的版本換掉它。比較麻煩的是**那組 split**:整個 .apks 裝下去,部件是齊的,但如果目標手機的 CPU 架構不同、或螢幕密度差很多,你手上的 split 並沒有描述那台手機,app 可能啟動後找不到程式庫而失敗。安裝一組 split 也不是 pm install <檔案>——那是一個工作階段(pm install-create、每個 APK 一次 install-writeinstall-commit),本站的 APK Installer 那頁會幫你做。最後,透過 Play 發布並會檢查授權或 Play Integrity 的 app,發現自己不是由商店安裝時可能拒絕執行,就算複製得再完整也一樣。

.apks 是什麼格式,我們產的裡面有什麼

.apks 是 bundletool 的輸出格式:一個 ZIP,裡面放同一個 app 的那些 APK,加上一份 toc.pb 說明哪個是 master split、其他各自對應什麼。那份中介資料就是這個格式存在的理由——一堆散檔會失去「哪個是 base、哪個 split 對應哪個架構」,而檔名只是猜測。這頁寫出的容器是同一個形狀:取出的 APK 放在 splits/ 底下,附上一份我們根據手機回報內容產生的 toc.pb,所以本站的 APK Installer 是依中介資料分類 split,而不是靠檔名猜。它是 stored 不壓縮(APK 本身已經是壓縮檔),而且在還在讀手機的同時就寫進磁碟,所以一個 900 MB 的遊戲不必塞進瀏覽器的記憶體。這是我們自己的容器、給我們自己的工具讀:我們不宣稱它跟 bundletool 的輸出位元組相同,其他安裝器收不收也不保證。

這頁不會寫任何東西到手機。取出全程只有讀取——列出套件、問路徑、讀檔案——所以沒有確認對話框要按,因為沒有破壞性的操作要確認。從這裡出發,APK Analyzer 吃你電腦裡的檔案並能比對兩個版本,APK Installer 把套件送回手機,Web ADB hub 則有裝置儀表板與其餘工具。

常見問題

換手機前想把自己裝的 app 全部備份,該怎麼做?

打開 USB 除錯後接上手機,按「全選使用者安裝的 app」(那是第三方清單,預載軟體不會進來),再按「選一個資料夾並開始取出」。你在電腦上選一次資料夾,每個 app 就會各自寫成一個檔案——split 形式的是 `<套件名>-<versionCode>.apks`,單一 APK 的是 `.apk`。app 是一個一個處理、結果也逐項回報,所以某個 app 的檔案 shell 讀不到時,那只是報告裡的一行,不是整個備份失敗。要裝回去時,在新手機上把檔案拖到 APK Installer 那頁。

為什麼有些 app 取不出來?

有三種原因,而且這頁會告訴你是哪一種。`shell` 使用者沒有權限讀那個 app 的目錄——在加固過與某些 OEM 版本上很常見,我們會原樣顯示手機的錯誤。`pm path` 什麼都沒印——只安裝在工作設定檔或別的使用者底下的 app 就會這樣,因為這頁問的是 user 0。或者那根本不是純 APK——`pm path` 也可能列出 `.dm` 的 dex metadata 附檔,我們會跳過,因為把它放進容器會導致裝不起來。至於所有 APK 加起來超過傳統 ZIP 定址上限(4 GiB)的 app,我們一樣拒絕,而不是寫出一個有些工具打得開、有些說壞檔的壓縮檔。

我取出的 APK 裝不回另一台手機,為什麼?

最常見的是它是 split app,而你只裝了 base:程式碼在,但那台裝置要用的原生程式庫與資源在 config split 裡。請用會開安裝工作階段的工具(本站 APK Installer 那頁)整包 `.apks` 一起裝,而不是把 base 交給系統安裝器。第二常見的是簽章衝突——同一個套件已經從別的來源裝過了——那要先把舊的移除。另外,CPU 架構不同的手機,可能根本不在這台手機拿到的那組 split 描述範圍內。

付費 app 能這樣備份嗎,這樣做可以嗎?

技術上它跟其他檔案一樣複製得出來。能不能保留或搬移是授權問題,不是技術問題:買 app 買的是使用授權,通常綁在購買的帳號上,而能複製到什麼程度由授權條款決定,不是由這頁決定。為自己在自己的裝置上使用而備份自己已授權的軟體,是很正常的事,也是這頁存在的用途。把 APK 散給別人不是;而且很多付費 app 執行時還會跟 Play 對照,發現不是商店安裝就拒絕啟動,所以傳給別人的複本通常本來就不會動。這頁不會幫你繞過授權,這裡也沒有任何功能會移除簽章或改掉檢查。

  • Web ADB Toolkit

    裝置儀表板、shell 抽屜,以及其他每一個 Web ADB 工具。

  • APK Analyzer

    同一份報告,但吃你電腦裡的檔案,另外還能比對版本。

  • APK Installer

    把 .apk、.apks、.xapk、.apkm 裝回手機。

  • Android Debloater

    移除或停用預載 app,並保留還原清單。