踩坑)
簡介本資源為 Android 官方命令行工具 Windows 版commandlinetools-win-11076708-latest.zip面向無需完整 Android Studio 的開發(fā)者、CI/CD 工程師及輕量級安卓構(gòu)建場景用戶解決 SDK 管理、AVD 創(chuàng)建、APK 分析與混淆調(diào)試等核心命令行需求。壓縮包共 104 個文件含 93 個 Java 工具類 jar 包支撐 sdkmanager、avdmanager、apkanalyzer、lint 等核心功能、8 個 Windows 批處理腳本如 sdkmanager.bat、avdmanager.bat、1 個說明文檔及配置文件整體體積 146.47MB結(jié)構(gòu)精簡、開箱即用。目前已有 561 人學(xué)習(xí)下載適合熟悉 Android 構(gòu)建流程的中高級開發(fā)者快速部署離線 SDK 環(huán)境。讀者可直接執(zhí)行命令行工具完成 SDK 平臺安裝、模擬器管理、資源縮減、堆棧還原retrace及 Kotlin 編譯支持等全鏈路操作無需依賴 IDE特別適用于自動化構(gòu)建、容器化開發(fā)與教學(xué)環(huán)境復(fù)現(xiàn)。 很多人在搭建Android開發(fā)環(huán)境時第一步就卡在SDK的獲取上。以前裝Android Studio順手就把SDK裝了但當你只需要命令行編譯、做CI自動化打包或者要給一臺沒有圖形界面的服務(wù)器配環(huán)境時那個幾百MB的commandlinetools-win-11076708-latest.zip就成了繞不開的起點。這篇文章就把這東西從頭到尾講透從它是什么、怎么裝、怎么用到實戰(zhàn)中會踩到的各種坑一次說清。1. 認識commandlinetoolsAndroid SDK的“最小啟動器”1.1 為什么現(xiàn)在的SDK要從命令行工具開始裝早期Android SDK是一個體積龐大的離線包下載下來解壓即用。后來Google改變了分發(fā)策略不再提供完整SDK的獨立壓縮包而是只給一個很小的“安裝器”——也就是commandlinetools。它本身不包含任何平臺版本、構(gòu)建工具只包含sdkmanager、avdmanager等幾個核心命令真正的SDK組件全靠這些命令去下載。這個設(shè)計很像Linux系統(tǒng)的包管理器先裝apt再用apt裝別的。commandlinetools就是Android世界的“包管理器外殼”而platform-tools、platforms;android-34、build-tools;34.0.0這些才是實際干活的東西。所以你在命令行環(huán)境里安裝SDK第一步永遠是拿這個zip第二步永遠是跑sdkmanager。1.2 zip包內(nèi)部有什么每個目錄都是干什么的拿到手先別急著解壓看一下目錄結(jié)構(gòu)會更清楚。解壓后你會得到一個cmdline-tools文件夾里面主要是bin和lib兩個目錄。bin目錄里放著三個關(guān)鍵腳本sdkmanager.bat用于管理SDK組件的安裝和卸載avdmanager.bat用于創(chuàng)建和管理虛擬設(shè)備apkanalyzer.bat用于分析APK文件。Windows下是.bat批處理Linux/macOS下是對應(yīng)的無擴展名shell腳本功能完全一樣。lib目錄里是一堆jar包包括sdkmanager.jar、avdmanager.jar等。這些腳本本質(zhì)上是“殼”真正邏輯都在jar里外層用Java啟動它們。所以你會發(fā)現(xiàn)一個硬性前提系統(tǒng)必須先裝好JDK否則.bat雙擊后一閃而過窗口都來不及看清。這一點后文會詳細講。1.3 版本號11076708到底代表什么commandlinetools-win-11076708-latest.zip這串名字里win表示W(wǎng)indows平臺對應(yīng)還有l(wèi)inux和darwin版本11076708是構(gòu)建版本號latest表示這是當前最新穩(wěn)定渠道的包。版本號本身沒有直接的“API level”含義它對應(yīng)的是工具自身的迭代。比如這個版本對應(yīng)JDK 17是沒問題的也支持后續(xù)下載最新的platforms;android-34、build-tools;34.0.0。實際使用時沒必要糾結(jié)具體版本號認準“從官方渠道拿最新”就行。因為SDK工具版本太舊時可能不支持新發(fā)布的Android平臺這時sdkmanager --list能看到新組件但安裝時提示版本不匹配只要換最新款commandlinetools即可解決。2. 從零開始下載、解壓與目錄規(guī)劃2.1 下載前先想清楚的事下載地址是Android開發(fā)者官網(wǎng)的“命令行工具”頁面。頁面會列出Windows、Linux、macOS三套包千萬別下錯平臺。Windows下選commandlinetools-win-...Linux服務(wù)器選commandlinetools-linux-...macOS選commandlinetools-mac-...mac還有Apple Silicon的變體darwin-aarch64根據(jù)芯片選。下載時另一個容易忽略的點是版本一致性。如果你后面要跑的是老項目compileSdkVersion可能只有30或31那沒必要追最新下載一個對應(yīng)年代的commandlinetools版本反而更穩(wěn)。但正常情況下直接拿最新就好因為有--sdk_root參數(shù)可以隔離不同SDK版本多版本共存也不沖突。另外下載完建議先校驗一下文件完整性。Windows下可以用certutil -hashfile commandlinetools-win-11076708-latest.zip SHA256Linux下用sha256sum拿算出來的哈希值和官網(wǎng)給的對一下。這個問題我踩過一次由于網(wǎng)絡(luò)中斷下載的zip不完整解壓時一直提示文件損壞或CRC校驗失敗當時一度以為是電腦問題最后才發(fā)現(xiàn)是被“好心”的下載工具改壞了文件格式。2.2 解壓到哪、目錄怎么命名最常見的低級錯誤解壓這一步看著簡單實際很多人在這里翻車。Google在文檔里明確說了cmdline-tools目錄下面必須再套一層latest。也就是說最終的目錄結(jié)構(gòu)應(yīng)該是你的SDK目錄/ └─ cmdline-tools/ └─ latest/ ├─ bin/ ├─ lib/ ├─ NOTICE.txt └─ source.properties如果你直接解壓成cmdline-tools/bin這樣的結(jié)構(gòu)運行sdkmanager時會報錯因為它找不到自己的lib目錄和版本信息。網(wǎng)上很多人問“為什么sdkmanager雙擊閃退”“為什么提示找不到SDK”八成就是目錄結(jié)構(gòu)錯了。推薦的安裝路徑是放在一個獨立的目錄比如D:\Android\Sdk或~/Android/Sdk。為什么不建議放在C盤默認位置呢因為SDK組件全裝完有好幾個GBC盤空間緊張的同學(xué)很快會后悔。把commandlinetools解壓到SDK目錄下的cmdline-tools/latest后后續(xù)通過sdkmanager下載的所有組件都會默認裝到同一根目錄下方便統(tǒng)一管理。如果非要用不叫l(wèi)atest的文件夾名理論上也能通過--sdk_root參數(shù)指定但那就把自己繞進復(fù)雜度里了老老實實用latest是最省心的做法。2.3 配置環(huán)境變量讓命令隨手可用解壓完成后需要把cmdline-tools\latest\bin加入PATH這樣在任何目錄下敲sdkmanager都能識別。Windows下的方法是設(shè)置里搜索“編輯系統(tǒng)環(huán)境變量” → 環(huán)境變量 → 在Path中新建一行填入你的cmdline-tools\latest\bin路徑。Linux下則寫入~/.bashrc或~/.zshrcexport ANDROID_HOME$HOME/Android/Sdk export PATH$PATH:$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools建議順手把ANDROID_HOME也配了。雖然sdkmanager本身不強制讀這個變量但后面的Gradle、Flutter、React Native等工具都會讀它。特別是做Flutter開發(fā)時flutter doctor會檢查ANDROID_HOME是否存在沒配好它就只能報錯提示找不到Android SDK。配置完成后別急著高興先敲一句sdkmanager --version驗證一下。如果提示“不是內(nèi)部或外部命令”說明PATH沒配上或當前終端沒重新加載Linux下記得先source ~/.bashrc。如果提示找不到Java那就是JDK這一步還沒解決看后面的排查部分。3. 核心實操sdkmanager的安裝與常用命令3.1 先確認JDK這個工具的全部前提sdkmanager是用Java寫的所以第一步是確認系統(tǒng)里有可用的JDK。這個工具對JDK版本有硬性要求——較新版本如11076708這個時期要求JDK 17及以上。裝個OpenJDK 17或Oracle JDK 17都很常見從Eclipse Adoptium或各發(fā)行版軟件源都能拿到安裝后配好JAVA_HOME環(huán)境變量就行。驗證JDK是否就緒打開終端敲java -version能看到版本號比如openjdk version 17.0.8就是正常的。注意Windows下如果裝了多個Java版本最好在環(huán)境變量里把JAVA_HOME指清楚否則java命令可能被其他軟件帶的JRE搶占導(dǎo)致sdkmanager啟動時出現(xiàn)奇妙的問題。有個常見誤導(dǎo)是“運行sdkmanager一定要把JAVA_HOME配好”實際只要java命令在PATH中可用就能跑。但很多工具鏈比如Gradle、Android Studio都在讀JAVA_HOME所以還是建議一步到位把JAVA_HOME配好省得以后再來補。3.2 列出可安裝組件選對platform和build-tools安裝任何東西之前建議先看看有哪些組件可以裝。運行sdkmanager --list輸出內(nèi)容很多會分兩個區(qū)域Installed packages和Available Packages。Available Packages里比較重要的幾類platforms;android-XX對應(yīng)Android API Level的開發(fā)平臺。比如platforms;android-34就是Android 14的SDK平臺。build-tools;XX.X.X編譯、打包APK所需的工具鏈。比如build-tools;34.0.0。platform-tools包含adb、fastboot這些連接真機和平板的關(guān)鍵工具。ndk;XX.X.X做C/C原生開發(fā)時的Native Development Kit。cmake;X.X.XNDK開發(fā)中用于構(gòu)建原生代碼的構(gòu)建系統(tǒng)。system-images;android-XX;...創(chuàng)建模擬器時需要的系統(tǒng)鏡像。對于常規(guī)Android開發(fā)最基礎(chǔ)的是sdkmanager platform-tools platforms;android-34其中platforms;android-34可以換成項目里compileSdkVersion對應(yīng)的值。如果你的項目compileSdkVersion是33裝platforms;android-33就夠過度裝高版本也不會帶來額外收益。3.3 實際安裝命令的細節(jié)與提示安裝是一件“看似簡單坑卻不少”的事。直接運行sdkmanager platform-tools platforms;android-34 build-tools;34.0.0它會先顯示一些許可協(xié)議要求你輸入y確認。這里有個升級版的需求——如果你在腳本或CI里自動安裝不可能每次都人工去輸y所以官方提供了這樣的寫法yes | sdkmanager --licenses這個命令會一次性接受所有許可協(xié)議。建議在任何新機器上裝完SDK后先執(zhí)行一次這條命令能省掉后面無數(shù)次的“y/N”交互。安裝過程中你會發(fā)現(xiàn)它并不顯示下載進度條只有一些類似[]的簡單進度信息不要以為卡住了。國內(nèi)網(wǎng)絡(luò)環(huán)境下某些組件下載速度可能會很慢甚至超時這時候可以考慮設(shè)置鏡像源后文會單獨說。裝完之后再執(zhí)行sdkmanager --list_installed看到剛才安裝的包出現(xiàn)在列表里就說明成功了。此時platform-tools目錄下應(yīng)該有adb.exeWindows或adbLinux/macOS。adb version能跑出版本號證明整個環(huán)境已經(jīng)可用。3.4 接受許可協(xié)議一條命令解決所有y/N交互可能有人會問“為什么Google要搞這么多次許可協(xié)議確認”因為Android SDK的各個組件分別受不同開源協(xié)議約束比如NDK有LGPL系統(tǒng)鏡像有Google的Terms and Conditions所以首次安裝必須逐一確認。在交互終端里一個一個y還能接受但在無人值守的安裝腳本里就成了災(zāi)難。yes | sdkmanager --licenses這個組合是社區(qū)的標準做法yes命令會不斷輸出y并管道傳給sdkmanager相當于自動把所有的“Do you accept the license?”都回答了。實測下來這一步執(zhí)行完后面任何常規(guī)安裝都不再出現(xiàn)許可確認體驗順暢得多。有一個細節(jié)值得注意yes會持續(xù)輸出直到目標進程退出。如果sdkmanager已經(jīng)接受完所有許可管道的另一端結(jié)束了yes自然會被中斷不會無限刷屏。這個命令在Windows的CMD下也能用只是如果你用的是PowerShellyes命令不被原生支持需要裝GNU工具或改用cmd /c echo y | sdkmanager --licenses。4. 進階用法命令行SDK的實戰(zhàn)場景4.1 搭建“無Android Studio”的編譯環(huán)境有了sdkmanager就算電腦上完全沒裝Android Studio也能構(gòu)建出一個能編譯APK的開發(fā)環(huán)境。這在很多場景很有用CI服務(wù)器、Docker鏡像、內(nèi)存有限的云開發(fā)機等?;静襟E是以Android目錄為根用sdkmanager裝齊platform-tools、platforms;android-XX、build-tools;XX.X.X再用Gradle拉取項目依賴并執(zhí)行g(shù)radlew assembleDebugGradle會通過ANDROID_HOME自動定位SDK并完成編譯。整個過程不需要打開任何IDE。但需要注意Gradle本身需要下載第一次構(gòu)建時它還要下載對應(yīng)版本的全部分發(fā)包所以這類環(huán)境務(wù)必保證網(wǎng)絡(luò)穩(wěn)定。如果你在CI上構(gòu)建建議把Gradle和Android依賴的緩存目錄設(shè)為持久化卷否則每次構(gòu)建都全量下載慢到你懷疑人生。4.2 avdmanager創(chuàng)建模擬器命令行也能開虛擬機sdkmanager裝好以后旁邊還坐著一個avdmanager它是創(chuàng)建Android虛擬設(shè)備AVD的命令行工具。平時大家都用Android Studio的可視化界面創(chuàng)建模擬器但其實命令行也能搞定而且更適合腳本化配置。先裝一個系統(tǒng)鏡像sdkmanager system-images;android-33;google_apis;x86_64然后創(chuàng)建AVDavdmanager create avd -n test_device -k system-images;android-33;google_apis;x86_64 -d pixel_5-n是給設(shè)備起名-k指定系統(tǒng)鏡像包-d指定設(shè)備定義可以在avdmanager list device里查看所有可選設(shè)備。創(chuàng)建完成后可以直接用emulator -avd test_device啟動模擬器。這條路徑特別適合對模擬器做批量測試的團隊把AVD創(chuàng)建、SDK安裝全部寫進腳本新入職同事一條命令就能拉起完整的本地Android環(huán)境。省去打開Android Studio、點半天圖形界面的功夫。4.3 用命令行工具直接做APK分析apkanalyzer是commandlinetools包里的另一個實用工具。它能在不安裝IDE的情況下對APK做深度分析。查看APK的基本信息apkanalyzer manifest print app.apk這條命令會輸出APK的AndroidManifest.xml可讀內(nèi)容如包名、版本、權(quán)限、組件聲明等。要查看APK的下載大小和APK的原始文件大小對比apkanalyzer apk download-size app.apk apkanalyzer apk file-size app.apk以前要分析APK都得去下載Android Studio或者用第三方工具?,F(xiàn)在命令行直接搞定寫個腳本批量分析應(yīng)用市場的APK也不在話下。安全檢查場景下可以用它看APK申請了哪些敏感權(quán)限不需要反編譯工具。4.4 把sdkmanager接入自動化腳本如果你維護著多臺開發(fā)機或CI節(jié)點建議把所有安裝步驟寫成腳本而不是每臺機器都手動操作一遍。Windows下可以寫個批處理echo off set ANDROID_HOMED:\Android\Sdk mkdir %ANDROID_HOME%\cmdline-tools tar -xf commandlinetools-win-11076708-latest.zip -C %ANDROID_HOME%\cmdline-tools move %ANDROID_HOME%\cmdline-tools\cmdline-tools %ANDROID_HOME%\cmdline-tools\latest yes | sdkmanager --licenses sdkmanager platform-tools platforms;android-34 build-tools;34.0.0Linux下同理可以用一行行的bash命令組合。核心思路就三步解壓到正確目錄 → 接受許可 → 安裝組件。多臺機器全部Copy-Paste運行環(huán)境保證一致不會出現(xiàn)“我本地好好的你那怎么不行”的尷尬。一個小提示如果團隊有統(tǒng)一的Gradle項目還可以借助Gradle的android-sdk-manager插件自動安裝SDK但那是另一個話題。純命令行腳本的方式最透明、最好排查問題。5. 常見問題與排查技巧實錄5.1 “找不到Java”或“UnsupportedClassVersionError”這是新手最容易撞的墻。癥狀是運行sdkmanager時提示java: command not found或者更高級一點Error: A JNI error has occurred, please check your installation and try again。原因基本是JDK沒裝或裝了但沒進PATH或版本太舊。新版commandlinetools要求JDK 17如果系統(tǒng)里是JDK 8或11啟動時就會拋出UnsupportedClassVersionError。解決辦法安裝JDK 17及以上確保JAVA_HOME和PATH配置正確然后注銷重登或刷新終端再試。Windows下還有一個隱性問題如果安裝過Oracle自帶JRE它可能把java.exe放到C:\Windows\System32里導(dǎo)致PATH優(yōu)先級被干擾。排查方法是在命令行里敲where java看它實際解析到哪個目錄就能定位到底是哪個Java在被調(diào)用。5.2 目錄結(jié)構(gòu)不對導(dǎo)致的“SDK not found”類報錯就像前文說的cmdline-tools目錄下必須有l(wèi)atest子目錄。如果解壓時少了這一層運行sdkmanager --list_installed可能不會立刻報錯但后續(xù)Gradle、本地的flutter doctor可能會提示找不到SDK。因為Gradle查找SDK時會找$ANDROID_HOME/platforms、$ANDROID_HOME/build-tools這些目錄。如果ANDROID_HOME指到了D:\Android\Sdk但SDK組件實際被安裝到了其他層級目錄錯亂就會導(dǎo)致Gradle的SDK定位失敗。我的建議是把目錄結(jié)構(gòu)嚴格做成D:\Android\Sdk ├─ cmdline-tools │ └─ latest ├─ platform-tools ├─ platforms ├─ build-tools └─ ndk這樣所有工具默認自動歸位Gradle、Flutter、React Native都能正確識別。不要去自定義“個人風(fēng)格”的目錄命名代價是各種工具找不到路徑。5.3 網(wǎng)絡(luò)下載慢或超時換鏡像源的方案國內(nèi)連接官方源下載SDK組件經(jīng)常出現(xiàn)幾十KB/s的龜速甚至直接超時。這里不建議用什么第三方商業(yè)加速工具也不建議折騰額外網(wǎng)絡(luò)設(shè)備最穩(wěn)妥的方案是使用國內(nèi)開源鏡像站。比如阿里云鏡像、騰訊云鏡像都提供Android SDK的鏡像地址。用sdkmanager時可以通過--channel和倉庫地址調(diào)整嗎其實sdkmanager一直沒有提供直接改源的官方參數(shù)但可以通過設(shè)置REPO_OS_OVERRIDE或修改repositories.cfg來影響。更簡單的方法是在Gradle的init.gradle或項目的build.gradle里配置阿里云鏡像倉庫來拉取依賴SDK組件本身可以通過下載鏡像站打包好的SDK文件來實現(xiàn)。更實際的操作是從鏡像站直接下載完整SDK壓縮包比如平臺、build-tools解壓到對應(yīng)目錄然后用sdkmanager補裝缺失的組件。這樣既繞過了最慢的部分又保留了sdkmanager后續(xù)自動安裝能力。另外分享一個經(jīng)驗避免在高峰時段執(zhí)行大批量安裝。清晨或午夜的下載成功率明顯高很多這也是不少CI團隊把環(huán)境預(yù)置放在深夜定時任務(wù)的原因。如果實在是公司網(wǎng)絡(luò)限制可以下載用離線包放入本地緩存Gradle或sdkmanager會自動發(fā)現(xiàn)緩存不再重復(fù)下載。5.4 提示“Warning: File ... could not be copied”或權(quán)限問題Windows下如果SDK目錄安裝在C:\Program Files這類系統(tǒng)保護目錄普通用戶執(zhí)行sdkmanager安裝組件時經(jīng)常出現(xiàn)權(quán)限不足導(dǎo)致文件無法寫入。典型的報錯長這樣Warning: File C:\Program Files\Android\... could not be copied.解決辦法有兩個方向一是用管理員權(quán)限運行終端再執(zhí)行sdkmanager二是把SDK目錄改到用戶目錄下比如C:\Users\你的用戶名\Android\Sdk或D:\Android\Sdk。我更推薦后者因為以管理員身份運行容易把目錄里的文件權(quán)限搞亂后續(xù)非管理員工具的讀寫會受影響。Linux下類似別把SDK放到/usr或/opt下然后糾結(jié)權(quán)限直接放~/Android/Sdk設(shè)置ANDROID_HOME后完全無障礙。既然是開發(fā)工具使用者就該有完整的讀寫控制權(quán)這是最舒服的狀態(tài)。5.5 和Android Studio的SDK目錄沖突問題很多人的電腦上既有Android Studio又在折騰命令行SDK。這時要確認你希望ANDROID_HOME指向哪邊。如果Android Studio已經(jīng)自動裝了一套SDK理論上可以共用同一套沒必要再裝第二份。Android Studio的SDK Manager里顯示的“Android SDK Location”就是ANDROID_HOME應(yīng)該指的位置。如果你決定用命令行管理新SDK可以不改動Android Studio自身配置只把ANDROID_HOME環(huán)境變量指向新SDK目錄。這樣的話Android Studio里通過圖形界面安裝的組件和新命令行裝的狀態(tài)是隔離的。但如果你某個項目打開時用的是Android Studio內(nèi)置SDK另一些腳本用命令行SDK很容易出現(xiàn)“版本不一致”的怪問題。我的習(xí)慣是統(tǒng)一非特殊需求ANDROID_HOME只指一個SDK根目錄cmdline-tools和Android Studio共用。這樣兩邊裝的東西都落在同一目錄樹基本不會出幺蛾子。6. 實用總結(jié)與我的個人經(jīng)驗把commandlinetools-win-11076708-latest.zip從“一個看不懂的壓縮包”變成“順手好用的SDK管理工具”其實本質(zhì)就三步解壓到cmdline-tools/latest配置好JDK和PATH用sdkmanager裝組件。整個過程不復(fù)雜但每一步都有細節(jié)目錄結(jié)構(gòu)、許可協(xié)議、網(wǎng)絡(luò)源都是最常見的絆腳石。我個人的體會是不要嫌命令行麻煩。就算你平時都用Android Studio學(xué)會sdkmanager也會讓你在排查環(huán)境問題、寫自動化任務(wù)時快人一步。比如同事報“SDK缺了build-tools 30.0.3”你一行sdkmanager build-tools;30.0.3就解決了不用讓他打開IDE點點點。最后分享一個我一直在用的小技巧新機器完成SDK安裝后立刻執(zhí)行一次yes | sdkmanager --licenses然后全量安裝你項目常用到的所有platform和build-tools版本。因為等你真的要用某個舊版本時再臨時裝一方面慢另一方面容易因為網(wǎng)絡(luò)問題卡在一半。提前把許可交了、常用組件裝了后續(xù)所有構(gòu)建都能直接從本地讀取那種順手的感覺試一次就知道。本文還有配套的精品資源點擊獲取