Windows下Android Studio 2022.1.1 Patch1安装失败问题咨询
问题场景
在Windows 11家庭版环境下,尝试将Android Studio 2022.1.1升级至2022.1.1 Patch 1时失败,该升级操作可在Linux分区正常完成。补丁下载完成后重启IDE触发更新,报错信息如下:
An error occurred when preparing the patch:
java.io.IOException: An absolute link: C:\Program Files\Android\Android Studio\jre -> C:\Program Files\Android\Android Studio\jbr
对应的更新日志完整内容:
20/02 14:57:18 INFO Runner.initLogger - --- Updater started --- 20/02 14:57:18 INFO Runner._main - args: [install, C:\Program Files\Android\Android Studio] 20/02 14:57:18 INFO Runner._main - destination: C:\Program Files\Android\Android Studio (C:\Program Files\Android\Android Studio), case-sensitive: false 20/02 14:57:18 INFO Utils.getTempFile - created a working directory: C:\Users\vanet\AppData\Local\Google\AndroidStudio2022.1\tmp\patch-update\idea.updater.files.2070024887130819060 20/02 14:57:18 INFO Runner.install - Extracting patch file... 20/02 14:57:18 INFO Utils.getZipEntry - entryPath: patch-file.zip 20/02 14:57:18 INFO Utils.getZipEntry - entryPath: .patch-info 20/02 14:57:18 INFO PatchFileCreator.prepareAndValidate - Android Studio 221.6008.13.2211.9477386 -> 221.6008.13.2211.9514443 20/02 14:57:18 INFO Patch.forEach - Validating installation... [3175 actions] 20/02 14:57:18 ERROR Runner.install - prepare failed java.io.IOException: An absolute link: C:\Program Files\Android\Android Studio\jre -> C:\Program Files\Android\Android Studio\jbr at com.intellij.updater.Digester.digestRegularFile(Digester.java:50) at com.intellij.updater.Patch.digestFile(Patch.java:450) at com.intellij.updater.DeleteAction.validate(DeleteAction.java:42) at com.intellij.updater.Patch.lambda$validate$0(Patch.java:292) at com.intellij.updater.Patch.forEach(Patch.java:438) at com.intellij.updater.Patch.validate(Patch.java:291) at com.intellij.updater.PatchFileCreator.prepareAndValidate(PatchFileCreator.java:109) at com.intellij.updater.Runner.install(Runner.java:413) at com.intellij.updater.Runner._main(Runner.java:221) at com.intellij.updater.Runner.main(Runner.java:49) 20/02 14:57:34 INFO Runner.cleanup - Cleaning up... 20/02 14:57:34 INFO Utils.tryDelete - deleted: C:\Users\vanet\AppData\Local\Google\AndroidStudio2022.1\tmp\patch-update\idea.updater.files.2070024887130819060\patch.tmp.0 20/02 14:57:34 INFO Utils.tryDelete - deleted: C:\Users\vanet\AppData\Local\Google\AndroidStudio2022.1\tmp\patch-update\idea.updater.files.2070024887130819060 20/02 14:57:34 INFO Utils.cleanup - deleted a working directory: C:\Users\vanet\AppData\Local\Google\AndroidStudio2022.1\tmp\patch-update\idea.updater.files.2070024887130819060 20/02 14:58:53 INFO Runner.initLogger - --- Updater started --- 20/02 14:58:53 INFO Runner._main - args: [install, C:\Program Files\Android\Android Studio] 20/02 14:58:53 INFO Runner._main - destination: C:\Program Files\Android\Android Studio (C:\Program Files\Android\Android Studio), case-sensitive: false 20/02 14:58:53 INFO Utils.getTempFile - created a working directory: C:\Users\vanet\AppData\Local\Google\AndroidStudio2022.1\tmp\patch-update\idea.updater.files.11969764392612736673 20/02 14:58:53 INFO Runner.install - Extracting patch file... 20/02 14:58:53 INFO Utils.getZipEntry - entryPath: patch-file.zip 20/02 14:58:53 INFO Utils.getZipEntry - entryPath: .patch-info 20/02 14:58:53 INFO PatchFileCreator.prepareAndValidate - Android Studio 221.6008.13.2211.9477386 -> 221.6008.13.2211.9514443 20/02 14:58:53 INFO Patch.forEach - Validating installation... [3175 actions] 20/02 14:58:53 ERROR Runner.install - prepare failed java.io.IOException: An absolute link: C:\Program Files\Android\Android Studio\jre -> C:\Program Files\Android\Android Studio\jbr at com.intellij.updater.Digester.digestRegularFile(Digester.java:50) at com.intellij.updater.Patch.digestFile(Patch.java:450) at com.intellij.updater.DeleteAction.validate(DeleteAction.java:42) at com.intellij.updater.Patch.lambda$validate$0(Patch.java:292) at com.intellij.updater.Patch.forEach(Patch.java:438) at com.intellij.updater.Patch.validate(Patch.java:291) at com.intellij.updater.PatchFileCreator.prepareAndValidate(PatchFileCreator.java:109) at com.intellij.updater.Runner.install(Runner.java:413) at com.intellij.updater.Runner._main(Runner.java:221) at com.intellij.updater.Runner.main(Runner.java:49)
注:jre为指向JetBrains Runtime目录jbr的符号链接。
问题根源分析
1. JetBrains更新器的符号链接校验逻辑限制
JetBrains为IntelliJ平台(包括Android Studio)开发的更新工具,在Windows系统下的文件校验逻辑中,明确禁止处理绝对路径格式的符号链接。从报错栈可以看到,Digester.digestRegularFile方法在检测到jre是绝对路径符号链接时直接抛出异常,终止更新流程。而Linux系统对绝对路径符号链接的兼容性更好,更新器的校验逻辑未对此做限制,因此Linux下升级正常。
2. 跨平台符号链接格式差异
Android Studio在Windows和Linux平台上创建jre符号链接的格式不同:Windows版本使用的是绝对路径指向jbr,而Linux版本使用的是相对路径。制作升级补丁时,是基于Linux下相对路径符号链接的预期进行适配的,未考虑Windows下绝对路径符号链接的场景,导致补丁校验不通过。
3. Windows NTFS符号链接与Linux软链接的底层差异
Windows NTFS符号链接和Linux软链接的底层实现、权限校验机制不同。JetBrains更新器的文件处理逻辑未完全适配Windows符号链接的特性,当更新器尝试读取jre符号链接的目标路径时,将绝对路径判定为不符合安全规范的异常情况,触发了预设的校验拦截规则。
内容的提问来源于stack exchange,提问作者Mauro Vanetti

