2015-05-22 15 views
5

Desidero ridurre le dimensioni della mia applicazione, pertanto sto utilizzando minifyEnabled true in modalità di rilascio ma a causa di questa applicazione si blocca. In seguito è la miaL'app si arresta in modo anomalo quando si seleziona la modalità di rilascio ma in modalità debug funziona perfettamente

build.gradle

buildscript { 
    repositories { 
     mavenCentral() 
    } 
    dependencies { 
     // replace with the current version of the Android plugin 
     classpath 'com.android.tools.build:gradle:1.1.0' 
     // the latest version of the android-apt plugin 
     classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4' 
    } 
    } 

    apply plugin: 'com.android.application' 
    apply plugin: 'com.neenbedankt.android-apt' 

    apt { 
    arguments { 
     androidManifestFile variant.outputs[0].processResources.manifestFile 
     resourcePackageName android.defaultConfig.applicationId 
    } 
    } 

    android { 
    compileSdkVersion 21 
    buildToolsVersion "21.1.2" 

    defaultConfig { 
     applicationId "com.iifl.news.codereduce" 
     minSdkVersion 10 
     targetSdkVersion 21 
     versionCode 1 
     versionName "1.0" 
    } 
    buildTypes { 
     release { 
      minifyEnabled true 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 

    packagingOptions { 

     exclude 'META-INF/LICENSE' 
     exclude 'META-INF/NOTICE' 

    } 
    packagingOptions { 
     exclude 'META-INF/LICENSE' 
     exclude 'META-INF/NOTICE' 

    } 
    } 

    dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.android.support:support-v4:21.+' 
    compile 'com.android.support:appcompat-v7:22.0.0' 
    compile 'com.jakewharton:butterknife:5.0.+' 
    compile 'com.jakewharton.timber:timber:2.2.+' 
    compile 'com.squareup.dagger:dagger:1.2.+' 
    provided 'com.squareup.dagger:dagger-compiler:1.2.+' 
    apt 'com.squareup.dagger:dagger-compiler:1.2.2' 


    compile 'com.squareup.okhttp:okhttp:2.0.0' 
    compile 'com.squareup.okhttp:okhttp-urlconnection:2.0.0' 
    compile 'com.squareup.retrofit:retrofit:1.6.1' 
    compile 'com.fasterxml.jackson.core:jackson-databind:2.4.+' 
    compile 'com.fasterxml.jackson.core:jackson-core:2.4.+' 
    compile 'com.fasterxml.jackson.core:jackson-annotations:2.4.+' 
    compile 'com.github.satyan:sugar:1.3' 
    compile 'com.pnikosis:materialish-progress:1.2' 
    compile 'com.android.support:cardview-v7:21.0.3' 
    compile 'com.google.android.gms:play-services-analytics:7.0.0' 

    compile files('libs/volley.jar') 
    } 

avevo aggiunto proguard-rules.pro. Se rimuovo questo, mi dà più avvertimenti.

-keep class butterknife.** { *; } 
-dontwarn butterknife.internal.** 
-keep class okhttp.** { *; } 
-dontwarn okhttp.** 


-keep class retrofit.** { *; } 
-dontwarn retrofit.** 

-keep class okio.** { *; } 
-dontwarn okio.** 

-keep class dagger.** { *; } 
-dontwarn dagger.** 
-dontwarn org.w3c.dom.bootstrap.DOMImplementationRegistry 
-dontwarn okio.** 
-dontwarn com.squareup.okhttp.internal.huc.JavaApiConverter$CacheHttpURLConnection 
-dontwarn com.squareup.okhttp.internal.huc.HttpURLConnectionImpl 

mio manifesto è come:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.iifl.news.codereduce" > 


<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
<uses-permission android:name="android.permission.GET_ACCOUNTS" /> 

<application 
    android:name=".app.IIFLApplication" 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name=".activities.SplashActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

    <activity 
     android:name=".activities.BaseActivity" 
     android:label="@string/title_activity_iiflbase" 
     android:screenOrientation="portrait" > 
    </activity> 
</application> 

</manifest> 

La mia classe è come IIFLApplication:

public class IIFLApplication extends Application { 

    private ObjectGraph applicationGraph; 
    private Tracker tracker; 

    private static final String PROPERTY_ID = "UA-61984632-2"; 

    public static int GENERAL_TRACKER = 0; 

    public enum TrackerName { 
     APP_TRACKER, GLOBAL_TRACKER, ECOMMERCE_TRACKER, 
    } 

    public HashMap mTrackers = new HashMap(); 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     /*if (BuildConfig.DEBUG) { 
      Timber.plant(new DebugTree()); 
     } else { 
      //Timber.plant(new CrashlyticsTree()); 
     }*/ 

     //create object graph 
     applicationGraph = ObjectGraph.create(getModules().toArray()); 
     applicationGraph.inject(this); 
    } 

    private List<Object> getModules() { 
     return Arrays.<Object>asList(new AppModule(this)); 
    } 

    public ObjectGraph getApplicationGraph() { 
     return this.applicationGraph; 
    } 

    /** 
    * A tree which logs important information for crash reporting. 
    */ 
    private static class CrashlyticsTree extends Timber.HollowTree { 
     @Override 
     public void v(String message, Object... args) { 
      logMessage(message, args); 
     } 

     @Override 
     public void v(Throwable t, String message, Object... args) { 
      logMessage(message, args); 
      // NOTE: We are explicitly not sending the exception to Crashlytics here. 
     } 

     @Override 
     public void i(String message, Object... args) { 
      logMessage(message, args); 
     } 

     @Override 
     public void i(Throwable t, String message, Object... args) { 
      logMessage(message, args); 
      // NOTE: We are explicitly not sending the exception to Crashlytics here. 
     } 

     @Override 
     public void w(String message, Object... args) { 
      logMessage("WARN: " + message, args); 
     } 

     @Override 
     public void w(Throwable t, String message, Object... args) { 
      logMessage("WARN: " + message, args); 
      // NOTE: We are explicitly not sending the exception to Crashlytics here. 
     } 

     @Override 
     public void e(String message, Object... args) { 
      logMessage("ERROR: " + message, args); 
     } 

     @Override 
     public void e(Throwable t, String message, Object... args) { 
      logMessage("ERROR: " + message, args); 
      //Crashlytics.logException(t); 
     } 

     private void logMessage(String message, Object... args) { 
      //Crashlytics.log(String.format(message, args)); 
     } 
    } 



    public synchronized Tracker getTracker(TrackerName appTracker) { 
     if (!mTrackers.containsKey(appTracker)) { 
      GoogleAnalytics analytics = GoogleAnalytics.getInstance(this); 
      Tracker t = (appTracker == TrackerName.APP_TRACKER) ? analytics.newTracker(PROPERTY_ID) : (appTracker == TrackerName.GLOBAL_TRACKER) ? analytics.newTracker(R.xml.global_tracker) : analytics.newTracker(R.xml.ecommerce_tracker); 
      mTrackers.put(appTracker, t); 
     } 
     return (Tracker) mTrackers.get(appTracker); 
    } 
    } 

