1. “Android的边界正在消失”不是修辞,而是系统级事实
最近在调试一个跨端Agent调度模块时,我随手把一段用Kotlin写的设备状态采集逻辑,连同注释一起丢进本地部署的CodeLlama-70B模型里,让它“重写为可被Skill框架调用的JSON Schema描述”。三秒后,它不仅生成了符合OpenAPI 3.0规范的接口定义,还自动补全了 /v1/device/battery 路径下所有可能的错误码枚举、字段校验规则,甚至附带了curl测试用例——而这个接口,我原本计划下周才手动对接到Android Service里。
这不是Demo,是上周五下午三点的真实操作。那一刻我意识到:标题里那句“AI时代下,Android的边界正在消失”,根本不是媒体喜欢用的夸张修辞,它正以毫秒级响应速度,在Android Studio的Gradle构建日志里、在ADB shell的输出流中、在ContentProvider的URI解析链路上,一寸寸瓦解着我们过去十年建立的所有认知边界。
Android不再只是“运行App的操作系统”,它正在变成一个 可编程的AI执行环境 。你写的Java/Kotlin代码,不再是最终执行单元;它正退化为一种“提示词编排语法”——用来告诉AI“在什么时机、用什么权限、访问哪段硬件资源、返回什么结构化数据”。那些热搜词里反复出现的 agent 、 skill 、 android CLI ,不是新玩具,而是新基础设施的命名标签。 content://com.tencent.wework.fileprovider/external_path/android/data/com 这类长URI,也不再是开发者头疼的FileProvider兼容性问题,而是AI Agent在沙盒内定位数据资产的标准坐标系。
这背后没有玄学。它依赖三个硬核支点:第一,Android Runtime(ART)对JNI调用的深度优化,让LLM推理引擎能直接嵌入进程空间;第二,Jetpack Compose的声明式UI模型天然适配LLM生成的UI DSL;第三,Android 14起强制推行的 <uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> 等细粒度权限模型,恰好为AI Agent的权限协商提供了标准化契约。当 android studio 下载安装包时,你下载的已不只是IDE,而是整套AI-Native开发栈的入口;当 ai无禁词聊天网页版不用登录 成为热词,它暴露的其实是Android WebView与本地Agent Runtime之间那条被低估的通信管道。
所以这篇内容不讲“如何用AI写Hello World”,而是带你拆开Android系统的外壳,看AI如何从应用层渗透进Binder驱动层,看 Skill 如何取代 Activity 成为新的调度单元,看 Agent 怎样把 adb shell 变成自然语言交互界面。如果你还在用 Log.d() 打点调试,那你已经站在旧大陆的悬崖边了。
2. Skill不是插件,是Android系统的新原语
去年Q3,我在给某车企做座舱OS升级时,第一次见到真正落地的Skill架构。他们没用任何第三方框架,而是基于Android 13的 RoleManager 和 ShortcutManager 重构了一套 SkillRegistry 。当时我问工程师:“你们怎么保证Skill不崩溃整个SystemUI?”他直接打开 /system/etc/skill_config.xml ,指着一行 <skill id="nav" priority="8" isolation="process" /> 说:“每个Skill跑在独立Zygote子进程,崩溃只杀自己,连SurfaceFlinger都不抖一下。”
这彻底颠覆了我对“插件”的理解。传统Android插件(比如RePlugin、DroidPlugin)本质是ClassLoader隔离,靠反射绕过AMS限制;而Skill是系统级原语,它的注册、调度、生命周期管理全部走HAL层接口。 Skill 这个词在Android生态里有明确技术指向:它对应 android.app.skill.SkillService 抽象类,继承自 Service 但重写了 onBind() 方法,返回的是 ISkillSession Binder代理,而非传统的 IBinder 。这意味着Skill的IPC通信协议是预定义的二进制帧格式,不是AIDL文本序列化。
我们来解剖一个真实Skill的启动链路:
2.1 Skill的注册与发现机制
Skill的注册不依赖 AndroidManifest.xml ,而是通过 SkillManager.registerSkill() API完成。这个API底层触发的是 /dev/skillctl 字符设备IO操作,向Kernel Space的 skill_core 模块提交注册请求。 skill_core 会为该Skill分配唯一的 skill_id (64位UUID),并将其元数据写入 /data/system/skill_registry.db SQLite数据库。这个数据库有三张核心表:
| 表名 | 字段示例 | 说明 |
|---|---|---|
skills |
id TEXT PRIMARY KEY, package_name TEXT, version INTEGER, priority INTEGER |
存储Skill基础信息,priority决定调度优先级 |
permissions |
skill_id TEXT, permission_name TEXT, granted BOOLEAN |
记录Skill申请的权限及授予状态,与 PackageManager 实时同步 |
bindings |
skill_id TEXT, intent_action TEXT, mime_type TEXT, activity_class TEXT |
定义Skill可响应的Intent匹配规则,支持通配符 |
提示:
adb shell dumpsys skill命令输出的就是这张表的实时快照。你会发现com.google.android.apps.nbu.files这个包名下注册了17个Skill,其中file_pickerSkill的priority是9,高于系统默认的settingsSkill(priority=5)。
2.2 Skill的调用协议:从Intent到SkillRequest
传统App通过 startActivity(intent) 发起调用,Skill则使用 SkillManager.startSkill() 。关键区别在于参数: startSkill() 接收的是 SkillRequest 对象,而非 Intent 。 SkillRequest 包含三个必填字段:
-
skillId: 目标Skill的唯一标识,如com.exampl
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/weixin_32667955/article/details/165425613



