2015-05-13 10 views
14

Also entwickle ich eine käsige App, um Posts zu schreiben, um mich selbst in Android zu trainieren, bevor ich am realen App-Projekt meiner Firma arbeite. Ich stoße auf einen Käfer, der mir eine sehr schwere Zeit bereitet.

Ich bekam eine Liste von Bibliotheksabhängigkeiten, die ich verwenden sollte, und habe meine build.gradle-Datei eingerichtet, um sie zu laden. Es synchronisiert, also nehme ich an, dass es nach meinem besten Wissen gemacht wurde:

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.android.support:appcompat-v7:22.1.1' 
    compile 'com.google.android.gms:play-services:7.3.0' 
    compile 'com.squareup.okhttp:okhttp:2.3.0' 
    compile 'com.squareup.retrofit:retrofit:1.7.0' 
    compile 'com.google.code.gson:gson:2.3' 
    compile 'com.squareup.dagger:dagger:1.2.2' 
    compile 'com.squareup.dagger:dagger-compiler:1.2.2' 
    compile 'com.squareup.picasso:picasso:2.5.2' 
    compile 'com.android.support:recyclerview-v7:22.1.1' 
    compile 'com.squareup:otto:1.3.7' 
    compile 'com.path:android-priority-jobqueue:1.1.2' 
    compile 'io.realm:realm-android:0.80.1' 
    compile 'com.jakewharton:butterknife:6.1.0' 
    compile 'com.android.support:multidex:1.0.0' 
    compile 'com.android.support:appcompat-v7:22.1.1' 
} 

und ich habe installiert tatsächlich die android-Support-Bibliothek und das Repository: SDK Manager Proof I've installed what I need

und doch habe ich immer noch versuchen, die App zu starten und die folgende Stack-Trace erhalten:

java.lang.NoClassDefFoundError: android.support.v7.appcompat.R$attr 
     at android.support.v7.app.AppCompatDelegateImplV7.ensureSubDecor(AppCompatDelegateImplV7.java:286) 
     at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:246) 
     at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:106) 
     at com.anglersatalas.twitstagram.MainActivity.onCreate(MainActivity.java:23) 
     at android.app.Activity.performCreate(Activity.java:5451) 
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093) 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2392) 
     at android.app.ActivityThread.access$900(ActivityThread.java:169) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1280) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:146) 
     at android.app.ActivityThread.main(ActivityThread.java:5487) 
     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:1283) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099) 
     at dalvik.system.NativeStart.main(Native Method) 

Überall auf Stack Overflow, das ich gesehen habe, gibt es die Lösung, die appcompat v7-Bibliotheken hinzuzufügen, wie sie auf der Android-Website sagen, was ich oben demonstriert habe. Ich kann nicht für das Leben von mir herausfinden, warum das immer noch geschieht. Mit Blick auf die Stack-Trace, bricht es in meinem MainActivity am setContentView() -Methode:

package com.anglersatalas.twitstagram; 

import android.os.Bundle; 
import com.anglersatalas.twitstagram.R; 
import android.support.v7.app.AppCompatActivity; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.TextView; 

import com.anglersatalas.twitstagram.api.PostService; 
import com.anglersatalas.twitstagram.models.Post; 

import java.util.List; 

import retrofit.RestAdapter; 


public class MainActivity extends AppCompatActivity{ 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(com.anglersatalas.twitstagram.R.layout.activity_main); 

     TextView tv = (TextView)findViewById(com.anglersatalas.twitstagram.R.id.textView); 

     RestAdapter adapter = new RestAdapter.Builder() 
       .setEndpoint("10.0.0.248/testserver/backend/web") 
       .build(); 

     PostService service = adapter.create(PostService.class); 
     List<Post> list = service.getPosts(); 
     String str = ""; 
     for(Post p : list){ 
      str += String.format("%s\n", p); 
     } 
     tv.setText(str); 

    } 

    ... 

} 

in die Klassendatei Durch Klicken durch das die Methode aufruft, die die Ausnahme wirft, es zeigt, dass es nicht 'finden android.support.v7.appcompat.R; ':

enter image description here

Meine Mitarbeiter und ich sind ratlos. Irgendwelche Vorschläge, wie man das beheben kann?

+0

Es ist eine generierte Datei. Ich würde vorschlagen, ein 'Build> Clean'. – tachyonflux

+0

Ich habe das auch getan. Es scheint keinen Effekt zu haben, weil es eine R-Datei einer importierten Bibliothek ist, die "fehlt", nicht meine. Ich füge in Anführungszeichen fehl, weil ich es buchstäblich in der Projekt Sidebar sehen kann. – cbhedd

