我正在把一个项目从蚂蚁转移到毕业,但有一些我根本无法想象的东西.
FACTS
在构建版本APK(即混淆)后,我注意到该应用程序崩溃严重.错误可以总结出来:
java.lang.NoSuchMethodException: <init> [class android.content.Context,interface android.util.AttributeSet]
调试(即非混淆)的APK工作正常,所以我猜测它与我的ProGuard / DexGuard配置有关.
我尝试通过添加以下语句来保持类引用:
-keep class com.mypackage.MyCustomView
因此,发布APK工作正常.然后我做了一些研究,我试过这个更具体的ProGuard / DexGuard配置:
-keep public class * extends android.view.View { public <init>(android.content.Context); public <init>(android.content.Context,android.util.AttributeSet); public <init>(android.content.Context,android.util.AttributeSet,int); public void set*(...); } -keepclasseswithmembers class * { public <init>(android.content.Context,android.util.AttributeSet); } -keepclasseswithmembers class * { public <init>(android.content.Context,int); }
这也是有效的,它是与阶级无关的.
题
我在想:
为什么我不用处理是在使用Ant?
>该错误出现的确切原因是什么? (以下是第一个问题的回答)
回答
@Blundell的答案是非常正确的.原来我从build.gradle配置中缺少一行:
android { ... buildTypes { debug { ... } release { proguardFile getDefaultDexGuardFile('dexguard-release.pro') # <----- this line proguardFile 'dexguard-project.txt' } } }
似乎该行实际上是强制性的,因为它作为ProGuard / DexGuard的基本规则集.其实这是dexguard-release.pro文件的一部分:
-keepclassmembers !abstract class !com.google.ads.** extends android.view.View { public <init>(android.content.Context); public <init>(android.content.Context,int); public void set*(...); } -keepclassmembers !abstract class * { public <init>(android.content.Context,int); } -keepclassmembers class * extends android.content.Context { public void *(android.view.View); }