日志与排查路线
安卓修改大师 · 智改工坊

出问题不可怕,可怕的是没有账

dock.log / error.log / pack.log / apktool.log:四份账,四条路

先把主标语放在最前面:会看日志的人,同一个问题只会遇到一次。这句话听起来像老生常谈,但它的反面每天都在发生:同一个坑,有人踩完之后学会了绕开,有人踩了八次还在"再试一次看看"。

本文的主角是「安卓修改大师智改工坊」:一款 Windows 桌面工具,把"改 APK"从技术活变成一句话——拖入安装包,用中文写需求,AI 改包,改完自动回编 / 对齐 / 签名 / 校验,一键装到手机或模拟器看效果。介绍页在 https://www.apkeditor.cn/ai-version.aspx,官网 www.apkeditor.cn。

这篇不聊功能,只聊一件"平时用不上、出事时救命"的事:这个工具留了哪几份账、它们各自记什么、出问题该先看哪一份。工具链长出问题来,无非几类:包解析不对、反编译失败、打包出不来、签名没签上、装上去还是旧界面、两个窗口的行为不对——每一类,都有一份账专门记着。

一、为什么"再试一次"是最贵的动作

先讲个所有人都经历过的场景:改完一版,装到手机上发现界面没变。你的第一反应是什么?多半是"再来一次"——重新打包、重新安装、重新看。第二次还是没变,你开始怀疑工具;第三次你把包删了重做一遍,还是没变。半小时过去了,你其实一个字的新信息都没获得。

问题就出在这里:"再试一次"只增加次数,不增加信息。它让你在同一片黑暗里多走几步,但没给你一盏灯。更糟的是,反复重试会污染现场——多出一堆分不清哪次是哪次的产物、多个版本的包、你自己都记不清改过什么。

日志的作用就是这盏灯:它把"过程"留下来,让失败有迹可循。而且日志的价值不在"出错的时候才体现"——它更像安全带:平时几乎感觉不到,出事时把损失从"半小时白干"压到"看一眼就明白"。

一条判断标准:如果你现在遇到问题,唯一能做的动作是"再点一次",那就说明你在靠猜;如果你能说出"我应该看哪一份账",你就在靠查。靠查的人,问题只出一次。

智改工坊在这个方向上做得比较"老派":它把过程分成四份账,各管一段,谁的锅谁背。这四份账的好处不是"多",而是"分工清楚"——你不必通读一份几千行的巨型日志,只需要按症状去翻对应那一份。

翻日志找线索
图 1:日志不是为了好看,是为了让失败有迹可循。

二、四个日志各记什么:分工表

先把四份账摆在一起看。它们的关系不是"备份",而是"各有辖区":

日志 位置 记什么
dock.log 诊断日志,在 %LocalAppData%\ApkGallary\dock.log 吸附过程、打包过程——两个窗口怎么吸到一起、打包有没有真跑起来
error.log 同样在 %LocalAppData%\ApkGallary\ 下 异常日志——程序层面出岔子的记录
pack.log 项目目录里(每个项目一个 8 位随机字符串目录) 打包全过程——回编 → 对齐 → 签名 → 校验四步的每一步
apktool.log 反编译失败时,程序会直接把路径提示给你 反编译这一段的输出——拆包拆到哪、报了什么

把这四行读一遍,你会发现分工逻辑很清晰:dock.log 管"工具自己有没有正常运转"(吸附、打包流程);error.log 管"程序出了什么异常";pack.log 管"这个项目的这一次打包干了什么";apktool.log 管"反编译那一步为什么不行"。

四份账摆在一起,还顺带解决了一个协作问题:日志是"可移交"的。你跟同事、跟技术支持描述问题时,不用再靠"我点了那个按钮然后它就那样了";直接把对应那份文件带上,配一句"我做了什么、预期什么、实际什么",对方看两分钟就能接上你的上下文。这不是流程主义,这是让别人的时间也不必浪费在猜上。

三、先看哪个:一份按症状走的决策树

大多数人卡住的不是"日志在哪",而是"我该看哪一份"。下面这张表按症状分类,直接给答案:

你遇到的现象 先看哪份 重点看什么
两个窗口没吸上 / 吸附位置不对 dock.log 吸附过程有没有发生、发生的时间点对不对
改了需求,却迟迟没弹打包窗口 dock.log 打包过程有没有被触发;结合轮询间隔(默认每 2 秒看一次标志文件)判断"是多等了几秒"还是"根本没触发"
程序弹异常、闪退、行为明显不正常 error.log 异常发生的时间与上下文,对上你刚才做的操作
打包出不来 / 不确定签没签上 pack.log 四步走到哪一步停的;产物是不是落到了 build 目录
反编译失败 / 项目建不起来 apktool.log 失败原因与路径(程序会直接把日志路径提示给你)
"工具好像没就绪"这一类 先做体检,再看 dock.log 「参数设置」页的工具链体检逐个报 aapt / java / apktool / zipalign / apksigner 是否就绪与完整路径
装上了但"看起来没变" pack.log + 设备侧确认 先确认这一版真的出了包;再用 dumpsys 看前台应用是不是它、装的是不是同一台设备

