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 ]

1 голос
/ 15 мая 2013

Я исправляю эту проблему, удаляя папки bin и gen и перестраивая проект.

1 голос
/ 28 сентября 2012

У меня просто была проблема с этим, поэтому я хочу рассказать, что вызвало проблему для меня.Я только что включил несколько новых библиотек, устанавливающих расширения APK.Библиотеки зависят друг от друга, и я включил только одну из них в мои библиотеки свойств> android>.

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

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

1 голос
/ 01 февраля 2011

Вы переименовали пакет в любое время?Обычно это происходит, если пакет был переименован после создания.Следующая ссылка должна быть полезной в этом случае http://code.google.com/p/android/issues/detail?id=2824. Если это не так, пожалуйста, опубликуйте свой полный файл манифеста.

1 голос
/ 13 июля 2012

У меня было 5 разных пакетов. И по какой-то причине компилятор искал активность в неправильном пакете.

Итак, я переключил свою активность и весь класс, который наследует активность, на пакет, в который она смотрела.

Я получил название пакета, который искал в начале logcat.

1 голос
/ 04 ноября 2011

У меня была такая же проблема в недавнем проекте Android. Проблема оказалась довольно простой, но ее было трудно найти. Это случилось со мной, затем я реорганизовал имя пакета активности точки входа приложения. Это создало конфликт с файлом gen /.../ R.java, поскольку пакет там не подвергался рефакторингу. Затмение не жаловалось, но во время выполнения я получил ту же ошибку, которую вы опубликовали: не удалось создать экземпляр ... classNotFoundException ...

Извлеченный из этого урок: делайте НЕ рефакторинг имени пакета, в котором содержится ваша основная деятельность!

Надеюсь, что это поможет вам или кому-то еще сломать голову над этой ошибкой!

1 голос
/ 01 ноября 2013

У меня была та же проблема, которую я решил, сняв флажок Зависимости Android от Проекта -> Свойства -> Путь к сборке Java -> Зависимости Android

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

Я не вижу ничего явно неправильного.Все, что я могу сказать, это попытаться протестировать его в максимально возможном количестве различных конфигураций.

Протестируйте его в эмуляторе для каждого возможного уровня SDK, следуйте инструкциям по тестированию на экранах разных размеров (хотя это не кажется вашей проблемой).

Попробуйте проверить его на телефоне от каждого из основных провайдеров, если вы можете найти друзей, у которых они есть: HTC Sense, Motoblur и т. Д.

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

0 голосов
/ 07 августа 2014

Удалить файлы папок BIN и GEN. Перестройте, все должно работать. Проверьте, есть ли еще одна ошибка ниже «неспособен создать экземпляр», иногда возникает другая ошибка (действие не может быть загружено из-за чего-либо, даже если его класс найден.

0 голосов
/ 13 августа 2014

Что мне нужно было сделать, это просто заново выполнить процесс сборки / экспорта без каких-либо изменений в коде. Это сработало для меня, что я сделал, чтобы экспортировать его два раза. В моем первом экспорте сборочный APK имеет меньший размер файла, а второй экспорт (без каких-либо изменений в коде / конфигурации) дал немного больший размер файла (около 200 КБ разности).

Эта ошибка в сборке очень дорога, убивает вас перед вашим менеджером, и должна быть исправлена ​​командой Android / Eclipse. Вид отстой

0 голосов
/ 29 апреля 2013

Я недавно приобрел новый планшет для разработки только с Android 4.0. У него не было внешней SD-карты. Демонстрационная программа, которую я запускал, зависала с той же ошибкой. В манифесте была такая же строка, запрашивающая разрешение SD:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

После установки внешней SD-карты проблема исчезла. Возможно, у человека нет SD-карты, и ваше программное обеспечение не обрабатывает ее должным образом. Моя демонстрационная программа не проверяет наличие SD-карты. Вот ссылка на стек, описывающая проблему:

Разработка Android - проверить SD-карту или предположить, что она есть?

Я понимаю, что опаздываю на вечеринку, но это может помочь кому-то еще.

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