Xamarin Java.exe 以代码 1 退出(Proguard 问题)

Posted

技术标签:

【中文标题】Xamarin Java.exe 以代码 1 退出(Proguard 问题)【英文标题】:Xamarin Java.exe exited with code 1 (Proguard Issue) 【发布时间】:2019-08-28 10:21:42 【问题描述】:

又是 Xamarin 的一天!甚至无法构建我的第一个 Hello World 项目!不足为奇吧?

所以,全新的 Xamarin.android 空白项目。启用 ProGuard,链接到 SDK Assemblies Only 并继续构建项目。 wallah!! 有一个错误!(等等,我不应该感到惊讶,对吧?毕竟,它是 Xamarin)。这是错误:

“java.exe”以代码 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 相关的问题。所以,搜索了谷歌并应用了我到目前为止找到的所有修复:

更新的 Android SDK 将 Java 堆大小设置为 1G(甚至 5G) 启用 Multi-Dex 更新了 ProGuard 在解决方案中创建了一个新的 proguard.cfg 文件(当然将 build action 设置为 ProGuardConfiguration 并添加了必要的自定义行。

但是,同样的错误指向同一个ProGuard 标签。现在,在有人开始抨击我说我可能弄乱了 proguard 配置文件之前,这里是它的链接:

ProGuard.cfg Build Output From Visual Studio 2017

我读到这是 Xamarin 中非常常见的问题。所以,我猜,有人可能想出了一个真正有效的解决方案!。那么,关于我可能遗漏的任何修复或想法?

【问题讨论】:

哇!!! 2021 年问题再次发生......这次是在我添加 Firebase 分析之后......当然就像其他 Xamarin 问题一样......在这个世界上只有我,我一个人有这个问题!!!!!!太令人沮丧了!!! @user1034912 我面临同样的错误。你解决了吗? @MadhavShenoy 是时候放弃 Xamarin 了,主要是因为微软自己放弃了它。他们正在搬到 MAUI。 @ChristopherH。 Xamarin 和 MAUI 没有什么不同。 MAUI 只是 Xamarin 的演进版本。我能够解决我的问题。我在 AppCenter 中运行了一个构建并发现了问题。我有 2 个 Firebase 消息传递参考。我删除了 1 个参考,构建又开始工作了 【参考方案1】:

    确保您添加的 proguard 文件不是 Unicode 文本文件(U+FEFF 字节顺序标记 (BOM)),因为 proguard 将失败...

    启用诊断。 MSBuild 的级别日志记录并获取完整的错误消息。

    Proguard 正在被 Google 的 R8 取代

如果您使用的是最新版本的 Xamarin,请参阅此博客文章作为开始:

Android’s D8 dexer and R8 shrinker

可以在此处的 Xamarin.Android 存储库中找到有关各种 D8/R8 项目配置的详细信息:

This is the D8 and R8 integration specification for Xamarin.Android.

【讨论】:

@zackraiyan 很高兴它有帮助,我个人建议在您的项目允许时迁移到 D8/R8...更快,甚至更好地缩减 Java 库。【参考方案2】:

Proguard 可能有点痛苦。通常的症状类似于

java 以代码 1 退出

对我有用的步骤(我将这些注释存储在我的解决方案中,因为它并不明显)。来自this site

    下载最新版本的Proguard 查找 Android SDK 的安装位置(类似于 /android-sdk/tools/proguard”)。要查找 SDK,请转到 Tools-&gt;Options-&gt;Xamarin 用新版本替换旧版本的 Proguard。为此,将当前文件夹重命名为“Proguard-pointless”,然后将新文件夹复制到工具文件夹中。 务必将新版本的文件夹重命名为“proguard”。 确保所有配置文件也被复制到新的 Proguard 文件夹中。对我来说,这是proguard-android-optimize.txtproguard-android.txtproguard-project.txt

    在您的 Android 项目的根目录中添加一个名为 proguard.cfg的新文件

    注意:由于 Xamarin 很智能,它会将这个新文件保存在 UTF-8BOM您需要更改它。最好在记事本中创建文件,然后将其包含在您的程序中。 这是必需的,因为除非文件采用 UTF-8 编码,否则 Proguard 不会读取文件。

    在 VS 中右键单击文件并选择属性。对于构建操作,选择 ProguardConfiguration。 将相关的keepdontwarn 子句添加到不带引号的文件中(这取决于您的警告),例如它可能是这样的...... “-dontwarn com.google.android.gms.**” “-keep class com.google.android.gms.**” 完成这些步骤后,再次尝试构建。 希望这次会更成功。如果不成功,检查您的构建输出 并查看 Proguard 给您的警告和说明。

从这个阶段开始,确定您需要对自定义 Proguard 文件进行哪些修改,一旦成功,构建就会成功。

【讨论】:

那么,当我说我更新了 proguard 并上传了 proguard.cfg 文件时,你认为我的意思是什么?我已经做了所有这些我的朋友。 @zackraiyan 是的,我只是认为 id 发布了对我有用的步骤,xamarin 可能非常善变。然而,一旦你让它工作它就不那么痛苦了【参考方案3】:

将 Proguard 升级到较新版本后,我没有添加以下文件:roguard-android-optimize.txt、proguard-android.txti proguard-project.txt,这就是问题所在。添加文件后,项目构建正确。

【讨论】:

以上是关于Xamarin Java.exe 以代码 1 退出(Proguard 问题)的主要内容,如果未能解决你的问题,请参考以下文章

“Java.exe”以代码 1 退出(Proguard 问题)

为啥我的 Xamarin.Android 项目不能在启用 Proguard 的情况下构建:“java.exe”退出代码 1

ProGuard:“java.exe”在添加 ModernHTTPClient 后以代码 1 退出

Xamarin.Forms Java.exe退出,代码为1

Xamarin Forms error MSB6006: “java.exe”已退出,代码为 2 解决办法

错误 MSB6006:启用 ProGuard 时“java.exe”以代码 1 退出