您参考了xamarin.com上的论坛帖子("Light Obfuscation").在那里,我现在添加了一个如何使用Xamarin Studio和Babel for .NET进行混淆的解释.
我将在此重复一遍:
您无需使用完整的Visual Studio即可轻松,舒适地进行混淆.我现在使用Babel for .NET和Xamarin Studio(在Windows中).我没有试过让Babel在Mac上运行,也许它是可能的.
那么,在这里我将解释如何在Xamarin Studio中混淆您的Android应用程序:
好处是Xamarin Studio使用MSBuild机制,Babel可以集成在MSBuild进程中.
对我来说(安装Babel除外)只需要两个步骤:
(步骤1)
使用文本编辑器编辑.csproj文件.Xamarin Studio一定不能运行.
<Project>
[... All existing stuff ...]
<UsingTask TaskName="Babel" AssemblyName="Babel.Build, Version=6.4.0.0, Culture=neutral, PublicKeyToken=138d17b5bd621ab7" />
<Target Name="AfterBuild" Condition=" '$(Configuration)' != 'Debug' ">
<Babel InputFile="$(TargetPath)" OutputFile="$(TargetPath)" GenerateDebug="true"
[...]
RulesFiles="babel.xml"
SuppressIldasm="false" ObfuscateTypes="true" ObfuscateProperties="true" ObfuscateEvents="true" ObfuscateMethods="true"
ObfuscateFields="true" VirtualFunctions="true" FlattenNamespaces="false"
StringEncryption="true"
/>
</Target>
</Project>
Run Code Online (Sandbox Code Playgroud)
每当您构建应用程序并且构建模式不是Debug(因此它是Release)时,将应用此任务.您可以指定一个xml文件,您可以在其中为混淆过程定义细粒度规则.(例如,排除某些类别等)
顺便说一句:经验法则是:将每个类,接口,委托或枚举定义为"内部",而不是"公共".默认情况下,组件外部必须可见的类型(公共类型)不会被混淆.默认情况下,内部类型将被混淆.我标记为"公共"的唯一类是"MainActivity".
(第2步)
当我开始第一次尝试我的应用程序时,我收到以下错误消息:
BABEL : error : Could not resolve assembly: 'Mono.Android, Version=0.0.0.0, Culture=neutral, PublicKeyToken=84e04ff9cfb79065'
Run Code Online (Sandbox Code Playgroud)
我首先无法理解,因为一个Hello-World Android应用程序被混淆了没有问题.经过几个小时的研究,我找到了错误的原因.我的活动(我的游戏只有一个活动)具有以下属性:
[Activity(
Label = "The name of my game",
MainLauncher = true,
WindowSoftInputMode = SoftInput.AdjustPan,
ConfigurationChanges = ConfigChanges.Keyboard | ConfigChanges.KeyboardHidden | ConfigChanges.Orientation | ConfigChanges.ScreenSize
)]
Run Code Online (Sandbox Code Playgroud)
原因是"Label"和"MainLauncher"不是问题所在.但是"WindowSoftInputMode"和"ConfigurationChanges"是问题所在.
为了解决这个问题,我从.cs文件中完全删除了[Activity(...)]属性,并手动将必要的信息添加到AndroidManifest.xml中.这样,混淆工作没有问题.
您可能想知道为什么Activity属性导致了问题.我意识到当使用"WindowSOftInputMode"和"ConfigurationChanges"将此属性应用于C#Activity类时,ILSpy也遇到了问题.所以我认为这不是巴别塔的问题,而是Xamarin的问题.原因可能是,虽然"Label"和"MainLauncher"是基本类型(字符串和bool),但其他两个则不是.它们的类型在Mono.Android.dll中定义,似乎以错误的方式引用.最好的办法是,如果Xamarin删除了编译后的dll的属性,因为它仅用于在构建步骤中创建AndroidManifest.xml.