Phone App解锁模拟IC资源:从资料整理到离线知识库 📅 发布时间:2026/8/28 17:17:20 👁 浏览次数: 做模拟IC相关工作的朋友应该都有过这种体会资料太多能用的太少。我的手机里一度躺着几百个PDF从运放datasheet到电源模块应用笔记散落在各个下载目录里真到要用的时候反而翻不到。后来我认真做了个决定——自己动手做一款手机App把这些模拟IC资源系统地整理、解锁、离线化让它们在现场调试、选型对比、给新人讲课的时候都能派上用场。这篇就完整记录一下这个“Phone App解锁模拟IC资源”项目的思路、数据结构和踩坑过程。如果你也是硬件工程师、模拟IC应用工程师或者正在学电子的大四/研一学生这篇应该能给你一些直接能用的参考。不管你是想照着做一个自己的资源库App还是只想把手里那堆“吃灰资料”整理得能打一点里面的思路和方法都可以移植。1. 从找资料到抄作业模拟IC工程师的手机资源困境1.1 一个数据手册引发的半小时先说一个特别典型的场景。有一次我在实验室调试一块电源板板上用了某家的升降压芯片负载一加大输出纹波就异常。我初步怀疑是补偿网络的参数选得不对想翻一下datasheet里关于补偿设计的推荐值。结果电脑在工位工位在楼上我手里只有一台手机。于是我掏出手机开始找资料先打开搜索引擎输入芯片型号跳出来一堆第三方网站点进去有广告、有诱导下载真正的datasheet藏在层层跳转后面。好不容易找到原厂PDF是用手机浏览器打开的页面缩放、翻页都还行可一旦想搜索“compensation”这个关键词手机浏览器里那个可怜的“在页面中查找”功能根本不给力翻了好几页才找到。等我把补偿电阻的推荐值对应到自己的设计时半小时已经过去了。这种体验你应该也不陌生。做模拟IC的不比其他数字芯片——随便对着原理图就能把功能猜个七八分。模拟芯片的行为高度依赖外部电路datasheet里的典型应用电路、曲线图、Layout指南往往比芯片本身更关键。搞不到准确的参考设计资料调试就是瞎子摸象。1.2 模拟IC资源比其他芯片资源更“厚重”这也是我在项目开始前反复想的一件事为什么模拟IC资料这么难整理数字芯片的资料相对标准化功能框图、寄存器表、时序图结构清晰篇幅也有限。模拟IC呢一份高性能运放的datasheet动辄50页起步里面包含开环增益曲线、共模抑制比曲线、不同温度下的失调电压分布、输入偏置电流与温度的关系图……这些曲线图在选型和故障排查时缺一不可。更头疼的是同一个器件会有一大堆关联文档主版本datasheet、早期版本datasheet、勘误表errata、应用笔记application note、参考设计含原理图PDF、PCB Layout图、BOM表、选型指南、SPICE模型、封装信息、可靠性报告。这些文档分布在不同页面、不同板块有的还在不同网站上。如果只是把PDF下载到手机里用一个文件管理器去看那跟没用差不多。你需要的不只是“文件”而是“资源”——可检索、可关联、可离线使用、可以按参数筛选的活数据。这正是我决定做这个App的初衷把分散在厂商网站上、工位电脑里、同事微信里的模拟IC资源统一解锁成一个手机上的知识库。1.3 “解锁”到底解锁什么这个项目叫“Phone App Unlocks Rich Analog IC Resources”我理解的“Unlocks”有两层意思。第一层是字面意义上的解锁App里预置的免费资源有限大量扩展资源包需要用户主动下载、激活后才可用。在部分受管控的设备上系统默认禁止App从外部链接下载内容这就需要App自己实现一套应用内下载与解锁机制把资源真正“放”到用户手里。第二层是更深层的让沉睡在PDF里的内容“解锁”。光有一个文件名不是解锁能让用户搜索到、能按参数筛选、能从一个器件跳到它配套的应用笔记和参考设计这才叫解锁。很多工程师手里不是没资料而是资料无法被有效地消费。这个App要解决的就是让每一份模拟IC资源都能被快速定位和复用。2. 资源库的地基先把文档喂成结构化数据做App之前我差点直接动手写界面。后来一想如果底层没有一套清晰的资源组织方式界面做得再花哨也是空中楼阁。模拟IC资源库的第一课不是写代码而是设计数据结构。2.1 资源分类比你想的要多我一开始想的很简单觉得资源就分三类datasheet、应用笔记、参考设计。等真正整理了一轮之后才发现远远不够。我的分类清单最后长这样datasheet主文档、历史版本、勘误表errata、早期预览应用笔记应用笔记是模拟IC资源里含金量最高的部分之一很多设计经验只写在这里参考设计原理图PDF、PCB Layout图、BOM、Gerber文件有些厂商提供选型指南按功能分类的产品选型手册尤其适合前端选型时快速过滤SPICE模型.lib、.mod、.cir等仿真模型文件还有对应的仿真工具版本说明封装信息机械封装图、CAD符号、焊盘建议可靠性/质量数据车规项目必查包括失效率、认证报告、PCN产品变更通知这个分类直接影响后续的检索和关联。如果只笼统地把所有PDF丢进“文档”目录后面做参数化选型时就会很痛苦。2.2 元数据设计让每份文档有“身份证”分类只是第一步。更关键的是给每份资源配一套完整、统一的元数据。我是用JSON来描述每份资源的一个最小可用的结构长这样{ id: res-opa2376-ds, device: OPA2376, vendor: TI, category: datasheet, title: OPA2376 Precision, Low-Power Operational Amplifier, version: E, date: 2024-03, params: { supply_min: 2.2, supply_max: 5.5, gbw: 5500000, iq: 0.00019, vos_max: 0.0001, rail_to_rail: true }, tags: [opamp, precision, low-power], files: [ { name: datasheet.pdf, path: docs/ti/opa2376/datasheet.pdf, size: 2400000, md5: ... }, { name: opa2376.model, path: models/ti/opa2376.model, size: 8000, md5: ... } ], related: [app-notes/ti/sboa123] }这里有几个字段我特别想强调一下。params字段非常关键它是参数化选型的基础。把datasheet里最核心的几个参数抽出来用统一的单位和键名存好后面做筛选就方便了。比如运放我固定抽取供电范围、GBW增益带宽积、静态电流、输入失调电压、是否轨到轨这几个。换成电源芯片就抽输入电压范围、输出电压、最大输出电流、开关频率、静态电流。related字段用来建立关联关系。一份datasheet可以关联到对应的应用笔记、参考设计、SPICE模型用户从器件详情页就能一键跳转不用再去搜索框里重新输入型号。files.md5字段是后来加上的。因为模拟IC资源经常更新厂商会修订文档的某个章节重新发布PDF。如果App端不校验文件完整性用户下载到一半失败或者服务器上的文件被更新过本地还保留着旧版本很容易拿着过时文档做设计。加MD5校验可以准确判断本地资源是否需要更新。2.3 资源包格式与版本管理单个资源的元数据定义好之后下一个问题是这些资源怎么打包分发我的方案是做成“bundle”资源包一个模拟IC主题或一组关联文档打成一个zip压缩包。压缩包内部包含manifest.json资源包的版本号、作者、发布说明、包含的资源ID列表resources/所有PDF、模型文件等thumbnails/封面缩略图方便App列表展示版本号我用了语义化版本规则主版本号.次版本号.修订号。资源内容或元数据结构有重大调整时升主版本号新增资源时升次版本号只是修正描述文字、补个关键词时升修订号。App启动后会拉取一个全局的index.json索引文件里面记录着所有可用资源包的版本信息。App拿本地已有的资源包版本号跟索引比对就知道哪个包需要增量更新。这样做的好处是用户不需要每次全量下载所有资源流量消耗和等待时间都大幅降低。这个数据结构从落地到现在我大概调整了三次。第一次分类太粗导致后面没法做针对性的筛选第二次没有params选型功能根本做不出来第三次补了MD5和版本信息才算真正支持断点续传和更新机制。所以我的建议是动手做App之前先把资源模型想透彻这能帮你躲过后面一半的坑。3. 下载限制与离线包App的资源获取机制设计资源包定义好之后紧接着就遇到一个很现实的问题这些包怎么到用户手机里3.1 为什么不能直接全部从服务器下载最理想的情况当然是App安装后用户按需从服务器下载所有资源。但实际使用中不能这么干。首先是体积问题。我整理的第一批模拟IC资源大概包含30个器件的完整文档包压缩后就接近500MB。让用户一次性下载既不现实也容易被应用商店和用户反感。必须拆分成多个包按需下载。其次是环境问题。很多工程师工作用的手机是企业配发的设备管得很严。我的一个同事就遇到过这种情况他用的手机被公司MDM移动设备管理策略管控App里点下载链接系统直接弹了一个提示内容大致是“downloading external resources is disabled”意思就是外部资源下载被禁用了。这种情况在混合开发App比如用WebView加载远程页面里更容易出现。第三是网络稳定性。实验室、生产车间、外地出差很多场景的网络环境都不好一个大文件下载到一半断掉是常事。如果App没有断点续传和失败重试机制用户的体验会很差。3.2 排查“downloading external resources is disabled”的完整链路这个“下载被禁用”的问题我前前后后排查了很久这里把过程完整记录下来省得你再踩一遍。第一步先搞清楚是哪个环节在拦截。我在App里加了日志输出把下载请求的URL、来源、触发的组件全部打出来。结果发现同一个下载链接在Android原生环境里用系统DownloadManager下载是正常的但在WebView内点击下载时就会触发那个“external resources disabled”的提示。问题就出在WebView层。很多混合开发框架或者App里嵌入了远程H5页面页面里点了下载链接默认会走WebView的下载流程。但如果WebView没有注册setDownloadListener或者宿主App的网络配置里禁止了外部资源请求系统就会直接拒绝下载。第二步检查Android WebView的设置和权限。WebSettings里有一个setBlockNetworkLoads开关如果被置为true所有网络请求都会被拦更别提下载文件。另外setMixedContentMode如果设置成MIXED_CONTENT_NEVER_ALLOWHTTPS页面里的HTTP资源也会被禁。第三步确认是不是设备管控策略。如果App本身设置没问题但下载依然被禁就要怀疑设备层面。可以试试在另一台普通手机上安装同样的App如果能正常下载基本就是设备策略的问题。这种场景下最稳妥的办法是绕过WebView下载改用App的原生下载模块。我的最终方案是App里所有资源下载都走原生DownloadManager或自研下载任务不依赖WebView。代码层面对WebView的下载事件做了接管webView.setDownloadListener(new DownloadListener() { Override public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) { // 不直接走系统下载而是交给App自己的下载管理器 if (ResourceDownloadManager.checkStoragePermission(context)) { ResourceDownloadManager.start(url); } else { // 在应用内引导用户授权 showPermissionGuide(); } } });这样即使WebView层禁了外部资源下载应用内原生的下载任务依然可以正常工作。同时我还在代码里判断了设备存储权限Android 6及以上要动态申请WRITE_EXTERNAL_STORAGEAndroid 11及以上推荐使用MediaStore或App私有目录避免分区存储的兼容性问题。3.3 预置资源包 应用内下载管理解决了“能不能下载”的问题接下来是怎么下载体验最好。我的设计是“预置精简包 按需下载扩展包”的组合。App安装包内置一份很小的精简资源包大概50MB左右包含最常用的几个器件型号的datasheet和关键应用笔记保证用户第一次打开就能用。其余资源都放在扩展包中用户按需下载。下载管理器除了常规的进度显示、暂停、继续以外我加了三个比较实用的功能断点续传记录每个文件已下载的字节数网络中断后恢复下载时从断点继续不重新开始完整性校验下载完成后计算文件MD5跟服务器端manifest里的MD5比对不一致自动重试自动解压下载完的资源包自动解压到App数据目录并在本地SQLite里建立索引为什么这么设计因为模拟IC资源包往往有几个GB的累积体积任何一次完整下载失败都可能导致用户放弃使用。断点续传和MD5校验看似基础却是能真正用起来和只是能安装之间的分水岭。这里也顺带说一下热词里那个“save all resources”。这个功能其实就是在离线场景下的完整资源下载——用户点击“保存全部资源”App会把所有扩展包排队下载到本地。数据量大的时候我会先检查剩余存储空间不够的话直接提示用户清理避免下载到一半因为空间不足而失败。4. 解锁不等于下载检索、关联与参数化选型资源包到了手机里如果只是能看PDF文件那跟网盘有什么区别这个App真正的价值在于把“文件”变成“可检索、可筛选、可关联”的知识系统。4.1 全文检索PDF进来之后如何变“活”我最开始设想的功能是在手机上搜索“低失调电压运放”“支持2.2V供电”之类的自然语言关键词App能返回匹配的器件和文档。要实现这个PDF必须先被解析成可检索的文本。PC上解析PDF有很多现成库但要在Android手机上原生解析选择就不多了。我选的是开源的PDF解析库把PDF文本层抽取出来写入SQLite的FTS全文检索表。这样用户在搜索框输入关键词时可以同时匹配标题、器件型号、厂商、分类和正文内容。建表用FTS5虚拟表CREATE VIRTUAL TABLE IF NOT EXISTS doc_fts USING fts5( title, device, vendor, category, content, tokenize unicode61 ); INSERT INTO doc_fts(rowid, title, device, vendor, category, content) VALUES (?, ?, ?, ?, ?, ?);这里有个小坑模拟IC的datasheet里充满各种单位和数字比如“uV”、“nV/√Hz”、“mA”、“kHz”。如果直接分词搜索“uA”这样的关键词时结果往往不准确。我后来在索引前做了一遍文本预处理把单位统一成无格式的字符串比如“uA”转成“ua”“kHz”转成“khz”搜索时也做同样的转换匹配率提升了不少。4.2 参数化选型把datasheet的关键参数变成筛选条件全文检索解决了“我记得文档里有这个词但找不着”的问题但工程师选型的时候更需要的是“按参数筛”。举个例子项目需要一个单电源、3.3V供电、带宽至少5MHz、静态电流不超过0.5mA的运放最好还是轨到轨输出。这时候你希望App能像电商筛选商品一样把符合条件的器件列出来。这个功能依赖的就是前面说的params字段。我把每个器件的关键参数抽出来后在SQLite里建一张器件参数表每行存储一个器件的最核心参数。筛选时执行SELECT device, vendor, gbw, iq, vos_max FROM devices WHERE category opamp AND supply_min 3.3 AND supply_max 3.3 AND gbw 5000000 AND iq 0.0005 AND rail_to_rail 1 ORDER BY iq ASC;查询结果直接以列表展示每一项再进详情页就能看datasheet和参考设计。就是这个功能让我在客户现场选型时从“翻半小时资料”变成了“30秒出结果”。值得提醒的是params字段的提取工作需要花大量时间。有些参数在datasheet里写得比较隐晦比如“输入偏置电流”可能有两个参数常温典型值和全温范围最大值。我会把两个值都存进去分别命名ib_typ和ib_max查询时用单独的条件。宁可字段多一点也不要漏掉关键参数。4.3 资源之间的关联跳转单纯能检索、能筛选还只是治好了“找不到资源”的病。真正让我觉得这个App“好用”的是资源之间的关联跳转。一个典型的关联场景是这样的我在看某个运放的datasheet发现它提到一个应用笔记专门讲“如何降低精密运放输入偏置电流”这时候如果App能直接跳到那份应用笔记体验就非常顺畅。我用的是一张简单的关系表CREATE TABLE resource_relations ( src_resource_id TEXT, dst_resource_id TEXT, relation_type TEXT, note TEXT, PRIMARY KEY(src_resource_id, dst_resource_id) );relation_type字段说明资源间的关系比如“referenced_in”“same_device”“eval_board_of”等等。用户点详情页的时候App查询这张表把所有关联资源显示在页面上。这个功能看起来简单但需要资源整理者非常熟悉模拟IC领域。哪些应用笔记是经典之作哪些参考设计真正管用哪些勘误表必须提醒用户注意都需要人工判断。我整理第一批30个器件时光是关联关系就标了400多条但每一条在后面实际使用时都派上了用场。4.4 “Save All Resources”离线全量保存的细节确认了检索、筛选、关联这三个核心功能后我补了“Save All Resources”这个听起来简单但很关键的入口。“保存全部资源”实现起来比想象中麻烦。核心问题是它需要遍历所有资源包逐个下载、校验、解压、建立索引任何一个环节失败都要能自动恢复。我把整个下载过程设计成有状态的任务队列每个资源包是一个任务新任务进入队列标记为pending下载开始标记为downloading下载完成并校验MD5标记为verifying解压完成并建立索引标记为done下载失败标记为failed自动进入重试队列最多重试3次用户可以在界面上看到每个包的下载进度和状态。如果下载过程中网络断开重连后自动从断点续传。这样即使资源包很大也不怕中断。有一点要提醒如果你的目标用户有相当一部分使用企业管控手机那么“Save All Resources”往往会触发设备策略限制导致下载失败。遇到这种情况我会在App里内置一个“导出资源包”功能让用户把压缩包放到手机本地再通过App的“本地导入”入口手动导入。从合规和设备兼容性的角度看这是一个非常稳妥的备份方案。5. 实测记录从吃灰资料到能打的知识库以及踩过的坑任何工具只有实际用起来才知道好不好用。下面记录一下我把第一批资源整理完真正开始使用时碰到的问题。5.1 用真实项目验收电源芯片选型测试项目是一个便携式医疗设备内部用一节锂电池供电需要产生3.3V和5V两路电源。3.3V给MCU和传感器5V给一个小型泵。输入电压范围需要覆盖3V到4.2V负载变化很大——泵启动瞬间电流能到1.5A。我先在App里用“升压”“降压”“升降压”进行分类筛选要求输入电压覆盖锂电全范围输出5V时最大电流1.5A。App从参数表里筛出了三颗主流器件的升降压方案再点进每颗器件的详情页对比静态电流和开关频率。这些数据如果从厂商官网查至少要打开十几个页面还要自己在一个个Excel或PDF里翻但在App里我只花了不到三分钟。这份“三分钟选型”的体验在之前的工具流程里是做不到的。也正是这次实测让我确认了参数化选型的价值坚定了继续完善资源库的决心。5.2 坑1PDF解析在Android上的乱码问题第一次跑通全文检索时我兴冲冲地导入了一批datasheet结果一搜很多文档的正文全是乱码根本匹配不上关键词。排查过程很曲折。先怀疑是PDF解析库的编码问题换了两个库还是一样。后来解压了PDF文件用文本编辑器直接看内部的PDF对象才发现问题出在字体上。很多厂商早期的模拟IC datasheet用的是非嵌入字体non-embedded fontPDF文件里只记录了字体名称没有把字体文件嵌入进去。在电脑上Acrobat或浏览器会自动用系统字体替换看起来没问题但在Android的解析库环境里没有对应的字体映射文本提取出来就是乱码或空白。解决方案有两个方向。一个是在解析时手动映射字体另一个是在文本提取后做清洗。我最后采用了“双管齐下”的方式在PDF解析环节配置字体替换表把常见的Times、Helvetica、Courier等映射到Android系统自带字体在索引环节再次检查提取结果如果发现乱码比例过高自动标记该文档“解析质量低”并优先使用备用的目录提取文本。实际上对早年的扫描版文档最好的方案还是直接OCR这个下一节说。5.3 坑2大资源包下载到一半失败“Save All Resources”功能刚上测试版的时候我在一台旧手机上做了全量下载测试。30多个资源包下载到第17个的时候Wi-Fi断了任务直接卡在“downloading”状态既不报错也不继续。这个问题的根因是我在下载管理器里没有处理网络切换事件。Wi-Fi断开后网络栈返回了一个异常但我的代码只捕获了“文件下载失败”这一类异常网络切换超时导致的异常没有被正确处理任务就挂在那里了。修复方式是在网络请求层加超时控制和自动重连// 伪代码示意 DownloadTask task new DownloadTask(url); task.setOnFailure(throwable - { if (isNetworkAvailable(context)) { // 网络仍然可用直接重试 task.retry(); } else { // 网络不可用等待网络恢复后自动继续 NetworkCallback.register(task::retry); } });同时也为每个下载任务增加了3次失败重试重试间隔按指数退避1秒、2秒、4秒。如果是网络切换导致的瞬时失败基本一次重试就恢复了如果是服务器端文件损坏多次重试也不会成功这种情况下会明确提示用户“资源已失效请更新索引后重试”。5.4 坑3老文档的扫描件与OCR问题模拟IC领域有一个其他领域不太常见的问题很多经典芯片的早期datasheet和应用笔记是上世纪末用扫描仪扫出来的整个PDF就是一页页图片没有文本层。这类文档在全文检索里完全“隐身”用户搜不到。我的应对方案是给文档加了一个“是否扫描件”的标记。对扫描件App会优先展示封面缩略图并且提供一个“OCR识别”按钮调用Tesseract OCR引擎离线识别文本。离线识别的好处是文档内容不会传到外部服务器数据安全性有保障但缺点是识别速度和准确率都比较一般。对于扫描质量特别差的文档我选择只OCR封面、目录和关键参数所在页而不是整个文档。原因很简单全文OCR不仅耗时长还会产生大量识别错误反而干扰检索结果。只识别这几个核心页面配合人工标注的关键词已经能满足大部分搜索需求。一点经验分享OCR之后一定要人工抽查识别质量尤其是数字和单位。模拟IC的参数表格里充满了“2.2”“5.5”“0.19”这类数据一旦识别错一位小数参数化选型就会出大问题。我在OCR流程后面加了一个“人工复核参数表”的环节虽然费时间但这是对结果负责。6. 进阶玩法把Versal时钟架构手册这样的硬核文档也变成可查询资源App的基础功能稳定之后我开始想一个更大的问题这套“解锁资源”的思路是不是只能用在模拟IC上当然不是。同样的数据模型完全可以扩展到FPGA、MCU、电源模块甚至任何以文档为核心的技术领域。我拿“Versal Adaptive SoC Clocking Resources Architecture Manual”这份文档做了个试验效果让我挺惊喜。6.1 从模拟IC扩展到FPGA/SoC复杂手册Versal是Adaptive SoC它有一份专门的时钟资源架构手册讲的是整个芯片的时钟源、时钟区域、PLL配置、NoC时钟、PL时钟等等。这份手册比模拟IC的datasheet更厚结构化程度也更高。难点在于模拟IC的datasheet核心是“曲线和表格”而SoC手册的核心是“寄存器配置和时钟树架构”。用户往往想知道的不只是“某寄存器在哪”而是“我要产生一个100MHz的时钟应该走哪个路径配置哪些寄存器”。我的思路是把手册拆分成比“章节”更小的“知识单元”。比如时钟区域部分我把每个时钟区域单独作为一个资源条目描述它的用途、上下游连接、可配置参数把寄存器描述表转成SQLite表支持按寄存器名、偏移地址、位域名称查询。这样用户搜索“CLK_OUT”时App不仅返回手册PDF还能返回对应的寄存器位域说明和示例配置步骤。6.2 手册结构化寄存器表、时钟树图怎么处理这一类文档的表格非常适合转成结构化数据。比如寄存器表通常是这种格式OffsetNameBitsAccessDescription0x04CLK_EN[0]RWClock enable0x08CLK_DIV[7:0]RWDivider value我把这类表格提取成CSV再灌进SQLite。配合App里的筛选功能用户可以直接查“哪些寄存器跟PLL相关”“哪些位域是只读的”体验比翻PDF好了不知道多少倍。至于时钟树图这类图形化的信息没法直接结构化。我的处理方式是在每个相关资源里加上“前置图”预览用户点击时钟路径上的节点时能看到对应节点的文字说明和寄存器配置入口。相当于把PDF里的图变成了一个可交互的“地图”。6.3 从个人工具到团队资源库把这份手册放进App以后我发现这套方法论的价值已经超出了单纯“模拟IC资源”的范畴。它本质上是一个“文档资源结构化索引系统”。我开始把它用在团队内部。组里几个人共享同一个资源库我负责维护资源包和元数据他们只负责用手机App查询。反馈说最赞的功能不是PDF查看而是“搜到一份参考设计还能直接跳转到对应芯片的勘误表”——这在以前需要打开两三个网站才能做到。团队化之后资源包的管理变得更重要。我现在用Git仓库管理资源包的原始文件、元数据和打包脚本每次更新都走一次版本发布流程。新版本资源包上传到内网服务器用户在App里下拉刷新索引就会看到更新提示。整个过程不需要重新安装App体验很顺。如果你也想做类似的事情我的建议是先别急着写代码先把你手头的资源分类、命名、提炼参数和关联关系哪怕用Excel先记录下来。资源模型想清楚了App只是一个壳。有了壳之后你会发现那些以前躺在硬盘里的“吃灰资料”真的会变成一个随时能调用的知识库。而做到这一步之后你还会发现更多值得放进去的内容——这不仅是一个Project更是一个可持续成长的个人知识系统。