---页首---

Android 常用编译 / 调试命令速查

Android 常用编译 / 调试命令速查(Windows 优先)

约定:项目根目录执行;Windows 用 gradlew.bat,Linux/macOS 把 gradlew.bat 换成 ./gradlew
adb 位于 %ANDROID_HOME%\platform-tools\adb.exe,下文一律简写为 adb


0. 先验证环境

:: Windows cmd
echo %ANDROID_HOME%                  :: 应输出 SDK 目录
where adb                            :: 应命中 platform-tools\adb.exe
java -version                        :: 必须 17+
gradlew.bat --version                :: 看 Gradle / Kotlin / JVM 版本

:: Windows PowerShell
$env:ANDROID_HOME
Get-Command adb

一次性配置(cmd,需重开终端生效):

setx ANDROID_HOME "%LOCALAPPDATA%\Android\Sdk"
setx PATH "%PATH%;%ANDROID_HOME%\platform-tools"

1. 每天用的 10 条

# 命令 作用
1 gradlew.bat :app:assembleDebug 编译 debug APK
2 gradlew.bat :app:installDebug 编译并安装到当前设备(一条命令跑通全流程)
3 gradlew.bat :app:bundleRelease 打 AAB(上架 Google Play)
4 adb logcat -v time 实时日志(Ctrl+C 退出)
5 adb devices -l 列出设备
6 adb install -r app\build\outputs\apk\debug\app-debug.apk 覆盖安装已有 APK
7 adb shell am force-stop com.example.myapp 强制停止应用
8 adb shell am start -n com.example.myapp/.MainActivity 冷启动指定 Activity
9 gradlew.bat :app:clean 清理模块构建产物
10 gradlew.bat --stop 停掉 Gradle daemon(构建卡死/文件占用时第一招)

2. Gradle 构建命令

2.1 按变体构建

变体名 = <Flavor><BuildType>,如 freeDebug、paidRelease。

gradlew.bat :app:assembleDebug           :: debug APK
gradlew.bat :app:assembleRelease         :: release APK(需要签名配置)
gradlew.bat :app:assembleFreeDebug       :: 指定风味的 debug
gradlew.bat :app:assemble                :: 所有变体的 APK
gradlew.bat :app:bundleRelease           :: release AAB
gradlew.bat :app:bundleDebug             :: debug AAB
gradlew.bat build                        :: 全部模块 assemble + 全部测试 + lint

2.2 安装与运行

gradlew.bat :app:installDebug            :: 装 debug
gradlew.bat :app:installRelease          :: 装 release(需已配置签名)
gradlew.bat :app:uninstallDebug          :: 卸载
:: 装完再启动(adb 更灵活,见 §4)

2.3 测试与静态检查

gradlew.bat :app:testDebugUnitTest                    :: 本地单元测试(JVM,秒级)
gradlew.bat :app:test                                 :: 所有变体单测
gradlew.bat :app:connectedDebugAndroidTest            :: 插桩测试(需要设备/模拟器)
gradlew.bat :app:lintDebug                            :: Lint 检查,报告在 build/reports/
gradlew.bat :app:lintVitalRelease                     :: release 前的致命项检查(CI 常用)
gradlew.bat :app:analyzeReleaseR8Config               :: AGP 9.3+:单独跑 R8 配置分析,不等完整打包

2.4 清理

gradlew.bat :app:clean                   :: 删 app/build
gradlew.bat clean                        :: 删所有模块 build
gradlew.bat --stop                       :: 停 daemon
gradlew.bat --status                     :: 查看运行中的 daemon

clean 会让下次全量重编(慢)。先试 --stop + 重跑,只有怀疑产物污染时才 clean。


3. Gradle 诊断命令

场景 命令
卡住不动 / 想看在干什么 gradlew.bat :app:assembleDebug --info
报错看不懂 gradlew.bat :app:assembleDebug --stacktrace(更狠用 --debug)
构建慢,想看任务耗时 gradlew.bat :app:assembleDebug --profile(报告在 build/reports/profile/)
全面分析(需联网授权) gradlew.bat :app:assembleDebug --scan(生成在线报告链接)
依赖冲突,看依赖树 gradlew.bat :app:dependencies --configuration debugRuntimeClasspath
某个库到底是谁引入的 gradlew.bat :app:dependencyInsight --dependency okhttp --configuration debugRuntimeClasspath
怀疑缓存脏了 gradlew.bat :app:assembleDebug --refresh-dependencies
断网 / CI 离线 gradlew.bat :app:assembleDebug --offline
跳过某个任务 gradlew.bat build -x lint
强制重跑所有任务 gradlew.bat :app:assembleDebug --rerun-tasks
看某个任务是什么 gradlew.bat help --task :app:assembleDebug
列出 Android 相关任务 gradlew.bat :app:tasks --group android
临时覆盖 Gradle 属性 gradlew.bat :app:assembleDebug -Pandroid.enableJetifier=false
配置缓存出问题 gradlew.bat :app:assembleDebug --no-configuration-cache
CI 推荐 gradlew.bat :app:assembleRelease --no-daemon --stacktrace
查签名信息 gradlew.bat :app:signingReport(输出各变体的 SHA-1 / 签名配置)

