Tencent / Shadow

零反射全动态Android插件框架
BSD 3-Clause "New" or "Revised" License
7.43k stars 1.3k forks source link

卸载插件时遇到无法删除文件的问题 #1287

Closed xiboliya2000 closed 7 months ago

xiboliya2000 commented 7 months ago

你好@shifujun ,由于我们插件的uuid是固定的,所以没法直接使用deleteInstalledPlugin(String uuid)接口来卸载某一个插件。因此我们自己写了卸载接口来删除数据库数据和删除插件安装目录及其下的所有文件。我们开发和测试阶段都没出现问题,但是线上收集到某些用户在删除的时候失败了,获取插件安装目录(插件MD5/pluginName)下的文件列表为null,并且删除此目录失败。而且我们发现该用户下次启动app删除数据还会遇到相同的问题,此目录始终无法删除。 另外,我查看了issue #691,里面有删除目录的方法,感觉跟我们的方法差不多。 我们的代码如下:

private fun deleteRecursive(file: File): Boolean { try { if (!file.exists()) { return true } if (file.isDirectory) { val files = file.listFiles() if (files != null) { for (child in files) { val result = deleteRecursive(child) if (!result) { return false } } } else { mLogger.error("deleteRecursive listFiles is null, file: $file") } } if (!file.delete()) { mLogger.error("deleteRecursive $file fail") return false } } catch (x: Exception) { mLogger.error("deleteRecursive $file error=$x") return false } return true }

附:线上收集到用户端打印的删除失败的日志如下: deleteRecursive listFiles is null, file: /data/user/0/com.demo/files/ShadowPluginManager/UnpackedPlugin/demo-manager/313206a8883de831e1eaee222dcd94c9/demoPlugin1 deleteRecursive /data/user/0/com.demo/files/ShadowPluginManager/UnpackedPlugin/demo-manager/313206a8883de831e1eaee222dcd94c9/demoPlugin1 fail

所以我们有3个问题咨询一下:

  1. 使用listFiles获取插件安装目录下文件列表为null的原因可能是什么呢?
  2. 删除插件安装目录及其下的所有文件有推荐的方法吗?
  3. 请问Shadow官方有没有计划添加卸载某个插件(比如根据插件名称和版本号来指定插件)的功能? 感谢大佬!
shifujun commented 7 months ago

首先你知道原本这个项目设计的uuid是不能重的,所以应该谁要固定的uuid你找谁才对呀。

其次,就文件管理这点事,也不复杂吧。manager整个自己重写就好了,它明显不是shadow的核心功能。

主要是注意安装插件和卸载插件时事务化操作多个文件。避免进程突然被用户杀了,留下个安装或卸载不完整的插件。

xiboliya2000 commented 7 months ago

@shifujun 好的,感谢回复。