Android: невозможно создать экземпляр активности / ClassNotFoundException - PullRequest
68 голосов
/ 27 января 2011

Я недавно опубликовал приложение на рынке, и теперь я получаю сообщение об ошибке от какого-то пользователя, которое, по-видимому, вылетает при запуске.К сожалению, я не могу связаться с ним напрямую, и приложение отлично работает в эмуляторе, а также на моем телефоне (и на телефонах некоторых друзей).РЕДАКТИРОВАТЬ: я думаю, что это происходит с более чем одним пользователем, когда я получил комментарии на рынке, такие как «сбой при запуске» или «не работает».Я получил только одну стековую трассировку, но нет информации о конфигурации, устройстве, версии Android и т. Д.

Приложение представляет собой простую звуковую панель, поэтому на самом деле в ней нет магии, но я не могу понять, почему она выходит из строяна некоторых телефонах.Вот трассировка стека, которую я получаю, надеюсь, кто-нибудь может мне помочь:

java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.my.app/com.my.app.SoundMachine}: java.lang.ClassNotFoundException: com.my.app.SoundMachine in loader dalvik.system.PathClassLoader[/mnt/asec/com.my.app-1/pkg.apk]
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2585)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
at android.app.ActivityThread.access$2300(ActivityThread.java:125)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4627)
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:876)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:634)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassNotFoundException: com.my.app.SoundMachine in loader dalvik.system.PathClassLoader[/mnt/asec/com.my.app-1/pkg.apk]
at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243)
at java.lang.ClassLoader.loadClass(ClassLoader.java:573)
at java.lang.ClassLoader.loadClass(ClassLoader.java:532)
at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2577)
... 11 more

Это первые несколько строк из моей деятельности:

public class SoundMachine extends Activity {
  private SoundManager mSoundManager;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

РЕДАКТИРОВАТЬ: Это(почти) завершено onCreate:

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mSoundManager = new SoundManager();
    mSoundManager.initSounds(getBaseContext());

    int counter = 0;
    for (Integer soundFile : soundFiles) {
      counter++;
      mSoundManager.addSound(counter, soundFile);
    }

    ImageButton SoundButton1 = (ImageButton) findViewById(R.id.sound1);
    SoundButton1.setOnClickListener(new OnClickListener() {
      public void onClick(View v) {
        mSoundManager.playSound(1);
      }
    });
    SoundButton1.setOnLongClickListener(new OnLongClickListener() {
      public boolean onLongClick(View v) {
        saveSoundChoice(soundFiles[0], soundNames[0]);
        return true;
      }
    });

(...more of this...)

    Button StopButton = (Button) findViewById(R.id.stopbutton);
    StopButton.setOnClickListener(new OnClickListener() {
      public void onClick(View v) {
        mSoundManager.stopAll();
      }
    });
  }

И вот мой манифест:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.my.app" android:installLocation="preferExternal"
    android:versionCode="9" android:versionName="1.2">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".SoundMachine" 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>
    </application>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-sdk android:minSdkVersion="3" android:targetSdkVersion="8" />
</manifest>

Так что все возможные ошибки, о которых я уже читал здесь и на некоторых форумах, не относятся к моему приложению.

  • Активность присутствует в манифесте.
  • Супер-метод вызывается в переопределенном методе.
  • ContentView устанавливается перед доступом к элементам вview.

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

Некоторые вопросы:

  • Нужна ли мне часть "намерение" в манифесте?Eclipse создал его, когда я создал проект. (Да, согласно Майре)
  • Должен ли супер-метод вызываться там, где он есть? (Да, согласно Майре)

РЕДАКТИРОВАТЬ: Основной вопрос, который остается сейчас: почему путь в PathClassLoader отличается от моего имени пакета?Похоже, что страница Джона Дж. Смита имеет дело с той же проблемой, но я не понимаю, какое исправление там было применено.

Спасибо, Select0r

Ответы [ 30 ]

38 голосов
/ 04 июня 2013

После обновления ADT до версии 22 (май 2013 г.) вам необходимо установить флажок «Частные библиотеки Android» в Проект -> Свойства -> Путь сборки Java -> Порядок и экспорт в Eclipse для ваших старых версий.проекты, чтобы избавиться от этого исключения ...

38 голосов
/ 31 мая 2012