读依赖树:(*) 表示已因冲突被省略;-> 表示被强制升级到某版本。重复出现在不同版本时,用 dependencyInsight 定位引入者。


4. adb:设备与安装

adb devices -l                       :: 列出设备(-l 带型号)
adb kill-server & adb start-server   :: 设备列表异常时重启服务
adb -s <serial> install app.apk      :: 多设备时指定目标
adb install -r app.apk               :: -r 覆盖安装并保留数据
adb install -r -d app.apk            :: -d 允许降级安装
adb install -t app.apk               :: -t 允许安装 test-only 包(debug 常见)
adb install-multiple base.apk split1.apk   :: 安装拆分 APK
adb uninstall com.example.myapp      :: 卸载
adb uninstall -k com.example.myapp   :: 卸载但保留数据
adb shell pm clear com.example.myapp :: 只清数据(不用重装)
adb shell pm path com.example.myapp  :: 看 APK 安装位置
adb shell pm dump com.example.myapp | findstr versionCode   :: 查已装版本号
adb shell getprop ro.build.version.sdk                      :: 查设备 API 级别

无线调试(Android 11+,无需 USB)

adb pair 192.168.1.20:37123          :: 用手机"无线调试-配对码"里的地址
adb connect 192.168.1.20:5555        :: 用无线调试页显示的端口
adb disconnect 192.168.1.20:5555

Android 10 及更早:先 USB 连一次 → adb tcpip 5555 → adb connect <ip>:5555。


5. adb logcat

adb logcat -v time                              :: 带时间戳
adb logcat -c                                   :: 清空缓冲区(开始复现前先执行)
adb logcat -s MyTag                             :: 只看某个 tag
adb logcat MyTag:D OtherTag:E *:S               :: tag:级别 + 其余静默(V<D<I<W<E)
adb logcat --pid=<pid>                          :: 只看某进程
adb shell pidof com.example.myapp               :: 先拿 pid
adb logcat -b crash                             :: 只看崩溃缓冲
adb logcat -g                                   :: 查缓冲区大小
adb logcat *:E                                  :: 只看 Error 及以上
adb logcat | findstr "Exception"                :: Windows 关键字过滤(Linux 用 grep)
adb logcat > log.txt                            :: 存文件

崩溃定位标准流程:

adb logcat -c
:: 复现崩溃
adb logcat -d -v time > crash.txt     :: -d 导出后退出(不阻塞)
:: 在 crash.txt 里搜 "FATAL EXCEPTION" / "AndroidRuntime"

6. adb shell:am / pm / dumpsys / input

:: am:Activity 与进程
adb shell am start -n com.example.myapp/.MainActivity
adb shell am start -W -n com.example.myapp/.MainActivity   :: 输出启动耗时(看 TotalTime)
adb shell am start -a android.intent.action.VIEW -d "https://example.com"
adb shell am start -a com.example.myapp.OPEN --es key value   :: 带 String 参数
adb shell am force-stop com.example.myapp
adb shell am kill com.example.myapp                        :: 仅杀后台进程
adb shell am broadcast -a com.example.myapp.MY_ACTION

:: pm:包管理
adb shell pm list packages | findstr example
adb shell pm clear com.example.myapp
adb shell pm grant com.example.myapp android.permission.CAMERA   :: 运行时授权
adb shell pm revoke com.example.myapp android.permission.CAMERA
adb shell cmd package compile -m speed com.example.myapp          :: 强制 AOT 编译

:: dumpsys:系统状态
adb shell dumpsys activity activities | findstr mResumedActivity  :: 当前前台 Activity
adb shell dumpsys meminfo com.example.myapp                       :: 内存占用
adb shell dumpsys meminfo com.example.myapp -d                    :: 详细(含 SQL/Asset 等)
adb shell dumpsys gfxinfo com.example.myapp framestats            :: 帧率数据
adb shell dumpsys battery                                         :: 电量状态
adb shell dumpsys battery set level 15                            :: 模拟低电量
adb shell dumpsys battery reset                                   :: 还原
adb shell dumpsys cpuinfo | findstr com.example.myapp             :: CPU 占用
adb shell dumpsys netstats                                        :: 流量统计
adb shell dumpsys alarm                                           :: 定时任务

:: input:模拟操作
adb shell input text "hello"
adb shell input keyevent 4                    :: 返回键
adb shell input tap 540 1200
adb shell input swipe 300 1000 300 500 200

:: settings / wm:改系统设置
adb shell settings put global window_animation_scale 0     :: 关动画(UI 自动化常用)
adb shell settings put global transition_animation_scale 0
adb shell settings put global animator_duration_scale 0
adb shell wm size                                          :: 分辨率
adb shell wm density                                       :: 密度

