ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Android系统应用开发入门:用 Android Studio 配 TaoToken 打通 AOSP 构建链路

Android系统应用开发入门:用 Android Studio 配 TaoToken 打通 AOSP 构建链路 1. 从应用开发切到 AOSP第一道坎到底卡在哪如果你已经能熟练用 Android Studio 写普通 App那说明 Gradle、Manifest、Activity 生命周期这些基础你都不缺。真正让人卡住的是从「写一个能装到手机上的 APK」切换到「写一个要进系统镜像、要引用 framework 隐藏 API、要跟 AOSP 源码树一起编译的系统应用」。这个跨度不是语言层面的而是工程链路层面的。我自己刚转系统应用那会儿最直观的感受就是代码在 Android Studio 里全是红色下划线import android.app.ActivityManagerInternal这种类根本找不到hide的 API 一个都调不出来。原因很简单你本地 SDK 里的android.jar是公开 API 的阉割版系统应用要用的那些内部接口它压根没有。于是你被迫去翻 AOSP 源码、手动配compileSdk、手动挂 framework 的 classes折腾一整天可能连一个模块都没导入成功。另一个高频痛点出现在「构建辅助」环节。系统应用模块动辄依赖几十个内部库Android.bp和Android.mk混着用编译报错信息又长又绕。这时候如果有一个稳定的模型通道帮你解释报错、补全Android.bp语法、生成AndroidManifest里的系统权限声明效率会差出好几倍。但很多人卡在「怎么在 IDE 里配一个统一的 Key/API 通道」这一步要么配置格式写错要么请求发不出去要么模型返回的内容跟当前 AOSP 版本对不上。这篇就围绕这个最小闭环来写在 Android Studio以及 ASfP里配好一条统一的模型通道让它同时支撑代码补全和构建辅助最后用一次真实的模块编译来验证整条链路是通的。示例场景我用系统设置类应用类似 TvSetting 那种来演示因为这类应用既有 UI 又有系统权限能覆盖大部分系统应用开发的典型依赖。2. TaoToken 在这条链路里扮演什么角色先把定位说清楚TaoToken 不是编辑器也不是编译器它是一条统一的模型 API 通道。你可以把它理解成「一个 Key 走通多个模型」的接入层。对系统应用开发者来说它的价值体现在两个地方。第一是代码补全和解释。AOSP 里大量hideAPI、SystemService调用、Binder相关代码公开文档很少遇到不认识的类只能翻源码。把模型通道接进 IDE 后你可以直接问「这个ActivityTaskManager的调用在 Android 14 上签名变了吗」比翻frameworks/base快得多。第二是构建辅助。Android.bp的语法、soong的模块类型、android_app和android_app_import的区别、privileged: true什么时候要加这些细节模型能帮你快速生成骨架你只需要核对版本差异。接入入口有三个按你的使用场景选模型对话验证模型是否可用、问 AOSP 问题https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewriteCoding Plan长期编码、Agent 场景适合把补全通道固定下来https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewriteAPI Keys生成和管理 Keyhttps://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite API 基址是https://taotoken.net/api这个不加 UTM直接填进配置里。注意Key 只存在你本地配置文件里不要提交到 AOSP 的 git 仓库。系统源码树经常要repo sync配置文件一旦被追踪同步时容易冲突。3. 可复制的配置骨架settings.json 与 config.toml这一节给两份能直接抄的配置。一份是给 VS Code / Cursor 这类走settings.json的编辑器远程编辑 AOSP 代码时常用一份是给走config.toml的 CLI 工具比如某些 coding agent。Android Studio 本身不直接读这两个文件但 ASfP 和远程编辑场景会用到所以先配好这两份后面 IDE 侧接入会引用同一个 Key。3.1 settings.json 骨架{ taotoken.enabled: true, taotoken.apiBase: https://taotoken.net/api, taotoken.apiKey: sk-你的Key填这里, taotoken.model: claude-sonnet-4-20250514, taotoken.completion.enable: true, taotoken.completion.maxTokens: 512, taotoken.completion.debounceMs: 300, taotoken.chat.systemPrompt: 你是 AOSP 系统应用开发助手回答时优先给出 Android.bp 和 AndroidManifest 片段注明 API 级别差异。, taotoken.excludeGlobs: [ **/out/**, **/.repo/**, **/prebuilts/** ] }几个参数说明一下。apiBase填https://taotoken.net/api不要带结尾斜杠。model按你实际可用的模型名填不同模型对长上下文 AOSP 代码的解析能力差别挺大建议先用模型对话页面测一下再固定。excludeGlobs很重要AOSP 的out/和.repo/目录动辄几十万文件不排除的话补全索引会卡死。3.2 config.toml 骨架[provider] name taotoken api_base https://taotoken.net/api api_key sk-你的Key填这里 model claude-sonnet-4-20250514 timeout_seconds 60 [completion] enabled true max_tokens 512 trigger auto [context] include_files [Android.bp, AndroidManifest.xml, *.java, *.kt] exclude_dirs [out, .repo, prebuilts, external] [agent] mode coding workspace /home/you/aospworkspace指向你的 AOSP 根目录。include_files里把Android.bp放第一位因为系统应用开发里构建脚本的补全需求比 Java 代码还高。提示两份配置里的 Key 是同一个。你只需要在 API Keys 页面生成一次然后复制到两个文件里。如果团队协作建议每人用自己的 Key方便排查请求来源。4. Android Studio / ASfP 侧接入步骤配置骨架有了接下来把它接进 IDE。分两条路径讲一条是普通 Android Studio 导入单个系统应用模块一条是 ASfP 直接打开 AOSP 源码树。4.1 普通 Android Studio 导入系统应用模块这种方式适合 Windows 环境也是大多数人上手最快的一条路。核心思路是把系统应用模块当成一个普通 Gradle 工程导入然后手动把 framework 的 classes 挂进来让红色下划线消失。第一步在 AOSP 根目录下找到你要开发的模块比如packages/apps/TvSetting。新建一个空目录作为工作区在里面建settings.gradlepluginManagement { repositories { google() mavenCentral() } } dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS) repositories { google() mavenCentral() } } rootProject.name TvSettingDev include :app第二步把模块的src、res、AndroidManifest.xml软链接或复制到工作区的app/下。软链接在 Windows 上要用mklink /DLinux 上用ln -s。第三步在app/build.gradle里挂 framework classesandroid { namespace com.android.tv.settings compileSdk 34 defaultConfig { minSdk 34 targetSdk 34 } compileOptions { sourceCompatibility JavaVersion.VERSION_17 targetCompatibility JavaVersion.VERSION_17 } } dependencies { compileOnly files(${aospRoot}/out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar) compileOnly files(${aospRoot}/out/target/common/obj/JAVA_LIBRARIES/tv_intermediates/classes.jar) }aospRoot在gradle.properties里定义。compileOnly表示只编译期引用不打进 APK因为系统应用运行时这些类由系统镜像提供。第四步把第 3 节的settings.json或config.toml放到 IDE 能读到的位置。Android Studio 本身不读这两个文件但如果你装了支持自定义 provider 的补全插件可以在插件设置里指向这个配置文件。ASfP 则可以直接在设置里填apiBase和 Key。4.2 ASfP 打开 AOSP 源码树ASfPAndroid Studio for Platform是官方给系统开发者的工具直接打开 AOSP 根目录索引整个源码树。它的接入更简单在Settings Tools TaoToken或对应插件面板里填API Basehttps://taotoken.net/apiAPI Key你的 KeyModel按需选然后File Sync Project with Gradle Files触发一次索引。ASfP 的索引比较吃内存建议给 IDE 分配至少 8GB 堆内存在studio.vmoptions里改-Xmx8192m。注意ASfP 现阶段对某些芯片厂商的定制源码树支持还不完善如果repo sync后索引一直失败先用普通 Android Studio 导入单模块的方式过渡。5. 一次编译验证确认整条链路是通的配置写完不算通要跑一次真实编译。这里用编译单个系统应用模块来验证因为这一步同时用到了 IDE 的代码解析和构建辅助通道。在 AOSP 根目录执行source build/envsetup.sh lunch aosp_arm64-userdebug mmm packages/apps/TvSettingmmm是编译单个模块的命令。如果编译成功你会看到类似输出[100% 12/12] Install: out/target/product/arm64/system/priv-app/TvSetting/TvSetting.apk看到Install:这一行就说明模块编译通过APK 已经进到out/target/product/.../system/priv-app/下。这时候回到 IDE检查两件事第一之前红色下划线的hideAPI 是否消失。如果还在说明classes.jar路径不对去out/target/common/obj/JAVA_LIBRARIES/下确认framework_intermediates/classes.jar是否存在。第二补全通道是否返回了跟当前 AOSP 版本匹配的建议。比如你输入ActivityManager.补全列表里应该出现getService这类内部方法。如果返回的是公开 API 文档里的内容说明模型通道没接上或者systemPrompt没生效。验证模型通道本身是否可用可以直接在模型对话页面发一条测试请给出 Android 14 中 android_app 模块在 Android.bp 里的最小定义包含 privileged 和 certificate 字段。正常返回应该是一段完整的Android.bp片段而不是泛泛的解释。如果返回内容跟 AOSP 版本对不上换一个模型再试。6. 本篇常见错排查6.1 红色下划线不消失最常见的原因是classes.jar路径写错。AOSP 编译产物路径跟 lunch 目标有关aosp_arm64-userdebug和aosp_x86_64-userdebug的out/目录结构不一样。用find out -name classes.jar -path *framework*确认实际路径再改build.gradle。另一个原因是compileOnly写成了implementation。系统应用的 framework 类不能打进 APK必须用compileOnly否则编译能过但运行时会ClassNotFoundException。6.2 请求发不出去或返回 401先检查 Key 有没有多余空格。从 API Keys 页面复制时容易带上换行粘到settings.json里就变成非法 JSON。用jq . settings.json验证一下格式。如果 Key 没问题检查apiBase是不是写成了https://taotoken.net/api/多了结尾斜杠。有些 HTTP 客户端会把//拼成//v1/chat/completions导致 404。6.3 补全索引卡死AOSP 源码树太大补全插件默认会索引所有文件。在settings.json的excludeGlobs里加上**/out/**、**/.repo/**、**/prebuilts/**、**/external/**。如果还卡把completion.debounceMs调到 500 以上减少请求频率。6.4 编译报 Android.bp 语法错误系统应用的Android.bp跟普通 Gradle 工程差别很大。常见错误是srcs里混入了res目录或者static_libs和shared_libs用反。把报错信息贴到模型对话里让它对照 AOSP 的build/soong文档解释比翻源码快。6.5 ASfP 索引失败先确认 JDK 版本。ASfP 要求 JDK 17用java -version检查。如果版本对但索引还是失败删掉.idea目录重新打开。AOSP 根目录下的.idea有时候会残留旧配置。7. 把通道固定下来长期编码更省心单次配置跑通之后如果你打算长期做系统应用开发建议把这条通道固定成 Coding Plan。原因是系统应用的依赖关系复杂每次换模块都要重新配classes.jar和Android.bp如果补全通道不稳定排查成本会叠加。Coding Plan 适合把模型通道作为长期编码基础设施来用接入方式在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 。日常遇到 AOSP 报错我的习惯是先把完整报错贴进模型对话让它给出Android.bp的修改建议再回 IDE 里改。这样比直接在 IDE 里试错快因为模型能同时看到构建脚本和 Java 代码的上下文。模型对话入口在 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。最后提醒一句系统应用开发里Android.bp的改动比 Java 代码更容易引发编译失败。每次改完Android.bp先跑一次mmm验证再继续写业务代码。这个习惯能帮你省下大量排查时间。
返回列表