Proguard导致应用崩溃

6

当我在gradle中设置

minifyEnabled true

useProguard true

时,出现以下空指针异常:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.jafari.farhad.ubazdidcontroller/com.jafari.farhad.ubazdidcontroller.LoginActivity}: java.lang.NullPointerException
  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
  at android.app.ActivityThread.access$600(ActivityThread.java:141)
  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
  at android.os.Handler.dispatchMessage(Handler.java:99)
  at android.os.Looper.loop(Looper.java:137)
  at android.app.ActivityThread.main(ActivityThread.java:5041)
  at java.lang.reflect.Method.invokeNative(Native Method)
  at java.lang.reflect.Method.invoke(Method.java:511)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
  at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.NullPointerException
  at com.jafari.farhad.ubazdidcontroller.LoginActivity.onCreate(Unknown Source)
  at android.app.Activity.performCreate(Activity.java:5104)
  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
  at android.app.ActivityThread.access$600(ActivityThread.java:141) 
  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
  at android.os.Handler.dispatchMessage(Handler.java:99) 
  at android.os.Looper.loop(Looper.java:137) 
  at android.app.ActivityThread.main(ActivityThread.java:5041) 
  at java.lang.reflect.Method.invokeNative(Native Method) 
  at java.lang.reflect.Method.invoke(Method.java:511) 
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
  at dalvik.system.NativeStart.main(Native Method) 

Gradle是:

buildTypes {
    debug {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    release {
        minifyEnabled true
        useProguard true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

在阅读StackOverflow时,我发现了一些与proguard-rules.pro文件相关的设置,如下所示:
    -dontusemixedcaseclassnames
    -dontskipnonpubliclibraryclasses
    -verbose
    
    
    -dontoptimize
    -dontpreverify
    
    -keepattributes *Annotation*
    -keep public class com.google.vending.licensing.ILicensingService
    -keep public class com.android.vending.licensing.ILicensingService
    
    # 对于本地方法,请参见http://proguard.sourceforge.net/manual/examples.html#native
    -keepclasseswithmembernames class * {
        native ;
    }
    
    # 保留Views中的setter以使动画仍然起作用。
    # 参见http://proguard.sourceforge.net/manual/examples.html#beans
    -keepclassmembers public class * extends android.view.View {
       void set*(***);
       *** get*();
    }
    
    # 我们希望保留在Activity中可以在XML属性onClick中使用的方法
    -keepclassmembers class * extends android.app.Activity {
       public void *(android.view.View);
    }
    
    # 对于枚举类,请参见http://proguard.sourceforge.net/manual/examples.html#enumerations
    -keepclassmembers enum * {
        public static **[] values();
        public static ** valueOf(java.lang.String);
    }
    
    -keepclassmembers class * implements android.os.Parcelable {
      public static final android.os.Parcelable$Creator CREATOR;
    }
    
    -keepclassmembers class **.R$* {
        public static ;
    }
    
    -dontwarn android.support.**
    
    # 理解@Keep支持注释。
    -keep class android.support.annotation.Keep
    
    -keep @android.support.annotation.Keep class * {*;}
    
    -keepclasseswithmembers class * {
        @android.support.annotation.Keep ;
    }
    
    -keepclasseswithmembers class * {
        @android.support.annotation.Keep ;
    }
    
    -keepclasseswithmembers class * {
        @android.support.annotation.Keep (...);
    }
当我禁用minifyEnabled时,一切都正常。谢谢。

你的Proguard文件里有什么内容? - Matias Olocco
展示Proguard文件和完整的gradle.build文件。 - Nguyễn Trung Hiếu
1
@handerianous 我请求你包含你的Proguard文件,否则我们无法知道它出了什么问题。 - Matias Olocco
从build.gradle文件中删除useProgaurd true,这是不必要的,请发布完整的build.gradle文件。 - nivesh shastri
@handerianous 你可以打开文件并复制内容,就像你处理代码一样。请检查我的回答。 - Matias Olocco
显示剩余2条评论
2个回答

0

你可以在Proguard中使用这段代码

-keep class com.jafari.farhad.ubazdidcontroller.LoginActivity** 

但是这会导致Proguard忽略LoginActivity类,你的代码将不会被混淆。

最好的方法是查看哪个元素导致引入了这个创建到Proguard中。


尽管这是真的,但他还没有发布文件,这将启用LoginActivity,但不包括其他部分... - Matias Olocco

0

我还没有看到你的proguard文件,但我非常确定添加这个:

-keep class com.jafari.farhad.ubazdidcontroller.** { *; }

会解决这个问题。

这里有一些文档(链接)

拿你添加的proguard文件,应该是:

-keep class com.jafari.farhad.ubazdidcontroller.** { *; }
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose


-dontoptimize
-dontpreverify

-keepattributes *Annotation*
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService

# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native
-keepclasseswithmembernames class * {
native ;
}

# keep setters in Views so that animations can still work.
# see http://proguard.sourceforge.net/manual/examples.html#beans
-keepclassmembers public class * extends android.view.View {
void set*(***);
*** get*();
}

# We want to keep methods in Activity that could be used in the XML attribute onClick
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}

# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}

-keepclassmembers class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator CREATOR;
}

-keepclassmembers class **.R$* {
public static ;
}

-dontwarn android.support.**

# Understand the @Keep support annotation.
-keep class android.support.annotation.Keep

-keep @android.support.annotation.Keep class * {*;}

-keepclasseswithmembers class * {
@android.support.annotation.Keep ;
}

-keepclasseswithmembers class * {
@android.support.annotation.Keep ;
}

-keepclasseswithmembers class * {
@android.support.annotation.Keep (...);
}

谢谢你的回答,Matias。但是这个包很重要,我想要使用Proguard来保护它 :) - handerianous
你有一个标准的Proguard文件吗? - handerianous
好的,请在您的Proguard文件末尾添加我在答案中提供的那行代码。 - Matias Olocco
@handerianous 我在我的回答中加入了你更新的proguardfile,并附上了我建议的那一行。 - Matias Olocco
ubazdidcontroller是重要的包,不应该删除它。 - handerianous
请阅读文档,如果您不想阅读文档,请尝试我的建议,我正在帮助您,而您却忽略了我的话。那是您的应用程序包,将其添加到proguard文件中使其保留,而不是离开。 - Matias Olocco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接