7. 文件传输 / 截图 / 录屏 / 抓报告

adb push local.txt /sdcard/Download/
adb pull /sdcard/Download/remote.txt .
adb pull /sdcard/DCIM/Camera/ .              :: 拉整个目录

:: 截图(推荐:先存设备再 pull,避免 Windows 行尾问题)
adb shell screencap -p /sdcard/shot.png
adb pull /sdcard/shot.png .
adb shell rm /sdcard/shot.png

:: 录屏(默认 180s 上限)
adb shell screenrecord /sdcard/demo.mp4 --time-limit 30 --bit-rate 4000000
adb pull /sdcard/demo.mp4 .

:: bugreport(整机诊断,含日志/堆栈/服务状态)
adb bugreport bugreport.zip

:: 访问 debug 应用的私有目录(仅 debuggable 包可用)
adb shell run-as com.example.myapp ls /data/data/com.example.myapp/databases

8. AAB 与 bundletool

AAB 不能直接装进设备,本地验证要用 bundletool(GitHub releases 下载 jar)。

:: 1) 生成设备专属 apks
java -jar bundletool.jar build-apks ^
  --bundle=app\build\outputs\bundle\release\app-release.aab ^
  --output=app.apks ^
  --ks=keystore\release.jks --ks-key-alias=mykey ^
  --ks-pass=pass:storepass --key-pass=pass:keypass

:: 2) 安装到设备
java -jar bundletool.jar install-apks --apks=app.apks

:: 3) 只生成本机匹配的分包(更快)
java -jar bundletool.jar get-device-spec --output=spec.json
java -jar bundletool.jar build-apks --bundle=... --output=app.apks --device-spec=spec.json

:: 4) debug 包可直接用 local-testing 模式
java -jar bundletool.jar build-apks --bundle=app-debug.aab --output=app.apks --local-testing

9. SDK / 模拟器 / APK 分析

:: 在 %ANDROID_HOME%\cmdline-tools\latest\bin 下
sdkmanager --list                                       :: 列出可安装包
sdkmanager --install "platforms;android-37" "build-tools;36.0.0"
sdkmanager --update

:: 模拟器
emulator -list-avds
emulator -avd Pixel_7_API_37 -gpu host -no-snapshot-load   :: 冷启动
emulator -avd Pixel_7_API_37 -wipe-data                    :: 清数据重置

:: AVD 管理
avdmanager list avd
avdmanager create avd -n MyDevice -k "system-images;android-37;google_apis;x86_64" -d pixel

:: APK 分析(apkanalyzer,同在 cmdline-tools\bin)
apkanalyzer apk summary app-debug.apk        :: 体积概览
apkanalyzer manifest print app-debug.apk     :: 合并后的 Manifest
apkanalyzer dex packages app-debug.apk       :: 方法数/包分布
apkanalyzer files list app-debug.apk         :: 文件清单
apkanalyzer apk compare a.apk b.apk          :: 两版本差异

10. Windows 专属坑

现象 原因 处理
'gradlew' is not recognized Windows 没有 ./gradlew 语法 用 gradlew.bat(PowerShell 里也要写全)
adb 命令不存在 没加 PATH 或没设 ANDROID_HOME 见 §0
构建报路径过长 / File name too long Windows 260 字符路径限制 项目放短路径(如 D:\dev\app);或开启长路径:注册表 HKLM\SYSTEM\CurrentControlSet\Control\FileSystem\LongPathsEnabled=1
编译时报文件被占用 / 删除失败 Gradle daemon 或索引进程持句柄 gradlew.bat --stop → 重试 → 再考虑关 Studio
中文用户名导致 Gradle 缓存异常 %USERPROFILE% 含非 ASCII 设 GRADLE_USER_HOME=D:\gradle-home 指向纯 ASCII 路径
adb exec-out 截图在 Windows 打开损坏 CR/LF 被转换 改用 §7 的 screencap + pull
模拟器起不来 BIOS 未开虚拟化 / Hyper-V 冲突 BIOS 开 VT-x/AMD-V;或改 -gpu swiftshader 软件渲染
端口 5037 被占 其它 adb(如豌豆荚、手机助手)抢占 adb kill-server 后 adb start-server

11. 出问题时的排查顺序

  1. adb devices -l —— 设备在不在。
  2. gradlew.bat --version —— JDK / Gradle 版本对不对(JDK 必须 17+)。
  3. gradlew.bat :app:assembleDebug --info —— 看卡在哪个任务。
  4. 报错看不懂 → 加 --stacktrace。
  5. 依赖冲突 → dependencies / dependencyInsight。
  6. 崩溃 → adb logcat -c → 复现 → adb logcat -d -v time > crash.txt → 搜 FATAL EXCEPTION。
  7. 疑似旧产物污染 → gradlew.bat --stop → 重跑 → 仍不行才 clean。
posted @ 2026-10-19 14:05  20190311  阅读(14)  评论(0)    收藏  举报
---页脚---