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" 按钮,开始体验吧。

相关推荐
萌萌哒草头将军6 小时前
🎉🎉🎉Cursor 宣布完成 C 轮 9 亿美元融资,市场估值 99 亿美元!
visual studio code·cursor·trae
LinXunFeng7 小时前
Flutter - GetX Helper 助你规范应用 tag
flutter·github·visual studio code
Jooolin10 小时前
【编程史】IDE 是谁发明的?从 punch cards 到 VS Code
ai编程·visual studio code·编译器
vueTmp3 天前
VSCode 插件离线下载攻略
visual studio code
穷人小水滴7 天前
在 Android 设备上写代码 (Termux, code-server)
android·linux·visual studio code
哎呦你好10 天前
VS Code 安装后设置中文界面并添加常用插件的详细指南
编辑器·visual studio code
魔术师ID20 天前
vue2.0 组件生命周期
前端·javascript·vue.js·学习·visual studio code
MingT 明天你好!20 天前
在vs code 中无法运行npm并报无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查
前端·npm·node.js·visual studio code
Ynov24 天前
详细解释api
javascript·visual studio code
程序员Bears1 个月前
现代前端工具链深度解析:从包管理到构建工具的完整指南
前端·python·visual studio code