2013-03-28 8 views
6

Questo errore mi sta facendo impazzire. La mia app si blocca all'avvio quando scaricato da Google Play Store con l'errore:java.lang.ClassNotFoundException in dalvik.system.BaseDexClassLoader.findClass

java.lang.ClassNotFoundException 
in dalvik.system.BaseDexClassLoader.findClass 

mia app non va in crash quando costruire da Eclipse sulle nostre due dispositivi. Tuttavia un mese fa un cliente usava il suo telefono per costruire la nostra app e poi si bloccava anche all'avvio. Ho ignorato il problema perché stava lavorando sui nostri dispositivi e ho pensato che avesse qualcosa a che fare con le chiavi di Google Maps o Keystore.

Ora la nostra app si blocca su tutti i dispositivi quando scaricati dal Play Store. Capisco che non esiste un modo semplice per risolvere questo problema, ma sarebbe gradita una spinta nella giusta direzione.

Inoltre, trovo difficile eseguire il debug di questo problema perché l'app funziona alla grande quando compilato da Eclipse sui nostri dispositivi!

Ecco il log di errore completo che ho riportato:

java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.denederlandsewateren.winkeloord/com.denederlandsewateren.views.StartScreenActivity}: java.lang.ClassNotFoundException: com.denederlandsewateren.views.StartScreenActivity 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2099) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2210) 
at android.app.ActivityThread.access$600(ActivityThread.java:142) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1208) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:4931) 
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:791) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558) 
at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.ClassNotFoundException: com.denederlandsewateren.views.StartScreenActivity 
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 android.app.Instrumentation.newActivity(Instrumentation.java:1053) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2090) 
... 11 more 

Ancora una volta I dont tranne una risposta dritto in avanti per questo problema, ma forse qualcuno può far luce su questo problema fornito con questo registro errori.

EDIT

Ecco il file manifesto, se questo è utile:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.xxxx.xxxxx" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <permission 
     android:name="com.xxxxx.xxxxx.MAPS_RECEIVE" 
     android:protectionLevel="signature" /> 
    <permission 
     android:name="com.xxxxx.xxxxx.permission.C2D_MESSAGE" 
     android:protectionLevel="signature" /> 

    <uses-permission android:name="my_app_package.permission.C2D_MESSAGE" /> 
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 
    <uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
    <uses-permission android:name="android.permission.WAKE_LOCK" /> 
    <uses-permission android:name="com.xxxxxx.xxxxx.MAPS_RECEIVE" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

    <uses-feature 
     android:glEsVersion="0x00020000" 
     android:required="true" /> 

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="17" /> 

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.CALL_PHONE" /> 
    <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
    <uses-permission android:name="android.permission.VIBRATE" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/app_icon" 
     android:label="@string/app_name" 
     android:theme="@style/Theme.Sherlock" > 
     <service android:name="com.xxxxxx.xxxxx.GCMIntentService" /> 

     <meta-data 
      android:name="com.google.android.maps.v2.API_KEY" 
      android:value="xxxxxxxx" /> 

     <receiver 
      android:name="com.google.android.gcm.GCMBroadcastReceiver" 
      android:permission="com.google.android.c2dm.permission.SEND" > 
      <intent-filter> 
       <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
       <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> 

       <category android:name="com.xxxxxx.xxxxxxx" /> 
      </intent-filter> 
     </receiver> 

     <activity 
      android:name="com.xxxxx.xxxxx.MainActivity" 
      android:label="@string/app_name" 
      android:screenOrientation="portrait"> 
      <!--<intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> --> 
     </activity> 

     <meta-data 
      android:name="com.facebook.sdk.ApplicationId" 
      android:value="@string/app_id" /> 

     <activity android:name="com.facebook.LoginActivity" > 
     </activity> 
     <activity 
      android:name="com.xxxxxx.xxxxxx.StartScreenActivity" 
      android:label="@string/app_name" 
      android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" 
      android:screenOrientation="portrait"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

EDIT

Aggiunto il registro dettagliato quando si installa l'applicazione sul dispositivo

