通过连接到 MSBuild,我在 Xamarin Studio 中获得了我的 Xamarin Android 项目,使用 .NET Reactor 进行了很好的混淆。将此标记添加到您的 csproj 文件的底部:
<Target Name="AfterCompile">
<Exec Command=""C:\Program Files (x86)\Eziriz\.NET Reactor\dotNET_Reactor.exe" -file "$(ProjectDir)$(IntermediateOutputPath)$(TargetFileName)" -targetfile "$(ProjectDir)$(IntermediateOutputPath)$(TargetFileName)" -suppressildasm 1 -obfuscation 1 -stringencryption 1 -antitamp 1 -control_flow_obfuscation 1 -flow_level 9 -resourceencryption 1 -mono 1 -exception_handling 1" Condition="'$(ConfigurationName)' == 'Release'" />
</Target>
</Project>
请注意,当我在 Visual Studio 2015 中升级到 Xamarin 时,这不再起作用。给了我一个“错误 MSB4018:“LinkAssemblies”任务意外失败。”
**编辑我通过将 PostBuild 设置为 true 并挂钩到 'PostBuildEvent' 事件而不是 Ajit 指出的那样解决了 'LinkAssemblies' 任务错误。
但是,混淆的 DLL 不会添加到 apk 文件中。我通过解压缩 .apk 文件(只需将文件扩展名更改为 .zip 或 .rar)并反编译其中的 DLL 文件对此进行了测试。它没有被混淆。
我查看了 bin/Release 和 obj/Release 文件夹,其中的 DLL 被混淆了。但由于某种原因,apk 中的 DLL 不是混淆后的 DLL。
也许 PostBuildEvent 在创建 apk 文件的过程中为时已晚?
这是我当前的设置:
将 PostBuild 设置为 true:
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
...
<PostBuildEventUseInBuild>true</PostBuildEventUseInBuild>
</PropertyGroup>
然后挂钩到“PostBuildEvent”事件而不是“AfterCompile”
<Target Name="PostBuildEvent">
<Exec Command=""C:\Program Files (x86)\Eziriz\.NET Reactor\dotNET_Reactor.exe" -file "$(ProjectDir)$(IntermediateOutputPath)$(TargetFileName)" -targetfile "$(ProjectDir)$(IntermediateOutputPath)$(TargetFileName)" -suppressildasm 1 -obfuscation 1 -stringencryption 1 -antitamp 1 -control_flow_obfuscation 1 -flow_level 9 -resourceencryption 1 -mono 1 -exception_handling 1" Condition="'$(ConfigurationName)' == 'Release'" />
</Target>
</Project>
** 更新我在 VS 2015 中创建了一个简单的空白 Android 项目,以测试问题是否是由我的项目的复杂性引起的(使用 3rd 方控件、通用实用程序库作为解决方案中的第二个项目等)。'LinkAssemblies' 错误仍然发生,所以它可能是我的环境/设置。
我有一个 GitHub 帐户,但还没有下载该应用程序,所以我无法上传整个项目文件夹结构,所以我只是压缩了整个解决方案并上传了它。它在这里可用:
https://github.com/nbcruz/TestObfuscate/blob/master/TestObfuscate.zip
我不得不删除 obj/Debug 文件夹的内容,因为它有 78MB 的文件,以使 GitHub 允许的 zip 文件小于 25MB。
.NET Reactor 项目位于 bin\Release\ 文件夹中。我手动运行它并创建 bin\Release\TestObfuscate_Secure 文件夹内的混淆 DLL。obfuscate.bat 文件也在 bin\Release\ 文件夹中,它基本上只是将 bin\Release\TestObfuscate_Secure 文件夹中的 DLL 复制到 bin\Release\ 文件夹中。这个空白的简单解决方案仍然会引发“LinkAssemblies”错误。