Search code examples
javaandroidproguardobfuscationtwitter4j

Android - twitter4j Proguard error


I was having problems trying to obfuscate my apk - the same problem as reported in this SO question. I applied the accepted answer for that question, and my apk was then built.

However, when I run my application, it crashes before the first splash screen is displayed.

How can I debug this and/or is there anything that might be missing from my proguard-project.txt file??...

# To enable ProGuard in your project, edit project.properties
# to define the proguard.config property as described in that file.
#
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in ${sdk.dir}/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the ProGuard
# include property in project.properties.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# Add any project specific keep options here:

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}

-dontwarn twitter4j.**

NB - I also use the android-support-v4.jar and acra-4.5.0.jar libraries in my app.


Solution

  • Looks like there were a number of issues. Got it sorted in the end. In case it helps anyone else, here is my full proguard-project.txt file:

    # To enable ProGuard in your project, edit project.properties
    # to define the proguard.config property as described in that file.
    #
    # Add project specific ProGuard rules here.
    # By default, the flags in this file are appended to flags specified
    # in ${sdk.dir}/tools/proguard/proguard-android.txt
    # You can edit the include path and order by changing the ProGuard
    # include property in project.properties.
    #
    # For more details, see
    #   http://developer.android.com/guide/developing/tools/proguard.html
    
    # Add any project specific keep options here:
    
    # If your project uses WebView with JS, uncomment the following
    # and specify the fully qualified class name to the JavaScript interface
    # class:
    #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
    #   public *;
    #}
    
    #
    # My classes - start
    #
    
    -keep public class com.example.SplashActivity
    -keep public class com.example.FragmentActivityWithListener
    -keep public class com.example.AbstractHelpActivity
    -keep public class com.example.GetContentFromWebTask$CompletedListener
    
    #
    # My classes - end
    #
    
    
    #
    # Twitter library - start
    #
    
    -dontwarn twitter4j.**
    -keep class twitter4j.** { *; }
    
    #
    # Twitter library - end
    #
    
    
    
    #
    # Google Play Service library - start
    #
    
    -keep class * extends java.util.ListResourceBundle {
        protected Object[][] getContents();
    }
    
    -keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable {
        public static final *** NULL;
    }
    
    -keepnames @com.google.android.gms.common.annotation.KeepName class *
    -keepclassmembernames class * {
        @com.google.android.gms.common.annotation.KeepName *;
    }
    
    -keepnames class * implements android.os.Parcelable {
        public static final ** CREATOR;
    }
    
    #
    # Google Play Service library - end
    #
    
    
    
    #
    # Ads - start
    #
    
    -keep public class com.google.android.gms.ads.** {
       public *;
    }
    
    -keep public class com.google.ads.** {
       public *;
    }
    
    #
    # Ads - end
    #
    
    
    #
    # ACRA - start
    #
    
    #ACRA specifics
    # Restore some Source file names and restore approximate line numbers in the stack traces,
    # otherwise the stack traces are pretty useless
    -keepattributes SourceFile,LineNumberTable
    
    # ACRA needs "annotations" so add this...
    # Note: This may already be defined in the default "proguard-android-optimize.txt"
    # file in the SDK. If it is, then you don't need to duplicate it. See your
    # "project.properties" file to get the path to the default "proguard-android-optimize.txt".
    -keepattributes *Annotation*
    
    # keep this class so that logging will show 'ACRA' and not a obfuscated name like 'a'.
    # Note: if you are removing log messages elsewhere in this file then this isn't necessary
    -keep class org.acra.ACRA {
        *;
    }
    
    # keep this around for some enums that ACRA needs
    -keep class org.acra.ReportingInteractionMode {
        *;
    }
    
    -keepnames class org.acra.sender.HttpSender$** {
        *;
    }
    
    -keepnames class org.acra.ReportField {
        *;
    }
    
    # keep this otherwise it is removed by ProGuard
    -keep public class org.acra.ErrorReporter {
        public void addCustomData(java.lang.String,java.lang.String);
        public void putCustomData(java.lang.String,java.lang.String);
        public void removeCustomData(java.lang.String);
    }
    
    # keep this otherwise it is removed by ProGuard
    -keep public class org.acra.ErrorReporter {
        public void handleSilentException(java.lang.Throwable);
    }
    
    #
    # ACRA - end
    #
    
    
    #
    # Facebook - start
    #
    -keep class com.facebook.** { *; }
    -keepattributes Signature
    #
    # Facebook - end
    #