03-30 17:56:28.554: D/dalvikvm(5150): GC_FOR_ALLOC freed 233K, 68% free 2639K/8195K, paused 13ms, total 13ms 
03-30 17:56:28.574: I/dalvikvm-heap(5150): Grow heap (frag case) to 26.682MB for 16777232-byte allocation 
03-30 17:56:28.594: D/dalvikvm(5150): GC_CONCURRENT freed <1K, 23% free 19022K/24647K, paused 2ms+9ms, total 21ms 
03-30 17:56:29.114: D/dalvikvm(5150): GC_FOR_ALLOC freed 0K, 23% free 19022K/24647K, paused 15ms, total 15ms 
03-30 17:56:29.129: I/dalvikvm-heap(5150): Grow heap (frag case) to 35.681MB for 9437200-byte allocation 
03-30 17:56:29.169: D/dalvikvm(5150): GC_CONCURRENT freed 0K, 17% free 28238K/33927K, paused 2ms+2ms, total 38ms 
03-30 17:56:29.254: D/libEGL(5150): loaded /system/lib/egl/libEGL_mali.so 
03-30 17:56:29.259: D/libEGL(5150): loaded /system/lib/egl/libGLESv1_CM_mali.so 
03-30 17:56:29.259: D/libEGL(5150): loaded /system/lib/egl/libGLESv2_mali.so 
03-30 17:56:29.284: D/OpenGLRenderer(5150): Enabling debug mode 0 
03-30 17:56:32.154: D/KEY(5150): UUID 
03-30 17:56:32.179: I/System.out(5150): UUID: xxxxxxxxxxxxxx 
03-30 17:56:32.179: E/SerializeObject(5150): FileNot Found in ReadSettings filename = xxxxx.dat 
03-30 17:56:32.184: D/GCMRegistrar(5150): resetting backoff for com.xxxxx.xxxxx 
03-30 17:56:32.214: V/GCMRegistrar(5150): Registering app com.xxxxx.xxxxx of senders 752727514714 
03-30 17:56:32.214: D/KEY(5150): pushEnabled 
03-30 17:56:32.324: V/SlidingMenu(5150): setting padding! 
03-30 17:56:32.394: W/AllCapsTransformationMethod(5150): Caller did not enable length changes; not transforming text 
03-30 17:56:32.394: W/AllCapsTransformationMethod(5150): Caller did not enable length changes; not transforming text 
03-30 17:56:32.394: W/AllCapsTransformationMethod(5150): Caller did not enable length changes; not transforming text 
03-30 17:56:32.409: W/AllCapsTransformationMethod(5150): Caller did not enable length changes; not transforming text 
03-30 17:56:32.414: W/AllCapsTransformationMethod(5150): Caller did not enable length changes; not transforming text 
03-30 17:56:32.414: W/AllCapsTransformationMethod(5150): Caller did not enable length changes; not transforming text 
03-30 17:56:32.424: W/AllCapsTransformationMethod(5150): Caller did not enable length changes; not transforming text 
03-30 17:56:32.424: W/AllCapsTransformationMethod(5150): Caller did not enable length changes; not transforming text 
03-30 17:56:32.429: W/AllCapsTransformationMethod(5150): Caller did not enable length changes; not transforming text 
03-30 17:56:32.434: W/AllCapsTransformationMethod(5150): Caller did not enable length changes; not transforming text 
03-30 17:56:32.434: W/AllCapsTransformationMethod(5150): Caller did not enable length changes; not transforming text 
03-30 17:56:32.434: W/AllCapsTransformationMethod(5150): Caller did not enable length changes; not transforming text 
03-30 17:56:32.459: V/CustomViewBehind(5150): behind INVISIBLE 
03-30 17:56:36.894: D/dalvikvm(5150): GC_CONCURRENT freed 20031K, 58% free 15574K/36551K, paused 4ms+7ms, total 49ms 
03-30 17:56:36.894: D/dalvikvm(5150): WAIT_FOR_CONCURRENT_GC blocked 31ms 
03-30 17:56:37.504: I/System.out(5150): VaarApp ID: 5 
03-30 17:56:37.534: I/Choreographer(5150): Skipped 122 frames! The application may be doing too much work on its main thread. 
03-30 17:56:37.539: V/GCMBroadcastReceiver(5150): onReceive: com.google.android.c2dm.intent.REGISTRATION 
03-30 17:56:37.544: V/GCMBroadcastReceiver(5150): GCM IntentService class: com.xxxxx.xxxxx.GCMIntentService 
03-30 17:56:37.549: V/GCMBaseIntentService(5150): Acquiring wakelock 
03-30 17:56:37.794: V/GCMBaseIntentService(5150): Intent service name: GCMIntentService-DynamicSenderIds-1 
03-30 17:56:37.794: E/GCMRegistrar(5150): internal error: retry receiver class not set yet 
03-30 17:56:37.794: V/GCMRegistrar(5150): Registering receiver 
03-30 17:56:37.799: D/GCMBaseIntentService(5150): handleRegistration: registrationId = xxxxxxxxx-xxxxxxxx-xxxxxxxx-xxxxxx-xxxxx-xxxx, error = null, unregistered = null 
03-30 17:56:37.799: D/GCMRegistrar(5150): resetting backoff for com.xxxxx.xxxxx 
03-30 17:56:37.799: V/GCMRegistrar(5150): Saving regId on app version 1 
03-30 17:56:37.829: V/GCMBaseIntentService(5150): Releasing wakelock 
03-30 17:56:39.169: D/dalvikvm(5150): GC_CONCURRENT freed 2248K, 52% free 17830K/36551K, paused 6ms+12ms, total 95ms 
03-30 17:56:39.169: D/dalvikvm(5150): WAIT_FOR_CONCURRENT_GC blocked 12ms 
03-30 17:56:39.174: D/dalvikvm(5150): WAIT_FOR_CONCURRENT_GC blocked 48ms 
03-30 17:56:41.164: I/dalvikvm(5150): Jit: resizing JitTable from 4096 to 8192 
03-30 17:56:42.229: D/dalvikvm(5150): GC_CONCURRENT freed 4265K, 49% free 18778K/36551K, paused 3ms+6ms, total 58ms 
03-30 17:56:42.229: D/dalvikvm(5150): WAIT_FOR_CONCURRENT_GC blocked 41ms 
03-30 17:56:42.234: D/dalvikvm(5150): WAIT_FOR_CONCURRENT_GC blocked 46ms 
03-30 17:57:51.759: D/dalvikvm(5150): GC_CONCURRENT freed 5476K, 49% free 18775K/36551K, paused 21ms+6ms, total 196ms 
+2

