Closed xiboliya2000 closed 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个问题咨询一下:
首先你知道原本这个项目设计的uuid是不能重的,所以应该谁要固定的uuid你找谁才对呀。
其次,就文件管理这点事,也不复杂吧。manager整个自己重写就好了,它明显不是shadow的核心功能。
主要是注意安装插件和卸载插件时事务化操作多个文件。避免进程突然被用户杀了,留下个安装或卸载不完整的插件。
@shifujun 好的,感谢回复。
你好@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个问题咨询一下: