3

自從我升級Android的工作室,我有點被迫移動上的搖籃的版本,buildToolsVersion,和Java的版本7NoClassDefFound之後搖籃和Android工作室升級

而我的問題是,我實際上可以在運行項目Android的棒棒糖完美,但我失去了向後的兼容性,我無法在設備上運行的應用程序之前API 21

的Android Studio版本: 1.0.2
搖籃包裝版本: gradle這個-2.2.1 - 全部

我遵循Configuring Your App for Multidex with Gradle指南的每一步。

TL; DR代碼編譯完美,在Android棒棒糖上運行,不會運行棒棒糖。

apply plugin: 'com.android.application' 

android { 

    compileSdkVersion 21 
    buildToolsVersion "21.1.2" 
    defaultConfig { 
     applicationId 'com.mundodescuento' 
     minSdkVersion 14 
     targetSdkVersion 21 
     multiDexEnabled true 
    } 

    buildTypes { 

     release { 
      proguardFile('proguard-rules.pro') 
      signingConfig signingConfigs.MundoDescuento 
      debuggable false 
      jniDebuggable false 
      renderscriptDebuggable false 
      minifyEnabled false 
      zipAlignEnabled true 
     } 

     debug { 
      proguardFile('proguard-rules.pro') 
      debuggable true 
      jniDebuggable true 
      renderscriptDebuggable true 
      minifyEnabled false 
      zipAlignEnabled false 
     } 
    } 
    dexOptions { 
     incremental true 
     javaMaxHeapSize "4g" 
    } 

    compileOptions { 
     sourceCompatibility JavaVersion.VERSION_1_7 
     targetCompatibility JavaVersion.VERSION_1_7 
    } 
} 

由於依賴也宣告

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.android.support:multidex:1.0.0' 
} 

項目的根依賴。

​​

我的應用程序類根據請求擴展了MultiDexApplication。一款Android 4.0.3設備上運行的項目時

public class MundoDescuentoApplication extends MultiDexApplication { 
    ... 
} 

堆棧跟蹤我越來越:

