public static boolean install(File file) {

		log.trace("Installing extension file " + file);

		if (file == null) {
			log.error("Install file cannot be null");
			return false;
		}

		ExtensionDetails extension = ExtensionUtils.getExtension(file, false);
		if (extension == null) {
			Msg.showError(ExtensionInstaller.class, null, "Error Installing Extension",
				file.getAbsolutePath() + " does not point to a valid ghidra extension");
			return false;
		}

		Extensions extensions = ExtensionUtils.getAllInstalledExtensions();
		if (checkForConflictWithDevelopmentExtension(extension, extensions)) {
			return false;
		}

		if (checkForDuplicateExtensions(extension, extensions)) {
			return false;
		}

		// Verify that the version of the extension is valid for this version of Ghidra. If not,
		// just exit without installing.
		if (!validateExtensionVersion(extension)) {
			return false;
		}

		AtomicBoolean installed = new AtomicBoolean(false);
		TaskLauncher.launchModal("Installing Extension", (monitor) -> {
			installed.set(ExtensionUtils.install(extension, file, monitor));
		});

		boolean success = installed.get();
		if (success) {
			log.trace("Finished installing " + file);
		}
		else {
			log.trace("Failed to install " + file);
		}

		return success;
	}
Installs the given extension file. This can be either an archive (zip) or a directory that
contains an extension.properties file.

@param file the extension to install
@return true if the extension was successfully installed
Ghidra/Framework/Project/src/main/java/ghidra/framework/project/extensions/ExtensionInstaller.java