Android: невозможно создать экземпляр активности/ClassNotFoundException

Недавно я опубликовал приложение на рынок, и теперь я получаю сообщение от пользователя, приложение, похоже, сработает сразу после его запуска. К сожалению, я не могу связаться с ним напрямую, и приложение отлично работает в эмуляторе, а также на моем телефоне (и на некоторых телефонах друзей).
EDIT: Я думаю, что это случается с несколькими пользователями, так как я получил комментарии на рынке, например," сбой при запуске "или" не работает". Я получил только один стек, но нет информации о конфигурации, устройстве, версии 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);

EDIT: Это (почти) complete 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>

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

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

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

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

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

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

Спасибо, Select0r

Ответ 1

С момента обновления ADT до версии 22 (май 2013 г.) вы должны установить флажок "Частные библиотеки Android" в Project → Properties → Java Build Path → Order and Export in Eclipse для ваших старых проектов, чтобы избавиться от этого исключение...

Ответ 2

Я решил эти проблемы, выбрав: Project- > properties- > order and export

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

Ответ 3

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

  • Устройство: HTC Desire HD (Android 2.2)
  • Старая SDHC-карта: SanDisk 8GB class 4
  • Новая карта SDHC: Kingston 16GB class 4

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

Также смотрите: http://android-developers.blogspot.com/2010/07/apps-on-sd-card-details.html

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

Это кажется неправильным.

Ответ 4

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

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

Ответ 5

Это не относится к вопросу OP, но это было сделано для моего, и мне потребовалось некоторое время, чтобы понять это: при использовании 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>

Ответ 6

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

Ответ 7

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

  • Я создал проект с пакетом под названием "myapp.sound", содержащим эту активность. Программа работает нормально;
  • Я переименовал этот пакет, назвав его "app.soundapp", и программа по-прежнему выполнялась нормально.

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

Ответ 8

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

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

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

Ответ 9

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

Ответ 10

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

Ответ 11

Я столкнулся с этой проблемой, когда я включил java Projects в мой путь сборки для моего проекта Android, ориентированного на JavaSE-1.7.

По какой-то причине мой эмулятор не выбрал класс, который не найден, если проект java, который он включал, был первоначально создан с таргетингом на JavaSE-1.6. Eclipse предоставит мне предупреждение "Путь сборки указывает среду выполнения JavaSE-1.6. В рабочей области нет JRE, которые строго совместимы с этой средой". Но эмулятор Android запустится, и я не получу classnotfoundexception

Итак, если вы включаете проекты, нацеленные на JavaSE-1.7, переделайте их с таргетингом на JavaSE-1.6, и это может решить вашу проблему.

Удачи!

Ответ 12

Подобно Bobf Cali, я впервые увидел эту ошибку после переименования моего базового пакета, чтобы изменить раздел "пример". Чтобы исправить это, мне пришлось удалить мои каталоги gen и bin, очистить проект и перестроить.

Обратите внимание, что в зависимости от версии используемого вами плагина eclipse android (если есть) вам также может потребоваться обновить названия активности в вашем AndroidManifest.xml

Ответ 13

Высказывал одно и то же сообщение об ошибке после простого обновления моего приложения. Исправлено:

Project->Build automatically OFF
Project->Clean->Selcting my project

Затем я сделал новый экспорт моего подписанного приложения, и он сработал.

Ответ 14

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

EDIT: Я только что увидел эту страницу, он помнит меня, что у меня уже была эта проблема при загрузке приложения с Android-рынка. Приложение разбилось при запуске, я много раз пробовал, но я всегда заканчивал тем же результатом. Затем я попытался удалить приложение, переустановить его, и все работает нормально. Я все еще использую его сегодня, и проблема больше не повторялась.

В моей ссылке вы также можете увидеть, что они воспроизвели вашу ошибку, сделав приложение недоступным (unmount SD), поэтому это определенно не проблема с вашим кодом.

Ответ 15

Ознакомьтесь с этой статьей: http://www.androidguys.com/2010/05/22/storing-apps-sd-froyo/, которая объясняет ограничения хранения приложений на SD-картах. Если ваши пользователи имеют карту SD, установленную компьютером, это может сделать класс SoundMachine невидимым. И мне интересно, не сработает ли команда cp (попытка perja исправить), потому что это может изменить право собственности на файлы, так что пользовательский интерфейс приложения и права собственности на файлы больше не соответствуют.

Ответ 16

Я решил это и смог найти причины: - Манифест будет испорчен. Даже если структура пакета правильная, и все данные были записаны правильно, активность не будет найдена. -R будет в структуре пакета, которая была сначала объявлена ​​перед переименованием. -Программы запуска настраиваются с неправильным пакетом R. Таким образом, активность не может быть найдена.

Что мы пробовали: -Управление редактированием исполняемых файлов через экспорт/импорт -Разное переименование структуры пакета -Разное переименование структуры R-пакета -Удаление run-config (он будет восстановлен, если вы попытаетесь запустить приложение)

Решение: Попробуйте настроить новый проект без повторного использования манифеста. Я попытался снова использовать его и снова получил те же проблемы. Поэтому после того, как основная причина должна быть коррупционным манифестом. Надеюсь, это поможет!

Ответ 17

Возможно, слишком поздно решить вашу проблему, но, надеюсь, это поможет кому-то другому.
У меня была аналогичная проблема, и после многих попыток я решил удалить R.java.
Это сделал трюк.

Ответ 18

Убедитесь, что ваш /src dir указан в ваших проектах > properties > java build path > source

Ответ 19

Эта ошибка также может возникнуть, если вы (на уровне проекта) неправильно Импортируете > Android > Существующий код Android в рабочее пространство через Eclipse. В моем случае это привело к пустой папке "src", но затем я заметил новую папку, начиная с "java" в корне и продолжая путь пакета (то есть com/zyzcorp/...), что привело к MainActivity. java файл.

Чтобы проверить, что я думаю, может решить проблему, я скопировал файл com. *. MainActivity.java в папку src, обновил, очистил и перезапустил Eclipse. Я смог создать и запустить приложение на целевом устройстве.

Ответ 20

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

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

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

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

Ответ 21

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

Ответ 22

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

Урок, извлеченный из этого: do NOT реорганизовать имя пакета, которое содержит ваше основное действие!

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

Ответ 23

У меня та же проблема, но это исправлено. В моем androidmanifest.xml у меня была эта строка под названием android: name = myappnameActivity. Хотя мое имя класса было просто myappname. Поэтому я снял часть Activity в XML файле, и все было в порядке.

Ответ 24

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

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

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

Ответ 25

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

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

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

Ответ 26

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

Ответ 27

У меня была такая же проблема Я решил это снимите флажки Android Dependencies из Project → Properties → Java builder Path → android dependencies

Ответ 28

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

Ответ 29

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

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

Ответ 30

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

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

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

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

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