应用程序在选择发布模式时崩溃,但在调试模式下完美运行。

16
我希望您能够缩小应用程序的大小,因此在发布模式下使用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引起的。但我不知道我做错了什么。欢迎任何建议。先感谢您。

以下是我的logcat:应用程序在运行后立即崩溃。

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',但没有成功。


@HarshDattani logcat已经被添加。 - PPD
你能否查看你的mapping.txt文件,找到com.iifl.news.codereduce.a.b应该是什么,并将该混淆类的代码添加到你的问题中吗?(如果它不是AppModule) - petey
3个回答

5

我遇到过同样的问题。问题在于当应用程序启动时,proguard会删除未使用的类方法,但是在以后的过程中可能需要这些类方法,例如当您切换到其他活动或退出应用程序时,这就是应用程序崩溃的原因。您需要将minifyEnabled属性更改为false,以保留未使用的方法。但仍然可以使用shrink属性在发布期间缩小所有文件。缩小可以提高应用程序的性能。

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

5
我已添加 shrinkResources true,但是出现了 Gradle 构建错误:删除未使用的资源需要启用未使用代码缩减。更多信息请参见 http://d.android.com/r/tools/shrink-resources.html。 - Matt D
1
这不是正确的答案。如果我想启用Proguard并保护我的代码,该怎么办?因为在发布版本中启用Proguard时应用程序会崩溃,而在调试中它可以正常工作。 - Parth Bhayani
禁用必要的东西(minifyEnabled)来使事情变得更糟几乎从来不是一个好的解决方案。 - Donki

1
如果您正在使用Retrofit,我假设您将拥有一些用作POJOs的类,以便从JSON进行转换。(即,当Retrofit返回响应时创建的Java对象)。
这些类不应该被proguard混淆,并且您需要按照以下方式删除它们(将它们放在一个单独的包中会有所帮助!)。
-keep class com.app.example.{ *; }
-dontwarn com.app.example.**

谢谢您的建议。我已经按照您的建议去做了,但我仍然得到相同的错误。 - PPD
你有其他建议吗?我还卡在这里。我已经谷歌了很多,但没有得到任何提示。 - PPD

0

build.gradle 文件中删除 apt 'com.squareup.dagger:dagger-compiler:1.2.1'


我也尝试了你建议的方法,但仍然出现相同的错误。谢谢。 - PPD
9
请详细说明为什么这会有帮助。 - TobiMcNamobi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接