我遇到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)事先找出哈希值,而不仅仅是检查应用程序输出日志中的崩溃?
答案 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