2013-08-08 7 views
0

Я разрабатываю приложение, которое должно поддерживать несколько версий sdk для Android. Он использует библиотеку ActionBarSherlock и скользящее меню. В Android 4.0+ приложение работает хорошо. Но когда я пытаюсь запустить его на всех устройствах с более низкой версией sdk, приложение вылетает со странной ошибкой. Вот трассировки стека:java.lang.NoClassDefFoundError: android

08-08 11:54:11.626: ERROR/dalvikvm(4782): Could not find class 'ru.arsenalmedia.AvatatorActivity', referenced from method ru.arsenalmedia.Auth.complete 
08-08 11:54:11.646: ERROR/dalvikvm(4782): Could not find class 'ru.arsenalmedia.AvatatorActivity', referenced from method ru.arsenalmedia.Auth.onActivityResult 
08-08 11:54:11.696: ERROR/ResourceType(4782): Style contains key with bad entry: 0x010102ce 
08-08 11:54:12.346: ERROR/dalvikvm(4782): Could not find class 'android.os.StrictMode$ThreadPolicy$Builder', referenced from method ru.arsenalmedia.proto.Utils.enableStrictMode 
08-08 11:54:18.346: ERROR/AndroidRuntime(4782): FATAL EXCEPTION: main 
     java.lang.NoClassDefFoundError: ru.arsenalmedia.AvatatorActivity 
     at ru.arsenalmedia.Auth.complete(Auth.java:119) 
     at ru.arsenalmedia.proto.ServiceWorker$ClientRequest$2.handleMessage(ServiceWorker.java:951) 
     at android.os.Handler.dispatchMessage(Handler.java:99) 
     at android.os.Looper.loop(Looper.java:143) 
     at android.app.ActivityThread.main(ActivityThread.java:4914) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:521) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
     at dalvik.system.NativeStart.main(Native Method) 

Manifest:

<uses-sdk 
      android:minSdkVersion="8" 
      android:maxSdkVersion="17" 
      /> 
<application android:icon="@drawable/icon" 
      android:label="@string/app_name" 
      android:name="ru.arsenalmedia.Avatator" 
      android:theme="@style/actionBarStyle" 
     > 
    <activity 
      android:screenOrientation="portrait" 
      android:name="ru.arsenalmedia.Auth" 
      android:label="@string/app_name" 
      android:clearTaskOnLaunch="true"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity 
      android:label="@string/app_name" 
      android:name="ru.arsenalmedia.AvatatorActivity" 
      android:screenOrientation="portrait" 
      > 
    </activity> 
    <activity android:name="ru.arsenalmedia.SlidingPanelActivity" /> 
    <activity android:name="ru.arsenalmedia.TestAct"/> 

</application> 

Я подумал, что это из-за скользящего меню. Я попытался использовать родной SlidingPaneLayout, но проблема такая же. Я много читал об этом, и ничего действительно не помогает. Пожалуйста помоги !!!

import android.app.AlertDialog; 
import android.content.DialogInterface; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.EditText; 
import android.widget.SearchView; 
import android.widget.TextView; 
import android.widget.Toast; 
import com.actionbarsherlock.view.Menu; 
import com.actionbarsherlock.view.MenuInflater; 
import com.actionbarsherlock.view.MenuItem; 
import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu; 
import com.jeremyfeinstein.slidingmenu.lib.app.SlidingFragmentActivity; 
import ru.arsenalmedia.avatator.R; 
import ru.arsenalmedia.proto.ContactInfo; 
import ru.arsenalmedia.proto.GroupInfo; 
import ru.arsenalmedia.proto.ServiceWorker; 

public class AvatatorActivity extends SlidingFragmentActivity implements SearchView.OnQueryTextListener, MenuItem.OnActionExpandListener { 

    private static final String TAG = "AvatatorActivity"; 
    protected Fragment mFragment; 
    private SearchView searchView; 

    private Menu menu; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setTitle(R.string.app_name); 
     actionBarInit(); 

     // set the Above View 
     if (savedInstanceState != null) 
      mFragment = getSupportFragmentManager().getFragment(savedInstanceState, "mFragment"); 
     if (mFragment == null) 
      mFragment = new GroupsList(); 
     //searchView = (EditText) findViewById(R.layout.contact_search_edittext); 

     setContentView(R.layout.content_frame); 
     getSupportFragmentManager() 
       .beginTransaction() 
       .replace(R.id.content_frame, mFragment) 
       .commit(); 

     // set the Behind View 
     setBehindContentView(R.layout.menu_frame); 
     getSupportFragmentManager() 
       .beginTransaction() 
       .replace(R.id.menu_frame, new AppMenuFragment()) 
       .commit(); 

