【发布时间】:2018-01-23 02:05:06
【问题描述】:
设置时
minifyEnabled 为真
useProguard true
在我的 gradle 中,我得到一个像这样的 NullPointerException :
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 文件的一些设置如下:
-dontusemixedcase类名 -dontskipnonpubliclibraryclasses -详细 -不要优化 -dontpreverify -keepattributes *注解* -保持公共类 com.google.vending.licensing.ILicensingService -保持公共类 com.android.vending.licensing.ILicensingService # 原生方法见 http://proguard.sourceforge.net/manual/examples.html#native -keepclasseswithmembernames 类 * { 本国的 ; } # 在 Views 中保留 setter 以便动画仍然可以工作。 # 见 http://proguard.sourceforge.net/manual/examples.html#beans -keepclassmembers 公共类 * 扩展 android.view.View { 无效集*(***); *** 得到*(); } # 我们希望在 Activity 中保留可以在 XML 属性 onClick 中使用的方法 -keepclassmembers 类 * 扩展 android.app.Activity { 公共无效*(android.view.View); } # 枚举类见http://proguard.sourceforge.net/manual/examples.html#enumerations -keepclassmembers 枚举 * { 公共静态 **[] 值(); 公共静态 ** valueOf(java.lang.String); } -keepclassmembers 类 * 实现 android.os.Parcelable { public static final android.os.Parcelable$Creator CREATOR; } -keepclassmembers 类 **.R$* { 公共静态; } -不要警告 android.support.** # 理解@Keep 支持注解。 -keep 类 android.support.annotation.Keep -keep @android.support.annotation.Keep 类 * {*;} -keepclasseswithmembers 类 * { @android.support.annotation.Keep; } -keepclasseswithmembers 类 * { @android.support.annotation.Keep; } -keepclasseswithmembers 类 * { @android.support.annotation.Keep (...); }当我禁用 minifyEnabled 时,一切正常。 谢谢
【问题讨论】:
-
你的 proguard 文件里有什么?
-
是的,发送吗? @MatiasOlocco
-
显示 proguard 文件和完整的 gradle.build 文件
-
@handerianous 我要求你包含你的 proguard 文件,否则我们无法知道它有什么问题。
-
从 bauild.gradle 文件中删除 useProgaurd true 是不必要的,并发布完整的 build.gradle 文件。