我怎样才能确保ProGuard在Xamarin.Android中保留我自己的所有类?

时间:2017-02-21 10:37:15

标签: android xamarin xamarin.android proguard android-proguard

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

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

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

如果我添加

-keep class md586c878b9e5eee7e17627db5c3cd60647.** { *; }

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

有没有办法

a)使用proguard.cfg或

中类的真实包名

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

1 个答案:

答案 0 :(得分:1)

Xamarin会自动生成一个proguard_xamarin.cfg,其中包含您的项目类(它将位于您的obj工件目录中):

proguard_xamarin.cfg示例:

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

它还会创建一个proguard_project_references.cfg,其中包含项目创建的所有Android Callable Wrapper(ACW)类。

如果您不希望Xamarin自动创建基于MD5的类名,则需要手动分配Name通过类属性(~~~~Attribute),即:

ActivityAttribute Name

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

BroadcastReceiverAttribute Name

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