Una build utilizza ProGuard? Mi chiedo se ProGuard stia estraendo il codice perché pensa che non sia utilizzato. – fadden

+0

Se la classe esiste (non è precostituita), è possibile che dalvik stia rifiutando la classe per qualche motivo. Se questo è il caso, vedrai alcuni messaggi di errore da Dalvik quando stai installando l'app. – JesusFreke

+0

Ho aggiunto i log durante l'installazione della mia app. Guarderà ProGuard in questo momento. –

risposta

7

Quindi è stato davvero ProGuard a strappare il codice dal mio progetto.Io uso ActionBarSherlock e facebook e questo è ciò che ho aggiunto in modo che avrebbe funzionato:

# ActionBarSherlock 

-keep class android.support.** { *; } 

-keep interface android.support.** { *; } 

-keep class com.actionbarsherlock.** { *; } 

-keep interface com.actionbarsherlock.** { *; } 




# Keep line numbers to alleviate debugging stack traces 

-renamesourcefileattribute SourceFile 

-keepattributes SourceFile,LineNumberTable 

Questo per Facebook:

-keepclassmembers class * implements java.io.Serializable 
{ 
    private static final java.io.ObjectStreamField[] serialPersistentFields; 
    private void writeObject(java.io.ObjectOutputStream); 
    private void readObject(java.io.ObjectInputStream); 
    java.lang.Object writeReplace(); 
    java.lang.Object readResolve(); 
} 
0

Bene, ti suggerisco di concentrarti sulla differenza tra la build che stai facendo da Eclipse e la build che stai fornendo al Play Store.

Se riesci a riprodurre l'errore che vedi dal PlayStation, mentre lo crei con Eclipse e lo collaudi, troverai sicuramente la risposta.

Quello che posso pensare sono i certificati che l'app viene firmata, ma non sembra essere così. Tuttavia dovresti pensare di più alla differenza tra i due .apk: la build per sviluppatori e la build per playstore.

Come .apk sono fondamentalmente archivi, è possibile decomprimerli entrambi, vedere le differenze tra di loro. È necessario utilizzare un dedexer per provare e decompilare le due istanze di classes.dex (vedere decompiling DEX into Java sourcecode). Probabilmente sarà un codice altamente offuscato, ma dovresti cercare classi mancanti o qualcosa del genere.

Spero che tu abbia capito bene.

+0

grazie per questo suggerimento! A questo punto verrò a posto quando sono a casa. –

0

Fai clic destro sulla cartella del progetto => Proprietà => Java Build Path => Ordine ed esportazione => seleziona la casella "Librerie private Android" se non selezionata. E funziona!