拆开一个包,胜过讲三小时原理
带过人的都知道一件事:讲原理没人记得住,动手一次就忘不掉。你花两小时讲「APK 是压缩包、里面有清单有资源有代码」,新人点头,第二天全忘;你让他自己拆一个包、改一句文案、装到手机上看到变化,他这辈子都记得。
所以这篇不是「APK 结构科普」,是「怎么用经典版当教材」。前半部分讲该讲什么(内容),后半部分讲该怎么讲(方法)。
一、第一课:一个 APK 到底是什么
最有效的开场不是定义,是动作:把后缀改成 zip,双击打开。新人会看到一堆目录——这个「啊,原来就是个压缩包」的瞬间,比任何定义都值钱。
然后告诉他里面有六块东西,各管一件事。
第一块:清单。应用的身份证兼目录。叫什么名字、什么版本、有哪些页面、要什么权限,全在这一份文件里。它是唯一「必须有」的文件。
第二块:资源。界面长什么样。布局、图片、文字、颜色、样式,都在这一块。它通常是最占体积的部分,也是改包最常动的地方。
第三块:代码。应用怎么跑。编译后的字节码,反编译出来是可以读的指令。这一块决定「点了会发生什么」。
第四块:原生库。用 C/C++ 写的部分,按 CPU 架构分目录。不是每个应用都有,游戏和音视频类应用常见。
第五块:附加资源。不进资源索引的原始文件——网页、配置、字体、模型。这一块是「原样打包」的,改起来最直接。
第六块:签名信息。证明这只包是谁做的。改过内容之后原来的签名就失效,必须重新签。这一块是「装不上」问题的高发区。
六块讲完,给新人一个记忆锚:清单说「我是谁」,资源说「我长什么样」,代码说「我怎么动」,库和附加资源是「我的零件和素材」,签名是「我的封条」。这五句话,比背目录名有用。
六块东西,各管一件事
二、第二课:清单文件在说什么
清单是新人第一个该读懂的文件。它不长,但信息密度高。带人时别让他从头读到尾,让他找五样东西。
一、包名。应用的唯一身份,形如一串用点分隔的英文。它决定「这两个包是不是同一个应用」。改包名等于换身份,后果是数据不共享、不能覆盖安装。
二、版本。有两个:一个给用户看的(版本名,比如 2.3.1),一个给系统比的(版本号,一个整数)。决定能不能覆盖安装的是后者。
三、应用名。就是桌面上显示的那个名字。它可能引用了一个字符串资源,也可能直接写死。这一点很重要——如果是引用,改字符串表就行;如果是写死,得改清单。
四、入口。点图标打开的第一个页面。它标记着「应用从哪儿开始跑」,也是排查「一打开就崩」时的第一站。
五、权限。应用要访问什么。位置、相机、存储、网络,都在这里声明。改包时一般不动它,但它是理解「为什么这个功能要授权」的入口。
找到这五样,新人就建立了「清单 = 应用的名片」这个认知。接下来可以做一个练习:把应用名改掉。先判断它是引用还是写死,再决定改哪里——这个判断动作,比改动本身更重要。
改完回编、签名、装上、看桌面。如果名字变了,说明路径对了;如果没变,说明还有一处没改——这个「没变」比「变了」更有教学价值,因为它逼着他去想「为什么」。
三、第三课:res 目录为什么长这样
资源目录是新人最容易迷路的地方,因为它的命名看起来像乱码。其实它有一套很清楚的逻辑:按「类型」分一级,按「条件」分二级。
一级是类型:layout 放界面结构,drawable 放图形,values 放值(颜色、字符串、尺寸、样式),mipmap 放应用图标,raw 放原样打包的文件,xml 放各种配置。看到目录名,就知道里面大概是什么。
二级是条件:同一个资源可以有多个版本,供不同设备挑选。屏幕密度不同选不同的图,语言不同选不同的文字,系统版本不同选不同的样式。所以你会看到带后缀的目录名——后缀就是在说「我适用于什么条件」。
这套设计的目的很简单:一份工程,适配所有设备。手机和平板看到的布局可以不同,高分屏和低分屏用的图可以不同,中文用户和英文用户看到的文字不同——但代码只有一份。
理解这一点,很多「为什么改了没变」就有答案了:你改的那份资源,可能不是当前设备会选中的那份。
带人时有个好练习:让他在资源目录里找出「同一个资源的全部版本」。比如找某个图标,把所有密度目录里的同名文件列出来,看它们的尺寸差别。这个动作会让他直观理解「多份」这件事——而「多份」正是改包翻车的第一大原因。
四、第四课:一句话为什么必须写「各尺寸都换」
这一课是把「结构知识」转成「表达能力」的桥。
新人写需求:「把图标换成这张图」。老手写:「把桌面图标换成这张图,各密度目录都换,通知栏小图标也用这张」。
差别在哪?老手知道图标是「一组文件」而不是「一张图」。他知道桌面图标在多个密度目录里各有一份,通知栏用的是另一套小图,最近任务列表可能还用第三套。所以他会一次说全。
这个能力的来源,就是第三课那个练习——当新人亲手把所有密度目录列出来、看到五六个同名不同尺寸的文件时,「各尺寸都换」这句话就有了具体的所指。
所以带人时,每一个结构知识点,都要连到一个「说法」上。讲完资源的多版本,就让他改写一条需求;讲完清单的引用与写死,就让他判断「改名字该改哪儿」。知识和表达绑在一起,才留得住。
这一点其实也解释了「为什么有些人写需求特别准」。不是他语言能力强,是他知道底下有什么。结构决定表达——这是带人时最该传递的一条心法。
知道底下有什么,才写得出准确的那句话
五、第五课:smali 该读到什么程度
代码这一层,带人要有分寸。全不讲,他就只能改资源;讲太深,他会陷进去出不来。目标定在「能读懂一个方法」。
第一件事:知道它是什么。smali 是字节码的反汇编形式,一行对应一条指令。它不是给人写的,所以没有注释、变量名都是寄存器编号。看它不要追求「读懂每一行」,追求「看出这段在干什么」。
第二件事:认识三样东西。寄存器(v0、v1、p0 这种,相当于变量)、方法调用(invoke- 开头,相当于「调用别人」)、跳转(if- 开头,相当于「判断之后往哪走」)。认这三样,就能看出一个方法的骨架。
第三件事:读一个真实的方法。挑一个简单的,比如某个按钮的点击处理。从上往下读,能说出「它先取了什么、然后判断了什么、最后调用了什么」,就算过关。
读完之后可以做一个很小的改动练习:把一个判断反过来(if-eq 改成 if-ne),看行为有什么变化。这个练习的价值在于——他会亲眼看到「一行指令决定一个行为」,从此对代码这一层有了具体的敬畏。
但要强调三条纪律:一次只改一处、改得越少越安全、改完先搜一遍自己改的那一行。这三条不是技术,是习惯,而习惯必须在第一次就建立——否则后面改出事来,他会以为是「工具不稳」。
六、第六课:资源表与资源 ID
这一课偏深,但值得讲,因为它是「为什么改了没生效」的终极答案之一。
原理:编译之后,资源不再用「名字」互相引用,而是用「编号」。代码里写的是编号,布局里写的也是编号。所有编号和名字的对应关系,存在一张表里。
影响:如果你手动新增了一个资源文件,但没有让这张表知道,就会出现「文件在那儿,但引用不到」。这是手动改包里比较深的一个坑。
带人时的处理:不讲太细,只讲结论——先只改已有资源,不新增。等他能稳定改包之后,再回头讲这一层。教学要有节奏,一次讲完只会让人放弃。
这一课真正的价值不在技术,在「建立边界感」:让他知道有些事现在不该碰,而不是以为什么都能改。知道自己不会什么,比会什么更重要。
七、第七课:签名那点事
签名是新人最容易忽略、也最容易翻车的一课。带人时讲三句话就够。
第一句:它是封条。证明这只包是谁做的。改过内容,原封条就破了,必须重贴。
第二句:系统只认封条。包名相同、封条不同,一律拒绝覆盖安装。它不管你是不是作者本人,只问封条对不对。
第三句:卸了重装会丢数据。所以遇到签名冲突,先想「这台设备上的数据要不要留」,再决定卸不卸。
三句话之后做一个演练:故意用两套不同签名打包,装到同一台设备上,看系统怎么拒绝。亲眼见过一次提示,比听十遍解释管用。
演练完再补一条:签名文件要当资产管。一个客户一套、文件与密码分开存、命名带信息。这三点现在讲,他以后会感谢你——因为这东西丢了,代价是所有设备重装。
八、第八课:原生库与架构
这一课可以简短,但必须提一句,否则新人看到 lib 目录会一头雾水。
是什么:应用里用 C/C++ 写的部分,编译成了二进制库。因为不同 CPU 架构的机器读不懂彼此的二进制,所以按架构分目录存放。
为什么要知道:有两个实际用途。一是「包太大」,可以只保留主流架构的库来减小体积;二是「某些设备装不上」,可能是因为这个包没有对应架构的库。
注意什么:删库要谨慎。删错了会导致应用在特定设备上一打开就崩,而且崩得没有任何提示。所以这个操作只建议在「确定目标设备架构」的前提下做。
讲到这里,八课的骨架就完整了:apk 是什么 → 清单 → 资源 → 表达 → 代码 → 资源表 → 签名 → 库。从「看得见」到「改得动」到「知道边界」,一条线走下来。
八课一条线:看见、改得动、知道边界
九、七天课程怎么排
八课的内容,压进七天。每天的节奏是「讲十分钟、做三十分钟、复盘十分钟」,一天一小时出头,不占用整块时间。
第一天:拆包与认识结构。让他把 apk 后缀改成 zip 打开,看一遍目录;再用经典版反编译,对比「原包」和「拆开之后」有什么不同。目标不是记住,是「不怕」。
第二天:清单五样。找包名、版本、应用名、入口、权限。然后做练习——把应用名改掉,装上验证。第一次成功会极大提升信心。
第三天:资源的分类。讲一级类型与二级条件的逻辑,然后让他找出「同一个资源的全部版本」。这一步是为第四天铺垫。
第四天:换图标。从「找全部版本」到「全部替换」,再到「装上验证三处(桌面、通知栏、最近任务)」。这一天他会真切体会「多份」的麻烦。
第五天:改文案与颜色。练「全局搜索」这个动作——搜一句话、搜一个色值,看命中几处,逐处判断。这一天练的是定位能力。
第六天:读一个 smali 方法。不求改,只求读懂骨架:取了什么、判断了什么、调用了什么。读完之后做那个「改一个判断」的小练习。
第七天:故意弄坏一次。删一个闭合标签、改错一个色值引用,回编看报错。人对失败的样子记得最牢,这一天价值最高。
七天之后不要急着让他独立接活。先给一个「低风险真活」——比如给自己团队的一个内部工具改个名字和图标。这类活出错成本低,但流程完整,是很好的过渡。
这个排法的逻辑是:先建立「不怕」,再建立「会找」,最后建立「会改」。顺序不能反——先教改,他会因为找不到位置而挫败;先教找,他会因为不知道找什么而迷茫。
还有一条:每天的复盘不要问「今天学了什么」,要问「今天哪一步卡住了」。前者他会背知识点给你听,后者才会暴露真实的理解缺口。
如果时间紧,可以压缩成三天:第一天拆包加清单,第二天资源加换图标,第三天读代码加弄坏一次。但「弄坏一次」这一课不能省——它是唯一能让他建立风险意识的方式。
先不怕、再会找、最后会改十、带人的五个动作
内容有了,方法更重要。五个动作,按顺序用。
动作一:示范。你做一遍,他看。关键是「边说边做」——说出你为什么点这里、为什么搜这个词、为什么判断是这一处。新手最缺的不是步骤,是「判断的依据」。
动作二:共做。同一个任务,你做一半他做一半。遇到岔路口停下来问他「你觉得下一步该干嘛」,等他说完再给答案。这个动作能把「模仿」变成「思考」。
动作三:放手。给他一个完整的任务,你不插手。只在两种情况下介入:他要做危险动作(比如删签名目录),或者卡住超过二十分钟。放手的目的不是考验他,是让他建立「自己能解决」的信心。
动作四:复盘。做完之后一起回看:哪一步最费时间、哪一步差点出错、下次能不能更快。复盘要具体到动作,不要说「下次注意一点」这种空话。
动作五:出题。给一个「看起来像但其实不同」的需求,看他会不会套用上次的经验套错。比如上次是「换桌面图标」,这次是「换通知栏小图标」——位置不同,处理方式也不同。这个动作检验的是「理解」还是「记忆」。
五个动作里,最容易省略的是「共做」,最不该省的也是它。因为「示范」是单向输入,「放手」是单向输出,只有「共做」能暴露他脑子里的模型对不对。
很多带人的失败,就失败在「讲了、让他做了、然后发现他不会」。中间少了「一起做」这一环——而这一环恰恰是把「知道」转成「会」的地方。
还有一点:这五个动作不需要一次用完。可以在一个任务里循环——示范一小段、共做一小段、放手一小段。循环比串行更贴近真实的学习节奏。
十一、新人最常有的六个误解
带人时会反复听到这六句话,每一句背后都是一个需要纠正的模型。
误解一:「改包就是把文件换掉。」不对。换完还要回编、签名,缺一步就装不上。而且「换掉」本身也有讲究——同一个资源可能有多份。
误解二:「改了就会生效。」不对。可能改错了位置、可能被别的资源覆盖、可能当前设备选中的是另一份。所以「改完必须验」不是流程繁琐,是必要动作。
误解三:「装不上就是包坏了。」不对。装不上有五个方向:包坏了、签名冲突、版本太低、架构不支持、权限没开。先分清是哪一类,再动手。
误解四:「代码不能碰。」也不对。代码可以碰,但要有纪律:一次只改一处、改得越少越安全、改完先自查。真正不能碰的是「不理解的那段代码」。
误解五:「AI 能改,就不用学结构。」短期看是对的,长期看会卡住。因为「说不清但必须改」的需求永远存在,而这类需求只能靠动手解决。
误解六:「学会了就能改任何包。」最需要纠正的一条。加固包改不了、有自校验的包改不了、涉及合规的包不该改。知道边界,才算真的会。
这六个误解有个共同点:它们都源于「把局部经验当成普遍规律」。改成功一次就以为「这样就行了」,装失败一次就以为「这工具不行」。
纠正的方法不是讲道理,是让他多遇到几次「不一样的情况」。所以带人时要故意给「看起来一样但实际不同」的任务——差异见多了,模型才会更新。
还有一条更根本的:让他养成「先判断、再动手」的习惯。判断的内容包括:这是什么类型的需求、该去哪一层找、有没有风险、怎么验。这四问走一遍,误解自然少一半。
把局部经验当普遍规律,是最常见的认知陷阱十二、一个完整的教学案例:换图标
把前面所有内容串成一个真实的教学过程。这个案例我带过很多次,效果稳定。
第一步:提问。不告诉他怎么做,先问三个问题——「图标在哪儿?」「一个应用有几个图标?」「换完之后怎么知道换对了?」。三个问题他多半答不全,这就制造了「想知道」的状态。
第二步:一起找。打开工程,让他自己在资源目录里找图标。他会找到一两个,然后发现还有别的目录里也有。这个「发现」比我告诉他有效十倍。
第三步:数一数。让他把所有同名文件列出来,数数有几个、尺寸各是多少。数完他会自己说出「原来有这么多份」。这时候不需要我再解释「为什么要各尺寸都换」。
第四步:动手换。让他自己换,我不插手。他可能会漏掉一两个目录,也可能把通知栏那份忘了——这些错误都在预期之内,而且正是教学素材。
第五步:验。装上,看三个地方:桌面、通知栏、最近任务。如果哪一处还是旧图,就回到工程找原因。这一步是「验收意识」的建立。
第六步:复盘。问他「如果下次再换图标,你会怎么做」。如果他能说出「先找全部同名文件、全部换掉、再验三处」,这一课就过了。
这个案例的设计要点是:所有的「知识」都是他自己发现的,我只负责提问和收尾。自己发现的知识,留存率远高于被告知的知识。
而且这个案例可以复用——换成文案、换成颜色、换成布局,结构完全一样:先问、再找、数清楚、动手、验、复盘。带人带多了你会发现,教一个案例等于教了一套方法。
唯一要注意的是「别抢答」。新手卡住的时候,人会本能地想帮他。但卡住的那几分钟,正是他建立「自己找得到」的信心的时候。忍住,比教会更难,也更值钱。
十三、怎么出题:三道渐进练习
带人不能只靠真活,还要出题。题的好处是「可以设计难度」,而真活的难度是随机的。三道题,难度递进。
第一题:换一个不存在的图标。让他把某个图标换成一个明显不同的图(比如纯色方块)。这题的考点是「找全所有版本」——漏一个就会在某个界面上露馅。做完让他自己解释「为什么有的地方变了有的没变」。
第二题:改一句话,但不能改另一句相似的。工程里有两句很像的文案,只改其中一句。这题的考点是「精确定位」——他必须看清上下文,而不是见一个改一个。
第三题:让一个功能「看起来还在但点了没反应」。这题偏难,需要动一点代码。考点是「理解行为与代码的对应关系」,同时练「改得越少越安全」——正确的做法可能是改一个判断,而不是删一段逻辑。
三道题做完,基本能判断他的水平:第一题考「细致」,第二题考「精确」,第三题考「理解」。三题都过,可以放手让他接真活;某一题卡住,就针对性地再练。
出题还有一个隐藏好处:题是可以复用的。你把这三道题和标准答案记下来,下次带新人直接用,不用每次重新设计。带人这件事,也能被「资产化」。
如果想让题目更贴近实战,可以加一条限制:不许问我,只能自己查。查的方式包括搜索、看目录、对比原包。这条限制会逼他建立「自己解决」的路径,而不是「等人给答案」。
十四、怎么判断他学会了:四个信号
「学会了」不是「能做出结果」,因为做出结果可能只是照抄。四个信号能判断真实水平。
信号一:他能说出「为什么」。不只会做,还能解释为什么这么做。比如「换图标要换全部密度目录,因为系统会按屏幕密度选」。能解释,说明模型是对的。
信号二:他遇到新问题会分类。装不上时,他会先问「是签名还是权限还是包坏了」,而不是盲目重试。分类能力是「有结构」的表现。
信号三:他会主动验收。不用你提醒,改完自己就去装、去看、去核对。这个动作一旦内化,他的返工率会直线下降。
信号四:他知道自己不会什么。能清楚说出「加固包我改不了」「这个涉及代码我不确定」。知道自己边界的人,才不会闯祸。
四个信号里,第四个最容易被忽略,但它最重要。因为前三项决定他「能做多少」,第四项决定他「会不会出事」。而带人最怕的不是他做得慢,是他做出一堆需要你收尾的事。
所以评估的时候,别只看「他做出来了没有」,还要看「他知不知道自己哪里不确定」。后者才是可以放心交付的前提。
十五、把知识做成一张自查表
新人最需要的东西不是教程,是一张「动手前照着看」的表。把这篇文章的内容压成十二问,让他自己勾。
动手前四问:这是什么类型的需求(外观 / 文案 / 行为)?该去哪一层找(资源 / 清单 / 代码)?这处改动会不会牵连别处?出问题怎么退回?
改动中四问:我搜过了吗(有几个命中)?我改的是「全部」还是「一处」?我改的是不是当前设备会选中的那份?我有没有动到不该动的地方?
改完后四问:回编成功了吗?签名用的是哪套?装上之后「改的地方」对不对?「没改的地方」还好吗?
十二问看起来很多,但熟练之后它会内化成直觉——你不需要真的逐条问,只是脑子里过一遍。而新手需要这张表,因为他的直觉还没建立。
这张表还有个进阶用法:让他每次卡住时,指出是第几问没做。第一次是「第二问没做(没搜全)」,第二次是「第九问没做(没验没改的地方)」。几次之后,他会自己发现自己的固定漏洞。
而「发现自己的固定漏洞」这件事,比学会任何技术都值钱。因为技术会过时,而「知道自己容易在哪出错」这个认知,会跟着他一辈子。
| 阶段 | 自查问题 | 没做会怎样 |
|---|
| 动手前 | 这是什么类型的需求 | 去错层,白找半天 |
| 动手前 | 该去哪一层找 | 在错的目录里翻 |
| 动手前 | 会不会牵连别处 | 改 A 坏了 B |
| 动手前 | 出问题怎么退回 | 改坏了只能重来 |
| 改动中 | 搜过没有,几处命中 | 改一处漏三处 |
| 改动中 | 改的是全部还是一处 | 某些界面还是旧的 |
| 改动中 | 是不是当前选中的那份 | 改了没生效 |
| 改动中 | 有没有动到不该动的 | 引入无关问题 |
| 改完后 | 回编成功了吗 | 根本没产物 |
| 改完后 | 签名用的是哪套 | 装不上 |
| 改完后 | 改的地方对不对 | 交付了错的东西 |
| 改完后 | 没改的地方还好吗 | 最伤人的一类事故 |
十六、带人最容易犯的五个失误
这五个失误我自己都犯过,所以写下来提醒。
失误一:讲太多。怕他不懂,于是把结构、原理、历史全讲一遍。结果信息过载,他什么都没记住。正确的做法是「讲刚好够动手的那一点」,剩下的等他遇到问题再讲。
失误二:抢着帮忙。他一卡住你就伸手。看起来很高效,实际剥夺了他「自己找到」的机会。而「自己找到」的体验,才是信心的来源。
失误三:只给结果,不给判断过程。「你把这个改一下」,改完了但不知道为什么。下次遇到类似的问题,他还是不会。正确的做法是边说边做——说出你在看什么、在排除什么。
失误四:用真活练手。真活有交付压力,一出问题就得你上,结果他学不到东西。正确的做法是「先用题练,再用低风险真活过渡」。
失误五:不让他出错。把所有的坑都提前填平,他一路顺风。但真实世界全是坑,而他从没见过坑的样子。所以「故意弄坏一次」这一课不能省。
五个失误的共同根源是:把「教会」理解成「让他少走弯路」。但学习这件事,弯路本身就是路径的一部分——你没走过的路,讲给你听也不属于你。
所以带人的心态应该是:陪他走,而不是抱他走。他摔了你扶一把,但别替他把路走完。这个分寸很难拿,但它决定了你带出来的是「能干的人」还是「会照做的人」。
还有一条现实的理由:如果你什么都替他做,你会一直很忙。真正的解脱不是他学得快,是他能独立承担——而独立承担的前提,是你曾经让他独立过。
陪他走,而不是抱他走十七、教的时候,你自己在学什么
这一段是写给带人的人的:教别人其实是一次高强度的自我整理。
第一,你会发现自己哪里是「模糊的」。有些事你做得很顺,但一被问「为什么」就说不清。那些说不清的地方,就是你理解里的空洞。
第二,你会被迫建立体系。自己用的时候,知识是散的;要教别人,就得把它排成顺序。而排序的过程,就是把经验变成结构的过程。
第三,你会得到新的视角。新人的问题往往很「笨」,但笨问题常常戳中假设。比如他问「为什么不能直接改压缩包里的文件」,这个问题会逼你解释「编译」和「打包」的区别。
第四,你会更清楚边界。教的时候必须说清「什么不能做」,而这句话说多了,你自己也会更守规矩。
所以带人这件事,收益是双向的。你付出的是一小时,收回的是一套更清晰的知识体系。而这套体系,会在你自己遇到新问题时救你——因为结构越清楚,学新东西越快。
如果你的团队里没人可带,也有替代方案:写下来。把你做的事写成步骤和判断依据,效果跟教一个人差不多。写作是最便宜的教学,也是最诚实的自查。
十八、什么时候让他转向 AI 版
最后一个问题:既然有 AI 版,为什么不直接教 AI 版?
答案是:两个都要教,但顺序不同。先教结构(经典版),再教表达(AI 版)。因为「会写需求」的前提是「知道底下有什么」——不知道结构的人,写出来的需求永远是模糊的。
反过来,如果先教 AI 版,他可能会形成「改包就是说话」的印象。这个印象在日常活里够用,但一遇到「说不清的需求」就卡死。而这类需求,恰恰是最值钱的那部分。
所以我的建议是:前两周用经典版打底,之后全面转向 AI 版,遇到卡点再回经典版。这个节奏既建立了结构认知,又不浪费时间在重复劳动上。
具体一点:第一周按前面七天课程走一遍,只求「看懂 + 能改一处」。第二周开始用 AI 版做真实需求,同时要求他每次改完都去工程里看一眼「改了哪些文件」。这个动作能持续强化结构认知。
再往后,他会自己形成判断:这个需求一句话能搞定,那个需求得动手。这个判断力,就是「成熟」的标志——而它不能靠教,只能靠两条路线都走过。
所以别把经典版和 AI 版当成「新旧」。它们更像「识字」和「写作」:先识字,才能写得准;写得多了,识字也更牢。两者是互相喂养的关系,不是替代关系。
十九、用下来的人怎么说
几条来自带人的人与刚被带过的人的反馈。
「以前带新人讲三天 PPT,他还是一脸茫然。后来改成让他拆一个包,一天就通了。现在我带人第一句话都是『先把后缀改成 zip』。」
—— 周工 · 技术主管
「我最受益的是那个『数一数有几个图标』的练习。数完之后我才真的明白为什么需求里要写『各尺寸都换』。」
—— 小陈 · 入职三个月
「带人最大的收获是自己理清了一遍。有些事我做得很顺但从没想过为什么,被问了几次之后才发现自己也是含糊的。」
—— 老吴 · 交付负责人
「我是自学的,没有师傅。就把经典版当一个可以随便拆的标本,拆了十几个包之后,看任何应用的感觉都不一样了。」
—— 阿哲 · 独立开发者
二十、七个问题
Q:没有编程基础能学吗?
能。前四课(结构、清单、资源、表达)完全不需要编程。第五课开始要能看懂逻辑,但也只是「看懂」,不是「写出来」。
Q:一定要用经典版吗?AI 版不能当教材?
AI 版看不到结构,教不了「为什么」。经典版的价值就是「摊开」,这是教学的前提。
Q:教一个人要花多久?
能改资源一周,能独立接活一个月左右。但「能判断」需要更久,那是在真实项目里磨出来的。
Q:新人最容易卡在哪?
「找位置」。改只花十秒,找要花十分钟。所以教学重点应该放在「怎么搜、怎么缩小范围」,而不是「怎么改」。
还有一层原因:找位置这件事,本质上是「理解结构」的应用。会找的人,心里有一张地图——知道什么需求大概落在哪一层、哪个目录、哪类文件。这张地图不是背出来的,是一层层走出来的。所以练「找」,其实是在练「理解」,比练手速值钱得多。
Q:要不要让他先学 Java?
不必。等他真需要改代码时再学,带着具体问题学效率高得多。先学一遍语法,大概率会忘。
Q:怎么判断他能不能独立接活?
看四个信号:能解释为什么、遇新问题会分类、主动验收、知道自己不会什么。四个都有,就可以放手。
Q:教的时候要不要讲原理?
讲「刚好够动手」的那部分。多讲的原理他记不住,等他遇到问题再讲,效果反而好。
二十一、写在最后
把这篇的内容收一下:经典版之所以适合当教具,不是因为功能多,是因为它把东西摊开了。摊开之后,结构可见、因果可见、错误也可见——而「可见」是一切学习的前提。
八课的内容其实可以压成一句话:apk 是六块东西,清单说身份,资源说外观,代码说行为,签名说归属。记住这句,剩下的都是细节。
只需说话,就能让应用变成你想要的样子。这句话对使用者是承诺,对学习者却是个陷阱——如果只停在「会说话」,你永远不知道自己在说什么。而拆过一次包的人,说话会变准。
所以教人的顺序,本质上是「先让他看见,再让他说话」。看见之后,那句话才有分量;没看见,那句话只是咒语——碰对了是运气,碰错了不知道为什么。
如果你正在带人,希望这篇能帮你少讲一点、多让他动手一点。如果你在自学,希望它给你一条能走的路径:不用系统学完,只要按顺序走完那八课。
最后一句:教是最好的学。哪怕你只是把这篇的内容讲给同事听一遍,你对 apk 的理解也会更清楚一层。这就是为什么我带人从来不觉得是负担——它其实是在给自己补课。
补课这件事,越往后越重要。做久了容易形成「肌肉记忆」——手会做,但说不清为什么。而说不清的部分,恰恰是最容易在换环境、换工具时失效的部分。教一次、写一次,等于把这些隐性的东西重新过一遍明路。
回到最开始那个画面:一个新人第一次把 apk 的后缀改成 zip,双击打开,看到一堆陌生目录。那一刻他心里想的不是「我要学会这个」,而是「原来就这么回事」。而后者,才是所有学习真正的起点——先放下畏惧,才谈得上理解。
所以如果你问我带人最重要的一件事是什么,不是讲得多清楚,也不是题出得多好,是让他尽早体验一次「我自己弄明白了」。那个瞬间一旦出现,后面就不用你推了。
而那个瞬间,通常不来自你讲得多好,来自你「忍住没帮他」的那十几分钟。教学里最难的动作从来不是讲,是等——等他自己找到、等他自己发现、等他自己说出那句「原来是这样」。
这份耐心,大概就是「教具」两个字真正的含义:不是把答案给他,是把东西摊开,让他自己看见。
而这套方法不只用于教改包。任何「看起来复杂」的手艺,都可以用同样的路子:先让他看到一个真实的东西,再让他动一次手,最后让他自己解释一遍。三步走完,知识就长在他身上了,而不是记在本子上。
所以如果你手上正有一个「怎么教都教不会」的人,别急着怀疑他笨,先想想是不是你一直在讲、没让他动手。改包这件事尤其如此——它的所有知识都在一个具体的包里,而不在任何一份文档里。
把包给他,让他拆。这一句话,抵得上这篇文章剩下的所有内容。
因为拆包这件事有一种别的教学替代不了的性质:它把抽象变成具体。你说「资源有多份」,他点头;他数出七份图标,他就不只是点头,他会记住。而「记住」和「知道」之间,差的正是这么一次亲手操作。
这也是为什么我建议每个团队都留一份「教学用的样本包」:一个结构干净、没有加固、体积不大、功能简单的应用。它不需要有用,只需要「能被拆开看」。有了它,带人这件事就有了固定的起点。
请在符合当地法律法规的前提下使用相关工具。本文所述技术细节仅用于原理解析、自有应用定制与教学演示,不构成对第三方应用的破解建议;修改他人应用并对外传播可能构成侵权。