这张表里有两个"顺序陷阱",值得单独提醒:

  1. 别一上来就怀疑 AI 改得不对。很多"改了没生效"其实是包没出、或者装错了设备。先看 pack.log 确认四步跑完、产物在 build 下,再去讨论改得对不对——先确认事实,再讨论判断。
  2. 别只看最后一屏。日志的行是按时间排的,出问题的原因往往在失败那一行的前面几行,不在末尾。看日志的正确姿势是"先找失败点,再往前看两屏"。
按症状选择日志的决策树
图 2:先分症状,再翻账——排查也能有路线图。

四、项目目录本身就是一份现场

在讲怎么读日志之前,先把"现场"交代清楚——因为日志只有配上现场,才拼得出完整的图。每建一个项目,程序会分配一个 8 位随机字符串的目录;这个目录不是随手起的,它是一套固定结构:

目录里的东西 作用 排查时的用法
config.ini 项目配置(含启动页组件名等) 确认"这个项目是谁、按什么信息建的"
source.apk 建项目时拷进来的一份源包 改坏了不慌——原件在这里,可以重来
apktool 目录 反编译输出 看它拆到哪儿了;拆失败就看 apktool.log
build 目录 unsigned.apk / aligned.apk / signed.apk 看四步各产出到哪一步、哪一份是最新的
pack.log 打包全过程 对时间、对步骤,确认"这一次到底跑完了没"
history.ini 修改历史(#序号 + 时间 + 需求原文) 确认"我到底改了哪一版、原话是什么"
ai_done.flag AI 改完留下的标志文件 它没出现,打包就不会自动弹——这就是"没反应"的一个常见原因

这份结构里藏着三个很好用的"排查锚点":source.apk(回到原点)、history.ini(回到那次改动)、pack.log(回到那次打包)。有这三个锚点,任何一次"结果不对"都能被拆成三个问题:改的是哪一版?包出的是哪一次?装的是不是那一份?三个问题各自有答案,就不存在"玄学"的空间。

顺手说一句历史这一块的设计,它对排查特别友好:详情页直接列出修改历史(最新在最上),每条显示 #序号 + 时间 + 需求原文,完整显示不截断;右侧「选择」能把那条需求填回输入框。历史按"记录1、记录2"递增,删某一节即删那条记录。项目列表里的「历史」按钮还能打开独立的历史窗口。"我上次到底说了什么",从来不需要靠回忆。

五、怎么读:几条真正有用的线索

知道看哪份之后,第二个问题是"看什么"。四份账里,各自有几条最值得盯的线索:

1)pack.log:盯四步,尤其是第四步

打包是四步一条链:回编(apktool b)→ 对齐(zipalign -p 4)→ 签名(apksigner + testkey)→ 校验(apksigner verify)。读 pack.log 的正确方式是先找"它停在哪一步":停在回编,多半是改出来的 smali / 资源有问题;停在对齐或签名,问题在产物或密钥;四步都跑完了,那这一次就是"技术上成功"的。

第四步最值得说。前三步只看退出码,而"退出码是 0"不等于"签名真的有效"——有些失败方式很阴,工具跑完了、包也在,但签名块根本没写对。所以程序多做了一步 verify:"到底签没签上",要 verify 说了算。你在 pack.log 里看到第四步也过了,才可以把"没签上"这个嫌疑划掉、去查别的原因。

顺带一个容易忽略的线索:每次出包前,程序会自动往 res/values/styles.xml 写入一个 name="info" 的样式,把时间、登录账号、机器码、机器名、系统用户名、程序版本、应用名、包名等信息编码进去。当你面对"我到底装的是哪一版"这种问题时,这个标记就是最后一道证据。

2)apktool.log:反编译失败不等于项目没了

反编译失败是新手最慌的一类问题,因为它发生在最前面,看起来像"整个流程没开始就结束了"。事实不是这样:反编译失败不影响项目本身——配置、图标、源包都已经落地了,项目照样在列表里,程序会提示原因并给出 apktool.log 的路径。

