复现条件:
使用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();
}
复现条件:
使用deleteInstalledPlugin方法卸载插件,再重新安装会失败。
原因分析:
deleteInstalledPlugin方法只会卸载插件、runtime、loader三个apk,而安装插件时回去查找插件目录下的UNPACK_DONE_PRE_FIX + pluginUnpackDir.getName()文件进行判断,如果存在就是已经安装过不解压缩包。加载插件的loader.apk时会失败抛出找不到这个文件异常。
这里有个issue也提到了这个问题:
#621
这个issue解决方法感觉不够简洁,我这里简化了下,自测解决自己场景是没问题,但是还是希望官方能提供更优雅的解决方案。