您引用了 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>
每当您构建应用并且构建模式不是 Debug(所以它是 Release)时,就会应用此任务。您可以指定一个 xml 文件,您可以在其中为混淆过程定义细粒度的规则。 (例如排除某些类等)
顺便说一句:经验法则是:将每个类、接口、委托或枚举定义为“内部”,而不是“公共”。默认情况下,必须在程序集之外可见的类型(公共类型)不会被混淆。默认情况下,内部类型将被混淆。我标记为“public”的唯一类是“MainActivity”。
(步骤 2)
当我开始第一次尝试我的应用时,我收到了以下错误消息:
BABEL : error : Could not resolve assembly: 'Mono.Android, Version=0.0.0.0, Culture=neutral, PublicKeyToken=84e04ff9cfb79065'
首先我无法理解,因为 Hello-World Android 应用程序被混淆而没有问题。经过几个小时的研究,我找到了错误的原因。我的活动(我的游戏只有一个活动)具有以下属性:
[Activity(
Label = "The name of my game",
MainLauncher = true,
WindowSoftInputMode = SoftInput.AdjustPan,
ConfigurationChanges = ConfigChanges.Keyboard | ConfigChanges.KeyboardHidden | ConfigChanges.Orientation | ConfigChanges.ScreenSize
)]
“标签”和“MainLauncher”原来不是问题。但是“WindowSoftInputMode”和“ConfigurationChanges”是问题所在。
为了修复它,我从 .cs 文件中完全删除了 [Activity (...)] 属性,并手动将必要的信息添加到 AndroidManifest.xml 中。这样,混淆工作没有问题。
您可能想知道为什么 Activity 属性会导致问题。我意识到,当将此属性应用于具有“WindowSOftInputMode”和“ConfigurationChanges”的 C# Activity 类时,ILSpy 也存在问题。所以我认为这不是 Babel 的问题,而是 Xamarin 的问题。原因可能是,虽然“Label”和“MainLauncher”是基本类型(字符串和布尔),但其他两个不是。它们的类型在 Mono.Android.dll 中定义,似乎以错误的方式引用。最好的办法是 Xamarin 删除已编译 dll 的属性,因为它仅用于在构建步骤中制作 AndroidManifest.xml。