Android 7系统国际化(七)Resources 与 AssetManager 源码剖析
系列目录第一篇全景图与调用链路概览 | 第二篇Locale 与 LocaleList | 第三篇Configuration | 第四篇LocalePicker | 第五篇ActivityManagerService | 第六篇ActivityThread | 第七篇Resources 与 AssetManager | 第八篇总结与实战建议一、为什么这是整个系列的核心前六篇追踪了语言偏好如何从用户指尖传到 AMS再传回应用进程。但传回去之后呢“——应用代码里写了getString(R.string.hello)Configuration 的 locale 从zh-CN变成了en-US返回的字符串怎么就从你好变成了Hello”答案就在Resources/ResourcesImpl/ResourcesManager/AssetManager这一套资源管理体系中。这是整个国际化链路的最后一公里——也是最硬核的一公里。二、四层资源管理架构┌──────────────────────────────────────────────────────────┐ │ Resources.java ← 公共 API开发者直接使用的类 │ │ getString(), getDrawable(), getDimension()... │ ├──────────────────────────────────────────────────────────┤ │ ResourcesImpl.java ← 核心逻辑实现 │ │ 配置差异计算、缓存清除、AssetManager 配置下发 │ ├──────────────────────────────────────────────────────────┤ │ ResourcesManager.java ← 全局单例管理 Resources 缓存 │ │ MapResourcesKey, WeakReferenceResourcesImpl 缓存池 │ ├──────────────────────────────────────────────────────────┤ │ AssetManager.java ← Java 到 Native 的桥梁 │ ├──────────────────────────────────────────────────────────┤ │ AssetManager.cpp ← Native 资源索引与查询 │ │ ResourceTypes.cpp ← resources.arsc 二进制解析 │ ├──────────────────────────────────────────────────────────┤ │ resources.arsc ← APK 中的资源索引表 │ │ res/values/strings.xml, res/values-zh-rCN/strings.xml... │ └──────────────────────────────────────────────────────────┘源码路径frameworks/base/core/java/android/content/res/Resources.javaframeworks/base/core/java/android/content/res/ResourcesImpl.javaframeworks/base/core/java/android/app/ResourcesManager.javaframeworks/base/core/java/android/content/res/AssetManager.javaframeworks/base/libs/androidfw/AssetManager.cpp三、ResourcesManager —— 全局缓存池ResourcesManager是应用进程中的全局单例管理所有ResourcesImpl实例的缓存。当语言切换后它负责创建或复用对应语言配置的ResourcesImpl。源码路径frameworks/base/core/java/android/app/ResourcesManager.javapublicclassResourcesManager{// 以 ResourcesKey 为 key 的缓存池WeakReference 允许 GC 回收privatefinalArrayMapResourcesKey,WeakReferenceResourcesImplmResourceImplsnewArrayMap();/** * 获取或创建 Resources 对象。 * 先查缓存缓存未命中时创建新的 ResourcesImpl。 */publicResourcesgetOrCreateResources(IBinderactivityToken,ResourcesKeykey,ClassLoaderclassLoader){synchronized(this){// 1. 查缓存ResourcesImplimplfindResourcesImplForKeyLocked(key);if(impl!null){returngetOrCreateResourcesForActivityLocked(activityToken,classLoader,impl);}// 2. 缓存未命中创建新的 ResourcesImplimplcreateResourcesImpl(key);mResourceImpls.put(key,newWeakReference(impl));returngetOrCreateResourcesForActivityLocked(activityToken,classLoader,impl);}}/** * 配置变更时更新所有缓存的 ResourcesImpl。 * 这是 ActivityThread.handleConfigurationChanged 调用的方法。 */publicfinalbooleanapplyConfigurationToResourcesLocked(NonNullConfigurationconfig,NullableCompatibilityInfocompat){// 遍历所有缓存的 ResourcesImpl逐个更新for(intimResourceImpls.size()-1;i0;i--){ResourcesKeykeymResourceImpls.keyAt(i);ResourcesImplrmResourceImpls.valueAt(i).get();if(r!null){r.updateConfiguration(config,null,compat);}else{mResourceImpls.removeAt(i);// 已被 GC 回收的清理掉}}returntrue;}}关键设计ResourcesKey包含mOverrideConfiguration其中含有 locale 信息。当用户切换语言后新的 Configuration 产生新的 keyfindResourcesImplForKeyLocked()查不到缓存 →createResourcesImpl()创建新的ResourcesImpl→ 内部AssetManager用新 locale 重新索引资源。由于WeakReference的存在旧ResourcesImpl在无引用后会被 GC 回收。四、Resources —— 开发者视角的门面源码路径frameworks/base/core/java/android/content/res/Resources.javapublicclassResources{privateResourcesImplmResourcesImpl;// 委托给 ResourcesImplpublicResources(AssetManagerassets,DisplayMetricsmetrics,Configurationconfig){mResourcesImplnewResourcesImpl(assets,metrics,config,newDisplayAdjustments());}NonNullpublicStringgetString(StringResintid)throwsNotFoundException{returngetText(id).toString();// 委托给 getText()}publicvoidupdateConfiguration(Configurationconfig,DisplayMetricsmetrics,CompatibilityInfocompat){mResourcesImpl.updateConfiguration(config,metrics,compat);}}关键设计Resources是门面FacadeResourcesImpl是核心实现。从 Android 7 开始这个分离逐渐强化——Resources保持稳定的公共 APIResourcesImpl独立演化。getString()最终通过mResourcesImpl.getAssets().getResourceText(id)走到 Native 层。五、ResourcesImpl —— 配置更新的终点ResourcesImpl是资源管理体系中真正干活的类。配置变更到达这里后完成缓存清除、AssetManager 配置下发等关键操作。源码路径frameworks/base/core/java/android/content/res/ResourcesImpl.javapublicclassResourcesImpl{privatefinalAssetManagermAssets;// Native 资源管理器privatefinalConfigurationmConfiguration;// 当前配置快照// 各种资源缓存privateDrawableCachemDrawableCache;privateConfigurationBoundResourceCacheAnimatormAnimatorCache;privateConfigurationBoundResourceCacheStateListAnimatormStateListAnimatorCache;publicvoidupdateConfiguration(Configurationconfig,DisplayMetricsmetrics,CompatibilityInfocompat){synchronized(mAccessLock){// 1. 计算实际配置变更finalConfigintconfigChangescalcConfigChanges(config);// 2. 多语言匹配从多语言列表中选取最佳匹配LocaleListlocalesmConfiguration.getLocales();if(locales.isEmpty()){localesLocaleList.getDefault();mConfiguration.setLocales(locales);}if((configChangesActivityInfo.CONFIG_LOCALE)!0){if(locales.size()1){String[]availableLocalesmAssets.getNonSystemLocales();if(LocaleList.isPseudoLocalesOnly(availableLocales)){availableLocalesmAssets.getLocales();}if(availableLocales!null){finalLocalebestLocalelocales.getFirstMatchWithEnglishSupported(availableLocales);if(bestLocale!nullbestLocale!locales.get(0)){mConfiguration.setLocales(newLocaleList(bestLocale,locales));}}}}// 3. ⭐ 关键将配置下发给 Native 层 AssetManagermAssets.setConfiguration(mConfiguration.mcc,mConfiguration.mnc,adjustLanguageTag(mConfiguration.getLocales().get(0).toLanguageTag()),mConfiguration.orientation,mConfiguration.touchscreen,mConfiguration.densityDpi,mConfiguration.keyboard,keyboardHidden,mConfiguration.navigation,width,height,mConfiguration.smallestScreenWidthDp,mConfiguration.screenWidthDp,mConfiguration.screenHeightDp,mConfiguration.screenLayout,mConfiguration.uiMode,Build.VERSION.RESOURCES_SDK_INT);// 4. 清除与配置变更相关的缓存mDrawableCache.onConfigurationChange(configChanges);mColorDrawableCache.onConfigurationChange(configChanges);mAnimatorCache.onConfigurationChange(configChanges);mStateListAnimatorCache.onConfigurationChange(configChanges);}}}关键设计calcConfigChanges()会调用mConfiguration.updateFrom(mTmpConfig)同时完成两件事——计算差异位掩码和更新配置快照。这意味着mConfiguration在updateConfiguration()返回前就已经被更新为新配置后续的setConfiguration()使用的是新配置值。关键设计多语言匹配逻辑在这里再次出现——getFirstMatchWithEnglishSupported()从用户的多语言列表中选取应用实际有翻译资源的最佳匹配语言。如果 App 只翻译了zh-CN而用户首选是zh-TW系统会降级到zh-CN。六、AssetManager —— Java 到 Native 的桥梁源码路径frameworks/base/core/java/android/content/res/AssetManager.javapublicfinalclassAssetManagerimplementsAutoCloseable{privatelongmObject;// Native AssetManager 的 C 指针publicAssetManager(){mObjectnativeCreate();}// 将配置下发给 Native 层16 个参数逐一传递publicnativefinalvoidsetConfiguration(intmcc,intmnc,Stringlocale,intorientation,inttouchscreen,intdensity,intkeyboard,intkeyboardHidden,intnavigation,intscreenWidth,intscreenHeight,intsmallestScreenWidthDp,intscreenWidthDp,intscreenHeightDp,intscreenLayout,intuiMode,intmajorVersion);// 查询资源文本/*package*/nativefinalCharSequencegetResourceText(intident);// 获取系统 ROM 中所有已翻译的语言列表publicnativefinalString[]getLocales();privatenativelongnativeCreate();}关键设计setConfiguration()是 Native 方法JNI16 个参数逐一传递。getResourceText()内部将资源 ID 传给 C 层查询返回的CharSequence直接从字符串池中取出。七、Native 层AssetManager 的资源表索引C 层AssetManager是资源匹配的真正引擎。源码路径frameworks/base/libs/androidfw/AssetManager.cpp7.1 核心数据结构classAssetManager:publicAaptAssetManager{ResTable*mResources;// 资源表ResTable_config mConfig;// 当前配置Native 版 ConfigurationVectorasset_pathmAssetPaths;// 已加载的资源包列表};ResTable_config是 Configuration 的 Native 对应结构体源码路径frameworks/base/libs/androidfw/ResourceTypes.hstructResTable_config{uint32_tsize;union{struct{uint16_tmcc;uint16_tmnc;charlanguage[2];// ⭐ zh, en, jacharcountry[2];// ⭐ CN, US, JPuint8_torientation;uint8_ttouchscreen;uint16_tdensity;uint8_tkeyboard;uint8_tnavigation;uint16_tscreenWidth;uint16_tscreenHeight;uint16_tsdkVersion;uint16_tminorVersion;uint8_tscreenLayout;uint8_tuiMode;uint16_tsmallestScreenWidthDp;uint16_tscreenWidthDp;uint16_tscreenHeightDp;charlocaleScript[4];// ⭐ Hans, HantcharlocaleVariant[8];// ⭐ 变体};};};关键设计language[2]是 2 字节——对 “en”、“zh” 两字节语言刚好。三字节语言如 Filipino “fil”使用localeScript字段存储。7.2 setConfiguration()源码路径frameworks/base/libs/androidfw/AssetManager.cppvoidAssetManager::setConfiguration(constResTable_configconfig){const_castResTable_config(mConfig)config;constsize_t NmAssetPaths.size();for(size_t i0;iN;i){mAssetPaths[i].resTable-setParameters(mConfig);}}关键设计遍历所有已加载的资源包APK将新配置传给每个ResTable使其在下次查询时用新配置进行匹配。八、资源匹配算法 —— 以 getString 为例R.string.hello (资源ID 0x7f040001) │ ▼ ResTable::getEntry(entryIndex) │ 根据资源 ID 找到 ResTable_entry │ 该 entry 包含多个 config 变体 │ ▼ 遍历该 entry 的所有 config 变体按优先级排列 ├── config_0: language, country → values/strings.xml ├── config_1: languageen, country → values-en/strings.xml ├── config_2: languageen, countryUS → values-en-rUS/strings.xml ├── config_3: languagezh, country → values-zh/strings.xml └── config_4: languagezh, countryCN → values-zh-rCN/strings.xml │ ▼ ResTable_config::match(mConfig) 匹配算法 对每个候选 config计算与当前 mConfig 的匹配度 │ ├── language 完全匹配 → 高优先分 │ language 为空通配→ 低优先分 │ language 不匹配 → 排除 │ ├── country 完全匹配 → 分 │ country 为空 → 低分 │ country 不匹配 → 排除 │ ├── script 匹配 → 分 │ └── 任何维度的值不兼容且非空 → 直接排除 │ ▼ 选择匹配分最高的 config │ 并列最高分 → 选择在 resources.arsc 中先出现的 │ ▼ 从该 config 对应的资源池中取出实际值 │ config_4 (zh-CN) 的字符串池中 → 你好 │ ▼ 返回 你好 → CharSequence8.1 匹配规则的精髓关键在于排除 vs 降级的区别如果候选 config 的 language 是 “en” 而请求是 “zh”直接排除如果候选 config 的 country 是 “”空而请求是 “CN”不排除降级匹配如果候选 config 的 language 是 “”通配默认值永远可匹配优先级最低关键设计这解释了为什么values/strings.xml无语言后缀永远能匹配上——它是最终兜底的默认值。九、resources.arsc —— 编译后的资源索引表resources.arsc由 AAPT 在编译期生成是二进制格式的资源索引resources.arsc ├── ResTable_header # 文件头包数量 ├── StringPool # 全局字符串池 │ ├── hello │ ├── app_name │ └── ... │ ├── ResTable_package (packageId 0x7f) # 应用资源包 │ ├── packageName com.example.app │ │ │ ├── TypeSpec (typeId 0x04) → strings │ │ ├── entry(0x0001) hello → 指向多个 variant │ │ │ ├── variant_0: config(values) → StringPool offset → Hello │ │ │ ├── variant_1: config(values-zh-rCN) → StringPool offset → 你好 │ │ │ └── variant_2: config(values-ja) → StringPool offset → こんにちは │ │ └── ... │ │ │ ├── TypeSpec (typeId 0x02) → drawables │ └── ... │ ├── ResTable_package (packageId 0x01) # 系统资源包 │ └── ... │ └── StringPool 其他字符串池...编译前XML→ 编译后arsc的对应关系编译前 编译后resources.arsc ───────── ───────────────────────── res/values/strings.xml StringPool offset 42: Hello string namehelloHello/string res/values-zh-rCN/strings.xml ResTable_entry hello { string namehello你好/string configs: [ {locale:, value42}, {locale:zh-CN, value128}, res/values-ja/strings.xml {locale:ja, value256} string namehelloこんにちは/string ] }9.1 资源 ID 编码每个资源 ID如0x7f040001编码了完整信息0x 7f 04 0001 │ │ └── entry index条目编号 │ └── type index04string, 02drawable... └── package id0x7f应用, 0x01系统 framework-res十、完整数据流回顾用户点击English │ ▼ [第四篇] LocalePicker.updateLocales(LocaleList(en-US)) │ config.setLocales(locales); config.userSetLocale true │ ▼ [第五篇] AMS.updatePersistentConfiguration(config) │ 权限检查 → updateConfigurationLocked(persistenttrue) │ SystemProperties.set(persist.sys.locale, en-US) │ mSystemThread.applyConfigurationToResources() ← system_server 自身先更新 │ 遍历 mLruProcesses → scheduleConfigurationChanged(configCopy) │ ▼ [第六篇] ActivityThread.handleConfigurationChanged(config) │ mResourcesManager.applyConfigurationToResourcesLocked(config, compat) │ ▼ [第七篇] ResourcesManager.applyConfigurationToResourcesLocked(config, compat) │ 遍历所有缓存的 ResourcesImpl → 逐个调用 updateConfiguration() │ ▼ ResourcesImpl.updateConfiguration(config, ...) │ calcConfigChanges(config) ← 计算差异并更新配置快照 │ getFirstMatchWithEnglishSupported ← 最佳语言匹配 │ mAssets.setConfiguration(mcc, mnc, en-US, ...) ← 下发配置给 Native │ mDrawableCache.onConfigurationChange(configChanges) ← 清除缓存 │ ▼ [Native] AssetManager.setConfiguration(config) │ ResTable::setParameters(config) ← 更新所有资源包的匹配参数 │ ▼ 下次 getString(R.string.hello) 或 inflate XML 时 │ ResTable::getEntry() → 根据新 locale 重新匹配 config variant │ → 从新语言的字符串池中取出 Hello │ → 返回给 Java 层 │ ▼ getString(R.string.hello) → Hello而非你好十一、小结要点说明资源管理架构Resources门面→ ResourcesImpl实现→ AssetManagerJNI 桥→ C 引擎缓存策略ResourcesManager以ResourcesKey含 Configuration为 key 缓存WeakReference允许 GC 回收配置变更响应ResourcesManager.applyConfigurationToResourcesLocked()遍历所有缓存的ResourcesImpl逐个更新配置传递终点ResourcesImpl.updateConfiguration()→mAssets.setConfiguration()多语言匹配getFirstMatchWithEnglishSupported()从多语言列表中选取最佳匹配缓存清除onConfigurationChange(configChanges)传入差异位掩码按变更类型选择性清除Native 匹配ResTable_config::match()算法language → country → script 逐级打分兜底机制values/目录无语言后缀永远可匹配优先级最低下一篇预告第八篇本系列最后一篇将回顾完整调用链总结各层关键设计思想并给出应用层的实战建议。本系列源码基于 AOSP 7.xAPI 24/25各版本可能存在差异请以实际代码为准。

相关新闻

GetJobs终极指南:如何用AI智能求职助手实现自动化投递,告别海投烦恼

GetJobs终极指南:如何用AI智能求职助手实现自动化投递,告别海投烦恼

GetJobs终极指南:如何用AI智能求职助手实现自动化投递,告别海投烦恼 【免费下载链接】get_jobs 💼【AI找工作助手】全平台自动投简历脚本:(boss、前程无忧、猎聘、智联招聘) 项目地址: https://gitcode.com/gh_mirrors/ge/get_j…

2026/10/17 10:23:34 阅读更多 →
MobaXterm中文版终极指南:如何在Windows上快速搭建专业远程开发环境

MobaXterm中文版终极指南:如何在Windows上快速搭建专业远程开发环境

MobaXterm中文版终极指南:如何在Windows上快速搭建专业远程开发环境 【免费下载链接】Mobaxterm-Chinese Mobaxterm simplified Chinese version. Mobaxterm 的简体中文版. 项目地址: https://gitcode.com/gh_mirrors/mo/Mobaxterm-Chinese 还在为Windows系统…

2026/10/16 18:23:55 阅读更多 →
探索Giffy Dialog核心组件:从GiffyBottomSheet到EntryAnimation全解析

探索Giffy Dialog核心组件:从GiffyBottomSheet到EntryAnimation全解析

探索Giffy Dialog核心组件:从GiffyBottomSheet到EntryAnimation全解析 【免费下载链接】giffy_dialog A Flutter package for a quick and handy giffy dialog. 项目地址: https://gitcode.com/gh_mirrors/gi/giffy_dialog Giffy Dialog是一个功能强大的Flut…

2026/10/17 5:13:38 阅读更多 →

最新新闻

第一个 MCP 服务器:从 SDK 到可用的 tools/resources/prompts,TaoToken 统一 Key 通道实践

第一个 MCP 服务器:从 SDK 到可用的 tools/resources/prompts,TaoToken 统一 Key 通道实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:33:04 阅读更多 →
OpenRouter 2026 重磅更新:Agentic Web Tools 统一大模型联网搜索与页面抓取,TaoToken 统一 Key 通道实测

OpenRouter 2026 重磅更新:Agentic Web Tools 统一大模型联网搜索与页面抓取,TaoToken 统一 Key 通道实测

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:33:04 阅读更多 →
C# 集成 OnnxRuntime 部署 PP-Vehicle 车辆分析全流程

C# 集成 OnnxRuntime 部署 PP-Vehicle 车辆分析全流程

简介:本资源为基于 C# 与 Onnx 的 PP-Vehicle 车辆分析完整源码,面向具备一定 C# 与深度学习部署基础、希望快速落地车辆视觉分析功能的开发者。项目整合车辆检测、车型识别、车辆颜色判别与车牌检测等多项能力,可用于智能交通、停车场管理、…

2026/10/19 0:32:03 阅读更多 →
open-code-review:可审计、可干预的开源代码审查框架

open-code-review:可审计、可干预的开源代码审查框架

1. 这不是又一个“AI代码审查工具”,而是开发者自己掌控审查权的起点“open-code-review”这个项目名乍看平平无奇,甚至有点像某个被遗忘在GitHub角落的冷门仓库——没有炫酷的UI,不提“秒级修复”,也不承诺“零Bug交付”。但如果…

2026/10/19 0:31:03 阅读更多 →
Hermes Agent 中 Skills 与 Tools 的关系分析:从 TaoToken 统一 Key 通道看能力编排

Hermes Agent 中 Skills 与 Tools 的关系分析:从 TaoToken 统一 Key 通道看能力编排

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:31:03 阅读更多 →
【AI】codex 使用教程:从 AGENTS.md 到 skills 的完整配置指南

【AI】codex 使用教程:从 AGENTS.md 到 skills 的完整配置指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:29:02 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →