2015-05-22 5 views
5

मैं अपने आवेदन का आकार कम करना चाहता हूं इसलिए मैं रिलीज मोड में minifyEnabled true का उपयोग कर रहा हूं लेकिन इस एप्लिकेशन के कारण दुर्घटनाग्रस्त हो गया है। बाद मेरीऐप क्रैश हो जाता है जब रिलीज मोड का चयन होता है लेकिन डीबग मोड में पूरी तरह से काम करता है

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') 
    } 

मैं proguard-rules.pro जोड़ा था है। अगर मैं इसे हटा देता हूं तो यह मुझे कई चेतावनी देता है।

-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 

मेरे प्रकट की तरह है:

<?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> 

मेरे 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); 
    } 
    } 

मुझे लगता है कि ProGuard के कारण है। लेकिन मुझे यह नहीं मिल रहा है कि मैं क्या कर रहा हूं। किसी भी suugestion की सराहना की जाएगी। अग्रिम धन्यवाद

फोल्लोइंग मेरा लॉगकैट है: तुरंत चलाने के बाद एप्लिकेशन क्रेशेश।

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   

मैं भी -keep class com.iifl.news.codereduce.{ *; } -dontwarn com.iifl.news.codereduce.** उपयोग करने की कोशिश की थी लेकिन फिर भी रिलीज़ मोड में यह दुर्घटना और डिबग मोड में अच्छी तरह से चलाता है।

मैंने निर्भरताओं में androidTestApt 'com.squareup.dagger:dagger-compiler:1.2.2' जोड़ने का भी प्रयास किया था। लेकिन कोई भाग्य

+0

लॉगकैट आउटपुट जोड़ें। –

+0

@HarshDattani logcat को जोड़ा गया है – PPD

+0

क्या आप अपनी mapping.txt फ़ाइल में देख सकते हैं और यह पता लगा सकते हैं कि 'com.iifl.news.codereduce.a.b' क्या है और उस प्रश्न के लिए उस obfuscated कक्षा के लिए कोड जोड़ें? (यदि यह ऐप मॉड्यूल नहीं है) – petey

उत्तर

0

यदि आप Retrofit का उपयोग कर रहे हैं तो मुझे लगता है कि आपके पास कक्षाएं होंगी जिन्हें आप JSON से कनवर्ट करने के लिए पीओजेओ के रूप में उपयोग करेंगे। (यानी जावा वस्तुओं आपके द्वारा बनाई गई हो जब रेट्रोफिट एक प्रतिक्रिया देता है)

इन कक्षाओं नहीं ProGuard द्वारा समझ से परे होना चाहिए और आप के रूप में इस प्रकार उन्हें हटाने के लिए की आवश्यकता होगी (उन्हें एक ही पैकेज के अंदर डाल में मदद मिलेगी!):

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

सुझाव के लिए धन्यवाद। मैंने जो भी सुझाव दिया है वह मैंने किया है, मुझे एक ही त्रुटि मिल रही है। – PPD

+0

क्या आपके पास कोई अन्य सुझाव है। मैं अभी भी इसमें फंस गया हूँ। Google लॉट लेकिन संकेत नहीं मिल रहा है। – PPD

0

फ़ाइल से apt 'com.squareup.dagger:dagger-compiler:1.2.1 हटाएं।

+0

मैंने आपके सुझावों का भी प्रयास किया लेकिन अभी भी एक ही त्रुटि है। धन्यवाद – PPD

+2

कृपया विस्तार करें * क्यों * यह मदद करनी चाहिए। – TobiMcNamobi

1

मुझे एक ही समस्या थी। समस्या यह थी कि ऐप लॉन्च होने पर अप्रयुक्त क्लास विधियों को हटा रहा था, लेकिन ऐप को बाद में उन क्लास विधियों की आवश्यकता हो सकती है, उदाहरण के लिए जब आप दूसरी गतिविधि में स्विच करते हैं या ऐप से बाहर निकलते हैं, और जब ऐप क्रैश हो जाता था। अप्रयुक्त विधियों को स्थायी रूप से रखने के लिए आपको minifyEnabled विशेषता को गलत में बदलने की आवश्यकता है। लेकिन फिर भी आप एक संकीर्ण विशेषता का उपयोग कर रिलीज के दौरान सभी फ़ाइलों को कम कर सकते हैं। हटना ऐप के प्रदर्शन को बढ़ावा दे सकता है।

release { 
     minifyEnabled false //keeps unused methods instead of removing them 
     shrinkResources true //to shrink files 
     proguardFiles getDefaultProguardFile('proguard-android.txt'),  'proguard-rules.pro' 
    } 
संबंधित मुद्दे