
简介Android Studio Bumblebee2021.1.1 Patch 2是面向Linux平台的Android集成开发环境完整发行包适用于需要在Linux桌面下进行Android应用开发、调试与构建的开发者。该版本对应Android Studio 4.4系列稳定版于2022年1月26日发布后续又推出Patch 1与Patch 2修复了已知问题并优化了构建与模拟器体验。压缩包约904.35MB内含2000个文件以py、jar、json、so、ttf等类型为主jar包构成IDE及Gradle工具链py脚本用于构建与辅助工具so为原生运行库json/txt为配置与说明文档整体结构完整可离线解压后配合SDK直接使用。已有346人学习/下载。通过此包可一次获得Android Studio Bumblebee Linux版完整程序包括布局编辑器、APK分析器、模拟器相关组件及调试工具链支持Kotlin、Java与NDK开发解压后无需从官网缓慢下载特别适合网络不便或需要固定版本环境的团队存档使用。1. Android Studio Bumblebee 的 Linux 离线包为什么我建议你重视 2021.1.1.22 这个版本在 Linux 桌面环境下准备搭一套 Android 构建环境手头拿到的是 android-studio-2021.1.1.22-linux 这个打包好的离线包。它是 Android Studio Bumblebee 在 Linux 上的完整 IDE 发行包解压以后就是一套能直接启动的工具链不需要像 Windows 版那样再跑一个额外的安装器。Bumblebee 这个版本号的位置很特殊它正好是 Android Studio 从旧版号切到 2021.x 新号制的早期正式版内置了 JDK 11和 AGP 7.0/7.1、Gradle 7.0.x 这一代构建链配合成熟。对 Linux 用户来说它能解决三件实际的事一次解压部署 IDE、用干净的环境变量管理 SDK、把 Gradle 构建和 APK 打包完整跑通。适合被新版 Android Studio 内存占用逼到想退回旧版的人也适合团队需要固定 IDE 版本统一联调环境的人。2. 安装前的四个决定JDK、解压目录、环境变量与桌面图标2.1 为什么 Bumblebee 内置了 JDK 11还要单独确认 JAVA_HOMEBumblebee 的安装包自带了一个 jbr 目录本质上是 OpenJDK 11 的定制版IDE 自身用它启动完全够包括跑 Gradle、启动模拟器、做布局渲染预览。但 studio.sh 这个启动脚本在找 Java 时是有优先级的它会先读 STUDIO_JDK 和 JAVA_HOME只有这两个变量都没设或者指向失效时才回落到安装包自带的 jbr。这也是很多人在 Linux 上把包解压好、双击图标没反应的原因——系统里装着 OpenJDK 8 或者 OpenJDK 17JAVA_HOME 恰好又指向它们Bumblebee 的 JVM 启动参数和 JDK 8 不兼容直接秒退。我在这台 Ubuntu 22.04 上的做法是不折腾系统 JDK直接让 IDE 用自带 jbr同时把 jbr 里的 java 暴露给 shell 用。先检查当前环境java -version echo $JAVA_HOME如果打印出来的版本不是 11或者 JAVA_HOME 是空的就先别急着启动 IDE把环境变量接到 jbr 上export JAVA_HOME/opt/android-studio/jbr export PATH$JAVA_HOME/bin:$PATH注意上面两条 export 只对当前终端生效想要永久写入就追加到 ~/.bashrc 后面再 source 一遍。对应关系很简单JAVA_HOME 管 Gradle daemon 和所有命令行 Java 工具PATH 管你在终端里能不能直接敲 java。人为把 JDK 切到 11 而不是用系统默认是因为 AGP 7.x 这一代构建链对 JDK 版本非常敏感JDK 8 直接跑不动JDK 17 在 Bumblebee 里偶尔会抛和 class 版本相关的警告统一到 11IDE、Gradle、AGP 在同一套运行时下排查问题时少一个变量。如果你刚装好还在配置阶段顺手说一个热频问题Bumblebee 没有官方中文界面想要中文菜单可以直接在 Settings Plugins 里搜 Chinese Language Pack这是 JetBrains 官方出的中文语言包装完重启就是中文菜单不需要改任何系统 locale。界面语言不影响构建链纯个人偏好。2.2 解压安装与启动studio.sh 的参数和启动方式拿到 android-studio-2021.1.1.22-linux.tar.gz 之后安装过程可以压缩成三条命令tar -xzf android-studio-2021.1.1.22-linux.tar.gz sudo mv android-studio /opt/android-studio sudo chown -R $USER:$USER /opt/android-studiotar 命令里 x 是解压、z 是解 gzip、f 指定文件。解压出来的是 android-studio 目录把它挪到 /opt 下是为了统一管理后续升级、卸载都只看这一个位置。chown 这步很容易被忽略但很关键不把目录归属改成当前用户的话IDE 写缓存、Gradle 临时文件都会报权限错误所以这里我习惯直接放开给登录用户。然后启动就是一句话/opt/android-studio/bin/studio.sh首次启动会弹一个 Complete Installation 窗口问是否导入旧版本配置。全新环境直接选 Do not import如果从别的机器拷贝过配置目录可以选路径导入。这里要说明白这个导入只影响 IDE 布局、快捷键和插件列表不影响 SDK 路径和 Gradle 缓存。直接关掉终端的话 IDE 也会跟着退出所以我一般建议顺手把桌面图标建出来mkdir -p ~/.local/share/applications cat ~/.local/share/applications/android-studio.desktop EOF [Desktop Entry] Version1.0 TypeApplication NameAndroid Studio Exec/opt/android-studio/bin/studio.sh Icon/opt/android-studio/bin/studio.png Terminalfalse CategoriesDevelopment;IDE; EOF这个 desktop 文件是 Linux 桌面快捷方式的标准格式Exec 指向启动脚本Icon 指向图标。Bumblebee 的图标一般在 bin/studio.png如果发行版改了路径用 find /opt/android-studio -name *.png 找一下实际位置再改就行。保存之后应用菜单里就能直接搜到 Android Studio点击即启动。2.3 环境变量ANDROID_HOME 和 PATH 的三种写法Android 开发环境变量里最核心的是 ANDROID_HOME它指向 SDK 根目录。Gradle 构建、adb、模拟器全靠它定位工具链。我建议同时把 ANDROID_SDK_ROOT 也设成同一个值因为部分命令行工具仍然读这个旧变量少设一个有时代码里会拿到空路径。三种写入位置各有适用场景~/.bashrc 对当前用户所有交互 shell 生效适合单机开发~/.profile 在登录时生效适合习惯重启后再开终端的场景/etc/profile.d/android.sh 对机器上所有用户生效适合团队共用一台编译机的场景。单人开发我一般写进 ~/.bashrcexport ANDROID_HOME$HOME/Android/Sdk export ANDROID_SDK_ROOT$ANDROID_HOME export PATH$PATH:$ANDROID_HOME/platform-tools:$ANDROID_HOME/emulator:$ANDROID_HOME/cmdline-tools/latest/bin source ~/.bashrc最后一行 source 是让配置立即生效不用重新登录。PATH 里追加的三个子目录要解释一下platform-tools 提供 adb 和 fastbootemulator 放着模拟器可执行文件cmdline-tools/latest/bin 里是 sdkmanager。这三个目录不是装好就有需要 SDK Manager 或者命令行工具安装对应组件后才会出现。写这个 PATH 的意义在于你之后在任何目录都能直接敲 adb、sdkmanager而不是每次拼一长串绝对路径。2.4 非 root 用户的目录权限与卸载回退再补两个容易被忽略的细节。第一是目录权限SDK 目录默认在 ~/Android/Sdk归属当前用户问题不大但 /opt/android-studio 如果没做 2.2 里的 chownIDE 升级或写日志时会频繁碰壁。第二是配置目录Bumblebee 的 IDE 配置在 ~/.config/Google/AndroidStudio2021.1.1里面保存了你的主题、快捷键、插件和最近项目列表。想回退到旧版本或者换台机器复现同一套环境直接打包这个目录走比重新配一遍快得多。这一点也回应了很多人问的历史版本下载诉求Android Studio 旧版本在官方下载页的历史列表里都能找到但回退不只是换个 tar 包那么简单。我的习惯是先备份配置目录和 ~/.gradle再卸新版rm -rf /opt/android-studio ~/.config/Google/AndroidStudio2021.1.1 ~/.local/share/applications/android-studio.desktop这三条分别清 IDE 程序、IDE 配置、桌面启动项。注意没动 ~/Android/Sdk 和 ~/.gradleSDK 和 Gradle 缓存是跨版本共用的删掉反而浪费下载时间。3. SDK 与 Gradle 联调把 SDK 路径、镜像仓库和构建参数一次配齐3.1 SDK Manager 图形界面与命令行 sdkmanager 的对应Bumblebee 的 SDK Manager 入口有两个欢迎页右上角的 Configure SDK Manager或者打开工程后 Tools SDK Manager。界面里分成 SDK Platforms、SDK Tools、SDK Update Sites 三个页签。Platforms 里勾选的是 Android 各版本的 platform 包Tools 里是 build-tools、NDK、CMake 这些构建组件。点 Apply 之后IDE 会调用 sdkmanager 去后台下载进度在底部状态栏能看见。但很多 Linux 场景是没有图形桌面的或者你想在 CI 机器上装同一套 SDK。这时候命令行 sdkmanager 更可控它和图形界面操作的是同一套组件 IDsdkmanager --list sdkmanager platforms;android-31 build-tools;31.0.0 yes | sdkmanager --licenses第一行列出所有可安装组件和已安装版本第二行按指定 ID 安装组件第三行通过管道把 yes 不断发给 licenses 命令一次性接受所有协议这是 CI 环境里最常用的写法。组件 ID 的规律是分号拼接platforms;android-31 表示 API 31 的 Android 平台build-tools;31.0.0 表示对应版本的构建工具。注意 sdkmanager 可执行文件的位置有两种可能新版 SDK 装在 cmdline-tools/latest/bin老 SDK 布局里在 tools/bin。我之前在这一步踩过找不到命令的坑解决办法是先 ls 确认实际路径再把它加进 PATH。组件 ID作用platforms;android-31API 31 的 android.jar编译目标build-tools;31.0.0提供 aapt2、apksigner、zipalignplatform-tools提供 adb、fastbootemulator模拟器主程序和系统镜像ndk;21.4.7075529NDKC/C 交叉编译组件版本的选择不是越新越好Bumblebee 是 2021 年的版本配套的 build-tools 用 31.0.0 或者 30.0.3 都顺盲目上 34.x 反而可能出现 IDE 内置检查器不认新输出的情况。NDK 只有在项目里写了 native 代码才需要纯 Java/Kotlin 工程装它纯属占用磁盘。3.2 Gradle Wrapper 下载慢distributionUrl 换镜像的完整改法几乎每个在 Linux 上新建项目的开发者都会遇到同一个卡点首次 Sync 时进度条停在 Downloading gradle-x.x.x-bin.zip十几分钟不动。原因是 Gradle Wrapper 默认从官方源拉分发包某些网络环境下连国际站点就是慢这不是 IDE 的问题。对应的修改位置是项目里的 gradle/wrapper/gradle-wrapper.propertiesdistributionUrlhttps\://services.gradle.org/distributions/gradle-7.0.2-bin.zip把域名换成阿里云镜像即可distributionUrlhttps\://mirrors.aliyun.com/gradle/gradle-7.0.2-bin.zip这里有个细节properties 文件里冒号要加反斜杠转义直接写 https:// 会被解析器截断。换完镜像后重新 Sync几十 MB 的分发包通常一两分钟就拉完。如果是临时救急不想改项目文件还有一个常见做法是手动把 Gradle 分发包放进 Wrapper 的缓存目录mkdir -p ~/.gradle/wrapper/dists/gradle-7.0.2-bin/hash unzip gradle-7.0.2-bin.zip -d ~/.gradle/wrapper/dists/gradle-7.0.2-bin/hash/注意 这个目录名是 Wrapper 根据 distributionUrl 计算出来的不是随便建的。最省事的办法是先照常跑一次 ./gradlew让它在失败后留下目录名再把下载好的 zip 解压进去随后重新 Sync 就会跳过下载直接使用。3.3 仓库与 JVM 参数gradle.properties 和 settings.gradle 的推荐配置Gradle 能正常拉下来只是第一步依赖仓库的网络问题紧随其后。Bumblebee 新项目默认用的是 google() 和 mavenCentral()但在 Linux 服务器上访问这两个仓库也可能很慢。我一般会在 settings.gradle 的 pluginManagement 里把国内镜像仓库插到前面Google 官方源作为兜底pluginManagement { repositories { maven { url https://maven.aliyun.com/repository/google } maven { url https://maven.aliyun.com/repository/gradle-plugin } maven { url https://maven.aliyun.com/repository/public } google() mavenCentral() } }Gradle 6 之后插件依赖必须声明在 pluginManagement 里写在前面意味着优先查找。阿里云这几个 repository 路径是对应 Google Maven、Gradle Plugin、中央仓库的镜像和官方源结构一致项目里的依赖坐标基本不用改。镜像在前、官方在后即使镜像缺某个构件也会自动回落到官方源不会因为一条仓库 URL 直接构建失败。依赖下载速度解决之后还建议把构建内存参数写进 gradle.propertiesorg.gradle.jvmargs-Xmx4096m -XX:MaxMetaspaceSize1024m org.gradle.daemontrue org.gradle.paralleltrue android.useAndroidXtrue android.enableJetifiertrue-Xmx 控制 Gradle daemon 最大堆内存4G 是我在大项目上的常用值MaxMetaspaceSize 管的是类元数据调大点能避免长时间构建后 OOM。daemontrue 让 Gradle 保持后台进程第二次构建明显更快paralleltrue 让多模块并行编译。最后两行和 AndroidX 相关Bumblebee 新建项目默认 useAndroidX 已经是 true但老项目迁移过来经常是 false依赖兼容包时会直接编译失败。3.4 AGP 版本对应Gradle 7.0、AGP 7.0 与 Bumblebee 的边界Bumblebee 里最容易搞混的是 SDK 版本、Gradle 版本和 AGP 版本三者之间的关系。SDK 版本是编译目标Gradle 是构建引擎AGP 是 Android 官方写的 Gradle 插件AGP 运行在 Gradle 之上两者有严格的版本匹配要求。以这块离线包里最常见的配套组合为例场景AGP 版本Gradle 版本说明Bumblebee 新建项目7.0.47.0.2我在这台机器上验证过的组合从 AS 4.x 迁移的老项目4.2.26.7.1先保证能编译再升级项目要上 Compose7.0.0 以上7.0.2 以上Compose 编译器插件绑定 AGP 7AGP 版本写在项目根目录的 build.gradle 里plugins { id com.android.application version 7.0.4 }Gradle 版本写在 gradle-wrapper.properties 里也就是 3.2 里改过的那一行。这两处必须配套否则会在 Sync 阶段直接报 Minimum supported Gradle version 错误。有一个边界问题值得点透AGP 7.0 要求最低 Gradle 7.0 和 JDK 11而 Bumblebee 内置的 jbr 正好是 JDK 11所以只要你不手动改坏 JAVA_HOME这条组合链是天然闭合的。如果项目里用了 ComposeAGP 7.0 是底线低于这个版本编译器插件不工作。这也是很多老项目升级到 Bumblebee 后第一波报错集中爆发的地方。4. 从旧项目迁移到 Bumblebee升级向导、AGP 变更与第一个打包4.1 AGP 升级向导做了什么哪些需要手动改Bumblebee 引入了一个很实用的功能叫 AGP Upgrade Assistant入口在 Tools 菜单下。它会扫描当前项目的 AGP 版本列出可以升级到的目标版本然后一键帮你改 build.gradle 和 gradle-wrapper.properties。这个改动是不可逆的所以我在团队里带人升级时有一个强制动作先备份整个工程目录再点升级。cp -r /path/to/project /path/to/project-bak-$(date %Y%m%d)date 命令拼出来的是当天日期这样备份目录不会重名。为什么要备份因为向导只改版本号不负责 SDK 同步。很多项目升级后 compileSdkVersion 从 30 跳到 31本地如果没装 platforms;android-31Sync 直接失败。这时候回退版本号重来不如装个 SDK 组件来得快但如果没有备份你又不能确认向导改了哪些文件排查范围会大很多。实际操作中我还发现向导不会处理项目里的自定义构建逻辑。比如老项目用 buildscript {} 方式声明插件依赖的升级后要手动改成 settings.gradle 里的 pluginManagement plugins {} 结构。这个手工迁移步骤不复杂但容易漏漏了之后的表现通常是 Sync 报错说找不到插件版本。4.2 打开旧项目时常报的 Gradle 版本错误从旧版 Android Studio 项目迁移到 Bumblebee第一个撞上的报错几乎是同一个。Sync 阶段弹出Minimum supported Gradle version is 7.0.2. Found version 6.5.0现象很清楚工程是从 Android Studio 4.x 时代拷过来的gradle-wrapper.properties 里还写着 Gradle 6.5而新工程用的 AGP 7.0.4 要求最低 Gradle 7.0.2。原因在于 AGP 7.x 使用了 Gradle 7 才有的新 API版本落后会直接在加载阶段被拒绝。解决方式不是单纯升级 AGP 或者单纯降 Gradle而是让两者同时走到 Bumblebee 默认的组合上。打开 wrapper 文件vim gradle/wrapper/gradle-wrapper.properties把 distributionUrl 改成 3.2 里那张镜像地址指向 gradle-7.0.2-bin.zip保存后重新 Sync。依赖下载完成后如果还有报错多半卡在第二个坑老项目里自定义 Gradle Task 用了 Transform API这个 API 在 AGP 7 里已经被移出公开接口字节码插桩类的插件基本都要重写。我的建议是迁移时先不开任何自定义插件等基础构建跑通了再加回来逐一定位。4.3 打包签名Generate Signed Bundle 与命令行 signingConfig 的关系打包是 Android Studio 使用率最高的功能之一。UI 路径是 Build Generate Signed Bundle / APK选 APK然后填 keystore 路径、别名和两个密码。这个操作本质上是往 build.gradle 里写一段 signingConfigs再由 Gradle 在组装 APK 时调用 apksigner 完成签名。我一般推荐直接用命令行方式因为密码能通过环境变量注入避免把密钥明文提交到 gitandroid { signingConfigs { release { storeFile file(release.jks) storePassword System.env.STORE_PASSWORD keyAlias release keyPassword System.env.KEY_PASSWORD } } buildTypes { release { signingConfig signingConfigs.release minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile(proguard-android-optimize.txt), proguard-rules.pro } } }storeFile 的路径相对 app 模块release.jks 放在 app 目录下最直观。storePassword 和 keyPassword 没有直接写字符串而是从系统环境变量里读这是 CI 打包时的标准做法。minifyEnabled 控制是否开启代码混淆shrinkResources 控制资源裁剪release 包上线前这两项都会打开。构建命令就一行STORE_PASSWORDxxx KEY_PASSWORDxxx ./gradlew :app:assembleRelease ls -lh app/build/outputs/apk/release/app-release.apk产物路径固定是 app/build/outputs/apk/release/。如果要上 Google Play 的 AAB 格式把任务名换成 :app:bundleRelease 就行。整个打包链路里aapt2、apksigner、zipalign 都来自 build-tools 目录如果 SDK 里没装对应版本报错会出现在半路而不是一开始所以 3.1 里装 build-tools;31.0.0 这一步别看轻了。5. Bumblebee on Linux 避坑排查五条高频翻车记录5.1 点击图标没反应启动日志里全是 libgtk 相关报错现象桌面图标双击后进程存在不到三秒就消失用终端跑 /opt/android-studio/bin/studio.sh日志里一片 libgtk-3.so.0 not found、libXrandr.so.2 not found。原因Linux 发行版缺少图形库依赖常见于精简版 Ubuntu 桌面或最小化安装的 CentOS。studio.sh 是 GUI 程序底层依赖 GTK 和 X11 的一系列库没装直接起不来。解决sudo apt-get install libgl1-mesa-dev libgtk-3-dev libxrandr-dev libxtst-dev libx11-devUbuntu/Debian 系装完这一组再启动就正常了。CentOS/RHEL 系对应命令是 yum install libgtk-3-devel libXrandr-devel libXtst-devel包名略有差异。这个坑最大的迷惑点是编辑器本身能启动但 IDE 图形界面起不来日志又藏在终端里所以排查时一定要在终端前台跑 studio.sh别只盯着桌面图标。5.2 Unrecognized VM option系统 JDK 和内置 jbr 打架现象启动时弹 Unrecognized VM option 或 Java HotSpot 相关报错偶尔日志里能看到 jdk1.8 字样。原因studio.sh 按优先级找到了系统 JAVA_HOME而指向的 JDK 不在 Bumblebee 支持范围内。JDK 8 的 JVM 不认识 Bumblebee 启动脚本里写的新参数直接拒绝执行。解决是为 Studio 单独指定它自己带的那套运行时export STUDIO_JDK/opt/android-studio/jbr /opt/android-studio/bin/studio.shSTUDIO_JDK 这个变量专为 Studio 设计优先级高于 JAVA_HOME且只影响 IDE不影响终端里的 java 命令。这条和 2.1 的联动关系是如果 JAVA_HOME 是对的就没必要设 STUDIO_JDK一旦出现 VM option 报错先重启终端确认 JAVA_HOME再考虑强制指定 jbr。5.3 Gradle 一直卡在 Downloading现象首次 Sync 卡在 Downloading gradle-7.0.2-bin.zip进度条长时间不动或者报连接超时。原因gradle-wrapper.properties 里的 distributionUrl 指向官方源网络链路慢是常态超过十分钟基本就是网络问题不需要继续等。解决分两步先改镜像distributionUrlhttps\://mirrors.aliyun.com/gradle/gradle-7.0.2-bin.zip如果项目是别人发的固定包不想改文件就用手动放包的方式兜底。先跑一次 ./gradlew 让它生成缓存目录再到 ~/.gradle/wrapper/dists/gradle-7.0.2-bin/ 里替换文件unzip gradle-7.0.2-bin.zip -d ~/.gradle/wrapper/dists/gradle-7.0.2-bin/hash/这个 hash 目录就是 wrapper 按 URL 计算出来的复制报错日志里已有的目录名最可靠。替换后重启 SyncGradle 会跳过下载直接解压使用。5.4 SDK location not found环境变量和 local.properties 的优先级现象命令行跑 ./gradlew 时报 SDK location not found但 IDE 里 Sync 和编译都正常。原因IDE 在打开项目时把 SDK 路径写进了项目根目录的 local.properties这个文件默认不进 git换机器或者新克隆代码后文件缺失命令行构建找不到 SDK。解决是在项目根目录手动创建sdk.dir/home/yourname/Android/Sdk这里优先级要记牢local.properties 里的 sdk.dir 高于系统环境变量 ANDROID_HOME。Gradle 在初始化阶段优先读 local.properties读到了就不再感知环境变量。所以出现 IDE 正常、命令行失效时第一反应去看 local.properties 存在不存在而不是去改 .bashrc。这个文件也不要提交进仓库里面是机器相关的绝对路径提交了反而影响其他协作者。5.5 构建内存不足Java heap space 与 Gradle daemon现象大项目编译到后半程报 java.lang.OutOfMemoryError或者 Gradle daemon 进程直接被系统杀掉。原因gradle.properties 里默认的 -Xmx 对于多模块工程不够用Bumblebee 默认值 2G 在大型 App 上容易被顶穿。解决是调大堆内存并把 daemon 参数打开org.gradle.jvmargs-Xmx4096m -XX:MaxMetaspaceSize1024m org.gradle.daemontrue改完先停掉旧 daemon 再构建./gradlew --stop这个停止动作很关键daemon 是常驻进程旧参数在旧进程里不会自动释放不停掉的话新的堆配置不生效。物理内存只有 8G 的机器建议顺手把 parallel 调成 false避免多模块并行同时开堆内存叠加量变引起翻车。6. 装完不等于能用用命令行把 SDK、Gradle 和 APK 全链路验证一遍6.1 从 Java 到 APK 的一条命令链我装完 Bumblebee 有一个习惯不在 IDE 里点来点去先开一个终端把整条构建链路走通。整个过程浓缩成一段命令/opt/android-studio/jbr/bin/java -version export PATH$PATH:$ANDROID_HOME/platform-tools:$ANDROID_HOME/cmdline-tools/latest/bin sdkmanager --list_installed adb devices cd ~/work/DemoApp ./gradlew clean :app:assembleDebug ls -lh app/build/outputs/apk/debug/app-debug.apk第一行验证自带 JDK 能用第二行把 SDK 命令行工具暴露出来第三行确认 SDK 组件装全第四行验证设备连接第五行执行一次完整调试包构建最后一行确认产物落盘。注意 assembleDebug 用的是 debug 签名不需要配置 keystore是纯环境验证的最佳目标。如果项目里没有现成的工程也可以用 IDE 新建一个空工程再走这条链。构建成功之后再用 build-tools 里的 apksigner 补一道验签$ANDROID_HOME/build-tools/31.0.0/apksigner verify --print-certs app/build/outputs/apk/debug/app-debug.apk如果能看到证书指纹说明 aapt2 资源编译、dex 打包、apksigner 签名这一整条 Android 工具链都是通的。之后再打开 studio.sh 做日常业务开发就只剩图形 API 那一层的问题底层构建系统已经验证过一遍排错范围明显缩小。有一次我在一台新配的 Linux 机器上装完 Bumblebee急着导入项目直接点了 Sync结果 SDK 组件缺失、Gradle 下载失败、JDK 版本冲突三个问题轮着来最后发现全是安装后没有验证惹的祸。从那以后我每次在 Linux 上装完 Android Studio 都会强制走一遍上面这条命令链Java 版本、SDK 组件、Gradle 构建、APK 输出逐个确认清楚再开始写业务代码。希望帮到你。本文还有配套的精品资源点击获取