java.lang.ExceptionInInitializerError 
      at java.lang.Class.newInstanceImpl(Native Method) 
      at java.lang.Class.newInstance(Class.java:1319) 
      at android.app.Instrumentation.newApplication(Instrumentation.java:957) 
      at android.app.Instrumentation.newApplication(Instrumentation.java:942) 
      at android.app.LoadedApk.makeApplication(LoadedApk.java:477) 
      at android.app.ActivityThread.handleBindApplication(ActivityThread.java:3938) 
      at android.app.ActivityThread.access$1300(ActivityThread.java:123) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1185) 
      at android.os.Handler.dispatchMessage(Handler.java:99) 
      at android.os.Looper.loop(Looper.java:137) 
      at android.app.ActivityThread.main(ActivityThread.java:4424) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:511) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
      at dalvik.system.NativeStart.main(Native Method) 
    Caused by: java.lang.NoClassDefFoundError: com/mundodescuento/model/request_params/LoginForm 
      at java.lang.Class.getDeclaredMethods(Native Method) 
      at java.lang.Class.getDeclaredMethods(Class.java:703) 
      at com.google.inject.spi.InjectionPoint.getInjectionPoints(InjectionPoint.java:662) 
      at com.google.inject.spi.InjectionPoint.forInstanceMethodsAndFields(InjectionPoint.java:356) 
      at com.google.inject.internal.ConstructorBindingImpl.getInternalDependencies(ConstructorBindingImpl.java:151) 
      at com.google.inject.internal.InjectorImpl.getInternalDependencies(InjectorImpl.java:585) 
      at com.google.inject.internal.InjectorImpl.cleanup(InjectorImpl.java:543) 
      at com.google.inject.internal.InjectorImpl.initializeJitBinding(InjectorImpl.java:529) 
      at com.google.inject.internal.InjectorImpl.createJustInTimeBinding(InjectorImpl.java:847) 
      at com.google.inject.internal.InjectorImpl.createJustInTimeBindingRecursive(InjectorImpl.java:772) 
      at com.google.inject.internal.InjectorImpl.getJustInTimeBinding(InjectorImpl.java:256) 
      at com.google.inject.internal.InjectorImpl.getBindingOrThrow(InjectorImpl.java:205) 
      at com.google.inject.internal.InjectorImpl.getInternalFactory(InjectorImpl.java:853) 
      at com.google.inject.internal.FactoryProxy.notify(FactoryProxy.java:46) 
      at com.google.inject.internal.ProcessedBindingData.runCreationListeners(ProcessedBindingData.java:50) 
      at com.google.inject.internal.InternalInjectorCreator.initializeStatically(InternalInjectorCreator.java:133) 
      at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:106) 
      at com.google.inject.Guice.createInjector(Guice.java:95) 
      at com.google.inject.Guice.createInjector(Guice.java:72) 
      at com.google.inject.Guice.createInjector(Guice.java:62) 
      at com.mundodescuento.MundoDescuentoApplication.<clinit>(MundoDescuentoApplication.java:22) 
            at java.lang.Class.newInstanceImpl(Native Method) 
            at java.lang.Class.newInstance(Class.java:1319) 
            at android.app.Instrumentation.newApplication(Instrumentation.java:957) 
            at android.app.Instrumentation.newApplication(Instrumentation.java:942) 
            at android.app.LoadedApk.makeApplication(LoadedApk.java:477) 
            at android.app.ActivityThread.handleBindApplication(ActivityThread.java:3938) 
            at android.app.ActivityThread.access$1300(ActivityThread.java:123) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1185) 
            at android.os.Handler.dispatchMessage(Handler.java:99) 
            at android.os.Looper.loop(Looper.java:137) 
            at android.app.ActivityThread.main(ActivityThread.java:4424) 
            at java.lang.reflect.Method.invokeNative(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:511) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
            at dalvik.system.NativeStart.main(Native Method) 
    Caused by: java.lang.ClassNotFoundException: com.mundodescuento.model.request_params.LoginForm 
      at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61) 
      at java.lang.ClassLoader.loadClass(ClassLoader.java:501) 
      at java.lang.ClassLoader.loadClass(ClassLoader.java:461) 
            at java.lang.Class.getDeclaredMethods(Native Method) 
            at java.lang.Class.getDeclaredMethods(Class.java:703) 
            at com.google.inject.spi.InjectionPoint.getInjectionPoints(InjectionPoint.java:662) 
            at com.google.inject.spi.InjectionPoint.forInstanceMethodsAndFields(InjectionPoint.java:356) 
            at com.google.inject.internal.ConstructorBindingImpl.getInternalDependencies(ConstructorBindingImpl.java:151) 
            at com.google.inject.internal.InjectorImpl.getInternalDependencies(InjectorImpl.java:585) 
            at com.google.inject.internal.InjectorImpl.cleanup(InjectorImpl.java:543) 
            at com.google.inject.internal.InjectorImpl.initializeJitBinding(InjectorImpl.java:529) 
            at com.google.inject.internal.InjectorImpl.createJustInTimeBinding(InjectorImpl.java:847) 
            at com.google.inject.internal.InjectorImpl.createJustInTimeBindingRecursive(InjectorImpl.java:772) 
            at com.google.inject.internal.InjectorImpl.getJustInTimeBinding(InjectorImpl.java:256) 
            at com.google.inject.internal.InjectorImpl.getBindingOrThrow(InjectorImpl.java:205) 
            at com.google.inject.internal.InjectorImpl.getInternalFactory(InjectorImpl.java:853) 
            at com.google.inject.internal.FactoryProxy.notify(FactoryProxy.java:46) 
            at com.google.inject.internal.ProcessedBindingData.runCreationListeners(ProcessedBindingData.java:50) 
            at com.google.inject.internal.InternalInjectorCreator.initializeStatically(InternalInjectorCreator.java:133) 
            at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:106) 
            at com.google.inject.Guice.createInjector(Guice.java:95) 
            at com.google.inject.Guice.createInjector(Guice.java:72) 
            at com.google.inject.Guice.createInjector(Guice.java:62) 
            at com.mundodescuento.MundoDescuentoApplication.<clinit>(MundoDescuentoApplication.java:22) 
            at java.lang.Class.newInstanceImpl(Native Method) 
            at java.lang.Class.newInstance(Class.java:1319) 
            at android.app.Instrumentation.newApplication(Instrumentation.java:957) 
            at android.app.Instrumentation.newApplication(Instrumentation.java:942) 
            at android.app.LoadedApk.makeApplication(LoadedApk.java:477) 
            at android.app.ActivityThread.handleBindApplication(ActivityThread.java:3938) 
            at android.app.ActivityThread.access$1300(ActivityThread.java:123) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1185) 
            at android.os.Handler.dispatchMessage(Handler.java:99) 
            at android.os.Looper.loop(Looper.java:137) 
            at android.app.ActivityThread.main(ActivityThread.java:4424) 
            at java.lang.reflect.Method.invokeNative(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:511) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
            at dalvik.system.NativeStart.main(Native Method) 

編輯15年2月10日:新增MundoDescuentoApplication.java和LoginForm.java

從出現在堆棧跟蹤類中的線是private static final Injector injector = Guice.createInjector(new ApplicationGuiceModule(), new GsonModule());

package com.mundodescuento; 

import android.content.Context; 
import android.content.SharedPreferences; 
import android.support.multidex.MultiDexApplication; 

import com.google.inject.Guice; 
import com.google.inject.Injector; 
import com.mundodescuento.module.ApplicationGuiceModule; 
import com.mundodescuento.module.GsonModule; 
import com.parse.Parse; 
import com.parse.ParseFacebookUtils; 

