2013-03-28 19 views
6

Ten błąd doprowadza mnie do szału. Moja aplikacja zawiesza się przy starcie, gdy pobrać z Google Play Store z błędem:java.lang.ClassNotFoundException w dalvik.system.BaseDexClassLoader.findClass

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

moja aplikacja nie awarii podczas kompilacji z zaćmienia na naszych dwóch urządzeń. Jednak miesiąc temu klient użył swojego telefonu do zbudowania naszej aplikacji, a następnie również się zawiesił przy starcie. Zignorowałem ten problem, ponieważ działało na naszych urządzeniach i domyśliło się, że ma to coś wspólnego z kluczami Map Google lub Keystore.

Teraz okazuje się, że nasza aplikacja ulega awarii na każdym urządzeniu pobranym ze Sklepu Play. Rozumiem, że nie ma łatwego sposobu rozwiązania tego problemu, ale doceniono by pchnięcie we właściwym kierunku.

Trudno jest również rozwiązać ten problem, ponieważ aplikacja działa świetnie, gdy kompiluje się z zaćmienia na naszych urządzeniach!

Oto pełna dziennika błędów, które zgłosiłem:

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 

Znowu nie wyjątkiem prostej odpowiedzi do przodu do tego problemu, ale może ktoś może rzucić nieco światła na ten problem dostarczonych z tym dzienniku błędów.

EDIT

Oto plik Manifest jeśli to pomocne:

<?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

dodał gadatliwy dziennika podczas instalowania aplikacji na urządzeniu

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

Czy jedna kompilacja używa ProGuard? Zastanawiam się, czy ProGuard usuwa kod, ponieważ uważa, że ​​jest nieużywany. – fadden

+0

Jeśli klasa istnieje (nie jest rozwinięta), to dalvik odrzuca klasę z jakiegoś powodu. W takim przypadku zobaczysz komunikaty o błędach od dalvik podczas instalacji aplikacji. – JesusFreke

+0

Dodałem dzienniki podczas instalowania aplikacji. Zajrzę teraz do ProGuarda. –

Odpowiedz

7

Tak naprawdę to ProGuard usunął kod z mojego projektu.Używam ActionBarSherlock i facebook i to dodałem więc to działa:

# 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 

to na Facebooku:

-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

Proponuję, abyś skupił się na różnicy między budową, którą tworzysz od zaćmienia, a budową, którą dostarczasz do Sklepu Play.

Jeśli możesz odtworzyć błąd, który widzisz z playstore, budując go za pomocą eclipse i testując go, na pewno znajdziesz odpowiedź.

To, co mogę wymyślić, to certyfikaty podpisywane przez aplikację, ale wydaje się, że tak nie jest. Jednak powinieneś pomyśleć więcej o tym, jaka jest różnica między tymi dwoma .apk - deweloperem i kompilacją dla playstore.

Jako że .apk są w zasadzie archiwami, można je rozpakować, zobaczyć różnice między nimi. Powinieneś użyć dedekstora, aby spróbować zdekompilować dwa wystąpienia klasy.dex (patrz decompiling DEX into Java sourcecode). Prawdopodobnie będzie to wysoce zaciemniony kod, ale powinieneś poszukać brakujących klas lub coś w tym stylu.

Mam nadzieję, że masz rację.

+0

dzięki za tę wskazówkę! Źle się z tym uporam, kiedy jestem w domu. –

0

prawym przyciskiem myszy na folderze projektu => Właściwości => Java Build Path => Zamów i eksportuj => zaznacz pole "Prywatne biblioteki Androida", jeśli nie jest zaznaczone. I to działa!

Powiązane problemy