报错:Failed to finalize session : INSTALL_FAILED_INVALID_APKLE:

本文讲述了在接收腾讯代码后遇到的签名文件冲突问题及解决方案。由于更换签名文件导致应用无法正常运行,在百度和Google搜索后发现原因是包名相同但签名不同。最终通过清理项目解决了该问题。

最近公司不断的从腾讯那边开始接收新的代码,其中这个报错,在编译的时候是显示通过成功的,只是在运行的时候就报错了!

起因是:腾讯的那边打包了一个签名,我们接收后,就把以前的签名文件给干掉了,自己从新弄了个签名文件,打包,通过fim构建内侧分发,是可以安装的,但是自己运行run(运行run实际上是运行的debug模式),结果就是项目跑不起来,然后就是报这个错!

百度了,google说是二次的安装的包名一样,签名文件不一样!
怎么解决呢!

直接clean 项目后,然后运行就可以

有网友说是as工具的问题,但是这么解决了,其实原理是什么我还真不知道,望知道的大神告知!

<think>我们正在处理一个常见的Android开发错误:"adb: failed to finalize session"。这个错误通常发生在使用ADBAndroid Debug Bridge)安装APK时,尤其是在Windows平台上。下面我们将详细解析该错误的原因及解决方案。 ### 错误原因分析: 1. **签名验证失败**:APK文件可能被破坏或签名无效。 2. **存储空间不足**:设备存储空间不足导致无法完成安装。 3. **权限问题**:ADB没有足够的权限写入设备。 4. **安装会话冲突**:之前的安装会话未正确关闭。 5. **设备连接不稳定**:USB连接或网络连接(无线调试时)不稳定。 ### 解决方案代码示例: ```python import subprocess import time def install_apk_with_retry(apk_path, device_id=None, retries=3): """ 增强版APK安装函数,处理session finalize失败 :param apk_path: APK文件路径 :param device_id: 可选设备ID(多设备时指定) :param retries: 重试次数 """ # 基础命令构建 base_cmd = ['adb'] if device_id: base_cmd.extend(['-s', device_id]) base_cmd.append('install') for attempt in range(retries): try: # 尝试安装 cmd = base_cmd + [apk_path] print(f"尝试安装 ({attempt+1}/{retries}): {' '.join(cmd)}") result = subprocess.run(cmd, capture_output=True, text=True, check=True) # 检查输出中是否有特定错误 if "Failed to finalize session" in result.stdout: raise RuntimeError("检测到session finalize失败") print("安装成功!") return True except subprocess.CalledProcessError as e: print(f"ADB错误: {e.stderr}") if "INSTALL_FAILED_INSUFFICIENT_STORAGE" in e.stderr: raise RuntimeError("设备存储空间不足") from e time.sleep(2) # 等待2秒后重试 # 最终失败处理 print("❌ 多次重试后仍失败,尝试手动重启设备或ADB服务") return False ``` ### 高级修复步骤: 1. **重启ADB服务**: ```python subprocess.run(['adb', 'kill-server']) subprocess.run(['adb', 'start-server']) ``` 2. **清除安装会话**: ```python subprocess.run(['adb', 'shell', 'pm', 'install-abandon', 'com.example.package']) ``` 3. **释放设备存储空间**: ```python # 获取设备可用空间 df = subprocess.check_output(['adb', 'shell', 'df', '/data']).decode() print("设备存储状态:\n", df) ``` 4. **绕过签名验证(仅调试)**: ```python # 使用--bypass-low-target-sdk-block选项(仅适用于Android 13+) subprocess.run(['adb', 'install', '--bypass-low-target-sdk-block', apk_path]) ``` ### 错误处理流程图: ```mermaid graph TD A[adb: failed to finalize session] --> B{检查存储空间} B -->|不足| C[清理设备存储] B -->|充足| D{重启ADB服务} D --> E[重试安装] E -->|仍然失败| F{清除安装会话} F --> G[pm install-abandon] G --> H[再次重试] H -->|失败| I[检查APK完整性] I --> J[重新签名APK] ``` ### 预防措施: 1. **安装前验证APK**: ```python from zipfile import ZipFile def verify_apk(apk_path): with ZipFile(apk_path) as z: if 'AndroidManifest.xml' not in z.namelist(): raise ValueError("APK文件损坏") ``` 2. **保持ADB版本最新**: ```python # 自动更新ADB(仅限Homebrew安装的Mac/Linux) subprocess.run(['brew', 'upgrade', 'android-platform-tools']) ``` §§相关问题§§ 1. 当使用无线ADB调试时,哪些网络因素可能导致'session finalize'失败? 2. 如何通过Python脚本自动清理Android设备的存储空间以解决安装空间不足问题? 3. 在多设备连接的情况下,如何确保ADB命令精确指定目标设备? 4. 对于因Android系统版本差异引发的安装失败(如targetSdkVersion过低),有哪些兼容性处理方案? 5. 如何捕获并解析ADB命令的输出流中的非英语错误消息(如中文系统下的错误提示)? </think>### ADB "failed to finalize session" 错误解决方案 #### 错误原因深度解析 该错误通常发生在 APK 安装过程中,主要涉及以下核心问题: 1. **APK 签名验证失败** - Android 系统无法验证 APK 的数字签名 2. **存储空间不足** - 设备内部存储或系统分区空间不足 3. **会话冲突** - 前次安装会话未正确终止 4. **API 级别不兼容** - 应用与设备 Android 版本不匹配 5. **损坏的 APK 文件** - 文件下载或传输过程中损坏 #### 完整解决方案代码 ```python import subprocess import os import time from pathlib import Path def adb_install_with_retry(apk_path, max_retries=3): """ 带错误处理的增强版ADB安装函数 :param apk_path: APK文件路径 :param max_retries: 最大重试次数 :return: 安装是否成功 """ apk_path = Path(apk_path).resolve() # 1. 验证APK完整性 if not verify_apk(apk_path): print(f"❌ APK文件损坏: {apk_path}") return False # 2. 重启ADB服务 subprocess.run(['adb', 'kill-server'], check=True) time.sleep(1) subprocess.run(['adb', 'start-server'], check=True) time.sleep(2) # 3. 清理旧会话 subprocess.run(['adb', 'shell', 'pm', 'install-abandon', 'all'], stderr=subprocess.DEVNULL) # 4. 带重试机制的安装 for attempt in range(max_retries): try: print(f"尝试安装 ({attempt+1}/{max_retries}): {apk_path.name}") # 添加安装参数选项 cmd = ['adb', 'install', '-r', '--bypass-low-target-sdk-block'] # 处理包含空格的中文路径 if ' ' in str(apk_path): cmd.append(f'"{apk_path}"') else: cmd.append(str(apk_path)) result = subprocess.run(cmd, capture_output=True, text=True, timeout=120) # 检查安装结果 if "Success" in result.stdout: print("✅ 安装成功!") return True # 处理特定错误 if "INSTALL_FAILED_INSUFFICIENT_STORAGE" in result.stderr: print("⚠️ 存储空间不足,尝试清理缓存...") subprocess.run(['adb', 'shell', 'pm', 'trim-caches', '500M']) except subprocess.TimeoutExpired: print("⏱️ 安装超时,重试中...") print(f"❌ 安装失败: {result.stderr.strip()}") return False def verify_apk(apk_path): """验证APK文件完整性""" try: # 基本大小验证 if apk_path.stat().st_size < 1024: return False # 通过aapt检查 aapt_out = subprocess.check_output( ['aapt', 'dump', 'badging', str(apk_path)], stderr=subprocess.DEVNULL ) return "package: name=" in aapt_out.decode() except: return False # 使用示例 if __name__ == '__main__': apk_file = "安卓应用_测试版.apk" adb_install_with_retry(apk_file) ``` #### 高级调试技巧 1. **启用详细日志**: ```bash adb install -d -t -g --verbose "path/to/app.apk" ``` 2. **检查设备状态**: ```python subprocess.run(['adb', 'devices', '-l']) subprocess.run(['adb', 'shell', 'df', '-h']) ``` 3. **会话恢复命令**: ```bash # 列出所有会话 adb shell pm list packages -f -U # 强制结束会话 adb shell pm install-abandon <session_id> ``` #### 错误处理流程图 ```mermaid graph TD A[adb failed to finalize session] --> B{检查存储空间} B -->|不足| C[清理缓存/卸载应用] B -->|充足| D{重启ADB服务} D --> E[清除安装会话] E --> F{验证APK完整性} F -->|损坏| G[重新获取APK] F -->|正常| H[添加安装参数] H --> I[--bypass-low-target-sdk-block] I --> J[--force-uuid] J --> K[重试安装] ``` #### 预防措施 1. **增加安装超时设置**: ```python subprocess.run(['adb', 'install', '-t', '300', ...]) ``` 2. **预安装检查**: ```python def pre_install_check(device_id): storage = subprocess.check_output(['adb', '-s', device_id, 'shell', 'df', '/data']) if '90%' in storage.decode(): print("⚠️ 存储空间即将满额") return False return True ``` 3. **签名验证工具**: ```python def check_signature(apk_path): jarsigner_out = subprocess.run( ['jarsigner', '-verify', '-verbose', str(apk_path)], capture_output=True ) return "jar verified" in jarsigner_out.stdout.decode() ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值