VSCode开发Android初探

随着AI的兴起,各种基于AI和VSCode的商业编程工具如雨后春笋般的涌现,比如Anysphere的Cursor ,字节跳动的TraeAI ,谷歌的Project IDX等。VSCode上的AI插件更是多如牛毛,身为Android开发者的我也想加入大家庭体验下VSCode的便利。

前期准备

这里假定当前已经有了一个基本的Android项目代码,可以先通过Android Studio 新建一个项目。

VSCoode并不是一个对于Android开发者开箱即用的解决方案,相比于Android Studio内置了所有所需工具,我们需要单独下载并配置相关设置才能成功运行程序。

软件下载

注:以下软件下载来源并不唯一,选择合适正规的渠道下载,我使用Windows 11系统

Java Development Kit(JDK)

learn.microsoft.com/zh-cn/java/...

我选择OpenJDK 21,建议下载JDK 17及以上的版本。安装好后,添加JAVA_HOME到系统环境变量。环境变量通过"此电脑"鼠标右键 "属性"->"高级系统设置"->"环境变量(N)"-> "系统变量(S)"下的 新建(W) 添加。

变量名为JAVA_HOME 变量值以我安装的位置举例为 C:\Program Files\Microsoft\jdk-21.0.5.11-hotspot\

Android SDK

developer.android.com/studio?hl=z...

我选择下载完整的Android Studio,Android Studio 中包含了命令行工具。也可以单独下载页面提供的"仅限命令行工具"。配置 ANDROID_HOME 环境变量,并将 SDK 的 tools、platform-tools 和 build-tools 目录添加到 PATH 环境变量,通过 "系统变量(S)" 中找到Path 点击编辑添加。

我的配置如下: ANDROID_HOME D:\Android\SDK

Path中添加

D:\Android\SDK\platform-tools

D:\Android\SDK\tools

D:\Android\SDK\build-tools

Android模拟器

我选择模拟器作为开发调试的工具,这一步如果使用真机可以忽略。为了方便我直接使用Android Studio自带的模拟器。

打开Android Studio,打开右侧的"Device Manager", 点击"+", 新建一个名叫"Pixel 8a API 35"虚拟机。新建完毕后,点击右侧开始按钮,启动模拟器。

启动完毕后,打开Windows命令行,Windows底部搜索栏 键入"CMD",打开命令提示符,输入 adb devices

会得到类似如下的结果

List of devices attached

emulator-5554 device

emulator-5554这个设备ID,你的可能和我不一样,先记住这个值,后续会用到,然后关闭模拟器。

VSCode

code.visualstudio.com/

安装扩展:Extension Pack for JavaKotlinAndroid

配置调试环境

在Android Studio 中新建一个Basic View Activity项目,用VSCode打开这个项目,按照Android 插件的要求我们需要一个launch.json的文件来配置项目的启动参数。

  1. 启动模拟器

不依赖Android Studio独立启动模拟器,找到模拟器的安装目录,模拟器的安装目录是在Android SDK的子目录下面,我的位置是D:\Android\SDK\emulator ,打开命令行输入以下指令

D:

cd D:\Android\SDK\emulator

emulator -avd Pixel_8a_API_35

自此就独立启动了模拟器,如果不知道自己模拟器的名字可以去 C:\Users\用户名\.android\avd 下面查看,子目录的文件夹名称就是-avd 后面需要填写的名称。

2.编译项目

进入项目当前根目录,使用gradle 编译项目,我的项目位置是D:\code\Demo,打开命令行输入以下指令

D:

cd D:\code\Demo

.\gradlew assembleDebug

等待片刻 提示BUILD SUCCESSFUL,编译成功。

3.运行项目

用VSCode打开项目,根目录新增文件夹 ".vscode",新增文件"launch.json",我们参考VSCode插件市场里面 Android 插件的示例代码,在launch.json中添加如下代码

json 复制代码
{
    "version": "0.2.0",
    "configurations": [

        {
            "type": "android",
            "request": "launch",
            "name": "Android Launch",
            "appSrcRoot": "${workspaceRoot}/app/src/main",
            "apkFile": "${workspaceRoot}/app/build/outputs/apk/debug/app-debug.apk",
            "adbPort": 5037,
            "adbSocket": "localhost:5037",
            "targetDevice": "emulator-5554",
        }
        
    ]
}

targetDevice中添加之前我们记录的设备ID

操作栏切换到运行和调试,点击 Android Launch 按钮,就可以正常运行项目了。

4 调试

项目启动后,在代码行数那里添加断点,界面顶端会出现断点调试按钮,我分别在Java和Kotlin文件下各新增了一个断点,断点都可以顺利进来。

优化

项目是运行起来了,也可以调试,但是也太麻烦了,能否优雅的一键 "启动模拟器->编译->运行"?

当然可以!

VSCode的配置项支持预启动任务,任务又可以组合成复合任务。因此我们在启动项目前,先顺序执行"启动模拟器" 和 "编译" 两个任务,任务结束后运行项目。

