Proguard导致崩溃
Posted
技术标签:
【中文标题】Proguard导致崩溃【英文标题】:Proguard leads to crash 【发布时间】:2018-01-23 02:05:06 【问题描述】:设置时
minifyEnabled 为真
useProguard true
在我的 gradle 中,我得到一个像这样的 NullPointerException :
java.lang.RuntimeException: Unable to start activity ComponentInfocom.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'
在阅读 *** 时,我发现 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 文件。 【参考方案1】:您可以在 Proguard 中使用此代码
-keep class com.jafari.farhad.ubazdidcontroller.LoginActivity**
但这会导致Proguard忽略LoginActivity类,你的代码不会被混淆。
最好的方法是查看是哪个元素导致这个创建被引入 Proguard。
【讨论】:
虽然这是真的,但他还没有发布文件,这将启用LoginActivity,但不会启用其余...【参考方案2】:我还没有看到你的 proguard 文件,但我很确定添加这个:
-keep class com.jafari.farhad.ubazdidcontroller.** *;
会解决问题的。
一些文档in here。
取你添加的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 文件吗? 好的,只需在您的 proguard 文件末尾添加我在答案中输入的行。 @handerianous 我把你的 proguardfile 用我建议的那一行更新到我的回答中 ,ubazdidcontroller 是重要的包,不应该保留它以上是关于Proguard导致崩溃的主要内容,如果未能解决你的问题,请参考以下文章
proguard 导致谷歌播放服务的 ActivityRecognitionResult getMostProbableActivity 崩溃