Android Проблемы с использованием библиотеки при развертывании на устройстве (в эмуляторе все в порядке) - PullRequest
0 голосов
/ 20 марта 2020

Я пытаюсь запустить автономное носимое приложение на (физическом) изнашиваемом устройстве с ОС 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 - похоже на тупик.

1 Ответ

1 голос
/ 30 марта 2020

Создание приложения Wear OS намекает на то, что вы пропустили один узел, который не принадлежит к узлу application:

<uses-feature android:name="android.hardware.type.watch" />

А также, что вы являетесь с использованием устаревших библиотек:

dependencies {
    implementation 'androidx.wear:wear:1.0.0'
    implementation 'com.google.android.gms:play-services-wearable:17.0.0'
    implementation 'com.google.android.support:wearable:2.5.0'
    compileOnly 'com.google.android.wearable:wearable:2.5.0'
}

И исходя из других значений, это должно быть:

targetSdkVersion 28

Если это не работает, попробуйте запустить любой из wear-os-samples для сравнения.

Если изнашивающиеся приложения из Play Store найдут его, можно предположить, что оно доступно на устройстве.


В случае, если вы используя Open-Q ™ 2500 Development Kit , вам может потребоваться установить sh другую прошивку. средство отслеживания проблем предназначено для самого компонента, что, скорее всего, здесь не применимо; лучше свяжитесь с Intrinsy c Technologies Corporation support отдел.

...