     customizeSlidingMenu(); 
     //updateMenuTitles(); 
     invalidateOptionsMenu(); 
    } 

    private void actionBarInit() { 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     getSupportActionBar().setHomeButtonEnabled(true); 
     setSlidingActionBarEnabled(false); 
    } 

    private void customizeSlidingMenu() { 
     SlidingMenu sm = getSlidingMenu(); 
     sm.setShadowWidthRes(R.dimen.shadow_width); 
     sm.setShadowDrawable(R.drawable.shadow); 
     sm.setBehindOffsetRes(R.dimen.slidingmenu_offset); 
     sm.setFadeDegree(0.35f); 
     sm.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN); 
     sm.setBackgroundResource(R.drawable.sliding_menu_selector); 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     getSupportFragmentManager().putFragment(outState, "mFragment", mFragment); 
    } 

    public void switchContent(Fragment fragment) { 
     Log.d(TAG, "SWITCH CONTENT"); 
     mFragment = fragment; 
     getSupportFragmentManager() 
       .beginTransaction() 
       .replace(R.id.content_frame, fragment) 
       .commit(); 
     //updateMenuTitles(); 
     invalidateOptionsMenu(); 
     getSlidingMenu().showContent(); 
    } 
+1

Кажется, что с этим 'java.lang.NoClassDefFoundError: ru.arsenalmedia.AvatatorActivity', вы используете обфускацию кода или что-то в этом роде? – Tonithy

+0

Нет, сэр, ничего подобного. – PAcan

ответ

1

StrictMode был введен в уровне API 9 (версия 2.3), так что старые версии вы тестирование на не должны быть в состоянии назвать его ...

08-08 11:54:12.346: ERROR/dalvikvm(4782): Could not find class 'android.os.StrictMode$ThreadPolicy$Builder', referenced from method ru.arsenalmedia.proto.Utils.enableStrictMode 

Когда вы звоните своим Utils. enableStrictMode(), вы должны сначала проверить, работает ли пользовательское устройство версии, имеющей доступ к StrictMode.

EDIT: Something like this также может вызывать проблемы; с помощью атрибутов XML, которые не существовали в более старых платформах в вашем styles.xml, в этой строке:

08-08 11:54:11.696: ERROR/ResourceType(4782): Style contains key with bad entry: 0x010102ce 

Это еще не объясняет ваш NoClassDefFoundError

+0

Строгий режим в приложении никогда не используется. Так что это даже не работает. Я подумал, что это проблема, но я прокомментировал метод и выяснил, что это не так. Спасибо за быстрый ответ. – PAcan

+1

@PAcan Hmm ... Это сильно изменило трассировку стека? – Tonithy

+0

Нет :)) трассировка стека такая же, но эта строка исчезла: 08-08 11: 54: 12.346: ERROR/dalvikvm (4782): Не удалось найти класс 'android.os.StrictMode $ ThreadPolicy $ Builder', ссылка от метода ru.arsenalmedia.proto.Utils.enableStrictMode – PAcan

1

Это довольно неуловимая проблема. Вы упомянули, что он работает на Android 4.0+, и это вызывает тревогу, что вы можете использовать что-то, что не поддерживается в старых версиях Android.

Но прежде всего, если вы используете Eclipse, вы должны обновить свой проект и выполнить чистую сборку. Иногда у Eclipse возникают проблемы с заменой изменений AndroidManifest, и вы можете загружать более старую версию на свой эмулятор/устройство.

Если это все еще не удается, возможно, вы импортируете что-то, не поддерживаемое в старых API, или, возможно, класс AvatatorActivity расширяет то, что доступно только в новых API. Можете ли вы опубликовать какой-то код для вашей AvatatorActivity (а именно, импорта и того, что AvatatorActivity расширяет)?

Это также поможет узнать, что вы настроили для Android: minSdkVersion и android: targetSdkVersion.

======== ======== EDIT

Спасибо за размещение кода. Функция SlidingFragmentActivity очень подозрительна, и, скорее всего, эта библиотека отсутствует. Самый простой способ отладить это - сохранить копию текущего AvatatorActivity.java и заменить ее следующим, чтобы увидеть, можете ли вы запустить эту активность.

public class AvatatorActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setTitle(R.string.app_name); 
    } 
} 

Если запускается эта голое действие, возникает проблема с установкой SlidingMenu.

+0

Я использую идею itellij. Я собираюсь опубликовать код. – PAcan

2

Вы используете плагин eclipse adt? если это так, просто щелкните правой кнопкой мыши project-> properties-> Java Build apth -> Order and export, затем установите флажки Android Dependencies.enter image description here

EDIT: Как вы используете Intellij, вы проверили, импортировали ли вы библиотеку SlidingMenu в качестве модуля? enter image description here

пс. , Я использую Android studio & Maven, я думаю, вы можете просто импортировать проект в качестве библиотеки, если вы не используете maven.

+0

Нет, я используя itellij Idea. Спасибо за ответ – PAcan

+0

Да, точно. Вы можете сделать это вот так, но я импортировал весь исходный код в свой проект. – PAcan

+1

Попробуйте использовать targetSdkVersion вместо maxSdkVersion и измените стиль на android: theme = "@ style/Theme.Sherlock". Насколько мне известно, андроид-sdk добавляет панель действий в 4.x, ActionBarsherlock помогает нам реализовать панель действий в android, версия которой ниже 4.x. – Weibo

0

Спасибо всем, я нашел решение. Это проблема с SearchView. Вы должны использовать один из ActionBarSherlock или SupportLibrary

Смежные вопросы