第一次真正把 AIDE 当回事,是在一个挺狼狈的现场:临时被叫去救火,笔记本落在另一个城市,手边只有一台平板和一个没写完的安卓工程。要改的也不复杂——一个按钮文案、一处状态栏颜色、一个空指针。放在电脑上十分钟的事,当时只能硬着头皮在 10 英寸屏幕上找办法。那次之后我才认真研究起 AIDE 这类移动端全栈开发环境:它不是"手机版记事本",而是一套把编辑器、编译器、打包器、日志面板全部塞进设备本地的完整工具链。它能让你在没有电脑的情况下完成一个安卓应用从写代码到打出安装包的全过程,也支持网页工程、Java 控制台程序甚至 C++ 原生模块。这篇文章面向两类人:一类是经常需要现场改东西、想把设备变成应急开发机的从业者;另一类是刚入门、只有一台安卓设备就想动手写第一个 App 的新手。下面这些内容,全部来自我在真实场景里踩出来的经验。
1. 先搞清楚 AIDE 到底解决什么问题
1.1 三个真实场景,决定它到底有没有存在价值
很多人第一次听说"在手机上写代码",第一反应是"图个新鲜"。我一开始也这么想,直到它真的救过几次场,才明白这东西的价值不在于"替代电脑",而在于填补电脑不在身边的那些时间缝隙。
第一个场景是现场应急。客户那边演示前发现一个崩溃,改一个判空、换一个资源文件,重新打个包就能过。这种活儿的特征是:改动极小、时间极紧、没有电脑。用 AIDE 从打开工程到装上新包,熟练之后大概五到八分钟,比到处借电脑靠谱得多。
第二个场景是碎片时间验证想法。写业务代码的人都有这种体验:洗澡的时候突然想到一个实现思路,第二天坐到工位上热情已经没了。移动端开发环境的好处是,你可以在通勤路上把核心逻辑先用一个 Java 控制台工程跑通,验证算法对不对、边界条件有没有漏,等回到工位再搬进正式工程。这一步验证花不了二十分钟,但能省掉后面大量的返工。
第三个场景是学习曲线的前半段。新手最容易卡在"环境搭不起来"这一关:装开发套件、配环境变量、等依赖下载、处理版本冲突,一套流程走完人已经没脾气了。AIDE 这类工具把这一层全部封装掉了,装完就能建工程、写代码、点运行。它不适合做正式项目,但用来理解"一个安卓应用是由什么组成的"这件事,效率高得离谱。
注意:不要把 AIDE 当成主力生产工具来规划工作流。它的定位是"补位",不是"主力"。指望用它维护一个几万行的项目,最后难受的是自己。
1.2 能力边界:它擅长什么,不擅长什么
把边界摸清楚,比学会几个快捷操作重要得多。我按"能不能干"和"干得爽不爽"两个维度,把常见任务分了类:
| 任务类型 | 能否完成 | 实际体验 | 建议 |
|---|---|---|---|
| 单 Activity 的小工具、Demo | 完全可以 | 顺畅,接近桌面体验 | 首选场景 |
| 中等规模业务 App 的局部修改 | 可以 | 需要耐心,搜索跳转是关键 | 应急可用 |
| 大型多模块工程的日常开发 | 勉强 | 索引慢、内存吃紧 | 不推荐 |
| 网页前端(HTML/CSS/JS) | 可以 | 很轻快,改完刷新即可 | 强烈推荐 |
| Java 控制台算法验证 | 可以 | 非常顺手 | 强烈推荐 |
| 原生 C++ 模块 | 可以 | 需要额外工具链,配置繁琐 | 谨慎 |
| 复杂 UI 动效调试 | 困难 | 预览受限,靠反复安装 | 换桌面 |
| 性能剖析、内存快照 | 困难 | 工具缺失 | 换桌面 |
从这个表能看出来一件事:改动越局部、依赖越少、反馈回路越短,AIDE 的价值就越大。它最舒服的状态是"改一处、跑一次、看一眼",一旦进入需要全局搜索重构、需要看内存曲线、需要多设备对比的阶段,桌面环境仍然是不可替代的。
还有一个常被忽略的边界:输入效率。在玻璃上敲代码的真实速度大概是物理键盘的三分之一到二分之一,还得算上误触和光标定位的时间。所以我的判断标准很简单——这个任务如果敲击量超过两百行,就别在手机上硬撑了,把思路记下来,回去再写。
2. 整体架构与方案选型:它凭什么敢在设备上编译
2.1 本地编译链路拆解
理解这条链路,能帮你在大半的报错面前不慌。AIDE 的做法不是"把代码传到某个地方编译再拿回来",而是把整套构建工具搬进设备本地,用设备自己的处理器跑编译。这意味着断网也能构建,也意味着构建速度直接受设备性能约束。
一次完整的构建大概要经过这么几步:先是资源编译,把res/目录下的布局、图片、字符串表打包成二进制资源;然后是代码编译,把 Java 源码编译成字节码;接着是字节码转换,把 JVM 字节码转成安卓运行时能识别的格式;再往后是打包,把所有东西塞进一个压缩包;最后是对齐和签名。每一步都可能出问题,报错信息也各不相同,所以知道自己在哪一步,排查效率会差好几倍。
实测下来,一台中端设备构建一个几百行的小工程,从点下运行到装上应用,大概在十五到四十秒之间;换成旗舰设备能压到十秒左右。这个速度做小步验证完全够用,但如果你的工程依赖了十几个外部库,每次构建都像在等一锅水烧开,那就该考虑把这类工程的编译挪回电脑了。
这里有个很实用的判断方法:如果你的构建时间超过了两分钟,说明这个工程已经超出移动端环境的舒适区。构建时间本质上是"反馈回路长度",回路越长,你在设备上犯错的成本就越高。
2.2 工程模型的选择:传统结构还是构建脚本结构
AIDE 支持两种工程组织方式,选错了会在后面疯狂吃亏。
第一种是传统结构,工程目录里直接有AndroidManifest.xml、src/、res/、assets/、libs/,没有构建脚本。它的优点是构建极快、配置极少、报错直白,非常适合在设备上做小工程。缺点是依赖管理基本靠手动往libs/里丢文件,版本号、签名配置全写在清单文件里,工程一大就乱。
第二种是基于构建脚本的结构,也就是带build.gradle的那种。它能用上标准的依赖声明、构建变体、混淆配置,跟桌面工程可以无缝互相打开。代价是构建慢、内存吃紧,在设备上跑一次完整构建的等待时间会明显变长。
我的建议很直接:在设备上新建工程,一律选传统结构。理由不是它更先进,而是它更"抗折腾"——手机上最怕的就是等,传统结构能把这个成本压到最低。反过来,如果你只是要把电脑上已有的工程拿到设备上改两行,那就用脚本结构,别为了迁就设备去改工程组织方式,那样只会让两边都难受。
顺带说一个实际踩过的坑:同一个工程在两种结构之间来回切换,很容易出现资源 ID 对不上、缓存残留的问题。解决办法是切换后先做一次完整清理再构建,别指望增量构建能正确处理这种结构性变更。
2.3 存储与权限:新版本系统下最容易翻车的地方
这一块坑最深,而且报错信息往往跟真实原因毫不相干。
早些年应用可以直接往公共存储目录写文件,工程放哪都行。后来存储权限收紧了,应用默认只能访问自己的私有目录。于是出现一种很典型的现象:工程建在公共目录下,编辑器能打开、能改、能保存,但一构建就失败,报的却是"找不到资源"或者"文件不存在"。真实原因是构建进程没有权限读那个路径。
排查顺序我总结成这样:先确认工程是不是放在应用私有目录或者应用有权访问的位置;再确认清单里申请的存储权限跟当前系统版本的行为是否匹配;最后才去看具体的文件路径到底存不存在。顺序颠倒过来查,很可能在错误的路上绕半小时。
还有一个隐形的坑是路径里的空格和中文。某些构建环节对路径的处理不够健壮,遇到空格会截断。这个问题的恶心之处在于它时好时坏——有的环节能处理,有的不能,于是你会在"能跑"和"不能跑"之间反复横跳。规避方法很土但很有效:工程目录名只用英文字母、数字和下划线,别用空格,别用中文。
提示:把工程放在应用私有目录下还有一个额外好处——卸载重装时数据会被清掉,但备份和恢复更可控;放在公共目录则相反,工程还在,但权限问题会一直跟着你。
3. 核心细节拆解与实操要点
3.1 编辑器与补全:把玻璃屏幕用出键盘的效率
在手机上写代码,效率瓶颈从来不是"打字慢",而是"定位难"。所以我的第一优先级不是练打字,而是把编辑器的辅助功能全部打开,让工具替我承担定位工作。
补全功能要开,但期望值要放低。它能补全当前文件里的符号、常见的 API 调用,但跨文件的语义分析能力远不如桌面环境。实际用下来的感受是:补全适合"确认拼写",不适合"发现 API"。别指望它提示你某个类有哪些方法,老老实实查文档更快。
真正提升效率的是这几个操作,我几乎每次都会用:全局搜索(找某个字符串出现在哪几个文件)、跳到定义(顺着调用链往上摸)、批量重命名(改一个变量名不用一个个找)、代码折叠(把不关心的段落收起来,只留正在改的那几十行)。特别是全局搜索,它是移动端开发的命脉——屏幕小,看不全,靠肉眼找文件纯属自虐。
还有一个细节值得说:自动缩进和括号匹配一定要开。玻璃键盘上打括号、分号、引号是最容易出错的地方,少一个括号引发的报错往往要翻半天。开启括号自动补全后,你只需要删掉多余的那个,出错率能降一大截。
至于外接键盘,如果你打算在设备上认真干活,一个折叠蓝牙键盘带来的提升是碾压性的。但要注意输入法的配合——有些输入法会拦截组合键,导致快捷键失效。真遇到这种情况,换一个精简输入法,问题通常就解决了。
3.2 构建配置里的那几个要命参数
小工程能不能顺利跑起来,八成取决于四个参数。我把它们和取值逻辑整理成了一张表:
| 参数 | 含义 | 常见取值 | 选错会怎样 |
|---|---|---|---|
| 最低支持版本 | 应用能装上的系统下限 | 21 / 23 / 24 | 设太高,老设备装不上;设太低,新 API 用不了 |
| 目标版本 | 适配行为基准 | 跟随主流,别太落后 | 太落后会导致权限、通知等行为异常 |
| 版本号(整数) | 内部比较用 | 每次发布自增 | 不递增,覆盖安装会失败 |
| 版本名(字符串) | 展示给用户看 | 语义化,如 1.2.0 | 纯展示,写错不影响安装 |
最低支持版本的选择有个实用的换算思路:它直接决定了你能不能用某些特性,也决定了要写多少兼容分支。举例来说,如果设成 21,你就得为权限申请写额外的判断分支;设成 23 以上,运行时权限模型就统一了,代码能干净不少。我的经验值是:个人工具类应用直接设 24,能省掉一大坨兼容代码。反正这类应用的用户群就是自己和小圈子,没必要为老设备背负担。
版本号的自增逻辑也值得说一句。我见过有人用"日期 + 序号"的方案,比如 2408151 代表某天第一个包。这个方案的好处是永远不会重复,坏处是数字膨胀得快,而且跟"发布顺序"没有严格对应关系。更稳的做法是维护一个纯递增整数,每次发布加一,简单粗暴不会错。
关于方法数上限这件事,小工程基本碰不到,但值得知道原理:单个可执行文件里的方法引用数量有 65536 的上限,超了就得做拆分。一个几百行的小应用距离这个数字还很远,但如果你往工程里塞了几个体积很大的依赖库,就可能触线。真遇到了,先考虑删依赖,再考虑拆分——在移动端环境里做多文件拆分,调试成本会陡增。
3.3 调试手段:没有电脑的时候怎么定位崩溃
这是很多人放弃移动端开发的原因:应用一崩,屏幕上只有一句"已停止运行",两眼一抹黑。实际上可用的信息比想象中多,关键是要知道去哪看。
第一顺位是日志面板。AIDE 内置了日志查看功能,能看到运行时的输出和异常堆栈。崩溃时最关键的是堆栈的第一行和最后一行:第一行告诉你异常类型,最后一行告诉你出错的具体文件和行号。中间那一坨调用链,在没有源码的情况下可以跳过。
第二顺位是自己埋日志。我给所有在设备上调过的工程都加了一条规矩:每个关键分支打一行带统一前缀的日志。这样在日志面板里按前缀过滤,剩下的就是自己关心的内容。这招看起来土,但在小屏幕上,过滤比滚动有用一百倍。
第三顺位是防御性捕获。在移动端调试时,我习惯在最外层的入口加一个全局异常捕获,把异常信息写到应用私有目录的一个文本文件里。这样即使日志面板刷太快没看清,回头还能翻文件。这个文件在应用卸载后会一起消失,所以定位完问题要第一时间处理掉。
关于断点调试,我的态度比较保守:能用,但操作成本高,在玻璃屏幕上设断点、看变量、单步执行,效率大概只有桌面的三分之一。我的实际做法是——能用日志解决的问题绝不上断点。断点留给那种"逻辑明明对但结果就是不对"的疑难杂症。
还有一类崩溃跟代码无关,纯粹是资源问题:图片太大导致内存溢出、布局层级太深导致测量超时、主线程做了耗时操作导致无响应。这类问题的特征是"改了代码也没用",得从资源本身下手。
4. 一次完整实操:从空工程到可安装包
4.1 初始化与目录规划
先说建工程这一步。打开工具后选择新建安卓应用,填三样东西:应用名、包名、最低支持版本。包名值得认真想一下,因为它是应用的唯一身份,装到设备上之后就改不了了——改包名等于换了一个应用,原来的数据全部读不到。
包名我一般用"反向域名 + 项目代号"的形式,全部小写,中间用点分隔,段数控制在三段左右。别用驼峰,别用中文,别用连字符。有些人喜欢把版本号也写进包名里,我个人不推荐,因为后续升级时你会被迫做数据迁移。
工程建好之后,目录结构大概是这样的:
工程根目录/ ├── AndroidManifest.xml # 应用清单,声明组件和权限 ├── src/ # 源码目录,按包名分层 │ └── com/example/demo/ │ └── MainActivity.java ├── res/ # 资源目录 │ ├── layout/ # 布局文件 │ ├── values/ # 字符串、颜色、尺寸 │ ├── drawable/ # 图片资源 │ └── mipmap/ # 应用图标 ├── assets/ # 原样打包的静态文件 └── libs/ # 第三方依赖包这个结构看起来简单,但我建议在建工程的第一分钟就做一件事:把字符串和颜色全部抽到values/下的资源文件里,布局和代码里只引用不写死。原因是在手机上改文案是高频操作,写死在布局里意味着你要在十几个文件里搜索替换;抽成资源后,只改一个文件就行。这个习惯在桌面开发里是规范,在移动端开发里是生存技能。
再补一个实操细节:res/drawable/里的图片文件名只能用小写字母、数字和下划线,不能大写,不能有连字符。这个限制在桌面环境里也很少有人踩,但在手机上手动往里拷文件时特别容易中招,报错还很不直观。
4.2 编码、运行、修复的循环
这个循环的效率决定了一切。我的操作习惯是:改完代码先不急着点运行,而是先在脑子里过一遍"这次改动会影响哪些地方",把可能出问题的分支用日志盖住,然后再构建。听起来多了一步,实际能省掉反复构建的时间。
构建成功后会提示安装。这时候有两种做法:直接用工具装上去调试,或者导出安装包手动装。前者快,后者适合要发给别人或者装到另一台设备。
第一次运行时最常见的问题不是崩溃,而是"装上了但打不开",或者"打开了但是白屏"。白屏的排查顺序我固定成三步:先看清单文件里有没有把入口 Activity 声明正确(这是最常见的低级错误);再看布局文件有没有语法问题导致解析失败;最后看代码里有没有在界面初始化阶段抛了异常但被吞掉了。
注意:清单文件里的组件声明是大小写敏感的,类名少一个大写字母就会导致运行时找不到组件。这个错误在手机小键盘上发生率极高,建议每次改动清单后专门检查一遍。
界面上手之后,就该处理真实的交互了。我的建议是先把一条主流程跑通,再补细节。比如一个记账工具,先把"输入金额、点保存、列表里能看到"这条链跑通,再去考虑分类、筛选、统计。在移动端环境里,跑通一条完整链路带来的信心远大于写一堆互不相连的功能。
4.3 打包、签名与产物校验
这一步是很多人卡住的地方,因为它涉及的环节最多,报错又最不直观。
先说要准备什么。安卓应用必须签名才能安装,签名需要一个密钥文件管着。如果只是自己调试,工具通常会用一个默认的调试密钥自动帮你签;但要发给别人装、或者长期维护,就必须自己生成一个正式的密钥文件,并且务必备份。密钥文件丢了,应用就再也无法覆盖升级,只能换个包名重新发——这是最惨的一种事故。
生成密钥的核心参数有四个:算法、密钥长度、有效期、别名。算法选非对称的常见方案,密钥长度我给的建议是 2048 位起步,有效期直接拉到 25 年以上。理由很朴素:这个密钥一旦用上,就得跟着应用一辈子,有效期设短了等于给自己埋雷。
签名之后还有个容易被忽略的步骤:对齐。简单说就是把压缩包里的内容按固定边界排列,让系统读取时更高效。这步不做,应用能装能跑,但会额外消耗内存。工具通常会把这个步骤自动做掉,如果你手动处理打包流程,记得补上。
最后是产物校验,这是发布前必做的一步。我固定检查四件事:安装包能不能在目标版本上正常安装;装上去能不能正常启动;清单里声明的权限是不是都是真正需要的;版本号和版本名是不是已经更新。第三项经常被忽略,而权限多余会直接影响用户信任度——一个手电筒应用要读通讯录,没人会不警惕。
这里补一个体积优化的实操判断。安装包变大主要是三部分:图片资源、依赖库、代码。图片是最好动的,一张 1080p 的界面截图如果按未压缩格式打包,轻松就是好几兆;转成压缩格式、或者干脆换成矢量图形,能省掉一个数量级。依赖库是第二好动的,把没用到的东西删掉,别为了一个工具类引入一整个库。代码部分最后再考虑,先用压缩混淆工具把没用的符号去掉。
5. 常见问题与排查速查
5.1 构建期报错怎么对号入座
构建报错最烦的是信息噪音大。我整理了一张对照表,涵盖了我在设备上遇到过的八成情况:
| 报错特征 | 大概率原因 | 处理动作 |
|---|---|---|
| 找不到资源文件 | 资源名大小写不对,或含非法字符 | 改成全小写 + 下划线 |
| 找不到符号 | 缺依赖包,或包名写错 | 检查libs/和导入语句 |
| 清单解析失败 | 标签未闭合、属性拼写错误 | 逐行核对清单结构 |
| 构建卡住不动 | 内存不足,或缓存损坏 | 清理缓存后重试,关掉后台应用 |
| 中文乱码 | 文件编码不是统一格式 | 统一改成 UTF-8 |
| 重复类冲突 | 两个依赖里含同名类 | 删掉其中一个,或改用不含重复的版本 |
| 构建成功但装上失败 | 签名不一致,或版本号未递增 | 统一签名,递增版本号 |
用这张表的时候有个前提:先看第一条报错,不要看最后一条。构建系统的输出往往是"一个根因引发一串连锁反应",最后那条通常是受害者,第一条才是元凶。我见过太多人盯着最后一行"构建失败"找半天,其实真正的错误在往上数二十行。
还有一类报错完全跟代码无关,纯粹是环境问题:存储空间不足、文件名过长、设备剩余内存太低。这类报错的特征是"同样的代码昨天能跑今天不行",遇到这种情况先别改代码,先看设备的剩余空间。
5.2 运行期报错:崩溃、无响应和白屏
崩溃的定位思路前面说过,这里补几个具体的场景。
空指针是最高频的。在移动端,屏幕旋转、应用切后台再切回来、系统回收内存,都会导致界面重建。如果代码里把某些对象的存在当成了默认事实,重建时就会拿到空值。我的防御习惯是:所有从界面里取到的组件引用,使用前都判一次空;所有在异步回调里用到的界面对象,回调用之前先确认界面还在。
无响应的触发条件是主线程被卡住足够久。常见的元凶是:在主线程读写文件、在主线程做网络请求、在主线程解析大块数据。这三个在移动端都属于"看起来很快,实际很慢"的操作。判断方法很简单——如果某个操作你在电脑上执行都要停顿一下,那它在手机上一定会卡界面。
白屏大多数时候是布局问题。可能是根布局的高度设成了包裹内容导致高度为零,可能是背景色和文字色撞了,可能是某个控件被设成了不可见。排查手法是先用一个最简单的纯色布局替换掉原布局,确认界面能出来,再一点点往回加。这种"二分法"排查虽然笨,但在小屏幕上比盯代码有效。
还有个隐蔽的坑:资源泄漏导致的越用越卡。表现是刚装上很流畅,用一会儿就卡。原因通常是长生命周期的对象持有了界面引用,导致界面销毁了内存还不释放。判断方法是在界面反复进出十几次,看内存占用是不是持续上涨。
5.3 踩过的几个体验坑
第一个坑是图片内存。很多人不知道一张图片解码成位图后占多大内存。举个例子,一张 4000×3000 的照片,按每像素 4 字节算,解码后就是 4000 × 3000 × 4 = 48,000,000 字节,差不多 45.8 MB。一个应用的总内存上限通常只有一两百兆,几张这样的图就能把应用撑爆。解决办法是按显示尺寸采样,把宽高按 2 的幂次缩小到接近屏幕尺寸,内存占用会掉到原来的几分之一。
第二个坑是布局层级。每多一层嵌套,界面测量和绘制就多一轮开销。我给自己定的规矩是层级不超过五层,能用相对定位解决的就不套线性容器。这个在电脑上看不出来,在手机上滑动时的跟手感差别很明显。
第三个坑是频繁刷新界面。列表滚动时如果没有做复用、每次都重新创建行视图,滚动就会一顿一顿的。这个问题的修复收益极高,值得优先处理。
第四个坑跟设备有关:不同设备的屏幕密度差异。同一个尺寸写死成像素值,在小屏上刚好,在大屏上就小得看不清。所以尺寸能写相对单位就别写绝对像素,能写密度无关单位就别写像素。
6. 和桌面环境怎么配合才不别扭
6.1 分工:手机上做什么,电脑上做什么
把移动端开发环境当成"临时工位",需要明确它在整个流程里的位置。我的分工原则是这样的:
手机上只做三类事——改文案和样式这类视觉调整、修一行能修好的逻辑错误、验证一个独立的小算法。这三类的共同点是不依赖全局上下文,改完立刻能验证。
电脑上做四类事——新增模块和重构、依赖升级、性能剖析、多设备适配测试。这四类的共同点是需要在多个文件之间跳转、需要工具链支持、需要跑多次构建对比结果。
这个分工背后是一个简单的成本判断:移动端环境最贵的是"导航成本"(在大屏幕上看代码的缺失)和"构建成本"(等构建的时间)。凡是这两项成本占比高的任务,一律挪回电脑。
还有一点需要注意的是代码风格的一致性。在手机上改代码容易写出"跟前文风格不一致"的片段——缩进不一样、命名不一样、注释格式不一样。这不是能力问题,是小屏幕上缺少上下文导致的。解决办法是每次在设备上改完,回到电脑后先跑一遍格式化工具,把这些差异抹平,再提交。
6.2 版本同步与冲突处理
在设备上改代码,最大的风险不是改错,而是改完之后忘了同步。我见过不止一次:设备上改了一堆东西,回头电脑上覆盖提交,设备端的改动全丢。
我的做法是用版本管理做同步,规则只有三条:每次打开设备端工程前先拉一次最新;改完之后立刻提交,不要攒;提交信息写清楚"这是什么场景下的修改",方便自己回头找。三条规则看起来平平无奇,但能把"改动丢失"这一类事故直接清零。
冲突处理要特别注意格式化差异。同一份代码,如果你在电脑上格式化过、在设备上又编辑过,很可能出现大量"看起来没改但被标记成修改"的行。这种冲突最烦,因为它不涉及真实逻辑,但会把你缠住。规避方法就是前面说的:设备上改完,回电脑先格式化再提交,别让两种格式化风格混在一起。
最后一个心得:在设备上改代码,改动越小越好。理想状态是只改一两行,改完立刻验证,验证完立刻同步。改动量大、跨越多个文件的时候,手机上的编辑体验会迅速恶化,而且出错概率随文件数线性上升。
我在实际使用中的体会是,AIDE 这类移动端开发环境最大的价值,不是它让你少背一台电脑,而是它把"动手验证"这件事的门槛压到了足够低。很多时候我们不是不会写,而是不愿意为了验证一个想法去打开电脑、等环境加载、找半天文件。当验证成本降到"掏出设备点两下"的程度,你会发现自己试错的意愿明显变高了——而这恰恰是写得越来越好的真正原因。至于它能不能替代桌面环境,我觉得这个问题本身问错了方向;它解决的是另一个问题:在电脑够不着的那些时间和空间里,你还想不想干活。