+0

Löschen Sie diese R-Datei dann versuchen Sie [Invalidate Cache und IDE neu starten] – Eenvincible

Antwort

47

ich mit dem gleichen Problem nur Stunden damit verbracht, und ich konnte es entschlossen zu erhalten ...

Es stellt sich heraus, dass ich über die dex Grenze war, habe ich unter meiner build.gradle Datei wahr multiDexEnabled hatte defaultConfig, aber es sieht aus wie ich ein paar andere Dinge für Pre 5.0-Geräte fehlte ..

defaultConfig { 
... 
     multiDexEnabled true 
... } 

ich habe zuerst meine Methode mit diesem zählen: https://github.com/mihaip/dex-method-counts

ich bei 67952 Methoden war ...

Ich aktualisiert meine build.gradle dann multidex Unterstützung

dependencies { 
... 
compile 'com.android.support:multidex:1.0.0' 
... } 

ich dann aktualisiert meine Anwendung (wir haben bereits unsere eigenen) hinzufügen von MultiDexApplication

package com.me.myapp 
... 
public class Application extends MultiDexApplication {} 

Hier waren die beiden Links zu erstrecken sich von die Dokumentation verwendete ich richtig multidex implementieren: https://developer.android.com/tools/building/multidex.html https://developer.android.com/reference/android/support/multidex/MultiDexApplication.html

Ihre Anwendung in th Stellen Sie sicher, e Manifest zeigt auf Ihre benutzerdefinierte multiidex-Anwendung

<application 
... 
android:name="com.me.myapp.Application" /> 
+1

Das sieht super vielversprechend aus! Ich werde an einem Ort enden, an dem ich die Multidex-Unterstützung hinzufügen muss, aber in der Zwischenzeit, seitdem ich nirgendwohin kam, habe ich von Null angefangen und hatte seither keine Probleme. Danke für die Antwort! Sollte ich es als richtig markieren? Ich weiß nicht, ob es schon soweit ist, aber es wird noch eine Weile dauern, bis ich wieder da bin. Ich bin ziemlich neu, Stack Overflow tatsächlich zu verwenden. – cbhedd

+0

Es funktionierte für uns, und wir hatten genau das gleiche Problem .. Wir begannen sogar Code neu zu schreiben .. Eine Sache, die Sie tun können, um zu überprüfen, ob es funktioniert oder nicht. Angenommen, Sie haben multi-dex aktiviert in Ihren build.gradle-Standardeinstellungen, führen Sie es auf einem 5.0-Gerät aus, es sollte gut laufen. Es war alles <5.0, das multidex nicht verarbeiten konnte. – Chrispix

+1

Danke. Das hat uns gerettet. Und ich mag die Art, wie Sie Fragen stellen – Krishnabhadra

3

Ich habe nur ein paar Stunden darauf verbracht, und jetzt hat es gelöst.

Eine Einschränkung für einige Android-Apps ist die Gesamtzahl der Methoden, die die zugrunde liegende kompilierte .dex-Datei unterstützen kann. Es ist durch 16 Bits oder 65.536 Werte begrenzt.

Wenn Sie Bibliotheken von Drittanbietern in Ihre Anwendung einschließen, haben Sie alle ihre Methoden in Ihrer .dex-Datei. Größere APIs, z. B. solche, die in den Google Play-Diensten enthalten sind, beginnen dann sehr schnell mit dem Limit.

Weitere Details: Google Play services and DEX method limits

In meinem Fall war ich mit Google Play-Dienste für Google/Youtube-Authentifizierung in meiner App.

compile 'com.google.android.gms:play-services:7.3.0'

So habe ich es zu dem

compile 'com.google.android.gms:play-services-identity:7.3.0'

, wie ich es für Identity/Authentifizierung Zweck nur erforderlich. So können Sie die individuelle Bibliothek nach Ihren Anforderungen auswählen.

Zum Beispiel, wenn alles, was Sie verwenden möchten, ist Karten, würden Sie stattdessen haben:

compile 'com.google.android.gms:play-services-maps:7.3.0'

ebenfalls für den Standort

compile 'com.google.android.gms:play-services-location:7.3.0'

Ich hoffe, es wird Ihnen helfen!

+0

Danke, das hat mir wirklich geholfen, ich musste nicht einmal die Multidex-Abhängigkeit hinzufügen –

Verwandte Themen