Я решил эту проблему, выбрав: Проект-> Свойства-> Порядок и экспорт

выбрать все внешние файлы JAR.почисти и построй его решил вопрос

20 голосов
/ 03 февраля 2011

Я только что получил ту же ошибку (Невозможно создать экземпляр активности ...) с Opera Mini.Opera Mini была на SD-карте (перенесена на SD-карту в настройках приложения).Кажется, ошибка связана с тем, что я вчера поменял карту SD.Устройство было выключено, я скопировал все данные со старой карты на новую (с помощью команды cp -a), затем вставил новую карту и снова запустил устройство.Кажется, все работает, как ожидалось, но теперь я вижу, что все приложения на SD-карте вылетают с одинаковой ошибкой.

  • Устройство: HTC Desire HD (Android 2.2)
  • Старый SDHCкарта: SanDisk 8 ГБ класса 4
  • Новая карта SDHC: Kingston 16 ГБ класса 4

Так что я бы сказал, что это ошибка Android, а не то, что может быть исправлено разработчиками приложений.

См. Также: http://android -developers.blogspot.com / 2010/07 / apps-on-sd-card-details.html

Всегда был случай, когда вы меняете карты SD на устройстве Android, если вы физически копируете содержимое старой карты на новую, система будет использовать данные на новой карте, как будто ничего не изменилось.Это также относится к приложениям, которые были установлены на SD-карте. "

Кажется, это неправильно.

7 голосов
/ 23 мая 2011

Это случилось со мной, когда я произвел рефакторинг одного из имен своих пакетов, и инструмент рефакторинга удалил ведущую "." от всех моих имен деятельности. поэтому в AndroidManifest.xml мне нужно было изменить android: name = "MyActivity" на android: name = ". MyActivity"

надеюсь, это кому-нибудь поможет, я просто потратил кучу времени на

6 голосов
/ 12 октября 2011

Это не относится к вопросу ОП, но к моему, и мне потребовалось довольно много времени, чтобы понять это: при использовании API Карт Google убедитесь, что вы включили объявление библиотеки в манифест приложения.

Например:

public class MyActivity extends MapActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    protected boolean isRouteDisplayed() {
        return false;
    }

}

В AndroidManifest.xml:

<application>
    <uses-library android:name="com.google.android.maps" />
    <activity android:name="MyActivity" android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>
4 голосов
/ 08 мая 2012

У меня была такая же проблема с вами, и после нескольких часов поиска я обнаружил кое-что интересное. Я постараюсь раскрыть это как можно более четко:

  • Я создал проект с пакетом «myapp.sound», содержащим действие. Программа работала нормально;
  • Я переименовал этот пакет, назвав его «app.soundapp», и программа все еще работала нормально.

Однако в файле manifest.xml программы было что-то странное: имя пакета было старым «myapp.sound». Я изменил манифест с правильным новым именем, и с этого момента произошла наша ошибка. Я не знаю почему, но кажется, что «средство изменения имени пакета» в Eclipse не обновляет все зависимости. Если это не является строго необходимым, не переименовывайте пакет, содержащий активность. Возможно, чтобы решить вашу проблему, вы должны создать новый проект и скопировать в него весь свой Java-класс.

4 голосов
/ 27 января 2011

Я не знаю, почему путь в PathClassLoader отличается от имени вашего пакета, но при тестировании на эмуляторе попробуйте принудительно закрыть его, а затем снова запустите, согласно этой ссылке

4 голосов
/ 21 сентября 2012

Посмотрите на пакет, определенный в верхней части файла манифеста, и убедитесь, что он соответствует пакету, в котором определен ваш класс.

Моя проблема заключалась в том, что у меня не было совпадающих имен пакетов.

Также добавьте, что у вас есть папка с именем «libs» и «s».Поместите все jar-файлы, которые вы добавили в него, и добавьте путь сборки.

3 голосов
/ 16 ноября 2011

Эта проблема может существовать, когда вы изменяете имя вашего класса и обновляете файл манифеста, а файл манифеста не обновляется в эмуляторе.Попробуйте удалить приложение из эмулятора, а затем переустановить его.Это будет работать.

3 голосов
/ 04 августа 2011

Эта проблема также может возникнуть, если в вашем классе активности есть конструктор с одним или несколькими параметрами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...