彻底解决Android 应用方法数不能超过65K的问题

本文详细探讨了Android应用面临65K方法数限制的问题,包括异常原因、解决方案和实践方法。主要介绍了两种主流策略:微信式的插件化动态加载和Facebook式的多DEX文件分包。重点讲解了基于Gradle和Ant构建项目的分包实现过程,并提供了开源项目链接作为参考。同时,针对Android 2.3系统中出现的INSTALL_FAILED_DEXOPT异常,提出了修改虚拟机内存的方法。

尊重原创 :http://blog.csdn.net/yuanzeyao/article/details/41809423


作为一名Android开发者,相信你对Android方法数不能超过65K的限制应该有所耳闻,随着应用程序功能不断的丰富,总有一天你会遇到一个异常:

Conversion to Dalvik format failed:Unable toexecute dex: method ID not in [0, 0xffff]: 65536

可能有些同学会说,解决这个问题很简单,我们只需要在Project.proterty中配置一句话就Ok啦,

dex.force.jumbo=true

是的,加入了这句话,确实可以让你的应用通过编译,但是在一些2.3系统的机器上很容易出现

INSTALL_FAILED_DEXOPT异常


<think> 我们正在分析安卓手机卸载应用后重启应用又回来的问题。根据用户描述,卸载后重启应用又出现,可能的原因包括: 1. 系统预装应用:如果是系统预装应用,普通卸载可能只是卸载更新,重启后会恢复。 2. 设备管理员应用:如果应用被设置为设备管理员,需要先取消设备管理员权限才能卸载。 3. 双开应用/工作资料:如果在工作资料或双开空间中安装,可能需要在对应资料中卸载。 4. 恶意应用:某些恶意应用可能会自动重新安装。 5. 恢复出厂设置保护:某些厂商(如小米)有“恢复出厂设置保护”功能,可能会在重启后自动恢复部分应用。 6. 卸载不彻底:卸载过程中中断或出错,导致应用未被完全移除。 分析步骤: 1. 确认应用来源:是用户自己安装的还是系统预装的? - 如果是系统预装,可能需要root权限才能彻底删除。 2. 检查设备管理员权限: - 进入“设置”->“安全”->“设备管理器”,查看该应用是否被激活为设备管理员。如果是,先取消激活再卸载。 3. 检查是否为工作资料中的应用: - 在设置中查找“用户和帐户”或“工作资料”,如果在工作资料中,需要切换到工作资料进行卸载。 4. 检查是否有恢复出厂设置保护(如小米手机): - 在设置中搜索“恢复出厂设置保护”或类似选项,查看是否开启。如果开启,关闭后再尝试卸载。 5. 使用ADB命令卸载: - 如果普通卸载无效,可以尝试使用ADB命令卸载(需要开启USB调试): ```bash adb shell pm uninstall --user 0 <package_name> ``` 注意:这种方式只是禁用应用,不是完全卸载,重启后不会恢复(但有些系统可能会在恢复出厂设置后恢复)。 6. 使用Root权限卸载: - 如果上述方法无效,且手机已root,可以使用root卸载工具彻底删除系统预装应用。但注意,错误删除系统核心应用可能导致系统不稳定。 根据引用[1]提到的root和卸载方法,如果应用是系统预装且无法通过常规方式卸载,可能需要使用root权限来卸载。但是root有风险,需谨慎操作。 如何分析具体原因? - 查看卸载后的应用状态:使用ADB命令检查应用是否还存在: ```bash adb shell pm list packages | grep <package_name> ``` - 查看日志:在卸载过程中和重启后查看logcat日志,寻找相关错误信息(如之前的Finsky日志)或应用重新安装的线索。 针对之前提到的Finsky日志(计数器错误),它不太可能导致应用卸载失败或重启后恢复。因此,我们需要从上述其他角度分析。 总结解决方案: 1. 常规方法:通过设置中的应用卸载,检查设备管理员、工作资料等。 2. ADB卸载:对于非核心系统应用,使用上述ADB命令卸载。 3. Root卸载:对于核心系统应用,root后使用系统卸载工具(如钛备份、Root Explorer等)删除。 注意:使用root卸载系统应用有风险,可能导致系统崩溃。建议仅卸载明确知道可以卸载的系统应用。 如果以上方法都无效,考虑备份重要数据后恢复出厂设置(注意不要启用恢复出厂设置保护)。 最后,如果怀疑是恶意应用,可以尝试使用杀毒软件扫描,或者进入安全模式卸载(防止其他应用干扰卸载过程)。 下面用伪代码展示如何通过编程检测应用是否被卸载(实际卸载操作需要用户交互或系统权限,无法直接通过代码卸载): ```java // Android中检测应用是否安装的方法 public static boolean isAppInstalled(Context context, String packageName) { try { context.getPackageManager().getPackageInfo(packageName, 0); return true; } catch (PackageManager.NameNotFoundException e) { return false; } } ``` 然后,我们可以模拟卸载后的检查: 1. 卸载应用。 2. 检查应用是否还存在(使用上述方法)。 3. 重启设备。 4. 再次检查应用是否存在。 如果重启后应用又出现,则说明是上面提到的某种原因(如系统恢复)。 </think> 针对安卓手机卸载应用后重启又恢复的问题,以下是系统化的分析方法和解决方案: ### 原因分析与诊断步骤 1. **系统预装应用验证** 使用ADB命令检查应用属性: ```bash adb shell pm list packages -f | grep "应用包名" ``` 若输出包含 `/system/` 或 `/vendor/` 路径(如:`package:/system/app/ExampleApp.apk`),表明是**厂商预装应用**,普通卸载仅移除更新,重启后恢复原始版本[^1]。 2. **设备管理员权限检测** 在终端执行: ```bash adb shell dumpsys device_policy ``` 检查输出中是否包含目标应用包名。若显示 `admin=ComponentInfo{包名}`,需先在**设置→安全→设备管理员**中取消权限。 3. **双空间/工作资料残留** - 执行多用户检测: ```bash adb shell pm list users ``` - 若存在工作资料(如:`UserInfo{10:Work}`),需切换到该用户卸载: ```bash adb shell pm uninstall --user 10 应用包名 ``` 4. **厂商恢复机制排查** 常见于小米/OPPO等品牌: - 检查**设置→恢复出厂设置→恢复系统应用**选项是否开启 - 观察 `/data/cota/` 目录是否存在应用恢复脚本 5. **卸载异常诊断** 监控卸载过程日志: ```bash adb logcat | grep -E "PackageManager|INSTALL" ``` 关键错误示例: - `DELETE_FAILED_INTERNAL_ERROR`:系统分区保护 - `Package 包名 is a system package`:预装应用锁定 ### 解决方案 1. **ADB强制卸载(非预装应用)** ```bash adb shell pm uninstall -k --user 0 应用包名 # 保留数据 adb shell pm uninstall 应用包名 # 完全卸载 ``` 2. **预装应用禁用(需USB调试)** ```bash adb shell pm disable-user 应用包名 # 禁用但不卸载 adb shell cmd package install-existing 应用包名 # 恢复 ``` 3. **Root方案(高风险)** 使用Root Explorer等工具: - 删除 `/system/app/应用目录` - 清除 `/data/data/应用包名` - **警告**:操作失误可能导致系统崩溃! > ⚠️ 关于日志 `Finsky: non-positive increment`:此为Google Play统计模块错误,**不影响卸载流程**,可忽略。 ### 验证是否彻底卸载 重启后执行: ```bash adb shell pm path 应用包名 # 无输出表示成功 adb shell dumpsys package 应用包名 | grep "installed=true" # 检查状态 ```
评论 37
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值