可穿戴应用程序无法从移动apk安装

时间:2016-03-28 16:46:18

标签: android android-studio apk wear-os

使用我的三个模块(常见,移动和磨损)的以下Gradle文件,我想知道为什么我的可穿戴应用程序无法安装在可穿戴设备上,当我使用穿戴虚拟模拟器和我的同时运行移动应用程序时移动设备运行和连接(通过USB和Android磨损应用程序),并通过移动模块(目前在移动目录中)签署两个apks:

通用模块:

apply plugin: 'com.android.library'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig {
        minSdkVersion 9
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

移动模块:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig {
        applicationId "dpark.gameoflife"
        minSdkVersion 9
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }

    signingConfigs {
        debug {
            storeFile file("C:\\Users\\Dave\\AndroidStudioProjects\\KEY_STORE\\Game_of_Life.jks")
            storePassword "***"
            keyAlias "game_of_life"
            keyPassword "***"
        }
        release {
            storeFile file("C:\\Users\\Dave\\AndroidStudioProjects\\KEY_STORE\\Game_of_Life.jks")
            storePassword "***"
            keyAlias "game_of_life"
            keyPassword "***"
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    wearApp project(':wear')
    compile project(':common')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.2.1'
    compile 'com.google.android.gms:play-services:8.4.0'
    compile 'com.google.android.gms:play-services-wearable:8.4.0'
}

磨损模块:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig {
        applicationId "dpark.gameoflife"
        minSdkVersion 22
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }

    signingConfigs {
        debug {
            storeFile file("C:\\Users\\Dave\\AndroidStudioProjects\\KEY_STORE\\Game_of_Life.jks")
            storePassword "***"
            keyAlias "game_of_life"
            keyPassword "***"
        }
        release {
            storeFile file("C:\\Users\\Dave\\AndroidStudioProjects\\KEY_STORE\\Game_of_Life.jks")
            storePassword "***"
            keyAlias "game_of_life"
            keyPassword "***"
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.google.android.support:wearable:1.3.0'
    compile 'com.google.android.gms:play-services-wearable:8.4.0'
    compile project(':common')
}

普通清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest
    package="dpark.common" >
</manifest>

移动清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="dpark.gameoflife" >

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme.NoActionBar" >
        <activity
            android:name=".MainActivity">
        </activity>
        <activity
            android:name=".WelcomeActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

穿上清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="dpark.gameoflife" >

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
        </activity>
        <activity
            android:name=".WelcomeActivity"
            android:theme="@android:style/Theme.DeviceDefault" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

...当应用程序在我的移动设备上正确安装时,我只在我的服装虚拟仿真器上收到(最多我的示例应用程序应该只显示GridView)的通知,如下所示:

enter image description here

enter image description here

enter image description here

谢谢!

编辑4/4: - 这就是我在logcat上得到的东西:

04-04 09:39:27.462 15810-15810/dpark.gameoflife I/art: Late-enabling -Xcheck:jni
04-04 09:39:27.462 15810-15810/dpark.gameoflife I/art: VMHOOK: rlim_cur : 0 pid:15810
04-04 09:39:27.543 15810-15810/dpark.gameoflife W/System: ClassLoader referenced unknown path: /data/app/dpark.gameoflife-1/lib/arm
04-04 09:39:27.570 15810-15810/dpark.gameoflife I/GMPM: App measurement is starting up, version: 8487
04-04 09:39:27.571 15810-15810/dpark.gameoflife I/GMPM: To enable debug logging run: adb shell setprop log.tag.GMPM VERBOSE
04-04 09:39:27.580 15810-15810/dpark.gameoflife E/GMPM: GoogleService failed to initialize, status: 10, Missing an expected resource: 'R.string.google_app_id' for initializing Google services.  Possible causes are missing google-services.json or com.google.gms.google-services gradle plugin.
04-04 09:39:27.580 15810-15810/dpark.gameoflife E/GMPM: Scheduler not set. Not logging error/warn.
04-04 09:39:27.644 15810-15831/dpark.gameoflife E/GMPM: Uploading is not possible. App measurement disabled
04-04 09:39:27.763 15810-15847/dpark.gameoflife I/Adreno-EGL: <qeglDrvAPI_eglInitialize:379>: EGL 1.4 QUALCOMM build: Nondeterministic_AU_msm8974_LA.BF.1.1.3__release_AU (I3fa967cfef)
04-04 09:39:27.763 15810-15847/dpark.gameoflife I/Adreno-EGL: OpenGL ES Shader Compiler Version: E031.28.00.02
04-04 09:39:27.763 15810-15847/dpark.gameoflife I/Adreno-EGL: Build Date: 09/29/15 Tue
04-04 09:39:27.763 15810-15847/dpark.gameoflife I/Adreno-EGL: Local Branch: mybranch14683032
04-04 09:39:27.763 15810-15847/dpark.gameoflife I/Adreno-EGL: Remote Branch: quic/master
04-04 09:39:27.763 15810-15847/dpark.gameoflife I/Adreno-EGL: Local Patches: NONE
04-04 09:39:27.763 15810-15847/dpark.gameoflife I/Adreno-EGL: Reconstruct Branch: NOTHING
04-04 09:39:37.863 15810-15831/dpark.gameoflife I/GMPM: Tag Manager is not found and thus will not be used
04-04 09:43:06.197 15810-15847/dpark.gameoflife E/Surface: getSlotFromBufferLocked: unknown buffer: 0xb9d385f0

...我在Manifest或Gradle文件中遗漏了一些内容,如上文所示?

1 个答案:

答案 0 :(得分:0)

第一印象

这里可能有很多错误。乍一看,gradle配置看起来不错,具有Wear应用程序参考,匹配的版本名称和编号,应用程序ID和程序包名称。清单没有显示可能丢失的权限。没有特别的味道。

您真正需要做的->获取日志

为了解决此问题,您需要收集日志。我看到您有logcat输出,但这实际上只是来自您的应用程序。您需要使用WearablePkgInstaller上设置的过滤器来过滤Android Wear Package Installer特定内容。

从手持设备上的登录信息中,您还将仅看到触发安装的说明。每次您重新安装应用或从Wear OS应用触发应用同步时,都会显示该信息。

11-07 14:58:53.127 3330-8739/? I/WearablePkgInstaller: Setting DataItem to install wearable apps for com.spotify.music

然而,真正有价值的日志记录在手表上。因此,请确保从可穿戴设备获取日志。在那里,您将获得有关安装失败的信息,包括原因。

某些手表具有用于调试的USB连接。其他人则需要一些额外的步骤来enable debugging over bluetooth。第一步是通过多次点击build number来启用开发人员选项和调试,这与在手持设备上的操作类似。

可穿戴设备上的日志记录可以在同一WearablePkgInstaller过滤器上过滤,也可以使用自己的包ID进行过滤。日志记录可能非常清晰(例如mismatching google play services或缺少权限),或者带有returnCode的神秘记录。

如果使用returnCode,则必须check in source code of Android该代码代表什么,并且基于javadoc,您可以开始进行更具体的搜索。

您还可以检查一些事情

可穿戴项目仅包含在发行版本中。还有latest Android studio builds have a flag setFLAG_TEST_ONLY),在安装时会导致returnCode -15失败。检查手持应用程序是否已启用适当的运行时权限(也应从错误日志记录中清除)。

即使是用于优化的构建工具也可以从应用程序中删除磨损项目。然后,您可以选择可穿戴设备或手持设备都不具有最新的Google Play服务。确保还检查this SO question上的可接受答案以了解选项。