Skip to content

插件卸载不干净导致无法重新安装插件 #691

@weixiaokang

Description

@weixiaokang

复现条件:
使用deleteInstalledPlugin方法卸载插件,再重新安装会失败。

原因分析:
deleteInstalledPlugin方法只会卸载插件、runtime、loader三个apk,而安装插件时回去查找插件目录下的UNPACK_DONE_PRE_FIX + pluginUnpackDir.getName()文件进行判断,如果存在就是已经安装过不解压缩包。加载插件的loader.apk时会失败抛出找不到这个文件异常。

这里有个issue也提到了这个问题:
#621
这个issue解决方法感觉不够简洁,我这里简化了下,自测解决自己场景是没问题,但是还是希望官方能提供更优雅的解决方案。

    public boolean deleteInstalledPlugin(String uuid) {
        InstalledPlugin installedPlugin = mInstalledDao.getInstalledPluginByUUID(uuid);
        File installedFile = installedPlugin.pluginLoaderFile.pluginFile.getParentFile();
        if (installedFile == null || installedFile.getParentFile() == null) {
            return false;
        }
        boolean success = deleteDir(installedFile.getParentFile());
        if (installedPlugin.pluginLoaderFile.oDexDir != null) {
            success = success && deleteDir(installedPlugin.pluginLoaderFile.oDexDir);
        }
        if (installedPlugin.pluginLoaderFile.libraryDir != null) {
            success = success && deleteDir(installedPlugin.pluginLoaderFile.libraryDir);
        }
        return success && mInstalledDao.deleteByUUID(uuid) > 0;
    }

    private boolean deleteDir(File dir) {
        if (dir.isFile()) {
            return dir.delete();
        }
        boolean success = true;
        File[] files = dir.listFiles();
        if (files != null) {
            for (File file : files) {
                success = success && deleteDir(file);
            }
        }
        return success && dir.delete();
    }

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions