ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Android Studio连接夜神模拟器指南:adb端口与Gradle缓存问题全解

Android Studio连接夜神模拟器指南:adb端口与Gradle缓存问题全解 不知道大家第一次在Android Studio里点开自带AVD的启动按钮是什么感受我反正是被那个启动画面折磨过不少次。项目稍微大一点从双击到桌面渲染完成两三分钟是常有的事中间内存直接飙到三四个G笔记本风扇跟发动机一样。后来我把开发调试的主力换成了夜神模拟器启动快、版本切换灵活还能直接挂多开日常联调舒服很多。但第一次把Android Studio和夜神串起来的时候问题也是一堆接着一堆连不上、显示offline、装上秒退、日志不输出甚至新建个项目还要卡在下载src那一步。这篇文章就把我在连接与日常使用中踩过的这些问题统一整理一遍适合刚开始用夜神做Android Studio联调的同学参考也欢迎老手一起交流补充。1. 为什么放着官方AVD不用偏偏选夜神1.1 AVD的硬伤慢、重、镜像还经常下不动很多新手一开始都会老老实实用AS自带的AVD Manager创建模拟器。说实话创建流程本身不难选设备型号、选系统镜像一路Next就能完事。真正难受的是后面系统镜像的下载在国内经常卡到怀疑人生几GB的镜像文件放在默认源上大概率要挂一个晚上。好不容易下载完启动发现还要等Haxm或者WHPX这类虚拟化组件正确工作Windows上稍有不慎就提示“VT not compatible”或“Hyper-V conflict”整个环境检查环节就劝退了一大批人。就算你把这些前置条件都解决了AVD的日常体验也谈不上好。冷启动时间很长打开系统设置、应用列表都要等动画慢慢转内存占用起步就是2GB以上跑一个稍大一点的App宿主机直接变卡。更麻烦的是我经常需要同时验证不同Android版本下的表现一个AVD对应一个系统镜像磁盘占用叠起来非常夸张。当然AVD也不是一无是处它和Android Studio集成得最紧密、没有第三方模拟器那层兼容性问题。但如果你是普通开发调试追求的是“打开就能跑、跑起来不卡”AVD这个官方选择反而成了很大的负担。1.2 夜神作为调试模拟器的优势与适用场景夜神这类第三方模拟器能在开发者中间流行起来核心原因是它把“启动快”和“资源占用可控”这两件事做得很到位。同样一个项目AVD可能要等三分钟夜神冷启动基本二十秒内能到桌面。而且夜神提供了多版本Android环境从Android 5到Android 13都有对应的镜像适合做兼容性抽查。开发中需要root权限看私有目录、读数据库或者抓系统进程夜神也提供了图形化的root开关改完立即重启生效比自己去掏AVD镜像的system.img方便太多。多开功能对开发联调特别有用。比如一个社交类App要验证聊天双开、多账号互聊夜神多开管理器里直接复制实例就能搞定再比如你要测试同一App在不同屏幕尺寸下的布局可以同时挂两个不同分辨率的实例每个实例独立运行互不干扰。这些场景用AVD做就很麻烦得额外配置快照和配置文件夹效率低。不过也要实话实说夜神毕竟不是Google官方模拟器架构走的是x86/x64的虚拟化路线凡是项目里带了纯arm64版本的Native so库装上去可能直接报INSTALL_FAILED_NO_MATCHING_ABIS。这类情况建议用云真机或者主流的X86兼容模拟器补位别在一棵树上吊死。2. 连接不上夜神的核心问题adb版本和端口号2.1 端口号默认62001还是62025Android Studio连夜神本质上就是让IDE的adb工具能发现夜神模拟器的adb监听端口。端口号不对连接就是一句空话。网上一搜“夜神端口号”有人说是62001有人说是62025结果两种说法都试了还是连不上问题就出在夜神的端口并不是固定的。通常来说夜神不同Android版本对应的默认端口略有差别常见的是62001这个端口对应较老的Android 5.1.1环境62025对应Android 7.1.2环境新版夜神默认也会监听62001。但这不是铁律尤其是你开了多开、换过模拟器版本、改过Root开关之后端口完全可能偏移。所以遇到连接失败我建议先不要背端口表直接看本机监听。在夜神已经启动的状态下打开cmd跑一句netstat -ano | findstr 620输出的本地地址那一列里会出现类似127.0.0.1:62001的条目这个端口才是你当前这个夜神实例真正监听的adb端口。看清楚了再连基本不会错。如果这里什么都没有说明夜神的adb服务没起来去夜神安装目录确认启动是否完整或者重启一下模拟器再执行。2.2 adb版本不一致是离线设备的幕后黑手端口对了以后最常遇到的坑就是明明提示connected successfullyAndroid Studio的设备列表里却看到设备状态写着offline。这个基本可以断定是adb版本不一致导致的。Android Studio自带一套platform-tools夜神的安装目录也有自己的adb.exe或者nox_adb.exe。两者版本差异较大时adb server在握手阶段就会出问题。我印象最深的一次某天Android Studio弹窗提示“Android SDK Platform-Tools Update Available”我顺手点了更新第二天夜神就连不上了。当时以为夜神坏了重装了两次最后才发现是AS那边的adb版本被抬到了34夜神自带adb还停在30握手直接失败。解决办法有两种。第一种比较粗犷但有效把Android Studio SDK目录下platform-tools\adb.exe复制到夜神安装目录的bin文件夹里覆盖掉夜神自带的nox_adb.exe。覆盖前记得把原始文件重命名备份一个万一不行还能还原。然后重启夜神让夜神使用和AS一致的adb版本。第二种办法更温和不要动夜神的文件直接用AS的adb去连接夜神端口。后续每次启动夜神后先在AS的Terminal里执行连接命令也能稳定连上。我个人更推荐第二种少动模拟器安装目录排查问题时干净很多。2.3 手动connect的正确操作流程下面给一套我平时最常用的连接流程。打开夜神模拟器等桌面完全加载后切到Android Studio的Terminal面板输入cd $ANDROID_HOME\platform-tools .\adb.exe kill-server .\adb.exe start-server .\adb.exe connect 127.0.0.1:62001 .\adb.exe devices注意$ANDROID_HOME在Windows的bat/cmd里不一定生效你需要换成自己SDK的实际路径比如C:\Users\你的用户名\AppData\Local\Android\Sdk。把platform-tools目录加进系统环境变量Path之后就能直接在任意终端敲adb命令省掉每次cd的麻烦。上述命令里的端口号按我2.1节说的先用netstat确认过再填。连接成功后adb devices会输出一行127.0.0.1:62001 device。这个状态出现后打开AS的Run配置设备下拉框里就能看到夜神了。这里有一个经验之谈每次电脑重启或者夜神重启之后连接状态会丢需要重新执行connect。所以我习惯在桌面丢一个一键连接脚本内容是这样的echo off cd /d C:\Users\你的用户名\AppData\Local\Android\Sdk\platform-tools adb kill-server adb start-server adb connect 127.0.0.1:62001 adb devices pause换电脑、换SDK路径时只需要改第一行的cd路径就行。后来我发现很多同学连不上的原因根本不是adb版本而是压根没做过connect这一步。AS不会主动发现夜神除非夜神自带启动器做过装置注册很多版本默认不注册所以一定要手动连接一次。3. 连上了却跑不起来运行部署阶段的翻车现场3.1 设备列表能看到Run按钮却选不到连接成功、adb devices也显示device在线一切看起来都正常可等到真要点Run的时候下拉框里没有夜神的影子。这个问题我见过很多次原因通常出在Android Studio的Run Configuration上。AS里默认的Run配置有时候会锁定在一个“特定设备”上比如之前你选过某个AVD切到夜神后IDE还记着旧设备。解决办法很简单点Run按钮旁边的模拟器下拉菜单选“Select Devices”在弹窗里勾选夜神那台设备再“OK”就行。如果这一步也没看到夜神那就先把AS的Terminal里连接状态确认一遍确认为device后再试。还不行的话关掉AS在cmd里执行一遍adb kill-server和adb start-server然后重新打开项目让IDE重新扫描设备。偶尔也会遇到AS设备列表里出现两个一模一样的夜神条目一个正常一个offline。这通常是你之前连接过别的端口或者AS内部缓存了旧的设备信息。处理方式是在Terminal里执行adb disconnect把多余连接断开再重新connect正确的端口。3.2 应用装上秒退快速启动模式惹的祸连接正常、设备能选、构建成功、App安装完成结果一打开立刻闪退。Logcat里看不到明显的崩溃栈只留下一堆“Process died”之类信息这种情况会让人非常抓狂。我碰到过一次折腾了大半天把项目里的依赖减了又减还是秒退。最后无意中发现夜神设置里默认开着“快速启动”。这个模式为了冷启动更快会缓存一部分系统镜像状态但缓存一旦和当前App的运行需求冲突就会出现启动即崩的诡异现象。把“设置—基本设置—快速启动”关掉重启夜神问题直接消失。所以当你排查闪退的时候别急着怀疑代码。先确认一遍模拟器自身状态如果夜神开着快速启动、系统版本和项目minSdk距离太远或者模拟器刚做完多开复制都可能出现奇怪行为。先关快速启动重启一次成本最低也比反复改代码高效。3.3 安装、运行中的其他报错INSTALL_FAILED_UPDATE_INCOMPATIBLE模拟器上已经存在旧版应用且签名不一致直接adb uninstall 包名然后重新安装。INSTALL_FAILED_NO_MATCHING_ABIS项目里有arm64-v8a的原生so库夜神是x86架构不认。解决方向是给对应依赖加x86_64的so或者调整abiFilters配置实在不行换arm架构的云真机。日志不输出检查Logcat左下角设备选择是否正确以及Filter里是否把级别调成了Error。夜神个别版本因为logd配置问题会吞日志重启模拟器也能恢复。运行卡顿严重去夜神设置把性能和分辨率调回标准档位别开高帧率模式。这些看似零碎的小问题实际上花费的排查时间比“连接失败”要多得多。养成“先查环境、再查代码”的习惯能少走很多弯路。4. 新建项目老在“下载src”这是缓存、镜像和模板的锅4.1 你看到的“下载src”到底是什么在下载网上经常有人问“如何取消Android Studio每次新建项目就下载src”。首先要澄清一个误解这个“下载src”并不是下载项目源码src/main/java这些代码目录在新建项目的那一刻就已经在本地生成好了。你看到的下载进度条实际上是Gradle在拉取构建过程需要的依赖组件。具体来说新建项目时会做三件事。第一根据gradle-wrapper.properties里的distributionUrl下载指定的Gradle发行包这个包体积不小下载速度慢的话会很痛苦第二Gradle根据依赖声明去Maven仓库拉取appcompat、constraintlayout、material、core-ktx这些库它们是模板代码运行的基础第三如果你用的模板依赖了较新的SDK Platform版本而本机SDK Manager里没有装好IDE还会自动补下载对应的Android Platform。所以这不是一个“取消”或“禁用”就能解决的问题。凡是构建需要的依赖总得落到本机缓存里除非你能保证完全离线并且本地全都有。问题的关键其实是如何让它更快、如何复用已有缓存。4.2 用阿里云镜像和预置依赖解决首次Sync既然依赖必须下载那就把下载源换成快的。这一步很多新手会忽略。Android Studio新建项目默认只配了google()和mavenCentral()在国内网络环境下部分仓库的访问速度确实不稳定。我在settings.gradle里常驻一套阿里云镜像配置pluginManagement { repositories { maven { url https://maven.aliyun.com/repository/google } maven { url https://maven.aliyun.com/repository/public } maven { url https://maven.aliyun.com/repository/gradle-plugin } google() mavenCentral() gradlePluginPortal() } } dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { maven { url https://maven.aliyun.com/repository/google } maven { url https://maven.aliyun.com/repository/public } google() mavenCentral() } }配置之后Gradle Sync的下载速度会有肉眼可见的提升尤其首次构建那十几分钟的体感改善非常明显。还有一个小技巧别老是让模板自动选最新的Gradle版本。新建项目以后打开gradle-wrapper.properties把distributionUrl里的Gradle版本号改成和本机已验证过的项目一致。比如你上一个项目用的是gradle-8.7-all.zip且已经下载过新项目改成同一个版本Gradle就不会再去下载一份新发行包了。依赖同理。如果你平时项目都用同一套版本的appcompat和material依赖本地缓存里早就有了新建项目Sync时会直接命中缓存完全不需要重新下载。这也是为什么老手的新建项目总是很快不是因为他网速快而是因为他用了一套固定的、已经缓存过的版本组合。4.3 离线模式怎么开注意事项对于一些网络条件差或者想彻底避免“下载src”的同学Gradle的离线模式值得了解一下。在Android Studio的Settings里搜索Gradle找到Build, Execution, Deployment下的Gradle页面勾选Offline work保存后Gradle就会强制走本地缓存不再访问任何远程仓库。注意离线模式的前提是本地缓存里已经有你需要的依赖。如果是一个全新的、从未同步过的依赖声明开离线模式后Gradle会直接报Missing artifact而且报错信息比较简单新手容易懵。所以我通常用的策略是准备一个“基线模板项目”把常用依赖、常用Gradle版本、常用Android SDK版本都Sync好放那儿。以后新建项目时直接拷贝这个项目结构改包名和模块名依赖理论上全都在缓存里Sync基本秒完成。如果你更习惯新建项目再改那么在第一次联网Sync成功之后再切离线模式后续微调都舒服了。这里提醒一个小坑开着离线模式时不要手贱去点击IDE提示的“Update Gradle Plugin”或“Check for Updates”一旦插件版本需要新依赖离线状态下会直接构建失败。真到那时候只能重新打开离线模式等依赖下载完成后再改回来。5. 把夜神调成顺手的调试工具性能、多开与实用配置5.1 性能和画面设置夜神连上AS能跑App只是第一步真正影响日常开发效率的是模拟器自身的流畅度。如果夜神跑起来一顿一顿的连拷日志都不利索那谁也没心思调试。先确认宿主机虚拟化已经开启。BIOS里找到Intel Virtualization Technology或者AMD-V选项如果是关闭状态夜神启动会异常缓慢甚至直接报VT未开启。这一步没做好后面调什么参数都白搭。夜神设置里的性能档位我给的建议是CPU至少分2核内存至少2GB到3GB。低于这个配置跑稍微现代一点的App会有明显掉帧。分辨率别一昧拉满1080p就够了4K分辨率虽然看起来细腻但对GPU和内存的压力大幅上升开发机没必要。帧率设置上别开那些“高帧率优化”或“桌面级性能”的选项。模拟器本质上是在宿主机上虚拟运行高帧率模式会把CPU资源大量吃走AS里的代码补全、Gradle构建会跟着变卡。均衡档才是开发阶段的合适选择。5.2 多开实例的端口分配夜神多开是联调利器但多开之后端口会变这个问题很多人会栽跟头。多开管理器的每一个实例启动后都会在本机监听一个adb端口。网上的端口表只能参考因为实例顺序、模拟器版本、系统镜像类型都会影响实际端口值。正确做法还是回到netstat大法。启动多开实例后在cmd里执行netstat -ano | findstr 620把监听地址里出现的每个端口都记下来然后挨个用adb connect试。哪个实例连接成功在AS的设备下拉框里就会多出对应设备。多开状态下建议给每个实例设置不同的名字或者通过-s 127.0.0.1:端口参数单独发指令避免在Terminal里adb命令串到错误的模拟器上。5.3 root、横竖屏和文件推送夜神的root开关在设置里直接提供。开发调试需要读私有目录、看WebView缓存、抓取App数据库时开root确实方便。但要注意一旦开启root很多App检测到模拟器加root会拒绝运行尤其银行、支付类的客户端。所以我通常只在需要排查数据时临时打开改完就关。横竖屏切换在开发响应式布局时很常用夜神自带快捷键可以在设置里自定义绑定也可用AS中的CtrlF11旋转模拟器屏幕避免每次点到设置面板里去找方向按钮。文件推送是另一个很省力的操作。调试时要用图片、音频文件直接用adb push推过去比在模拟器里手动下载快得多adb push test.jpg /sdcard/Pictures/ adb pull /sdcard/Download/test.txt ./这套组合用顺了之后我基本不再为“模拟器里的文件怎么弄进来”这种问题浪费时间。说到最后我最大的感受是这类第三方模拟器连接IDE的问题九成以上都出在adb本身的版本和端口管理上。先把这两个基础点理顺后面那些闪退、选不到设备、日志不显示之类的现象多半也会跟着变少。如果你今天正好卡在夜神连接这一步直接按第2章的流程走一遍大概率能跑通跑通了再回头看第4章把依赖下载的缓存问题一并解决整个开发流就顺畅了。
返回列表