我是Xamarin Android的新手。我使用Visual Studio 2015 Community Edition创建了一个App。我已将解决方案配置设置为Release。
对于混淆,我使用.Net Reactor。
这就是我试图混淆的方式
1:构建应用程序后,我将转到Bin \ Release文件夹
2:混淆App.dll
3:用Bin \ Release,Obj \ Release和Obj \ Release \ assemblies中的模糊dll替换原始dll
4:转到工具 - > Android->发布
但是,当我尝试发布时,混淆的dll将被原始dll替换。
那么我做错了什么?我是否必须手动打包apk文件。如果是这样的话,我怎么能这样做?
答案 0 :(得分:1)
1)发布未混淆的应用程序.apk,将其重命名为.zip。
2)将文件 Mono.Android.dll 从文件夹“ assemblies ”移到文件夹 YourProjectName \ bin \ Release
3)创建一个新的.NET Reactor项目,设置正确的设置(取消选中 Anti ILDASM ,同样混淆过程重命名反射或序列化中使用的字段。为避免应用程序崩溃,应该设置排除项以忽略某些类型或方法。) 将此项目文件保存到 YourXamarinFolder \ YourProjectName \ bin \ Release 。
4)创建文件 obfuscate_android.bat ,在这里插入代码:
"C:\Program Files (x86)\Eziriz\.NET Reactor\dotNET_Reactor.exe" -project "NET_Reactor_Project_Name.nrproj"
copy "YourProjectName_Secure\YourProjectName.dll" "YourProjectName.dll"
DEL "YourProjectName_Secure\*.dll" "YourProjectName_Secure\*.pdb" /q
将此文件移至 YourProjectName \ bin \ Release 。
5)卸载您的Xamarin项目并编辑YourProjectName.csproj 找到下一个块:
<PropertyGroup Condition = " '$ (Configuration) | $ (Platform)' == 'Release | AnyCPU'">
<! -- Insert here the link to obfuscate_android.bat -->
<PostBuildEvent>obfuscate_android.bat </ PostBuildEvent>
</ PropertyGroup>
6)保存所有并重新加载项目
7)运行发布。
答案 1 :(得分:1)
我在Xamarin Studio中获得了我的Xamarin Android项目,通过挂钩到MSBuild来使用.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时,这不再起作用了。给我一个&#34;错误MSB4018:&#34; LinkAssemblies&#34;任务意外失败。&#34;
**编辑 我超越了LinkAssemblies&#39;通过将PostBuild设置为true并挂钩到&#39; PostBuildEvent&#39;来解决任务错误事件而不是Ajit所指出的。
但是,混淆的DLL没有被添加到apk文件中。我通过解压缩.apk文件(只是将文件扩展名更改为.zip或.rar)并对内部的DLL文件进行反编译来测试。它没有被混淆。
我查看了bin / Release和obj / Release文件夹,其中的DLL被混淆了。但由于某种原因,apk中的DLL不是混淆的DLL。
在创建apk文件的过程中,PostBuildEvent可能为时已晚?
这是我目前的设置:
将PostBuild设置为true:
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
...
<PostBuildEventUseInBuild>true</PostBuildEventUseInBuild>
</PropertyGroup>
然后挂钩&#39; PostBuildEvent&#39;事件代替&#39; AfterCompile&#39;
<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项目来测试问题是否可能是由于我的项目的复杂性(使用第三方控件,常用实用程序库作为解决方案中的第二个项目等)引起的。 &#39; LinkAssemblies&#39;错误仍然存在,所以它可能是我的环境/设置。
我有一个GitHub帐户但是没有下载该应用程序,所以我无法上传整个项目文件夹结构,所以我只是压缩整个解决方案并上传了。它可以在这里找到:
https://github.com/nbcruz/TestObfuscate/blob/master/TestObfuscate.zip
我不得不删除obj / Debug文件夹的内容,因为它有78MB的文件使zip文件低于25MB,GitHub允许。
.NET Reactor项目位于bin \ Release \文件夹中。我手动运行它并创建bin \ Release \ TestObfuscate_Secure文件夹中的混淆DLL。 obfuscate.bat文件也位于bin \ Release \文件夹中,它基本上只是将bin \ Release \ TestObfuscate_Secure文件夹中的DLL复制到bin \ Release \文件夹中。这个空白的简单解决方案仍然会引发LinkAssemblies&#39;错误。
答案 2 :(得分:1)
.xamarin现在已经非常容易使用.net反应器:
适用于Visual Studio适当版本的反应堆ide安装扩展(菜单Visual Studio)
中为您的xamarin解决方案创建一个项目。您可以使用菜单“保护主题-> Xamarin”或使用自己的设置。不要忘记添加其他文件(您的Forms共享项目和其他所需文件)。保存项目,记下其路径。
在Visual Studio ide菜单中的“工具”->“反应器自动化”中设置:
单击确定,就是这样。
构建过程将是MSBuild编译,然后反应器将应用其处理,然后VS将打包/打包为平台部署/分发设置的所有内容。