在".vscode"目录中新增 "task.json"文件,新增三个任务,分别为"Launch Android Emulator","Run Gradle","PreLaunchTasks"。

Launch Android Emulator

执行shell 命令 emulator -avd Pixel_8a_API_35 启动模拟器。

关键点:

  1. 需要后台一直存在,不然模拟器会消失,使用isBackground": true 命令。
  2. 由于启动模拟器的窗口一直存,因此需要告知下一个任务何时开始,不然等到天荒地老都开始不了,在background中定义匹配规则beginsPattern和endsPattern,代表当前什么时候认为它开始,什么时候认为它结束。
json 复制代码
"background": {
    "activeOnStart": true,
    "beginsPattern": ".*Monitoring duration of emulator setup.*",
    "endsPattern": ".*Successfully loaded.*|.*Boot completed.*"
    }

我经过观察发现,模拟器启动的时候终端一定会输出 "Monitoring duration of emulator setup" 的信息,因此把它作为起始点,模拟器在热启动和冷启动的输出信息不一样,分别有如下信息"Successfully loaded" 和 "Boot completed",因此结束点这两种情况都考虑。

Run Gradle

执行shell 命令 ${workspaceFolder}/gradlew 开启编译

PreLaunchTasks 作为领头羊,通过dependsOn指定依赖Launch Android Emulator,Run Gradle ,指示他们顺序执行dependsOrder": "sequence"

完整的tasks.json代码如下:

json 复制代码
{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "Launch Android Emulator",
            "type": "shell",
            "command": "emulator -avd Pixel_8a_API_35",
            "problemMatcher": {
                "pattern": [
                    {
                        "regexp": ".*",
                        "file": 1,
                        "line": 2,
                        "column": 3,
                        "severity": 4,
                        "message": 5
                    }
                ],
                "background": {
                    "activeOnStart": true,
                    "beginsPattern": ".*Monitoring duration of emulator setup.*",
                    "endsPattern": ".*Successfully loaded.*|.*Boot completed.*"
                }
            },
            "isBackground": true,
            "options": {
                "shell": {
                    "executable": "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",
                    "args": [
                        "-c"
                    ]
                }
            }
        },
        {
            "label": "Run Gradle",
            "type": "shell",
            "command": "${workspaceFolder}/gradlew",
            "args": [
                "assembleDebug"
            ],
            "presentation": {
                "echo": true,
                "reveal": "always",
                "focus": false,
                "panel": "shared",
                "showReuseMessage": true,
                "clear": true
            },
            "problemMatcher": [],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        },
        {
            "label": "PreLaunchTasks",
            "dependsOn": [
                "Launch Android Emulator",
                "Run Gradle"
            ],
            "dependsOrder": "sequence",
            "group": "none",
            "problemMatcher": []
        }
    ]
}

launch.json 增加预处理任务,完整代码如下:

json 复制代码
{
    "version": "0.2.0",
    "configurations": [

        {
            "type": "android",
            "request": "launch",
            "name": "Android Launch",
            "appSrcRoot": "${workspaceRoot}/app/src/main",
            "apkFile": "${workspaceRoot}/app/build/outputs/apk/debug/app-debug.apk",
            "adbPort": 5037,
            "adbSocket": "localhost:5037",
            "targetDevice": "emulator-5554",
            "preLaunchTask": "PreLaunchTasks"
        }
        
    ]
}

关掉所有的Windows命名提示符和模拟器,点击"Android Launch" 按钮,开始体验吧。

相关推荐
酱酱们的每日掘金12 小时前
从零打造吉卜力风格AI绘图网站、写给普通人的 MCP 入门指南、VS Code 又行了!丨AI Coding 周刊第 3 期
ai编程·visual studio code·mcp
我命由我123452 天前
C++ - 头文件基础(常用标准库头文件、自定义头文件、头文件引入方式、防止头文件重复包含机制)
服务器·c语言·开发语言·c++·后端·visualstudio·visual studio code
Captaincc2 天前
Visual Studio Code 发布王炸更新:Agent 模式上线,支持 MCP 协议!
microsoft·visual studio code·mcp
Gixy2 天前
日常在VS Code开发中没注意到的一些实用配置
前端·visual studio code
QC七哥8 天前
picgo的vscode插件支持easyimage图床
node.js·visual studio code
formulahendry8 天前
在 VS Code 中,一键安装 MCP Server!
visual studio code·vs code·mcp
Jiude10 天前
🚨两月没动的项目突然爆红❗一场由 ESLint 和格式化配置缺失引发的血案🧩
前端·visual studio code·cursor
60岁咯11 天前
VSCode插件开发九:扩展中接入Copilot AI
前端·javascript·visual studio code
jerrywus11 天前
最新Cursor无限续杯避坑指南,让你稳稳的喝咖啡~
openai·visual studio code·cursor
ACE叫牌18 天前
C++Qt开发流程图效果,包括保存、加载功能
c++·qt·流程图·visual studio code