2014-02-27 183 views
2

我之前沒有使用過ProGuard,所以我可能在這裏忽略了一些東西。Proguard:應用程序混淆後崩潰

問題如下:我必須混淆我的Android Studio項目。我經歷了構建問題,並能夠在測試設備上運行我的發佈版本(啓用了proguard)。該應用程序啓動,一旦我按下登錄按鈕它崩潰。 logcat中給出了錯誤的輸出如下:

E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.packagename/com.packagename.activity.MainWebActivity}: android.view.InflateException: Binary XML file line #48: Error inflating class fragment 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2295) 
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2349) 
      at android.app.ActivityThread.access$700(ActivityThread.java:159) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1316) 
      at android.os.Handler.dispatchMessage(Handler.java:99) 
      at android.os.Looper.loop(Looper.java:137) 
      at android.app.ActivityThread.main(ActivityThread.java:5419) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:525) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1187) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003) 
      at dalvik.system.NativeStart.main(Native Method) 
    Caused by: android.view.InflateException: Binary XML file line #48: Error inflating class fragment 
      at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:719) 
      at android.view.LayoutInflater.rInflate(LayoutInflater.java:761) 
      at android.view.LayoutInflater.rInflate(LayoutInflater.java:769) 
      at android.view.LayoutInflater.inflate(LayoutInflater.java:498) 
      at android.view.LayoutInflater.inflate(LayoutInflater.java:398) 
      at android.view.LayoutInflater.inflate(LayoutInflater.java:354) 
      at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:361) 
      at android.app.Activity.setContentView(Activity.java:1956) 
      at com.packagename.activity.MainWebActivity.onCreate(Unknown Source) 
      at android.app.Activity.performCreate(Activity.java:5372) 
      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1104) 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2257) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2349) 
            at android.app.ActivityThread.access$700(ActivityThread.java:159) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1316) 
            at android.os.Handler.dispatchMessage(Handler.java:99) 
            at android.os.Looper.loop(Looper.java:137) 
            at android.app.ActivityThread.main(ActivityThread.java:5419) 
            at java.lang.reflect.Method.invokeNative(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:525) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1187) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003) 
            at dalvik.system.NativeStart.main(Native Method) 
    Caused by: java.lang.NullPointerException 
      at com.packagename.fragment.DrawerMenuFragment.a(Unknown Source) 
      at com.packagename.fragment.DrawerMenuFragment.onCreateView(Unknown Source) 
      at android.support.v4.app.Fragment.performCreateView(Unknown Source) 
      at android.support.v4.app.FragmentManagerImpl.moveToState(Unknown Source) 
      at android.support.v4.app.FragmentManagerImpl.moveToState(Unknown Source) 
      at android.support.v4.app.FragmentManagerImpl.addFragment(Unknown Source) 
      at android.support.v4.app.FragmentActivity.onCreateView(Unknown Source) 
      at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:691) 
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:761) 
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:769) 
            at android.view.LayoutInflater.inflate(LayoutInflater.java:498) 
            at android.view.LayoutInflater.inflate(LayoutInflater.java:398) 
            at android.view.LayoutInflater.inflate(LayoutInflater.java:354) 
            at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:361) 
            at android.app.Activity.setContentView(Activity.java:1956) 
            at com.packagename.activity.MainWebActivity.onCreate(Unknown Source) 
            at android.app.Activity.performCreate(Activity.java:5372) 
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1104) 
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2257) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2349) 
            at android.app.ActivityThread.access$700(ActivityThread.java:159) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1316) 
            at android.os.Handler.dispatchMessage(Handler.java:99) 
            at android.os.Looper.loop(Looper.java:137) 
            at android.app.ActivityThread.main(ActivityThread.java:5419) 
            at java.lang.reflect.Method.invokeNative(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:525) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1187) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003) 
            at dalvik.system.NativeStart.main(Native Method) 

的應用程序啓動其持有DrawerLayout網頁視圖活動LoginActivity後。我的proguard-project.txt看起來如下:

-optimizationpasses 5 
-dontusemixedcaseclassnames 
-dontskipnonpubliclibraryclasses 
-dontpreverify 
-verbose 
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 
-keepattributes *Annotation* 


-keep public class * extends android.app.Activity 
-keep public class * extends android.support.v4.app.FragmentActivity 
-keep public class * extends android.app.Application 
-keep public class * extends android.app.Service 
-keep public class * extends android.content.BroadcastReceiver 
-keep public class * extends android.content.ContentProvider 
-keep public class * extends android.preference.Preference 
-keep public class * extends android.view.View { 
    public <init>(android.content.Context); 
    public <init>(android.content.Context, android.util.AttributeSet); 
    public <init>(android.content.Context, android.util.AttributeSet, int); 
    public void set*(...); 
} 

# Explicitly preserve all serialization members. The Serializable interface 
# is only a marker interface, so it wouldn't save them. 
-keepclassmembers class * implements java.io.Serializable { 
    static final long serialVersionUID; 
    private static final java.io.ObjectStreamField[] serialPersistentFields; 
    private void writeObject(java.io.ObjectOutputStream); 
    private void readObject(java.io.ObjectInputStream); 
    java.lang.Object writeReplace(); 
    java.lang.Object readResolve(); 
} 

-keepclasseswithmembers class * { 
    public <init>(android.content.Context, android.util.AttributeSet); 
} 

-keepclasseswithmembers class * { 
    public <init>(android.content.Context, android.util.AttributeSet, int); 
} 

-keepclassmembers class * extends android.content.Context { 
    public void *(android.view.View); 
    public void *(android.view.MenuItem); 
} 

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

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

-keepclasseswithmembernames class * { 
    native <methods>; 
} 
-keepclassmembers class * { 
    public void *ButtonClicked(android.view.View); 
} 

-keep public class * extends android.support.v4.app.Fragment 
-keep public class * extends android.app.Fragment 

-keepclassmembers public class * extends android.view.View { 
     void set*(***); 
     *** get*(); 
    } 

-libraryjars libs 

# The official support library. 
-keep class android.support.v4.** { *; } 
-keep interface android.support.v4.** { *; } 

# Facebook library 
-keep class com.facebook.** { 
    *; 
} 

-dontwarn com.squareup.okhttp.** 

# Make sure that Google Analytics doesn't get removed 
-keep class com.google.analytics.tracking.android.CampaignTrackingReceiver 

# Gson uses generic type information stored in a class file when working with fields. Proguard 
# removes such information by default, so configure it to keep all of it. 
-keepattributes Signature 

# Gson specific classes 
-keep class sun.misc.Unsafe { *; } 
-keep class com.google.gson.** { *; } 

我懷疑在我的proguard-project.txt中缺少一些東西。我知道這是混淆的問題,因爲當我添加-dontobfuscate它將運行沒有錯誤。

我在這裏錯過了什麼?

編輯:我能發現通過增加 -keepattributes SourceFile,LineNumberTable 在我的情況有一些東西需要用的usermodel發生了什麼事情。

回答

4

這很可能有使用自定義namesapce,如一些XML屬性:

app:fragment="com.example.app.myFragment" 

,不會被AAPT採摘,所以你要自己添加下列規則:

-keep public class * extends android.app.Fragment { 
    <init>(...); 
} 
-keep public class * extends android.support.v4.app.Fragment { 
    <init>(...); 
} 
+0

感謝爲了答案!不幸的是,除了已經排除的Facebook LoginButton之外,我沒有使用任何自定義命名空間 – kayode

相關問題