查看 Xamarin 的自定义 MSBuild 任务库 (C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Build.Tasks.dll) AndroidSignPackage 扩展 AndroidToolTask 扩展内置 ToolTask 类。看起来他们也正确实现了它,所以你应该能够简单地传递额外的可选参数ToolPath。
如果您在自定义构建过程中直接从 MSBuild 调用任务,则命令可能如下所示:
<AndroidSignPackage
UnsignedApk="pathtounsignedapk"
SignedApkDirectory="signedapkoutputdir"
Keystore="yourkeystorelocation"
KeyAlias="thekeyaliasusedtosign"
StorePass="thepasswordforthekeystore"
ToolPath="NEWPATHTOJAVASDK" />
如果您尝试在 Visual Studio 环境中集成此功能,则需要开始在他们的 *.Targets 文件中四处寻找并追踪它,如果您对 MSBuild 不满意,我不建议您这样做.
除此之外,根据 MURPHY 的说法,在无证土地上的任何担保都不会而且将在最不合适的时间打破
在我的 Xamarin.Android.Common.targets (C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets) 中的 Xamarin 工具链版本中,我们看到 AndroidSignPackage 是从 _Sign 目标中调用的,看来至少在这个版本中,正在传递 ToolPath 属性,在此版本中定义为 $(JarsignerToolPath),在 .targets 文件中进一步查找,我们看到它的定义如下:
<CreateProperty Value="$(_JavaSdkDirectory)\bin">
<Output TaskParameter="Value" PropertyName="JarsignerToolPath"
Condition="'$(JarsignerToolPath)' == ''"
/>
</CreateProperty>
看起来他们在验证 $(JarsignerToolPath) 在设置此值之前未定义时非常好(至少在此版本中),如果是,此任务将不执行任何操作并采用现有值。
此时您有几个选择,归结为他们将尊重 MSBuild 属性$(JarsignerToolPath),但它在此构建过程之前出现。如果您阅读有关 MSBuild 的文档,您会发现可以通过多种方式定义该属性。
最流行的(也是我的建议)是直接在您的 MSBuild 脚本(请记住 CSPROJ 文件只是 MSBuild 脚本)中的一个属性组(我建议在构建配置下)中声明它,您可以简单地明确定义此属性,例如:
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|JDK17' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
... (Additional properties trimmed) ...
<JarsignerToolPath>C:\Program Files (x86)\Java\jdk1.7.0_71\bin</JarsignerToolPath>
</PropertyGroup>
或者,您可以在启动 Visual Studio/MSBuild 进程之前设置环境变量,执行将 JarsignerToolPath 设置为正确属性的构建。
显然你可以利用上面的知识更进一步,看看你是否可以替换$(_JavaSdkDirectory)...