ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Linux 下部署 Android 命令行工具:sdkmanager 与 avdmanager 实战

Linux 下部署 Android 命令行工具:sdkmanager 与 avdmanager 实战 简介面向Linux平台的Android命令行工具包commandlinetools-linux-13114758-latest.zip解决的是不安装完整Android Studio情况下的SDK管理需求。它支持通过命令行完成组件下载、更新与部署特别适合服务器环境、自动化构建和持续集成流程也能满足习惯键盘操作的中高级开发者。压缩包共108个文件其中95个jar文件为工具运行提供核心类库另含sdkmanager、avdmanager、apkanalyzer、lint、d8、r8等命令可分别完成SDK包管理、虚拟设备创建、APK深度解析、静态代码检查、字节码转换与代码压缩混淆整体约157MB包内cmdline-tools目录结构清晰解压后配置环境变量即可使用。这些命令覆盖了从SDK配置、项目构建到应用发布前的检查与优化等主要环节常被用来替代图形化界面完成批量操作。借助其中的sdkmanager可灵活针对项目的实际需要拉取平台组件、NDK、模拟器等常见组件打造轻量且定制化的安卓构建环境将相关命令写入脚本后还能自动完成依赖安装、版本切换与增量更新与Android Studio相比占用更少内存便于在低配机器或容器中运行同时提升团队协作中环境的可复现性。目前已有282人学习下载适合需要以高效、可配置方式管理安卓SDK的Linux开发者实践者。1. 为什么还要单独装一份命令行工具很多开发者的第一反应是不是装了 Android Studio 就有 SDK 了吗确实Android Studio 的 SDK Manager 界面里能勾选平台、构建工具但那是图形界面背后的托管逻辑。当你在一台没有显示器的构建机上配 CI 环境或是想把 SDK 安装写进 Dockerfilecommandlinetools 才是正路。它把 sdkmanager、avdmanager 这些原本嵌在 Studio 里的工具抽出来单独分发让 Linux 服务器可以不走 IDE 直接操作 SDK。下面按「解压配置 → sdkmanager 装包 → avdmanager 建模拟器」的顺序走完整条链路最后给一段可直接复制的安装脚本。2. 解压 commandlinetools第一个坑是 latest 那一层目录2.1 先确认 Java 环境sdkmanager、avdmanager 都是 Java 程序官方对 JDK 版本的最低要求一直在往上抬。我的经验是直接上 JDK 17Android Gradle Plugin 8.x 也要 17桌面端和命令行端统一起来省得折腾。先去终端确认一下java -version echo $JAVA_HOMEjava -version没输出说明 JDK 还没装Debian/Ubuntu 下执行sudo apt install openjdk-17-jdk-headlessCentOS/RHEL 是sudo yum install java-17-openjdk-devel。这里有个和安装 Python 时类似的习惯问题java命令能用不代表环境配好了JAVA_HOME没设置后续 avdmanager 常常会报找不到工具链的错误。把下面两行追加到~/.bashrcexport JAVA_HOME/usr/lib/jvm/java-17-openjdk-amd64 export PATH$JAVA_HOME/bin:$PATH路径按实际安装位置改可以用update-alternatives --list java查到真实路径。配好之后重新登录终端再跑一次java -version确认输出的是装的那个版本再继续。2.2 解压出来的目录名暗藏玄机官方下载页的 Command line tools only 区块里Linux 对应commandlinetools-linux-13114758_latest.zip这样的文件。注意文件名中间是下划线13114758 是这条发布线的 build 号下一次更新时数字会变大文件名模式不变。下载后先解压mkdir -p ~/android-sdk cd ~/android-sdk unzip ~/下载/commandlinetools-linux-13114758_latest.zip lsunzip是 Linux 常用命令里处理 zip 的标准工具环境里没有就先sudo apt install unzip。这一步大部分人没问题接下来是最容易栽的坑zip 解压出来一个叫cmdline-tools的目录里面直接是bin/和lib/。但 sdkmanager 对安装位置有硬性要求它默认到cmdline-tools/latest/bin找自己所以必须手动多套一层mv cmdline-tools cmdline-tools.bak mkdir -p cmdline-tools mv cmdline-tools.bak cmdline-tools/latest完成后的目录结构是~/android-sdk/cmdline-tools/latest/bin/sdkmanager。补齐latest之后把 bin 加进 PATHexport ANDROID_HOME$HOME/android-sdk export PATH$ANDROID_HOME/cmdline-tools/latest/bin:$PATH sdkmanager --versionANDROID_HOME是新工具链推荐的变量名Gradle 和 Flutter 都认它旧项目里偶尔还会看到ANDROID_SDK_ROOT两者指向同一个路径时不会冲突。能输出版本号说明工具已经跑起来了。构建机上一般把$ANDROID_HOME/platform-tools也加进 PATH这样adbAndroid Debug Bridge可以在流水线里直接调用。至于 Linux 下解压 zip 常见的文件名乱码这个包所有文件都是 ASCII不受影响乱码通常发生在解压带中文文件名的归档时。提示如果目录里已经有一个 cmdline-tools先rm -rf ~/android-sdk/cmdline-tools再执行移动避免嵌套出cmdline-tools/latest/cmdline-tools这种修不干净的路径。3. sdkmanager命令行安装 SDK 组件3.1 用 --list 看可装的东西sdkmanager 的角色相当于 Android SDK 的包管理器它管的不是 apt/yum 那套而是 Google 发布的 SDK 组件。第一次用先看仓库里有什么sdkmanager --list输出很长上半部分是 Available Packages下半部分是 Installed packages。可用包的名字长成这样platforms;android-34、build-tools;34.0.0、platform-tools、emulator、system-images;android-34;google_apis;x86_64。分号是包标识的分隔符不是写错了。包标识内容什么时候需要platforms;android-34某个 API 版本的平台 jar用 compileSdk 构建build-tools;34.0.0aapt2、zipalign、apksignerGradle 构建必需platform-toolsadb、fastboot连设备/模拟器调试cmdline-tools;latest命令行工具自身更新工具链system-images;android-34;google_apis;x86_64模拟器系统镜像跑 AVDemulatorAndroid 模拟器跑 AVD规律是分号之间依次是组件类型、API 版本、变体。google_apis表示带谷歌 API 的镜像实际跑 App 用这个x86_64是 CPU 架构Intel/AMD 宿主机选它ARM 机器要换arm64-v8a。这个命名规则记清楚后面装什么包都不迷路。3.2 安装与卸载的包标识写法安装只需一个命令把包标识全名作为参数传进去sdkmanager platforms;android-34 build-tools;34.0.0 platform-tools一次传多个包sdkmanager 会逐个下载。引号不是必须的但分号在部分 shell 里可能有特殊解释养成加引号的习惯不会错。sdkmanager 不在 PATH 里时可以指定完整路径跑$ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager platform-toolsSDK 装在非默认位置时用--sdk_root指定根目录多用户共享一台构建机、统一用/opt/android-sdk的场景比较常见sdkmanager --sdk_root/opt/android-sdk platform-tools卸载是对称的--uninstall权限要求和安装时一致装在/opt下就用 sudo装在用户目录下不需要。装完验证sdkmanager --list_installed ls $ANDROID_HOME/platforms--list_installed只显示本地已装包比翻长输出快得多ls 看目录能确认 platforms 的结构是否符合预期。升级工具链本身用sdkmanager --update构建机上的日常维护基本就这几条命令。3.3 license 处理第一次安装时sdkmanager 会逐个询问是否接受组件对应的 license 协议。手动输入y回车可以但流水线里会卡住常见做法是管道yes | sdkmanager --licenses--licenses会把所有未接受的协议一次性列出来管道喂yes等效于全部接受。只想接受某个组件的协议就运行后再逐条处理适合开发机上单装包的场景。接受过的 license 记录在 SDK 根目录的licenses/文件夹里部署新机器时把整个 SDK 目录拷贝过去时带上这份授权能省掉 CI 里的重复交互。4. avdmanager命令行创建 Android 虚拟设备4.1 先确认 system-images 就位emulator 负责跑模拟器avdmanager 负责创建 AVD 配置文件两者是两回事。创建之前先用 sdkmanager 装好模拟器本体和一个系统镜像以 API 34、x86_64 为例sdkmanager emulator system-images;android-34;google_apis;x86_64这一步下载量大system-images 通常超过 1GB耐心等。镜像 tag 写google_apis不带谷歌 API 的原生镜像改成default只做 UI 自动化测试的话aosp_atdAutomated Test Device是更小的选择。检验装没装对sdkmanager --list_installed | grep system-images过滤后应看到完整的镜像包标识。这一层容易犯的错是只装platforms;android-34忘记镜像创建时会报找不到 system image跟环境变量没关系。4.2 create avd 的参数与常见坑创建 AVD 用 avdmanager子命令列表看avdmanager -h。先列出可用的设备定义avdmanager list device输出每一段是一个设备定义id字段是给创建命令用的比如 pixel_6、pixel_7。然后创建avdmanager create avd \ --name ci_pixel \ --package system-images;android-34;google_apis;x86_64 \ --device pixel_6--name是 AVD 显示名--package必须与已下载镜像的包标识完全一致--device对应 list 里的 id。创建时它会问是否创建自定义硬件 profile输入no回车即可后续要改硬件参数编辑~/.android/avd/ci_pixel.avd/config.ini里的hw.*配置。用户目录下还有~/.android/avd/ci_pixel.ini这个文件写死了 AVD 配置路径删除 AVD 要用avdmanager delete avd --name ci_pixel不要手动删配置目录。创建后验证avdmanager list avd能列出名字和镜像路径就成功了。如果 avdmanager 报 Java 相关错误回第二章检查JAVA_HOME这是最典型的故障点。4.3 无头环境启动模拟器开发机上直接emulator -avd ci_pixel会弹出模拟器窗口。CI 或远程服务器没显示器加无头参数$ANDROID_HOME/emulator/emulator \ -avd ci_pixel \ -no-window \ -no-audio \ -gpu swiftshader_indirect \ -no-boot-anim-no-window不创建窗口-no-audio禁用音频-gpu swiftshader_indirect用软件渲染替代显卡加速-no-boot-anim去掉开机动画。启动是异步的用 adb 等系统就绪adb wait-for-device adb shell while [ $(getprop sys.boot_completed) ! 1 ]; do sleep 1; done第一行等 adb 识别设备第二行进 Android 层等开机完成。sys.boot_completed变成 1 说明系统 UI 已就绪instrumented test 或 UI 自动化这时候跑才有意义。用完记得adb emu kill关闭模拟器会在后台占着 CPU。5. 收尾技巧整套 SDK 用一段脚本装完手动敲完前面几段你会发现这套流程高度可重复正好固化成脚本。构建机上最省事的做法是把解压、装配、授权全部收进一个 bash 脚本参数化 SDK 根目录和 API 版本新机器直接跑一遍#!/usr/bin/env bash set -euo pipefail SDK_ROOT${1:-$HOME/android-sdk} API_LEVEL${2:-34} if ! command -v java /dev/null; then echo JDK not found exit 1 fi mkdir -p $SDK_ROOT unzip -q commandlinetools-linux-*_latest.zip -d $SDK_ROOT mv $SDK_ROOT/cmdline-tools $SDK_ROOT/cmdline-tools-tmp mkdir -p $SDK_ROOT/cmdline-tools mv $SDK_ROOT/cmdline-tools-tmp $SDK_ROOT/cmdline-tools/latest export PATH$SDK_ROOT/cmdline-tools/latest/bin:$PATH yes | sdkmanager --licenses /dev/null sdkmanager platform-tools build-tools;$API_LEVEL.0.0 platforms;android-$API_LEVEL脚本接收两个参数SDK 安装根目录和 API 版本不传则用默认值。set -euo pipefail让任何一步出错都中止CI 上比逐条硬跑更稳。yes | sdkmanager --licenses /dev/null把 license 交互和输出都吞掉。目录移动先改名再建 latest避免 mv 目标冲突脚本重复执行时cmdline-tools/latest已存在会让 mv 失败正好由set -e兜住也提醒你别重复跑同一台机器。这段脚本存成install-sdk.sh在干净镜像上从 unzip 装起、跑一遍、再跑gradle assembleDebug就是一条可复现的验证链路。最后一层验证建议装完不要只看 sdkmanager 有没有输出真正有说服力的是端到端构建。项目根目录写local.properties指定sdk.dir$ANDROID_HOME然后./gradlew assembleDebug能产出 APK 才算这套命令行工具真正落地。如果报 SDK 位置错误优先检查ANDROID_HOME是否指向cmdline-tools的上级目录而不是latest目录这个路径层级问题是整套工具链里出现频率最高的坑。本文还有配套的精品资源点击获取
返回列表