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 ]

3 голосов
/ 13 декабря 2011

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

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

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

Удачи!

3 голосов
/ 21 июня 2013

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

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

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

3 голосов
/ 30 января 2013

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

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

2 голосов
/ 31 января 2011

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

РЕДАКТИРОВАТЬ: я только что видел эта страница , онопомнит меня, у меня уже была эта проблема при загрузке приложения из Android Market.Приложение запускалось при запуске, я пробовал много раз, но всегда заканчивал тем же результатом.Затем я попытался удалить приложение, переустановить его, и все работало нормально.Я все еще использую его сегодня, и проблема никогда не повторялась.

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

2 голосов
/ 14 декабря 2013

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

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

2 голосов
/ 22 июня 2012

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

2 голосов
/ 11 сентября 2012

Убедитесь, что ваш каталог / src указан в ваших проектах> свойства> путь сборки java> source

2 голосов
/ 05 февраля 2011

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

2 голосов
/ 21 декабря 2011

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

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

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

1 голос
/ 12 апреля 2012

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

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