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 崩溃

应用程序使用 proguard 崩溃

Proguard后Android应用程序崩溃

使用 GSON 库和 ProGuard 时 Android 崩溃

了解启用 Proguard 的崩溃和 ANR

Proguard 回溯工具的输出