/** 
* Created by gmuniz on 6/30/14. 
*/ 
public class MundoDescuentoApplication extends MultiDexApplication { 

    private static MundoDescuentoApplication mInstance; 
    private static final String SHARED_PREFFERENCES = "com.mundodescuento.Prefferences"; 
    private static final Injector injector = Guice.createInjector(new ApplicationGuiceModule(), new GsonModule()); 

    private static SharedPreferences sharedPreferences; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     mInstance = this; 

     Parse.initialize(...); 
     ParseFacebookUtils.initialize(getString(R.string.facebook_app_id)); 

     sharedPreferences = getSharedPreferences(SHARED_PREFFERENCES, Context.MODE_PRIVATE); 
    } 

    /** 
    * Retrieves an instance from the {@link SharedPreferences} 
    * 
    * @return 
    */ 
    public static SharedPreferences getSharedPreferences() { 
     return MundoDescuentoApplication.sharedPreferences; 
    } 

    /** 
    * This is a convenience for {@link com.google.inject.Injector#injectMembers(Object) Injector.injectMembers(Object object)} 
    */ 
    public static void injectMembers(final Object object) { 
     injector.injectMembers(object); 
    } 

    /** 
    * Retrieve the application in a static way. 
    * 
    * @return the context. 
    */ 
    public static Context getAppContext() { 
     return mInstance; 
    } 
} 

的LoginForm.java

package com.mundodescuento.model.request_params; 

/** 
* Created by gmuniz on 2/4/15. 
*/ 
public class LoginForm { 

    private final String email; 
    private final String password; 

    private LoginForm(final Builder builder) { 
     this.email = builder.email; 
     this.password = builder.password; 
    } 

    public static class Builder { 
     private String email; 
     private String password; 

     public Builder email(final String email) { 
      this.email = email; 

      return this; 
     } 

     public Builder password(final String password) { 
      this.password = password; 

      return this; 
     } 

     public LoginForm build() { 
      return new LoginForm(this); 
     } 
    } 

    public String getEmail() { 
     return email; 
    } 

    public String getPassword() { 
     return password; 
    } 

} 

我已經失去了這個每線索,任何幫助,將不勝感激!

+0

嘗試改變'minifyEnabled FALSE'到'runProguard FALSE'並重新運行gradle這個 – 2015-02-09 21:03:57

+0

錯誤:(54,0)搖籃DSL方法未找到: 'runProguard()' 項目「MundoDescuento '可能正在使用不包含該方法的Gradle版本。 – GMuniz 2015-02-09 21:11:53

+0

正確的,你需要更新gradle發佈爲此工作... – 2015-02-09 21:21:28

回答

0

那麼......最後我想出瞭解決方案。

我無法詳細解釋它,似乎有一個問題在內部處理註釋和google-guice dependency。

我的應用程序是整個完整的Android API的水平完全可運行後,我搬到版本:

compile 'com.google.inject:guice:4.0-beta5:no_aop' 

它不具有任何關係multidex配置。

0

確保有以下設置:

Setup Multi Dex with resources in Android Studio

更新

它看起來像真正的問題是LoginForm的投擲的初始化 java.lang.ExceptionInInitializerError這是造成一個空指針在登錄表格中發生的第22行MundoDescuentoApplication.java:22

請,can你發佈這個類的代碼?

+0

我已經聲明..'編譯'com.android.support:support-v4:21.0.3' 編譯'com.android.support:appcompat-v7:21.0.3''我仔細檢查了反正我是缺少'compile'c​​om.google.code.gson:gson:2.3.1'' ...其他我試過在你的答案中啓發了更改'compile'c​​om.google.inject的版本:guice:3.0:no_aop ''編譯'com.google.inject:guice:3.0''沒有運氣,但是當我回到no_aop版本時,堆棧跟蹤是相同的,但有另一個文件,也在同一個包下。 – GMuniz 2015-02-09 21:52:27

+0

正如我所說,我聲明'編譯'com.google.code.gson:gson:2.3.1'',但是當我執行'./gradlew:app:androidDependencies'時,依賴項未列出...任何線索與此? – GMuniz 2015-02-09 21:55:19

+0

我會看看你,稍後再更新一下。看來這不是答案... – 2015-02-09 21:56:13

2

對我來說,這個問題是通過改變和增加一些東西來解決的。所有需要的 首先使multidex加入

defaultConfig { 
    multiDexEnabled true 
} 

再加入這個依賴

dependencies { 
    compile 'com.google.inject:guice:4.0-beta5:no_aop' 
    compile 'com.android.support:multidex:1.0.0' 
} 

清單中的應用

<application 
    ... 
    android:name="android.support.multidex.MultiDexApplication"> 
    ... 
</application> 

改變***或者如果你有你自己的應用程序class then android:name =「。yourApllication」that must extend MultiDexApplication

欲瞭解更多信息 https://developer.android.com/tools/building/multidex.html

相關問題