Android - java.lang.VerifyError в SDK 2.2

Я недавно запустил свое приложение на Маркет и связался с пользователем, который сообщает, что когда он запускает мое приложение, оно отображает диалоговое окно Force Close/Report. Я попросил пользователя сообщить об ошибке, чтобы я мог видеть трассировку стека того, что происходит, и я получаю java.lang.VerifyError.

Из того, что я прочитал, это связано либо с внешней библиотекой, либо с несовместимостью некоторых методов в java.lang с целевой версией Android SDK.

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

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

Вот трассировка стека:

java.lang.VerifyError: com.app.myapp.MainActivity
at java.lang.Class.newInstanceImpl(Native Method)
at java.lang.Class.newInstance(Class.java:1429)
at android.app.Instrumentation.newActivity(Instrumentation.java:1034)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2749)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2866)
at android.app.ActivityThread.access$2300(ActivityThread.java:140)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2181)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:143)
at android.app.ActivityThread.main(ActivityThread.java:5097)
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:868)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
at dalvik.system.NativeStart.main(Native Method)

Заранее спасибо!

РЕДАКТИРОВАТЬ
Добавлено по запросу Константина

MainActivity.java

package com.app.myapp;

//Imports removed

public class MainActivity extends BaseActivity implements Runnable {

private LayoutInflater mInflater;
private SharedPreferences prefs;
private SharedPreferences.Editor prefsEditor;

    ....

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

private void loadActivity(Bundle savedInstanceState) {
    setContentView(R.layout.mainlayout);

    ActionBar actionBar = (ActionBar)findViewById(R.id.actionbar);
    actionBar.setTitle("My App");
    actionBar.setHomeAction(new IntentAction(this, null, R.drawable.ic_actionbar_home));
    actionBar.addAction(new SearchAction(this, R.drawable.ic_actionbar_search));

    weatherThread = new Thread(this);
    try {
        ....Unrelated Code....

        //****HERE WAS THE PROBLEM****//
        Gson gson = new Gson();

        ....More Unrelated Code....
    } catch (JsonSyntaxException ex) { }

    initMembers();
    initControls();

    if (savedInstanceState != null) {
        mSelectedLayout = savedInstanceState.getInt("CURRENT_TAB");
        setCurrentTab();
    }
    else
        loadMainLayout();
}

    ....Other unrelated code....

}

4 ответа

Решение

Есть несколько устройств, которые используют GSON внутри, но сделали библиотеку общедоступной, что вызвало конфликт пространства имен, когда приложение пытается сослаться на свою упакованную версию gson. Возможный обходной путь - изменение пространства имен json-фляги, которую вы включили, используя jarjar.

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

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

Ref - Причины получения java.lang.VerifyError

Похоже, что ActionBar был выпущен только с уровня API 11, в то время как Android 2.2 несколько старше (уровень API 8). Так что попробуйте без панели действий. Я не знаю, был ли вид перенесен на платформу 2.2, но даже если это так, у вашего пользователя все еще может быть старая версия 2.2.

Убедитесь, что вы используете правильную версию Android SDK. Что такое minSDK в вашем AndroidManifest.xml?

Другие вопросы по тегам