Roboguice NoClassDefFoundError

时间:2015-08-19 14:08:16

标签: java android roboguice

我今天刚开始使用Roboguice,跟随Wiki https://github.com/roboguice/roboguice/wiki/Your-First-View-Injection,当我创建一个新的App时,示例工作正常,但是当我尝试在我现有的App上集成Roboguice时,它在运行时给出了NoClassDefFoundError

这是我的MainActivity。

import android.app.SearchManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.net.Uri;
import android.os.Bundle;
import android.support.design.widget.NavigationView;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.SearchView;
import android.widget.TextView;

import com.example.hp.navigationexercise.R;

import roboguice.RoboGuice;
import roboguice.activity.RoboActionBarActivity;
import roboguice.inject.InjectView;

        public class MainActivity extends RoboActionBarActivity implements
            android.view.View.OnClickListener{


        //RoboGuice
        static {
            RoboGuice.setUseAnnotationDatabases(false);
        }

        @InjectView(R.id.textme) TextView textView;


        private DrawerLayout mDrawer;
        private Toolbar toolbar;
        private ActionBarDrawerToggle drawerToggle;

        public static final String PREFS_NAME = "MyPrefsFile";
        int firstrun = 0;

        @Override
        protected void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            // Set a Toolbar to replace the ActionBar.
            toolbar = (Toolbar) findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);

            // Find our drawer view
            mDrawer = (DrawerLayout) findViewById(R.id.drawer_layout);
            //setupDrawerContent(mDrawer);

            drawerToggle = setupDrawerToggle();

            // Tie DrawerLayout events to the ActionBarToggle
            mDrawer.setDrawerListener(drawerToggle);

            // Set the menu icon instead of the launcher icon.
            final ActionBar ab = getSupportActionBar();
            ab.setHomeAsUpIndicator(R.drawable.ic_navigation_drawer);
            ab.setDisplayHomeAsUpEnabled(true);

            NavigationView navigationView = (NavigationView) findViewById(R.id.nvView);
            if (navigationView != null) {
                setupDrawerContent(navigationView);
            }

        }


        private ActionBarDrawerToggle setupDrawerToggle() {
            return new ActionBarDrawerToggle(this, mDrawer, toolbar, R.string.drawer_open,  R.string.drawer_close);
        }


        private void setupDrawerContent(NavigationView navigationView) {
            navigationView.setNavigationItemSelectedListener(
                    new NavigationView.OnNavigationItemSelectedListener() {
                        @Override
                        public boolean onNavigationItemSelected(MenuItem menuItem) {
                            selectDrawerItem(menuItem);
                            return true;
                        }
                    });
        }


        public void selectDrawerItem(MenuItem menuItem) {
            //Handles Menu Drawer Items
        }

        public void onFragmentInteraction(Uri uri){
            //you can leave it empty
        }


    }

这是错误它抛出

08-19 14:24:23.514  25562-25562/com.example.hp.navigationexercise E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.hp.navigationexercise, PID: 25562
    java.lang.NoClassDefFoundError: android.support.v7.appcompat.R$layout
            at android.support.v7.app.AppCompatDelegateImplV7.ensureSubDecor(AppCompatDelegateImplV7.java:324)
            at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:246)
            at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:106)
            at com.example.hp.navigationexercise.activity.MainActivity.onCreate(MainActivity.java:69)
            at android.app.Activity.performCreate(Activity.java:5343)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1090)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2331)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2419)
            at android.app.ActivityThread.access$800(ActivityThread.java:151)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1342)
            at android.os.Handler.dispatchMessage(Handler.java:110)
            at android.os.Looper.loop(Looper.java:193)
            at android.app.ActivityThread.main(ActivityThread.java:5323)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640)
            at dalvik.system.NativeStart.main(Native Method)

它会在第69行

中抛出指向setContentView(R.layout.activity_main);的错误

这是我的Build.Gradle(app)

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

android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"

    packagingOptions {
        exclude 'META-INF/DEPENDENCIES.txt'
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/dependencies.txt'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/license.txt'
        exclude 'META-INF/LGPL2.1'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/notice.txt'
    }

    repositories {
        mavenCentral()
        maven { url 'https://maven.fabric.io/public' }
    }

    defaultConfig {
        applicationId "com.example.hp.navigationexercise"
        minSdkVersion 14
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
        // Enabling multidex support.
        multiDexEnabled true
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])

    compile('com.twitter.sdk.android:twitter:1.3.2@aar') {
        transitive = true;
    }
    compile 'com.android.support:design:22.2.0'
    compile 'com.android.support:appcompat-v7:22.2.0'
    compile 'com.android.support:cardview-v7:22.2.0'
    compile 'com.android.support:recyclerview-v7:22.2.0'
    compile 'com.android.support:support-v4:22.2.0'
    compile 'com.android.support:support-annotations:22.2.0'
    compile 'com.squareup.picasso:picasso:2.5.2'
    compile 'com.android.support:gridlayout-v7:22.2.0'
    compile 'com.github.bumptech.glide:glide:3.6.0'
    compile 'de.hdodenhof:circleimageview:1.3.0'
    compile 'com.google.android.gms:play-services:7.3.0'
    compile 'com.facebook.android:facebook-android-sdk:4.1.0'

    compile 'org.roboguice:roboguice:3.0'
    provided  'org.roboguice:roboblender:3.0'

}

Build.Gradle(Project)

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        mavenCentral()
        maven { url 'https://maven.fabric.io/public' }
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.2.3'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}


allprojects {
    repositories {
        jcenter()
        maven { url 'https://maven.fabric.io/public' }
    }
}

Proguard的

-dontwarn com.squareup.okhttp.**
-dontwarn com.google.appengine.api.urlfetch.**
-dontwarn rx.**
-dontwarn retrofit.**
-keepattributes Signature
-keepattributes *Annotation*
-keep class com.squareup.okhttp.** { *; }
-keep interface com.squareup.okhttp.** { *; }
-keep class retrofit.** { *; }
-keepclasseswithmembers class * {
    @retrofit.http.* <methods>;
} 

感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

这是我的dex大小问题(通常你不能编译超过65k函数的dex,这可以通过在你的gradle脚本中使用启用multi-dex来解决)。

尝试启用multi-dex并查看它是否有帮助。

这是一个链接 - http://developer.android.com/tools/building/multidex.html

祝你好运。

答案 1 :(得分:0)

Roboguice现已弃用。您可以改用Toothpick