Я выпустил версию своего приложения в Google Play и проснулся сегодня утром с рядом недовольных клиентов. Последняя версия приложения объединяет поддержку монитора частоты сердечных сокращений Bluetooth Low Energy (BTLE).java.lang.NoClassDefFoundError для старых версий SDK для Android
Приложение отлично работает на Android 4.3 и 4.4, но выходит из строя на 4.0, 4.1 и 4.2 со следующей ошибкой.
FATAL EXCEPTION: main
java.lang.NoClassDefFoundError: com.eiref.boatcoach.MainActivity
at com.eiref.boatcoach.WhatToDo.onClick(WhatToDo.java:274)
at android.view.View.performClick(View.java:4204)
at android.view.View$PerformClick.run(View.java:17355)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:152)
at android.app.ActivityThread.main(ActivityThread.java:5132)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
at dalvik.system.NativeStart.main(Native Method)
Ошибка возникает при создании Intent в простом OnClick, подобное следующему ...
public void onClick(View v) {
Intent i = new Intent(this, MainActivity.class);
startActivity(i);
}
После выпускающих и покупки 4.2 таблетки, так что я могу повторить вопрос, я пришел к вывод о том, что он связан с этой новой версией приложения, поддерживающей Bluetooth LE, который включен в SDK 4.3 и более поздних версиях. Если я удалю все ссылки на Bluetooth в MainActivity, тогда сбой исчезнет на 4.2 и более ранних устройствах.
Мое понимание, прочитав документацию, состояло в том, что можно было написать приложение, которое включает функции Bluetooth LE, и оно будет работать на старых устройствах, только если вы не выполняете BTLE-код, используя что-то вроде следующего ...
if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) return;
BluetoothManager manager = (BluetoothManager) getSystemService(BLUETOOTH_SERVICE);
mBluetoothAdapter = manager.getAdapter();
//etc.
Поэтому мой manifest.xml делает не включают в себя следующее, как было бы предотвратить загрузку для старых устройств, и я, очевидно, хотят, чтобы поддерживать единую базу кода, если это возможно ...
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true" />
Первый вопрос, является ли мое предположение выше возможности включить код BTLE в SDK до 4.3? Если нет, мне действительно нужно создать две версии приложения ... один для людей, использующих 4.3 и более поздние версии, и один для всех остальных?
Существует много сообщений StackOverflow о java.lang.NoClassDefFoundError, и я думаю, что прочитал большинство соответствующих. Многие полагают, что я изучаю Java Build Path, чтобы убедиться, что Android Private Libraries и Android Dependencies отмечены. Они есть. Некоторые предлагают перемещать папку gen перед папкой src, но это, похоже, не имеет особого значения.
Я бы разместил изображение Eclipse Java Build Path, но поскольку это мой первый пост, у меня нет 10 точек репутации, необходимых для вставки изображения, поэтому вот еще одно сообщение, которое я последовал ... Android java.lang.NoClassDefFoundError
Итак, второй вопрос, любые другие мысли о том, что может быть неправильным в пути построения?
большое спасибо заранее.
Обновление ... как-то задавая вопрос, у меня было достаточно очков, чтобы размещать изображения пути сборки java. Как отмечает @Ashoke, я думаю, что это связано с неправильным способом построения или поддержкой библиотек.
тот же код внутри OnClick Работает ли на> = 4.3 или есть другой путь кода в зависимости от Android версии? –
Вам определенно не нужны две версии приложения. Что касается тега uses-feature, я бы рекомендовал вам * включить * включить его, но установить 'android: required =" false "'. Я действительно не думаю, что это коренная проблема, но все равно хорошо. – kcoppock
@MichaelKrause - это точно такой же код для разных версий Android. –