上个月我帮朋友做一个内部用的签到打卡工具App,需求本身不算复杂,但我刻意把整个过程放在Android Studio里用AI辅助来完成。粗算了一下,项目最终约有一万多行代码,其中AI辅助生成或者大幅度改过的部分超过六成。最让我印象深刻的不是生成速度,而是过程里踩的那些坑——如果完全不校验,AI产出的代码能直接编译通过的比例其实没有想象中高。这篇文章就把我这一套AI辅助安卓开发的工作流完整梳理一遍,包括工具选择、脚手架搭建、业务代码生成、Compose UI开发、调试和测试,希望能给正在Android Studio里摸索AI辅助开发的同行一些参考。
文章适合有一定安卓基础、想在开发流程里正式引入AI工具的开发者。要是你刚学安卓,也能看,只是我讲的重点不是语法本身,而是“怎么指挥AI把活干好”。
1. 为什么说AI已经改变了安卓开发的工作方式
1.1 我常用的三个AI工具和各自的定位
安卓开发最常用的IDE就是Android Studio。现在所谓的AI辅助,来源主要是两类:IDE内嵌的AI助手和独立安装的AI插件。我先后用过GitHub Copilot、Android Studio原生的AI Assistant,还有国产的通义灵码,简单说一下各自在我项目里的定位。
GitHub Copilot最擅长的是“行级补全”。尤其是写Compose代码时,你刚写完一个Modifier链,它基本能猜出你下一步要写什么,那种顺着你思路往下推的连贯感,比聊天式生成更省心。AI 这个场景下,Copilot更像一个手速极快的结对程序员,你给他一个片段,他还给你一个完整函数。
Android Studio内置的AI Assistant适合解决“这个问题怎么处理”这种问答型需求。比如我不知道WorkManager的精确配置方式,直接选中代码问它,它给出的解释往往带源码参考,可信度还行。不过它的响应速度和稳定性在不同地区差异比较大,这个要做好心理准备。
通义灵码这类国内插件,聊天的响应速度明显快,对中英文混杂的表述理解自然,而且对新版AndroidX、Compose的版本知识更新及时。它在“生成某个完整功能模块”时表现不错,我很多从零到一的功能骨架是让它写的。
工具这种东西,没有必要迷信某一个。我的习惯是:补全用Copilot,问答用灵码,查最新API用Android Studio官方助手,三个配合着来。
| 工具 | 强项 | 弱项 |
|---|---|---|
| GitHub Copilot | 行级补全、上下文连贯性好 | 聊天式生成弱于专门的大模型对话工具 |
| Android Studio AI Assistant | 与IDE深度绑定、能引用源码文档 | 网络稳定性影响大,偏问答式 |
| 通义灵码 | 中文理解好、响应快、版本知识新 | 行级补全的“贴合感”略逊于Copilot |
1.2 AI最擅长替安卓开发扛下的三类活
用了一段时间之后,我总结出AI在当前安卓开发里最划算的三类工作。
第一类是机械的样板代码。Adapter、ViewHolder、Repository、ViewModel的模板结构,这些东西写起来不费脑子但费时间,AI生成得又快又准。曾经有人质疑“这些代码我自己写也就五分钟”,可当你有十几个列表页面时,五分钟乘以十几,差距一下就出来了。
第二类是文档密集型的API片段。牵涉到ContentProvider、FileProvider这类需要精确配置的组件时,AI往往能直接把完整代码连带XML配置一起给出来。比如那个常见的安全性问题——App对外暴露FileProvider的路径时要注意授权范围,AI给出的模板里通常会带<exported>false</exported>这样的安全配置,比你翻文档快得多。
第三类是报错诊断。把一个Logcat堆栈扔给它,让它指出最可能的原因和修复顺序,属于“AI翻文档能力”的最佳应用场景。安卓的崩溃栈往往又长又绕,人眼看半天不一定有头绪,AI对已知异常模式的识别准确率相当高。
这三类活有一个共同特点:有相对标准的答案。AI本质上是从海量已有代码里总结出“最常见写法”,而这三类任务的“最常见写法”恰恰就是最好的写法。
1.3 完成度评估:什么样的代码适合直接采用
很多刚接触AI辅助开发的朋友容易走极端:要么完全不信任AI给的代码,逐行重写;要么直接复制粘贴,跑不通再回来骂AI。真正的做法是建立一套快速验收标准。
我自己的判断维度有五条:第一,代码是否只依赖了项目里已有的依赖;第二,是否有明显超过当前需求的设计——比如你只让它写一个列表,它给你引了三个新库,这种直接否决;第三,涉及异步的操作有没有处理好取消和异常;第四,是否遵守了当前项目的包结构和命名习惯;第五,关键逻辑有没有依赖AI“编”出来的接口。
这五条里,第五条最重要,也最容易踩坑。AI在生成代码时,如果拿不准某个API是否存在,有时候会“一本正经地编一个”,这种情况在第三方SDK接入时尤其普遍。下文的踩坑部分我会专门展开讲。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 起项目:让AI从零搭一个标准安卓应用的脚手架
2.1 描述需求的方式决定了脚手架的质量
让AI帮你创建安卓项目的第一步,不是让它写代码,而是把你的描述武装到足够精确。你要是只说“帮我创建一个安卓应用”,它给你的东西大概率是脱节的示例代码。
我通常会按这个模板来要求AI生成方案:
帮我整理一个安卓新项目的初始化方案,要求:Kotlin语言,minSdk 26,targetSdk 34,UI体系使用Jetpack Compose,包名com.example.signin,依赖包含ViewModel、Room、Retrofit、DataStore,自带基础目录分层(data/domain/ui),Activity用单Activity架构。
这样几个关键决策点全部明确。AI不需要替你做技术选型,你的需求描述本身就是初步架构方案。你会发现,需求说清楚之后,AI给出的目录结构通常和我手工搭建的几乎一致。因为它学习过大量项目的标准分层方式,只要你不给它“即兴发挥”的空间,它产出的骨架比你从头写还要规整。
2.2 Gradle配置版本问题:AI的版本知识可能滞后
脚手架阶段最容易翻车的点是Gradle版本管理。AI的记忆里可能存着半年前的版本信息,而这半年AGP和Gradle的配套关系已经可能发生变化。比如AGP 8.2要求Gradle 8.2以上,如果你的项目里被写成了Gradle 7.6,首次构建大概率直接报错,你还会一脸懵,以为是代码写错了。
我的做法是双保险:第一步,让AI生成build.gradle.kts时明确要求它备注版本号来源;第二步,自己去Android开发者官网看一眼最新稳定的AGP版本,再对照官方的Gradle映射表去校正。
下面是一版我最终使用的Kotlin DSL配置片段,以Android Studio目前常见的稳定版本为例:
kotlin复制plugins {
id("com.android.application") version "8.2.2" apply false
id("org.jetbrains.kotlin.android") version "1.9.22" apply false
id("org.jetbrains.kotlin.plugin.compose") version "2.0.0" apply false
}
注意compose编译器插件现在和Kotlin版本号对齐,不再是以前那种单独的composeOptions。AI不一定知道这个变化,如果你看到它让你单独配kotlinCompilerExtensionVersion,就知道它给的答案是历史版本。
2.3 首次Build失败的常规处理方式
就算你给了精确需求,AI生成的初始项目第一次Build失败也是常态。我把这个当成流程的一部分,而不是事故。常见的失败类型就三种:依赖版本对不上、Kotlin编译器版本和Compose不兼容、Gradle下载依赖超时。
处理的顺序也有讲究。先看Gradle Sync报错,这是基础。Sync过了再Build,Build过了再跑设备。很多人喜欢一步步追问AI“为什么报错”,我倒建议先自己看错误前缀:如果是Could not find开头的就是依赖仓库问题,如果是Unresolved reference就是代码层面的import问题,不同问题处理方式完全不同,别把所有问题都一股脑丢给AI。
有个实用技巧:Build失败后,在Android Studio里点击“File > Sync Project with Gradle Files”,然后再Build一次。不要急着改代码,很多Sync后面跟着的错误是同一个根因衍生出来的。你修复根因后,那一串错误其实会自己消失。
3. 核心业务代码:AI生成与人工验收的配合节奏
3.1 把大需求切成小任务,一次只问一件事
在项目进入业务功能开发后,我最大的心得是:永远不要让AI一个提示词生成整个模块的全部代码。比如你想做一个“打卡记录”功能,包含打卡、历史列表、统计三个页面,你一次性提问,它会把所有代码糅在一起,风格不稳定,边界也混沌。
正确的做法是拆件。把“打卡功能”拆成:数据库表结构设计、数据仓库层、ViewModel状态管理、UI层展示、交互事件处理。每一个小任务单独生成,单独验收。你可能会觉得这样很慢,但算上返工成本,一次到位其实是更快的。
以打卡记录为例,我的提问是:
我现在有一个打卡记录表records,字段包括id、date、type、note,用Room实现DAO,查询方法要支持按日期倒序分页,请生成DAO和对应的数据类,不要写Repository。
这个提示词里包含了“字段定义、技术栈、查询条件、生成范围、禁止项”五个要素。AI给出的代码,基本不用大改就能编译通过。如果你省略了最后那句“不要写Repository”,它会自作主张把上层也写了,而它写的Repository可能和你项目里已有的依赖注入方式完全对不上。
3.2 AI生成代码后的四个验收点
无论AI生成的代码看起来多么完整,我在合入主分支之前,一定会过四个验收点。
第一是编译验收。./gradlew assembleDebug能通过是最低要求,跑不过的一律打回重写。第二是运行验收。不是编译过了就完,要至少在模拟器和真机各跑一次,重点看交互路径有没有崩溃。第三是边界验收。这一点经常被忽略——AI生成的处理函数往往只覆盖了正常路径,你要手动给它喂几个异常输入,比如空字符串、无网络、权限被拒,看它是否做了防御。第四是规范验收。检查它是否符合项目里已有的架构习惯,比如项目统一用StateFlow管理状态,AI却写了个LiveData,这种就必须改评,哪怕功能是对的。
四个验收点里,运行验收最花时间但最值。AI写出的代码经常会有一种“看起来对,实则没处理生命周期”的问题,比如在协程里做耗时操作却没有考虑ViewModel被销毁时会怎么样。这种问题只有跑起来才会现出原形。
3.3 ViewModel加协程这类架构代码适合AI,核心判断要留给自己
我还有一条明确的边界原则:架构骨架类的代码,比如ViewModel的创建、Repository的实例化、Flow的转换链,这些交给AI非常划算;但核心业务规则,比如打卡的周期怎么算、连续签到如何判定,这类逻辑我会自己动手改,或者至少一行行读明白AI生成的代码。
举个例子。让AI生成一个简单的ViewModel,它会给你这样的代码:
kotlin复制class SignInViewModel(private val repository: SignInRepository) : ViewModel() {
private val _signInState = MutableStateFlow<SignInState>(SignInState.Idle)
val signInState: StateFlow<SignInState> = _signInState.asStateFlow()
fun signIn(date: LocalDate) {
viewModelScope.launch {
repository.recordSignIn(date)
_signInState.value = SignInState.Success(date)
}
}
}
这段代码从语法到结构都没问题,甚至可以“出师”了。但问题在于业务规则:今天是周末,能不能补签?一天能不能重复打卡?这些判断逻辑AI不会自己想到,它只会机械地执行你表面上的意图。我的做法是让AI先把基础架构搭好,然后在它生成的代码上追加业务判断。别期待AI自动理解业务规则,它的极限在于“如何写”,而“写什么”是你的责任。
4. UI层开发:AI在Jetpack Compose里的实战体验
4.1 描述式UI生成可以完成多少工作
Jetpack Compose对AI辅助开发简直是量身定做的土壤。原因很简单:Compose的代码是“声明式”的,界面长什么样,代码就长什么样,AI非常容易理解“UI描述”和“实现代码”之间的映射关系。
实际体验里,你只要说出界面要素,AI返回的代码就有九成能直接跑。比如我想要一个带进度记录的签到页面,提示词是:
写一个Compose方法,顶部是显示本周完成率的卡片,中间是一个CircularProgressIndicator,下方用LazyColumn展示每天的签到记录,每行显示日期和签到状态,状态用绿点标记。
半分钟内它给的代码就能填充到一个Scaffold里直接预览。Compose在这种场景下和AI是双赢的关系,AI适合生成结构明确的代码,Compose恰好就是结构明确的UI框架。
但这里有一个度的问题。AI能把“要素”变成“代码”,但还不能把“审美”变成“代码”。你描述的颜色、间距、动效,它默认给的全是Material规范里的标准值,出来的界面层次感往往不够丰富。我自己会先从AI拿到可运行的初稿,再花时间去调Spacing、Elevation和动画曲线。这部分不是AI不聪明,而是你的审美没有通过文字完整传给它。
4.2 动态图标和进度条:AI处理图形逻辑的边界
热搜里很多人关心安卓动态图标、进度条这些偏细节的组件。我的实测结论是:基础情况AI完全能帮你搞定,但涉及图形数学的地方要人工兜底。
进度方面,CircularProgressIndicator带动态进度动画,AI生成起来很顺手。比如要从30秒倒计时动画进度,你告诉它“根据剩余秒数平滑更新进度”,它就知道用animateFloatAsState加Animatable来处理,代码质量没问题。
但“动态图标”就没那么顺利了。自适应图标加AnimatedVectorDrawable,AI能生成基础资源的壳子,但一旦涉及复杂的路径动画,比如你想要的是一条线条从一端画到另一端,这里面的路径数据,AI经常会处理得不对。PathData的语法本身就不常用,人写都容易错,AI纯粹是根据记忆生成,翻车概率不低。
我的建议是:动态图标这种小而尖的需求,让AI负责框架代码和布局,但路径动画的核心PathData自己参考官方模板来写,或者用Android Studio自带的Vector Asset工具生成。不必硬靠AI。
4.3 Compose和XML两个体系下,AI生成的差异
如果你还维护着传统的XML布局项目,你会发现AI在两个体系下的表现差距明显。Compose下面的代码密度高,一个界面元素对应的代码区域集中,AI容易保持上下文;XML布局则是属性分散、标签嵌套深,AI生成的布局经常多包几层无用的LinearLayout,或者把dp写错位置。
我自己维护的老项目里,XML布局的AI辅助使用率不高。AI更适合帮我把XML布局改写成Compose版本,而不是直接生成新的XML。举例来说,把一段传统LinearLayout布局换成Compose的Column加Modifier,AI会给出干净的迁移结果,这个任务的规则性强,很适合它。
所以在选型层面,新项目我建议直接上Compose,一方面是你写代码更爽,另一方面是之后AI辅助的收益也更高。长远看,Compose会是安卓开发的主流方向,这个趋势目前已经很明确了。
5. 调试排错与单测补全:AI当助手而不是裁判
5.1 把Logcat堆栈扔给AI的正确姿势
调试与测试阶段,AI的价值同样不可小瞧,但要讲究提问方式。很多人犯的错误是只扔一段崩溃日志,问“为什么崩了”。这种做法得到的回答往往非常泛,因为信息不够。
正确姿势是:堆栈信息加相关代码片段加场景描述,三者缺一不可。我会按这个格式:
我的App在Android 14上点击列表项后崩溃,以下是堆栈和点击事件代码,请问最可能的原因是什么?注意我只在Android 14上复现了问题。
这种具体描述下,AI的回应效率大幅上升。它能结合“Android 14特有的行为变化”和“你点击事件的处理逻辑”来推断。要知道,很多崩溃埋藏在API行为差异里,人脑去回忆Android 14改了哪些行为很费劲,AI读过的版本更新文档比你多得多。
5.2 AI补单测:覆盖率变高了,但有效性要看清楚
让AI补单元测试,是我目前认为“投入产出比”最高的用法之一。我让AI给项目里的工具类和方法生成单元测试,XML配置、网络解析器、日期工具这种纯逻辑模块,它生成的测试覆盖度很可观。
但有一条经验你必须知道:AI写的测试,有时候就像迎合你而存在的代码。你让它提高覆盖率,它可能用“断言结果不为空”这种几乎没有任何约束力的语句来凑数。它不笨,它只是按你的指令执行。
我现在的做法是,让AI把算法逻辑抽成纯函数后,再补测试。比如连续签到天数计算,抽成calculateStreak(dates: List<LocalDate>): Int,这种纯输入输出性质的方法,AI生成的测试质量稳定很多。涉及Context、Database交互的部分,则自己手动写测试,不让AI发挥。边界划清楚了,AI补测试就是白赚的工时。
5.3 三个AI编码中最容易踩的坑
最后把我在实际使用中踩过的坑集中说下,都是真实案例。
第一个坑是过时API。AI记忆里的API库存在明显的时间截点。它曾让我用一个已经废弃的AsyncTask接口去处理网络请求,功能上没报错,但运行在主线上的阻塞问题非常严重。处理方式很简单:生成代码后,凡是遇到陌生API先瞄一眼官方文档,确认不是废弃接口。
第二个坑是上下文漂移。同一个功能拆了好几个对话后,AI对前面上下文的记忆会模糊,生成的代码风格可能前后不一致。我现在的应对是:每个功能模块用独立的对话窗口,窗口内把需求重复一遍再发问,避免隔空对话。
第三个坑是幻觉接口。前面提过,AI在拿不准的时候会编方法名。有一次它生成了一个FileUtils.getExternalStoragePath(),实际上这个类在当时的项目里根本不存在。这类错误隐藏得很好,因为编译错误会准确指向这一行,但如果你不仔细看会误以为是没导入包。解决方式就是多看生成的代码,而不是盲目信任。
上面这些坑,本质上都是同一个问题:AI是概率模型,不是知识库。它能给出“看起来最合理”的答案,但不保证答案真实存在。把这个底层逻辑想通了,你对结果就会多一份审慎,而这恰恰是AI辅助开发里最重要的心态。
我自己的感受是,AI辅助安卓开发已经从“玩具”变成了“应手”。它解决的不是“能不能写”的问题,而是“能省多少”的问题。但省下来的时间,最终要靠你更强的验收能力去兜底。如果你能做到“让AI多干活,但每一份产出都有人形审”,这套工作流会一直稳下去。
