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. 出问题时的排查顺序
adb devices -l—— 设备在不在。gradlew.bat --version—— JDK / Gradle 版本对不对(JDK 必须 17+)。gradlew.bat :app:assembleDebug --info—— 看卡在哪个任务。- 报错看不懂 → 加
--stacktrace。 - 依赖冲突 →
dependencies/dependencyInsight。 - 崩溃 →
adb logcat -c→ 复现 →adb logcat -d -v time > crash.txt→ 搜FATAL EXCEPTION。 - 疑似旧产物污染 →
gradlew.bat --stop→ 重跑 → 仍不行才clean。

浙公网安备 33010602011771号