一、ADB架构全景图
核心组件交互关系:
- ADB客户端:开发者使用的命令行工具(如adb install)
- ADB Server:主机后台进程(端口5037),负责设备发现与指令转发
- adbd守护进程:设备端常驻服务,接收并执行具体指令
二、客户端处理流程(命令解析与传输)
核心文件:
commandline.cpp
:ADB命令分发中心adb_install.cpp
:安装策略控制器
arduino
cpp
// commandline.cpp 指令路由核心逻辑
int adb_commandline(int argc, const char** argv) {
// 遍历匹配命令关键字
if (!strcmp(argv[0], "install")) {
// 根据设备版本选择安装方式
return _use_legacy_install() ?
install_app_legacy(argc, argv) : // Android 9以下传统模式
install_app(argc, argv); // Android 10+增强模式
}
// 其他命令处理...
}
安装模式选择矩阵:
模式 | 触发条件 | 技术特点 |
---|---|---|
传统推送安装 | API Level < 29 | 完整APK传输到/data/local/tmp |
流式安装 | API Level >= 29 | 边传输边解析,内存占用优化 |
增量安装 | 启用--incremental 参数 |
仅传输差异文件,调试效率提升50%+ |
scss
cpp
// adb_install.cpp 安装模式决策逻辑
int install_app(...) {
// 评估设备支持能力
auto [primary, fallback] = calculate_install_mode(...);
// 主模式执行
int result = run_install_mode(primary);
// 主模式失败时启用备用方案
if (result && fallback) {
result = run_install_mode(*fallback);
}
return result;
}
三、服务端处理流程(安装会话管理)
核心组件:
- PackageManagerShellCommand:PM指令入口
- PackageInstallerService:安装会话管理器
- PackageManagerService:安卓包管理核心
安装会话生命周期:
rust
mermaid
sequenceDiagram
Client->>+adbd: adb install example.apk
adbd->>+PackageManagerShellCommand: pm install
PackageManagerShellCommand->>PackageInstallerService: 创建会话
PackageInstallerService-->>-PackageManagerShellCommand: sessionId=123
PackageManagerShellCommand->>PackageInstallerSession: 写入APK数据
PackageManagerShellCommand->>PackageInstallerSession: 提交安装
PackageInstallerSession->>PackageManagerService: 启动安装验证
PackageManagerService-->>-Client: INSTALL_SUCCEEDED
关键代码解析:
csharp
java
// PackageManagerShellCommand.java 安装入口
public int onCommand(String cmd) {
switch(cmd) {
case "install":
return runInstall(); // 触发安装主流程
// 其他命令处理...
}
}
private int runInstall() {
// 创建安装会话
int sessionId = doCreateSession(params, installerPkg, userId);
// 写入APK文件
writeApkToSession(sessionId, apkFile);
// 提交安装请求
return doCommitSession(sessionId);
}
四、安装验证流程(安全与兼容检查)
验证步骤分解:
-
APK完整性校验
typescriptjava // PackageManagerService.java private void verifyApkIntegrity(PackageParser.Package pkg) { if (pkg.mSigningDetails == SigningDetails.UNKNOWN) { throw new PackageManagerException("APK签名缺失"); } }
-
权限声明检查
javascriptjava void checkRequiredPermissions(PackageParser.Package pkg) { for (String perm : pkg.requestedPermissions) { if (!isPermissionDeclared(perm)) { throw new SecurityException("未声明权限: " + perm); } } }
-
系统兼容性验证
arduinojava void checkMinSdkVersion(int minSdk) { if (minSdk > Build.VERSION.SDK_INT) { throw new PackageManagerException( "所需SDK版本" + minSdk + "高于当前系统"); } }
五、安装结果处理(数据持久化)
安装后操作流程:
-
文件系统写入:
- APK存储路径:
/data/app/[包名]-base.apk
- 优化文件生成:
oat/
目录下的.odex
文件
- APK存储路径:
-
系统状态更新:
scssjava void updatePackageState(PackageInstalledInfo res) { mSettings.addPackage(res.pkg); mSettings.saveLPr(); // 发送全局广播 sendPackageAddedBroadcast(res.pkg.packageName); }
-
缓存清理策略:
ccpp // adb_install.cpp void cleanupTempFiles(int sessionId) { string path = "/data/local/tmp/" + sessionId + ".apk"; if (file_exists(path)) { unlink(path.c_str()); // 删除临时文件 } }
六、错误处理机制
常见错误码对照表:
错误码 | 触发场景 | 解决方案 |
---|---|---|
INSTALL_FAILED_ABORTED | 用户主动取消 | 检查用户交互状态 |
INSTALL_PARSE_FAILED | APK解析错误 | 验证APK完整性 |
INSTALL_FAILED_CONFLICT | 包名冲突 | 卸载旧版本或修改包名 |
INSTALL_FAILED_INVALID_URI | 文件路径异常 | 检查adb push操作完整性 |
调试技巧示例:
ruby
bash
# 查看实时安装日志
adb logcat -s PackageManager:I
# 保留安装临时文件
adb shell 'cp /data/local/tmp/*.apk /sdcard/debug/'
# 强制使用传统安装模式
adb install --legacy app-debug.apk