第13章 综合技术
依据得到电子书完整目录覆盖7个节点:建立CrashHandler、multidex、动态加载与反编译/重打包实验,理解诊断、构建和代码边界
第13章 综合技术
在《第13章 综合技术》中,本页依据任玉刚《Android开发艺术探索》完整目录独立重构,不复制原文。版本锁定电子工业出版社2015年9月第1版、507页、ISBN 9787121269394,原书机制以Android 5.0与Java应用层/源码分析为基线。
原书中的AsyncTask、IntentService、旧权限/后台/存储规则和部分framework实现具有历史边界。在《第13章 综合技术》中,课程先准确解释出版时机制,再单独建立现代targetSdk迁移账本;不会用Compose、协程或当前Jetpack替换原书目录后仍声称一比一覆盖。
学习目标
- 能解释“第13章 综合技术”全部正式节点的调用方、所有者、线程、进程、状态与Android 5.0边界。
- 能实现“建立CrashHandler、multidex、动态加载与反编译/重打包实验,理解诊断、构建和代码边界”的最小垂直切片,并保存源码、构建、操作、日志和断言。
- 能比较正常、边界、组件重建、进程退出、队列阻塞与外部失败,分析“收集崩溃时泄露敏感数据,或把动态加载与二次打包当作无信任边界的普通功能”。
- 能设计反例并凭崩溃包、方法数报告、类加载图、签名差异、反编译结果和安全边界完成独立交接。
机制总览
第13章 综合技术:机制路径
- 1
从framework因果链开始
Android API只是入口。在《第13章 综合技术》中,每个实验先找 生命周期所有者 ,再画“应用调用 → framework代理 → Binder或消息队列 → 系统/目标对象 → 回调”的链路。
- 2
最小可执行切片
在《第13章 综合技术》中,下面的Java片段只抓住本章核心合同。先预测线程、状态和失败,再在匹配Android 5.0语境的样例工程中运行;代码所依赖的上下文和导入应在工程中显式声明。
- 3
层源码与故障证明
在《第13章 综合技术》中, 调用层。 从“第13章 综合技术”选择一次入口,写出应用对象、framework代理、系统服务或目标组件以及返回路径。对源码分析,记录Android版本、类名、方法与关键分支;对应用实验,记录用户动作、Intent或消息标识。先解释谁创建工作、谁持有引用、谁负责结束,再谈API细节。
章级决策实验
第13章 综合技术:机制与证据
切换《第13章 综合技术》的三个关键教学阶段,先解释机制,再用运行与失败证据验证结论。
选择推理阶段
当前阶段 · 从framework因果链开始
Android API只是入口。在《第13章 综合技术》中,每个实验先找 生命周期所有者 ,再画“应用调用 → framework代理 → Binder或消息队列 → 系统/目标对象 → 回调”的链路。
可核验证据
固定 Android 5.0/Java 基线,沿源码与运行链追踪「从framework因果链开始」,保存 PID/TID、对象或 token、状态前后值、最终行为及一个故障注入。
学完《第13章 综合技术》后,应能从输入和前置条件推导状态变化,并用可重复的构建、运行或边界测试证明结果。
失效—证据矩阵
第13章 综合技术:失效与核验
从framework因果链开始
典型失效
若分析「从framework因果链开始」时只停留在 API 调用而不追踪 framework、Binder/消息、目标对象和生命周期回调,表面成功会掩盖跨线程或进程状态错误。
核验证据
固定 Android 5.0/Java 基线,沿源码与运行链追踪「从framework因果链开始」,保存 PID/TID、对象或 token、状态前后值、最终行为及一个故障注入。
最小可执行切片
典型失效
若分析「最小可执行切片」时只停留在 API 调用而不追踪 framework、Binder/消息、目标对象和生命周期回调,表面成功会掩盖跨线程或进程状态错误。
核验证据
固定 Android 5.0/Java 基线,沿源码与运行链追踪「最小可执行切片」,保存 PID/TID、对象或 token、状态前后值、最终行为及一个故障注入。
层源码与故障证明
典型失效
若分析「层源码与故障证明」时只停留在 API 调用而不追踪 framework、Binder/消息、目标对象和生命周期回调,表面成功会掩盖跨线程或进程状态错误。
核验证据
固定 Android 5.0/Java 基线,沿源码与运行链追踪「层源码与故障证明」,保存 PID/TID、对象或 token、状态前后值、最终行为及一个故障注入。
从framework因果链开始
Android API只是入口。在《第13章 综合技术》中,每个实验先找↡创建、持有并最终取消或释放Activity、View、Binder连接、线程任务与原生资源的明确主体,再画“应用调用 → framework代理 → Binder或消息队列 → 系统/目标对象 → 回调”的链路。↡一次用户动作跨对象、线程与进程产生可观察结果的有序调用关系帮助区分源码事实和表面现象。
在《第13章 综合技术》中,主线程、Binder线程池、HandlerThread、线程池和原生线程有不同责任。↡回调实际执行的线程、队列顺序以及允许阻塞或触碰UI的约束必须写在代码旁。状态也要分为界面暂态、可恢复实例状态、进程内缓存、文件/数据库事实和系统服务状态;进程单例从来不是持久事实源。
本章主线是建立CrashHandler、multidex、动态加载与反编译/重打包实验,理解诊断、构建和代码边界。所有节点都要生成↡由固定环境、输入、操作、原始日志、时序、资源计数与断言组成的可重放结论,并声明↡Android版本、targetSdk、设备实现、framework源码分支与依赖共同限定的结论范围。正常截图不证明线程、重建、失败和释放正确。
最小可执行切片
在《第13章 综合技术》中,下面的Java片段只抓住本章核心合同。先预测线程、状态和失败,再在匹配Android 5.0语境的样例工程中运行;代码所依赖的上下文和导入应在工程中显式声明。
public void uncaughtException(Thread thread, Throwable error) {
CrashEnvelope envelope = CrashEnvelope.from(error);
envelope.removeSecrets();
crashStore.writeAtomically(envelope);
previous.uncaughtException(thread, error);
}
// A crash handler records evidence; it must not pretend the process is healthy.固定环境并保留构建、安装、组件与线程证据:
./gradlew --no-daemon clean test assembleDebug
adb install -r app/build/outputs/apk/debug/app-debug.apk
adb shell am force-stop org.example.art
adb shell monkey -p org.example.art 1
adb shell dumpsys activity processes > processes.txt
adb logcat -d -v threadtime > run.log将机制写成能失败的行为合同:
Given a pinned JDK, Android plugin, device API, process state, permission state, and input
When the smallest scenario for "adae15-13-integrated-techniques" crosses its owner, thread, or process boundary
Then callbacks, durable state, side effects, timing, and resource release match the prediction
And process death, owner destruction, malformed input, queue pressure, and repeated work stay observable
And modern targetSdk differences are recorded as migration evidence, not original behavior在《第13章 综合技术》中,三段材料分别约束源码机制、环境重放和用户可见结果。若日志没有线程名、进程号、输入标识和阶段,或测试只断言“没有崩溃”,就无法证明真正经过目标调用链。
四层源码与故障证明
在《第13章 综合技术》中,调用层。 从“第13章 综合技术”选择一次入口,写出应用对象、framework代理、系统服务或目标组件以及返回路径。对源码分析,记录Android版本、类名、方法与关键分支;对应用实验,记录用户动作、Intent或消息标识。先解释谁创建工作、谁持有引用、谁负责结束,再谈API细节。
在《第13章 综合技术》中,线程与进程层。 在每个箭头上标线程和进程。主线程不能执行无界I/O或计算;Binder回调不自动处于主线程;Service也不自动提供后台线程。用线程名、进程号、队列长度和时间戳验证,分别注入进程退出、Binder死亡、队列饱和和组件销毁,检查迟到结果是否被丢弃。
在《第13章 综合技术》中,状态与资源层。 列出可恢复事实、缓存和外部资源。旋转、后台回收、进程重建、列表复用与配置变化后,界面应由事实重建,而不是依赖旧对象。文件、Cursor、Bitmap、动画、Window、线程池和JNI引用都要有关闭或取消点;保存前后资源计数,避免只靠肉眼判断泄漏。
迁移层。 原书锁定Android 5.0。在《第13章 综合技术》中,现代迁移一次只改变targetSdk、组件导出、后台限制、存储、权限、通知、构建插件或替代API之一,比较构建、调用链、用户行为、测试与回滚。新实现可以使用Jetpack或结构化并发,但必须保留原书机制说明,不能抹去历史API为何工作及为何后来受限。
围绕“收集崩溃时泄露敏感数据,或把动态加载与二次打包当作无信任边界的普通功能”预写一个推翻条件:状态丢失、错误线程、越权、ANR、泄漏、结果错位、重复副作用或原生崩溃中的任一项出现,都意味着当前实现不成立。最终交付崩溃包、方法数报告、类加载图、签名差异、反编译结果和安全边界,让他人无需口头提示即可复现。
本章回顾
本页从“第13章 综合技术”覆盖到“13.4.2 使用apktool对apk进行二次打包”,共7个正式节点。掌握标准是能沿“建立CrashHandler、multidex、动态加载与反编译/重打包实验,理解诊断、构建和代码边界”解释调用因果链,运行正常、重建与故障实验,并让另一位开发者凭崩溃包、方法数报告、类加载图、签名差异、反编译结果和安全边界重放结论。
练习
问题 1:“第13章 综合技术”覆盖哪些正式节点和机制主线?
问题 2:怎样建立本章最小可执行切片?
问题 3:本章最需要推翻的错误假设是什么?
问题 4:为什么一次正常运行不能证明framework机制?
问题 5:怎样迁移到现代targetSdk而不改写原书?
问题 6:达到独立交接标准需要哪些证据?
名词解释
本章出现的专业名词,用大白话再讲一遍。
- 生命周期所有者
创建、持有并最终取消或释放Activity、View、Binder连接、线程任务与原生资源的明确主体。
- 调用因果链
一次用户动作跨对象、线程与进程产生可观察结果的有序调用关系。
- 线程合同
回调实际执行的线程、队列顺序以及允许阻塞或触碰UI的约束。
- 证据链
由固定环境、输入、操作、原始日志、时序、资源计数与断言组成的可重放结论。
- 版本边界
Android版本、targetSdk、设备实现、framework源码分支与依赖共同限定的结论范围。
← 上一页:第12章 Bitmap的加载和Cache · 下一页:第14章 JNI和NDK编程 →
原版目录概念补充核对
以下条目补齐官方目录中容易被示例主线掩盖的概念。它们不重复罗列目录,而是明确每项概念的机制、适用边界和验收证据。
13.1 使用CrashHandler来获取应用的crash信息:机制、边界与证据
第13章 综合技术中的13.1 使用CrashHandler来获取应用的crash信息需要区分请求入口、system_server/消息队列状态、目标线程与完成回调。用 PID/TID、token/record、队列时序和最终组件状态交叉验证,并注入进程未启动或迟到消息。
13.2 使用multidex来解决方法数越界:机制、边界与证据
第13章 综合技术中的13.2 使用multidex来解决方法数越界必须放回 Android 5.0/Java 基线的应用调用—framework 代理—Binder/消息队列—目标对象—回调链路。固定版本,先预测状态变化,再以源码符号、运行轨迹和一个失败样本复核。
13.3 Android的动态加载技术:机制、边界与证据
第13章 综合技术中的13.3 Android的动态加载技术必须放回 Android 5.0/Java 基线的应用调用—framework 代理—Binder/消息队列—目标对象—回调链路。固定版本,先预测状态变化,再以源码符号、运行轨迹和一个失败样本复核。
13.4 反编译初步:机制、边界与证据
第13章 综合技术中的13.4 反编译初步必须放回 Android 5.0/Java 基线的应用调用—framework 代理—Binder/消息队列—目标对象—回调链路。固定版本,先预测状态变化,再以源码符号、运行轨迹和一个失败样本复核。
13.4.1 使用dex2jar和jd-gui反编译apk:机制、边界与证据
第13章 综合技术中的13.4.1 使用dex2jar和jd-gui反编译apk必须放回 Android 5.0/Java 基线的应用调用—framework 代理—Binder/消息队列—目标对象—回调链路。固定版本,先预测状态变化,再以源码符号、运行轨迹和一个失败样本复核。