读这一份的思路是分清"包的问题"和"环境的问题":如果是包本身特殊(比如我们自己的应用打成了分发包,或者包做了加固),那 apktool.log 里会留下它拆到哪一步停下的痕迹;如果是工具链缺失或版本不对,那更快的路径其实是回「参数设置」页做一遍工具链体检——aapt / java / apktool / zipalign / apksigner 逐个报是否就绪与完整路径,环境不齐就点「立刻更新」,自动下载并解压工具包(7z 格式),装完重新检测。

还有一条纪律值得记住:反编译有 10 分钟上限,超过会中断并报错。所以"它跑了很久最后报错"不一定是你做错了什么——可能是这个包本来就不该走这条路。明确的失败,比无限期的等待善良得多。

3)dock.log:看两个窗口的"时间线"

dock.log 记吸附过程和打包过程,它的价值在"时间线":什么时候吸的、吸的是谁、打包有没有被触发。排查"改了需求却没反应"时,用它把时间点排开,你立刻能分清两种完全不同的情况——是"触发了但慢"(多等几秒的事),还是"根本没触发"(那就去查标志文件与轮询)。

顺便把"没触发"的常见原因说透:AI 改完会在项目目录留一个标志文件(ai_done.flag),主窗口每 2 秒轮询一次,读到才自动弹打包窗口。所以"没反应"可能是三件事:AI 还没改完、标志文件没落地、或者你刚点完不到 2 秒。前两件看日志与目录就知道,第三件——多等两秒就好。这类"把可能性列出来"的排查,比"再试一次"高效得多。

4)error.log 与 --verbose:异常与细节

error.log 记的是异常——程序层面出岔子的记录,通常配合"刚才我做了什么"一起看。如果需要在排查时拿到更细的输出,可以用命令行参数 --verbose 跑一次;这类命令行参数(还有 --target / --dock / --no-dock / --width / --height / --share / --gap 等)都只对本次运行生效,用来做一次性排查正合适,不会污染你的长期设置。

打包四步与产物流向
图 3:看 pack.log 的第一件事,是找到它停在哪一步。

六、两个自家应用的实例:两次真实的"看一眼就明白"

下面两个例子都是我们自己的应用,也都是"没日志会折腾半天、有日志两分钟收工"的典型。

实例一 · 自家门店导购助手(内部自用版)

"装上去还是旧界面":先看 pack.log,再看设备前台

以前怎么做:我们给导购助手去掉开屏广告那阵子,经常遇到"装上去还是老样子"。当时没有任何过程记录,只能靠猜:是不是没改上?是不是装错设备了?是不是手机上还留着旧版本?——猜的顺序还全凭心情,最后往往是把包删了重做一遍,做完发现还是老样子。

现在一句话怎么做:需求照旧一句话写清——"去掉我们这个应用的开屏广告,其它不动",点「立刻修改」;之后按固定顺序看两处:先看项目目录里的 pack.log,确认回编 → 对齐 → 签名 → 校验四步都跑到了、build 下的 signed.apk 是最新的;再确认设备侧——程序打包完会自动装机拉起,并用 dumpsys 看一眼前台应用是不是它。

改完怎么验证:这一轮我们查出来的原因是同事手机上装的是更早那版,signed.apk 本身没问题。把最新那份装过去,开屏直接进主界面,收工。教训很清楚:"界面没变"是现象,不是原因;先确认"这一版真的出了包""装的是不是这一份",剩下的讨论才有意义。

实例二 · 自家内部考勤工具(企业内测,分发包)

反编译失败那一次:项目还在,日志告诉你去哪看

以前怎么做:我们自己的考勤工具当时出的是分发包,某次拖进来准备改图标和主题色,解析阶段就不对劲——没有包信息可读。放在过去,这种时候人就懵了:是包坏了、是工具不行、还是我操作错了?只能换个包反复试。

现在一句话怎么做:程序的处理方式很直接——这类解析不出包信息的输入,会以文件名继续建项目,并在页面上给一句说明;如果反编译这一步失败,它会提示原因并给出 apktool.log 的路径,同时项目本身不受影响——配置、图标、源包都已经落地,项目照样在列表里。我们据提示把流程走完,改用整包 APK 重新建了一次项目,需求也写成一句话:"桌面图标换成附件里的新 logo;界面主色换成深蓝系,其它不动",挂上附件写清用途,点「立刻修改」。

改完怎么验证:四步跑完自动装到设备上拉起,看图标与主色调是否都换了、其它界面有没有被误动;要微调就翻历史点「选择」把原话填回,改一个词再来一轮。这一轮真正的收获不是"改成功了",而是知道了:反编译失败不等于项目没了,看 apktool.log 就知道这一段为什么不行。

七、把日志用成一种纪律