credo sia dovuto al Proguard. Ma non sto sbagliando quello che sto facendo. Sarà apprezzato qualsiasi suugestion. Grazie in anticipo

Folllowing è il mio logcat: applicazione che si interrompe immediatamente dopo l'esecuzione.

05-22 15:15:43.067 3158-3158/com.iifl.news.codereduce E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: com.iifl.news.codereduce, PID: 3158 
java.lang.RuntimeException: Unable to create application com.iifl.news.codereduce.app.IIFLApplication: java.lang.IllegalStateException: Module adapter for class com.iifl.news.codereduce.a.b could not be loaded. Please ensure that code generation was run for this module. 
     at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4521) 
     at android.app.ActivityThread.access$1500(ActivityThread.java:144) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1339) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5221) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
Caused by: java.lang.IllegalStateException: Module adapter for class com.iifl.news.codereduce.a.b could not be loaded. Please ensure that code generation was run for this module. 
     at dagger.internal.FailoverLoader$1.create(Unknown Source) 
     at dagger.internal.FailoverLoader$1.create(Unknown Source) 
     at dagger.internal.Memoizer.get(Unknown Source) 
     at dagger.internal.FailoverLoader.getModuleAdapter(Unknown Source) 
     at dagger.internal.Modules.loadModules(Unknown Source) 
     at dagger.ObjectGraph$DaggerObjectGraph.makeGraph(Unknown Source) 
     at dagger.ObjectGraph$DaggerObjectGraph.access$000(Unknown Source) 
     at dagger.ObjectGraph.create(Unknown Source) 
     at com.iifl.news.codereduce.app.IIFLApplication.onCreate(Unknown Source) 
     at  android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1011) 
      at   

Avevo provato anche utilizzando -keep class com.iifl.news.codereduce.{ *; } -dontwarn com.iifl.news.codereduce.** Ma ancora in modalità di rilascio si crash e in modalità di debug funziona bene.

Avevo anche provato ad aggiungere androidTestApt 'com.squareup.dagger:dagger-compiler:1.2.2' nelle dipendenze. Ma senza fortuna

+0

Aggiungi uscita Logcat. –

+0

@HarshDattani logcat è stato aggiunto – PPD

+0

puoi cercare nel tuo file mapping.txt e trovare cosa dovrebbe essere com.iifl.news.codereduce.a.b' e aggiungere il codice per quella classe offuscata alla tua domanda? (se non è AppModule) – petey

risposta

0

Se si utilizza Retrofit presumo che si disporrà di classi che verranno utilizzate come POJO per la conversione da JSON. (Vale a dire il oggetti Java si ottiene creato quando Retrofit restituisce una risposta)

Queste classi dovrebbero non essere offuscato da Proguard e sarà necessario eliminarli nel modo seguente (mettendoli all'interno di un unico pacchetto aiuterà!):

-keep class com.app.example.{ *; } 
-dontwarn com.app.example.** 
+0

Grazie per il suggerimento. Avevo fatto quello che suggerisci ancora sto ottenendo lo stesso errore. – PPD

+0

Hai qualche altro suggerimento. Sono ancora bloccato in questo. Google lotti ma non ricevendo suggerimenti. – PPD

0

Rimuovi apt 'com.squareup.dagger:dagger-compiler:1.2.1 dal file build.gradle.

+0

Ho provato anche quello che suggerisci ma ho ancora lo stesso errore. Grazie – PPD

+2

Si prega di approfondire * perché * questo dovrebbe aiutare. – TobiMcNamobi

1

Ho avuto lo stesso problema. Il problema era che proguard stava rimuovendo i metodi di classe inutilizzati all'avvio dell'app, ma l'app potrebbe aver bisogno di quei metodi di classe in un secondo momento, ad esempio quando si passa ad altre attività o si esce dall'app, e cioè quando l'app si è bloccata. È necessario modificare l'attributo minifyEnabled su false per mantenere i metodi non utilizzati in modo permanente. Ma ancora puoi ridurre tutti i file durante il rilascio usando un attributo shrink. Il restringimento può aumentare le prestazioni dell'app.

release { 
     minifyEnabled false //keeps unused methods instead of removing them 
     shrinkResources true //to shrink files 
     proguardFiles getDefaultProguardFile('proguard-android.txt'),  'proguard-rules.pro' 
    }