Xamarin Java.exe 退出,代码为 1(Proguard 问题)
Xamarin Java.exe exited with code 1 (Proguard Issue)
与 Xamarin 的又一天!甚至无法构建我的第一个 Hello World
项目!不足为奇吧?
那么,全新的 Xamarin.Android
空白项目。启用 ProGuard、link 到 仅 SDK 程序集 并继续构建项目。 wallah!! 出现错误!(等等,我不应该感到惊讶,对吧?毕竟,它是 Xamarin)。这是错误:
"java.exe" exited with code 1
双击异常打开Xamarin.Android.Common.Targets
文件并指向ProGuard
标签如下:
<Proguard
Condition="'$(AndroidEnableProguard)' == 'True' and '$(_ProguardProjectConfiguration)' != ''"
ProguardJarPath="$(ProguardJarPath)"
AndroidSdkDirectory="$(_AndroidSdkDirectory)"
JavaToolPath="$(JavaToolPath)"
ProguardToolPath="$(ProguardToolPath)"
ToolExe="$(ProguardToolExe)"
UseProguard="$(UseProguard)"
JavaPlatformJarPath="$(JavaPlatformJarPath)"
ClassesOutputDirectory="$(IntermediateOutputPath)android\bin\classes"
AcwMapFile="$(_AcwMapFile)"
ProguardCommonXamarinConfiguration="$(IntermediateOutputPath)proguard\proguard_xamarin.cfg"
ProguardGeneratedReferenceConfiguration="$(_ProguardProjectConfiguration)"
ProguardGeneratedApplicationConfiguration="$(IntermediateOutputPath)proguard\proguard_project_primary.cfg"
ProguardConfigurationFiles="$(ProguardConfigFiles)"
JavaLibrariesToEmbed="@(_JarsToProguard);@(_InstantRunJavaReference)"
ExternalJavaLibraries="@(AndroidExternalJavaLibrary)"
DoNotPackageJavaLibraries="@(_ResolvedDoNotPackageAttributes)"
ProguardJarOutput="$(IntermediateOutputPath)proguard\__proguard_output__.jar"
EnableLogging="$(ProguardEnableLogging)"
DumpOutput="$(IntermediateOutputPath)proguard\dump.txt"
PrintSeedsOutput="$(IntermediateOutputPath)proguard\seeds.txt"
PrintUsageOutput="$(IntermediateOutputPath)proguard\usage.txt"
PrintMappingOutput="$(IntermediateOutputPath)proguard\mapping.txt"
ProguardInputJarFilter="$(_AndroidProguardInputJarFilter)"
/>
所以,我最好的猜测是它可能是一个 ProGuard 相关的问题。因此,搜索 google 并应用我目前找到的所有修复程序:
- 已更新 Android SDK
- 将Java堆大小设置为1G(甚至5G)
- 已启用 Multi-Dex
- 已更新 ProGuard
- 在解决方案中创建了一个新的 proguard.cfg 文件(当然将
build action
设置为 ProGuardConfiguration
并添加了必要的自定义行。
但是,同样的错误指向同一个 ProGuard
标签。现在,在有人开始抨击我说我可能搞砸了 proguard 配置文件之前,这里是 link:
我了解到这是 Xamarin 中一个非常常见的问题。所以,我想,有人可能想出了一个 确实有效的解决方案!。那么,关于我可能遗漏的任何修复或想法?
确保您添加的混淆器文件不是 Unicode 文本文件(U+FEFF 字节顺序标记 (BOM)),因为混淆器会失败...
启用诊断。 MSBuild 的日志记录级别并获取完整的错误消息。
Proguard 正在被 Google 的 R8 取代
如果您使用的是最新版本的 Xamarin,请参考此博客 post 作为开始:
有关各种 D8/R8 项目配置的详细信息可在此处的 Xamarin.Android 存储库中找到:
Proguard 可能有点麻烦。通常的症状是
java exited with code 1
对我有用的步骤(我将这些注释存储在我的解决方案中,因为它并不明显)。摘自 this site
- 下载最新版本的Proguard
- 找到 Android SDK 的安装位置(类似于 /android-sdk/tools/proguard”)。要找到 SDK,请转到
Tools->Options->Xamarin
- 用新版本替换旧版本的 Proguard。为此,将当前文件夹重命名为“Proguard-pointless”之类的名称,并将新文件夹复制到工具文件夹中。
- 确保将新版本的文件夹重命名为“proguard”。
- 确保所有配置文件也被复制到新的 Proguard 文件夹中。对我来说,这是
proguard-android-optimize.txt
、proguard-android.txt
和 proguard-project.txt
。
将新文件添加到 Android 项目的根目录,名为 proguard.cfg
注意:因为 Xamarin 很聪明,它使用 BOM
将这个新文件保存在 UTF-8
中, 您需要更改这个。可能最好在记事本中创建该文件,然后将其包含在您的程序中。 这是必需的,因为 Proguard 不会读取文件,除非它是 UTF-8 编码。
- 在 VS 中 右键单击 文件和 select 属性。对于生成操作,select ProguardConfiguration.
- 在没有引号的文件中添加相关的
keep
或 dontwarn
子句(这取决于您的警告),例如它可能是这样的...
- "-dontwarn com.google.android.gms.**"
- "-保持 class com.google.android.gms.**"
- 完成这些步骤后,再次尝试构建。
- 希望这次能更成功。如果不成功,检查您的构建输出 并查看 Proguard 给您的警告和注释。
从这个阶段开始,需要确定您需要对自定义 Proguard 文件进行哪些修改,一旦修改成功,构建就会成功。
将Proguard升级到较新版本后,我没有添加文件:roguard-android-optimize.txt、proguard-android.txti proguard-project.txt和这就是问题所在。添加文件后,项目构建正确。
与 Xamarin 的又一天!甚至无法构建我的第一个 Hello World
项目!不足为奇吧?
那么,全新的 Xamarin.Android
空白项目。启用 ProGuard、link 到 仅 SDK 程序集 并继续构建项目。 wallah!! 出现错误!(等等,我不应该感到惊讶,对吧?毕竟,它是 Xamarin)。这是错误:
"java.exe" exited with code 1
双击异常打开Xamarin.Android.Common.Targets
文件并指向ProGuard
标签如下:
<Proguard
Condition="'$(AndroidEnableProguard)' == 'True' and '$(_ProguardProjectConfiguration)' != ''"
ProguardJarPath="$(ProguardJarPath)"
AndroidSdkDirectory="$(_AndroidSdkDirectory)"
JavaToolPath="$(JavaToolPath)"
ProguardToolPath="$(ProguardToolPath)"
ToolExe="$(ProguardToolExe)"
UseProguard="$(UseProguard)"
JavaPlatformJarPath="$(JavaPlatformJarPath)"
ClassesOutputDirectory="$(IntermediateOutputPath)android\bin\classes"
AcwMapFile="$(_AcwMapFile)"
ProguardCommonXamarinConfiguration="$(IntermediateOutputPath)proguard\proguard_xamarin.cfg"
ProguardGeneratedReferenceConfiguration="$(_ProguardProjectConfiguration)"
ProguardGeneratedApplicationConfiguration="$(IntermediateOutputPath)proguard\proguard_project_primary.cfg"
ProguardConfigurationFiles="$(ProguardConfigFiles)"
JavaLibrariesToEmbed="@(_JarsToProguard);@(_InstantRunJavaReference)"
ExternalJavaLibraries="@(AndroidExternalJavaLibrary)"
DoNotPackageJavaLibraries="@(_ResolvedDoNotPackageAttributes)"
ProguardJarOutput="$(IntermediateOutputPath)proguard\__proguard_output__.jar"
EnableLogging="$(ProguardEnableLogging)"
DumpOutput="$(IntermediateOutputPath)proguard\dump.txt"
PrintSeedsOutput="$(IntermediateOutputPath)proguard\seeds.txt"
PrintUsageOutput="$(IntermediateOutputPath)proguard\usage.txt"
PrintMappingOutput="$(IntermediateOutputPath)proguard\mapping.txt"
ProguardInputJarFilter="$(_AndroidProguardInputJarFilter)"
/>
所以,我最好的猜测是它可能是一个 ProGuard 相关的问题。因此,搜索 google 并应用我目前找到的所有修复程序:
- 已更新 Android SDK
- 将Java堆大小设置为1G(甚至5G)
- 已启用 Multi-Dex
- 已更新 ProGuard
- 在解决方案中创建了一个新的 proguard.cfg 文件(当然将
build action
设置为ProGuardConfiguration
并添加了必要的自定义行。
但是,同样的错误指向同一个 ProGuard
标签。现在,在有人开始抨击我说我可能搞砸了 proguard 配置文件之前,这里是 link:
我了解到这是 Xamarin 中一个非常常见的问题。所以,我想,有人可能想出了一个 确实有效的解决方案!。那么,关于我可能遗漏的任何修复或想法?
确保您添加的混淆器文件不是 Unicode 文本文件(U+FEFF 字节顺序标记 (BOM)),因为混淆器会失败...
启用诊断。 MSBuild 的日志记录级别并获取完整的错误消息。
Proguard 正在被 Google 的 R8 取代
如果您使用的是最新版本的 Xamarin,请参考此博客 post 作为开始:
有关各种 D8/R8 项目配置的详细信息可在此处的 Xamarin.Android 存储库中找到:
Proguard 可能有点麻烦。通常的症状是
java exited with code 1
对我有用的步骤(我将这些注释存储在我的解决方案中,因为它并不明显)。摘自 this site
- 下载最新版本的Proguard
- 找到 Android SDK 的安装位置(类似于 /android-sdk/tools/proguard”)。要找到 SDK,请转到
Tools->Options->Xamarin
- 用新版本替换旧版本的 Proguard。为此,将当前文件夹重命名为“Proguard-pointless”之类的名称,并将新文件夹复制到工具文件夹中。
- 确保将新版本的文件夹重命名为“proguard”。
- 确保所有配置文件也被复制到新的 Proguard 文件夹中。对我来说,这是
proguard-android-optimize.txt
、proguard-android.txt
和proguard-project.txt
。 将新文件添加到 Android 项目的根目录,名为
proguard.cfg
注意:因为 Xamarin 很聪明,它使用
BOM
将这个新文件保存在UTF-8
中, 您需要更改这个。可能最好在记事本中创建该文件,然后将其包含在您的程序中。 这是必需的,因为 Proguard 不会读取文件,除非它是 UTF-8 编码。- 在 VS 中 右键单击 文件和 select 属性。对于生成操作,select ProguardConfiguration.
- 在没有引号的文件中添加相关的
keep
或dontwarn
子句(这取决于您的警告),例如它可能是这样的...- "-dontwarn com.google.android.gms.**"
- "-保持 class com.google.android.gms.**"
- 完成这些步骤后,再次尝试构建。
- 希望这次能更成功。如果不成功,检查您的构建输出 并查看 Proguard 给您的警告和注释。
从这个阶段开始,需要确定您需要对自定义 Proguard 文件进行哪些修改,一旦修改成功,构建就会成功。
将Proguard升级到较新版本后,我没有添加文件:roguard-android-optimize.txt、proguard-android.txti proguard-project.txt和这就是问题所在。添加文件后,项目构建正确。