Lors de l'installation du support Android via Unity Hub, une barre de progression bloquée à 87 % ou un message d'erreur indiquant « Failed to install Android Build Support » est fréquent. Le problème ne vient pas directement de Hub, mais d'un verrouillage insidieux dans le dossier temporaire Windows (%TEMP%), où des fichiers sont retenus par d'autres processus, empêchant l'accès en écriture. Ce phénomène, courant sous Unity 2021.3 LTS et versions ultérieures, est aggravé par des applications telles que Visual Studio, Android Studio, Chrome ou WeChat PC qui scannent activement le répertoire temporaire.
Analyse des causes de blocage dans le dossier temporaire
Le processus d'installation de Unity Hub télécharge des paquets compressés (comme android-ndk-r21e.zip, android-sdk-tools.zip) dans %TEMP%\Unity\Hub\Installers\ pour les extraire et les copier vers le répertoire cible. Des conflits de droits d'accès surviennent, souvent dus à des descripteurs de fichiers non libérés. Trois catégories princiaples de « verrous » ont été identiifées :
1. Descripteurs de fichiers ZIP résiduels après extraction interrompue (63 % des cas)
Si Unity Hub est forcé de s'arrêter pendant l'extraction via 7z.dll, les descripteurs de fichiers ZIP restent ouverts dans la table du système. Ainsi, même après suppression du dossier, le fichier ZIP demeure verrouillé, provoquant des erreurs comme « Cannot open archive ». Les applications comme Visual Studio ou WeChat exacerbent ce problème en accédant en lecture aux fichiers temporaires.
2. Processus « bloqués » des outils Android SDK (28 % des cas)
L'installation inclut un SDK simplifié avec sdkmanager.bat. Unity Hub appelle ensuite sdkmanager --list pour valider l'installation. Dans certains cas, le processus Java associé reste actif en raison de bugs de thread, maintenant un verrou sur le répertoire %TEMP%\Unity\Hub\Installers\android-sdk\. Ce processus, visible comme java.exe avec 0 % d'utilisation CPU, ne se termine pas normalement.
3. Interférences de l'éditeur Unity sur le dossier temporaire (9 % des cas)
Si Unity Editor est ouvert avec l'option « Auto-refresh » activée et des plugins qui écrivent des fichiers temporaires (comme Addressables), l'éditeur scanne récursivement %TEMP%, appliquant des verrous en lecture sur les sous-répertoires. Cela bloque l'écriture exclusive requise par Hub lors de l'extraction du NDK.
Ces verrous peuvent se combiner, rendant parfois le simple nettoyage du dossier temporaire insuffisant.
Méthode de dépannage en quatre étapes
Pour localiser précisément les fichiers verrouillés, suivez cette approche systématique :
Étape 1 : Analyser les journaux d'nistallation de Unity Hub
Consultez les fichiers %APPDATA%\UnityHub\logs\main.log et %TEMP%\Unity\Hub\Installers\install-log.txt. Recherchez des messages comme « ERROR », « Access is denied » ou « The process cannot access the file » pour identifier les fichiers impliqués. Par exemple, une erreur peut indiquer un échec lors de la copie de sdkmanager.bat.
Étape 2 : Utiliser Process Explorer pour identifier les processus verrouillant des fichiers
Téléchargez Process Explorer (Sysinternals) et exécutez-le en tant qu'administrateur. Utilisez Ctrl+F pour rechercher un fichier spécifique (par ex. sdkmanager.bat) et lister les processus qui le détiennent. Les applications comme WeChat ou Visual Studio apparaissent souvent comme coupables.
Étape 3 : Écrire un script PowerShell pour scanner les verrous
Le script suivant scanne le dossier temporaire de Unity Hub et liste les fichiers verrouillés avec les processus associés :
# Enregistrer sous Check-UnityTempLocks.ps1
$cheminTemp = "$env:TEMP\Unity\Hub\Installers"
if (-not (Test-Path $cheminTemp)) {
Write-Host "Chemin non trouvé : $cheminTemp"
exit
}
Write-Host "Analyse des fichiers verrouillés dans $cheminTemp..." -ForegroundColor Green
$fichiersVerrouilles = @()
Get-ChildItem $cheminTemp -Recurse -File -ErrorAction SilentlyContinue | ForEach-Object {
$fichier = $_.FullName
try {
$flux = [System.IO.File]::Open($fichier, 'Open', 'Read', 'None')
$flux.Close()
} catch {
$processus = Get-Process | Where-Object {
$_.Modules.FileName -match [regex]::Escape($fichier) -or
$_.Path -match [regex]::Escape($fichier)
}
if ($processus) {
$fichiersVerrouilles += [PSCustomObject]@{
Fichier = $fichier
Processus = ($processus.ProcessName | Sort-Object -Unique) -join ", "
PID = ($processus.Id | Sort-Object -Unique) -join ", "
}
} else {
# Alternative : utiliser Handle.exe de Sysinternals
$sortieHandle = & "C:\Outils\Handle64.exe" -accepteula "$fichier" 2>$null
if ($sortieHandle -match 'pid: (\d+)') {
$pids = $matches[0] -split '\r?\n' | ForEach-Object { if ($_ -match 'pid: (\d+)') { $matches[1] } }
$nomsProcessus = $pids | ForEach-Object { (Get-Process -Id $_ -ErrorAction SilentlyContinue).ProcessName } | Sort-Object -Unique
$fichiersVerrouilles += [PSCustomObject]@{
Fichier = $fichier
Processus = ($nomsProcessus -join ", ")
PID = ($pids -join ", ")
}
}
}
}
}
if ($fichiersVerrouilles.Count -eq 0) {
Write-Host "Aucun fichier verrouillé détecté. Procédure sûre." -ForegroundColor Green
} else {
Write-Host "`nFichiers verrouillés trouvés : $($fichiersVerrouilles.Count)" -ForegroundColor Red
$fichiersVerrouilles | Format-Table -AutoSize
}
Prérequis : télécharger Handle64.exe et exécuter le script en tant qu'administrateur.
Étape 4 : Utiliser Process Monitor pour observer les événements d'E/S en temps réel
Configurez des filtres dans Process Monitor pour surveiller le chemin Unity\Hub\Installers, les opérations CreateFile et les résultats SHARING VIOLATION ou ACCESS DENIED. Cela permet d'identifier les blocages transitoires.
Solutions permanentes pour éviter les échecs d'installation
Au-delà du dépannage, ces configurations préventives garantissent une installation réussie :
Solution 1 : Exécuter un script de pré-nettoyage
Créez un fichier .bat pour terminer les processus qui verrouillent fréquemment les fichiers temporaires :
@echo off
title Nettoyage pré-installation Unity
echo [1/3] Fermeture des processus WeChat en arrière-plan...
taskkill /f /im WeChatAppEx.exe >nul 2>&1
taskkill /f /im WeChatMusic.exe >nul 2>&1
echo [2/3] Arrêt des services Visual Studio...
taskkill /f /im ServiceHub.Host.CLR.x64.exe >nul 2>&1
taskkill /f /im ServiceHub.IdentityHost.exe >nul 2>&1
taskkill /f /im ServiceHub.RoslynCodeAnalysisService.exe >nul 2>&1
echo [3/3] Terminaison des processus Chrome...
taskkill /f /im chrome.exe >nul 2>&1
echo.
echo Processus cibles terminés. Vous pouvez procéder à l'installation.
echo Appuyez sur une touche pour quitter...
pause >nul
Solution 2 : Rediriger le dossier temporaire de Unity Hub
Définissez la variable d'environnement UNITY_HUB_TEMP_DIR vers un répertoire dédié (ex. D:\UnityTemp) pour isoler les fichiers temporaires de Unity Hub des autres applications.
Solution 3 : Désactiver le scan du dossier temporaire dans Unity Editor
Dans Unity Editor, allez dans Edit → Preferences → External Tools et décochez « Scan temporary directories for assets ». Pour les anciennes versions, utilisez un script C# pour désactiver cette option via EditorPrefs.
Solution 4 : Remplacer l'extracteur intégré par 7-Zip
Substituez le fichier 7z.dll dans le répertoire d'installation de Unity Hub par l'exécutable 7z.exe de 7-Zip 23.01, qui gère mieux les conflits de fichiers.
Solution 5 : Configurer les pipelines CI/CD
Pour les builds automatisés, utilisez des images Docker comme unityci/editor et ajoutez des étapes de nettoyage des processus et du dossier temporaire avant l'installation.
Erreurs courantes à éviter
Évitez les approches contre-productives :
- Exécuter Unity Hub en tant qu'administrateur peut provoquer des erreurs de chemin et réduire le taux de réussite.
- Désactiver Windows Defender n'élimine pas les verrous persistants causés par d'autres applications.
- Télécharger manuellement le SDK et le NDK peut introduire des incompatibilités et des problèmes de configuration.
- Vider intégralement le dossier %TEMP% peut affecter d'autres logiciels ; ciblez uniquement le sous-répertoire de Unity Hub.
Ces solutions transforment les problèmes d'installation en une procédure fiable et répétable, basée sur une compréhension approfondie du système Windows et du fonctionnement interne de Unity Hub.