我如何确保 ProGuard 将我自己的所有 类 保存在 Xamarin.Android 中?

How can I ensure that ProGuard keeps all my own classes in Xamarin.Android?

ProGuard 删除我自己的 classes 时遇到问题。我创建了一个 proguard.cfg,我尝试为它们指定 -keep class,但我只能在使用它们的 md5 散列包指定 classes 时让它工作。

例如,我的应用程序的包名是se.initech.foo,我在子包Framework中有一个class,叫做InfoBox。 所以我希望完全限定的 class 名称是 se.initech.foo.Framework.InfoBox.

但是在我编译打包和 运行 ProGuard 之后,在应用程序输出日志中我可以看到它找不到 class md586c878b9e5eee7e17627db5c3cd60647.InfoBox.

如果我添加

-keep class md586c878b9e5eee7e17627db5c3cd60647.** { *; }

到我的 proguard.cfg 文件,它有效。但是,如果我尝试指定真实的 class 名称,即 se.initech.foo.** 甚至 se.initech.foo.Framwork.InfoBox,它就不起作用。

有没有办法

a) 使用proguard.cfg中classes的真实包名,或者

b) 事先找出哈希值,而不仅仅是检查应用程序输出日志中的崩溃?

Xamarin auto-generates 包含您的项目的 proguard_xamarin.cfg classes(它将在您的 obj 工件目录中):

proguard_xamarin.cfg 示例:

~~~~
-keep class md52ce486a14f4bcd95899665e9d932190b.** { *; <init>(...); }
-keepclassmembers class md52ce486a14f4bcd95899665e9d932190b.** { *; <init>(...); }
~~~~

它还会创建一个 proguard_project_references.cfg,其中包含您的项目创建的所有 Android 可调用包装器 (ACW) classes。

如果您不希望 Xamarin 为 auto-create 基于 MD5 的 class 名称,您将需要通过 class 属性手动分配 Name~~~~Attribute), 即:

ActivityAttribute Name:

[Activity(Name = "com.sushhangover.proguarddroid.WhosebugActivity", Label = "ProGuardDroid", MainLauncher = true, Icon = "@mipmap/icon")]

BroadcastReceiverAttribute Name:

[BroadcastReceiver(Name = "com.sushhangover.proguarddroid.SOBroadcastReceiver")]
public class SOBroadcastReceiver : BroadcastReceiver