Я пытаюсь запустить автономное носимое приложение на (физическом) изнашиваемом устройстве с ОС Oreo 8.1. Приложение успешно собирается и работает на эмуляторе Android Wear Square (API 26), но когда я пытаюсь запустить приложение на физическом устройстве, я получаю следующую ошибку:
Caused by: java.lang.IllegalStateException: Could not find wearable shared library classes.
Please add <uses-library android:name="com.google.android.wearable" android:required="false" /> to
the application manifest
Как Код ошибки указывает, что строка
<meta-data. android:name="com.google.android.wearable". android:value="false" />
уже добавлена в файл манифестов приложения (AndroidManifest. xml) внутри тега приложения. Ниже показано содержимое тега приложения в файле манифеста.
<application
android:allowBackup="false"
android:label="@string/app_name"
android:theme="@android:style/Theme.DeviceDefault">
<meta-data
android:name="com.google.android.wearable.standalone"
android:value="true" />
<uses-library android:name="com.google.android.wearable" android:required="false" />
<activity android:name="com.example.android.wearable.wear.alwayson.MainActivity"
android:label="@string/app_name"
android:launchMode="singleInstance"
android:configChanges="orientation|keyboardHidden"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Даже после добавления предложенной строки в файл манифеста android я продолжаю получать точно такой же код ошибки.
Я подозреваю, что версия библиотеки на устройстве отличается от используемой в нашей среде разработки, однако я не знаю, как найти и проверить версию библиотеки устройства.
Кто-нибудь может предложить решение этой проблемы?
Информация о сборке:
compileSdkVersion 28
buildToolsVersion "28.0.3"
defaultConfig {
versionCode 1
versionName "1.0"
minSdkVersion 24
targetSdkVersion 27
multiDexEnabled true
}
Зависимости:
dependencies {
implementation 'androidx.wear:wear:1.0.0'
implementation 'androidx.legacy:legacy-support-v13:1.0.0'
implementation 'com.google.android.gms:play-services-wearable:17.0.0'
compileOnly 'com.google.android.wearable:wearable:2.1.0'
implementation 'com.google.android.support:wearable:2.1.0'
}
В комментариях предлагалось изменить значение с compileOnly
на implementation
. Вот полученное сообщение об ошибке:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.android.wearable.wear.alwayson, PID: 2593
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.android.wearable.wear.alwayson/com.example.android.wearable.wear.alwayson.MainActivity}: java.lang.RuntimeException: Stub!
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6501)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Caused by: java.lang.RuntimeException: Stub!
at com.google.android.wearable.compat.WearableActivityController$AmbientCallback.<init>(WearableActivityController.java:6)
at androidx.wear.ambient.WearableControllerProvider$1.<init>(WearableControllerProvider.java:52)
at androidx.wear.ambient.WearableControllerProvider.getWearableController(WearableControllerProvider.java:51)
at androidx.wear.ambient.AmbientDelegate.onCreate(AmbientDelegate.java:103)
at androidx.wear.ambient.AmbientModeSupport.onCreate(AmbientModeSupport.java:198)
at androidx.fragment.app.Fragment.performCreate(Fragment.java:2414)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1418)
at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:802)
at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)
at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)
at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)
at androidx.fragment.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3273)
at androidx.fragment.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:3229)
at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:201)
at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:620)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1335)
at android.app.Activity.performStart(Activity.java:7019)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2741)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6501)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Похоже, в Интернете не так много информации о настройке и разработке для Android Wear, поэтому любые указатели на полезные ресурсы будут оценены.
-------- Обновлено 6 апреля на основании нового тестирования
В оригинальном посте я показал только тег приложения файла манифеста. Вне тега приложения содержалась строка:
<uses-feature android:name="android.hardware.type.watch" />
Использование устаревших библиотек просто из-за использования предоставленных (устаревших) примеров, которые поставлялись с исходным пакетом для устройства , Первоначально я следовал учебному пособию, предоставленному Google (та же ссылка, что и вы, в которой используется wearable: 2.5.0), и не увенчался успехом - возвращает ту же ошибку, которая указана в исходном сообщении.
Я пробовал несколько примеров приложений, содержащихся в указанном вами месте, до публикации в SO, а также образцы, предоставленные в пакете с исходным кодом для комплекта разработки - все приводит к одной и той же ошибке.
Вот полный код ошибки, который был опубликован изначально. Это происходит, когда устройство пытается запустить приложение.
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.android.wearable.speaker, PID: 3230
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.android.wearable.speaker/com.example.android.wearable.speaker.MainActivity}: java.lang.IllegalStateException: Could not find wearable shared library classes. Please add <uses-library android:name="com.google.android.wearable" android:required="false" /> to the application manifest
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6501)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Caused by: java.lang.IllegalStateException: Could not find wearable shared library classes. Please add <uses-library android:name="com.google.android.wearable" android:required="false" /> to the application manifest
at androidx.wear.ambient.SharedLibraryVersion.verifySharedLibraryPresent(SharedLibraryVersion.java:57)
at androidx.wear.ambient.WearableControllerProvider.getWearableController(WearableControllerProvider.java:48)
at androidx.wear.ambient.AmbientDelegate.onCreate(AmbientDelegate.java:103)
at androidx.wear.ambient.AmbientModeSupport.onCreate(AmbientModeSupport.java:198)
at androidx.fragment.app.Fragment.performCreate(Fragment.java:2586)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:838)
at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1238)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1303)
at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:439)
at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2079)
at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1869)
at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1824)
at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1727)
at androidx.fragment.app.FragmentManagerImpl.dispatchStateChange(FragmentManagerImpl.java:2663)
at androidx.fragment.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManagerImpl.java:2613)
at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:246)
at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:542)
at com.example.android.wearable.speaker.MainActivity.onStart(MainActivity.java:254)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1335)
at android.app.Activity.performStart(Activity.java:7019)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2741)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6501)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Я проверил код, в котором выдается исключение, и, по-видимому, это связано с отсутствием держателя предустановки для общей библиотеки, которую он пытается проверить существование. Ниже приведена функция в файле «SharedLibraryVersion. java.»
/**
* Throws {@link IllegalStateException} if the Wearable Shared Library is not present and API
* level is at least LMP MR1.
* <p>
* <p>This validates that the developer hasn't forgotten to include a {@code <uses-library>} tag
* in their manifest. The method should be used in combination with API level checks for
* features added before {@link #version() version} 1.
*/
public static void verifySharedLibraryPresent() {
if (!PresenceHolder.PRESENT) {
throw new IllegalStateException("Could not find wearable shared library classes. "
+ "Please add <uses-library android:name=\"com.google.android.wearable\" "
+ "android:required=\"false\" /> to the application manifest");
Из этого видно, что носимой библиотеки нет на устройстве или она не может найти / связать ее ?
Согласно комментарию Мартина, предполагая, что если носимые приложения из PlayStore могут работать, то на устройстве должна существовать библиотека, я попытался установить некоторые носимые приложения. В версии SDK на наборе разработчика нет магазина игр, поэтому я попытался загрузить некоторые из них, найденные онлайн, через adb.
Несмотря на то, что adb вернул успех при запуске adb install appname.apk, на самом деле ни одно из приложений не появилось, кроме одного, APKPure, которое само по себе является боковым загрузчиком приложения, которое работает на устройстве. Попытка установить носимые приложения через APKPure в комплекте разработчика также не сработала, поскольку я получаю «действия по установке / удалению, не поддерживаемые в Wear». Похоже, это связано с тем, что PackageManger блокирует установку произвольных APK - похоже на тупик.