最后说三条"用日志的习惯",它们比记住四个文件名更重要:

  1. 出问题的第一分钟,先提一份日志,再做第二个动作。哪怕你最终还是要重试,先把账留下来——重试之后现场就被覆盖了。
  2. 描述问题时带上三样:操作、预期、实际。"我点「立刻修改」→ 预期自动弹打包窗口 → 实际等了两分钟没动静",配上对应那份日志,别人接手零成本。
  3. 把日志当"回头看"的工具,而不是"出事了才翻"的工具。每次出包之后扫一眼 pack.log 的四步、扫一眼 build 目录里的三个产物,你对这条链的熟悉度会变成一种直觉——下次再出问题,你大概能猜到是哪一段。

还有一条更朴素的:日志记录的是"过程",而过程是可以被信任的。这也是这个工具在做的事里我最喜欢的一点——它默认一个改包流程有六七段路(解析、反编译、写需求、改包、回编、对齐、签名、校验、装机),每一段都留痕。你不必记住这些细节,你只需要在需要的时候,知道去哪里找。

再强调一次分工:吸附与打包过程看 dock.log;异常看 error.log;这一次打包到底干了什么看项目里的 pack.log;反编译不行看 apktool.log。四句话背下来,比任何"高级排错技巧"都管用。
四个日志各管一段
图 4:四份账,四条路;把问题交给对应那一份。

八、用户评价与合规提醒

下面几位的共同点是:都被"再试一次"折磨过,然后学会了翻账。

「我第一次认真看 pack.log,是因为怀疑它没给我签名。看完第四步才算把心放下——原来'跑完了'和'签上了'真不是一回事。」
—— 老周 · 安卓逆向爱好者
「我们内测出问题,我现在一律让对方把项目目录里的日志带上,再写一句'我做了什么'。这样来回一次就能定位,省了以前那种三四轮问话。」
—— 陈工 · 企业内部开发
「反编译失败那次我本来准备重装软件的,结果它直接把日志路径给我了。看一眼就知道不是环境的问题,省了半天瞎折腾。」
—— 小唐 · 安卓开发工程师
「我第一次知道 history.ini 里存的是需求原话,是删记录那次——删一节就是删一条,挺好理解的,不用记什么格式。」
—— 宁宁 · 产品运营
「我现在养成的习惯是:包里出不来先看 build 目录有没有三个产物。有 unsigned 没 signed,那问题就在后半段,一眼就定位。」
—— 阿凯 · 独立开发者
「体检那页帮过我好几次,尤其换新电脑的时候。就跟日志一样,它不解决问题,但它告诉你问题在哪。」
—— 老郑 · 团队负责人

我们回访过一批长期用户,反馈里有个挺一致的规律:约 81% 的人表示"知道出问题该看哪里"之后,同样的坑基本不再踩第二次;约 69% 的人已经习惯把日志文件带上再描述问题。这两个比例背后是同一句老话:能被查清的事,就不该交给运气。

请务必注意:本工具面向你自己拥有版权或已获得授权的应用,用于学习研究、企业内部定制、自有产品改包与二次开发等合法场景。请勿用于破解他人付费应用、去除他人版权信息或绕过安全机制。文中实例均发生在自有或内部应用上。

把全文收一下:改包这条链上,能出错的地方不少——解析、反编译、改包、回编、对齐、签名、校验、装机,每一段都可能出岔子。这个工具的处理办法不是"保证不出错",而是把每一段都留下账:dock.log 管吸附与打包过程,error.log 管异常,pack.log 管项目里的这次打包,apktool.log 管反编译;再配上项目目录这个"现场",任何一次"结果不对"都能被拆成几个有答案的小问题。会看日志的人,同一个问题只会遇到一次。

产品是安卓修改大师智改工坊,介绍页:https://www.apkeditor.cn/ai-version.aspx;官网 www.apkeditor.cn。想看看这套账是怎么记的,拿一个自家的包走一遍最直接:拖入安装包 → 用中文写需求 → 看它自动回编 / 对齐 / 签名 / 校验 → 一键装到手机或模拟器看效果,然后翻一翻项目目录里的那几份记录。

下载区域
Windows 桌面端 · 只需说话就能改 APK
拖入安装包 → 用中文写需求 → AI 改包 → 自动回编 / 对齐 / 签名 / 校验 → 一键装到设备看效果。用起来以后记得翻一次项目目录:pack.log、build 里的三份产物、history.ini,这些就是你的排查底牌。
立即下载智改工坊(AI 版)
运行环境:Windows 桌面端;诊断日志位于 %LocalAppData%\ApkGallary\(dock.log 与 error.log),项目日志位于各自的项目目录。官网:www.apkeditor.cn