【问题标题】:Proguard leads to crashProguard导致崩溃
【发布时间】: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 文件。

标签: android android-proguard


【解决方案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 是重要的包,不应该保留它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-06
  • 2013-09-07
  • 1970-01-01
  • 2020-12-02
  • 2013-11-11
  • 2011-01-24
  • 2015-02-23
相关资源
最近更新 更多