Android Wear app ne s'installe pas par le combiné
j'essaie de faire installer une application portable via un combiné Android en utilisant la méthode "Package with Android Studio" trouvée ici mais ça ne fonctionne pas. L'apk n'est jamais installé sur le dispositif portable. C'est le logcat de sortie:
07-28 15:11:54.107 766-820/? W/PackageManager﹕ Unknown permission com.google.android.wearable.READ_SETTINGS in package com.google.android.gms
07-28 15:11:54.117 766-820/? W/PackageManager﹕ Not granting permission com.google.android.gm.permission.AUTO_SEND to package com.google.android.wearable.app (protectionLevel=2 flags=0x88be44)
07-28 15:11:54.117 766-820/? W/PackageManager﹕ Not granting permission android.permission.MEDIA_CONTENT_CONTROL to package com.google.android.wearable.app (protectionLevel=18 flags=0x88be44)
07-28 15:11:55.047 632-632/? D/WearablePkgInstaller﹕ Got PackageUpdateReceiver message Intent { act=android.intent.action.PACKAGE_REMOVED dat=package:my.package.name flg=0x4000010 cmp=com.google.android.wearable.app/com.google.android.clockwork.companion.packagemanager.PackageUpdateReceiver (has extras) }
07-28 15:11:55.177 632-632/? D/WearablePkgInstaller﹕ Got PackageUpdateReceiver message Intent { act=android.intent.action.PACKAGE_ADDED dat=package:my.package.name flg=0x4000010 cmp=com.google.android.wearable.app/com.google.android.clockwork.companion.packagemanager.PackageUpdateReceiver (has extras) }
comme note de côté, je suis capable de empaqueter manuellement (également décrit dans le lien ci-dessus) et l'apk est installé sur le dispositif portable lorsque je l'exécute sur le combiné. J'utilise buildToolsVersion 20.0.0, J'exécute Android Studio 0.8.2 et avoir cette ligne dans la construction du module de mon combiné.gradle:
wearApp project(':wearable')
je suis à court d'idées sur la façon de débogage, les journaux semblent assez inutile. Des idées?
EDIT: Allez poster les articles pertinents de Manifester et construire.Grad pour le combiné et le module portable.
Manifeste Du Combiné
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="my.package.name"
android:installLocation="auto"
android:versionCode="259"
android:versionName="4.6.1">
<!-- =========== -->
<!-- PERMISSIONS -->
<!-- =========== -->
<permission
android:name="my.app.name.permission.C2D_MESSAGE"
android:protectionLevel="signature"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<!-- ====================== -->
<!-- APPLICATION PROPERTIES -->
<!-- ====================== -->
<uses-sdk
android:minSdkVersion="9"
android:targetSdkVersion="19" />
<supports-screens
android:anyDensity="true"
android:largeScreens="true"
android:normalScreens="true"
android:smallScreens="true"
android:xlargeScreens="true"/>
<application
android:name=".AppState"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/Theme.MyApp"
android:hardwareAccelerated="true">
<!-- ==================== -->
<!-- GOOGLE PLAY SERVICES -->
<!-- ==================== -->
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version"/>
<!-- ================== -->
<!-- Android Wear -->
<!-- ================== -->
<service
android:name=".wear.DataLayerListenerService" >
<intent-filter>
<action android:name="com.google.android.gms.wearable.BIND_LISTENER" />
</intent-filter>
</service>
<!-- This is used for manual packaging I have this commented out when -->
<!-- packaging with Android Studio-->
<!--<meta-data android:name="com.google.android.wearable.beta.app"-->
<!--android:resource="@xml/wearable_app_desc"/>-->
...The rest of the activities
</application>
</manifest>
fabrication du combiné.gradle
buildscript {
repositories {
maven { url 'http://download.crashlytics.com/maven' }
}
dependencies {
}
}
apply plugin: 'com.android.application'
apply plugin: 'crashlytics'
apply plugin: 'newrelic'
repositories {
mavenCentral()
maven { url 'http://download.crashlytics.com/maven' }
}
dependencies {
compile fileTree(dir: 'libs', include: '*.jar')
compile 'com.android.support:support-v4:20.0.+'
compile 'com.android.support:appcompat-v7:20.0.+'
compile project(':facebook')
compile project(':mopub-sdk')
compile project(':GooglePlay')
compile 'com.newrelic.agent.android:android-agent:3.+'
compile 'com.crashlytics.android:crashlytics:1.+'
androidTestCompile fileTree(dir: 'tests/libs', include: '*.jar')
wearApp project(':wearable')
}
android {
compileSdkVersion 19
buildToolsVersion '20.0.0'
//Build type is debug to avoid conflict with Proguard
testBuildType = "debug"
defaultConfig {
testApplicationId "my.package.name.test"
testInstrumentationRunner "com.zutubi.android.junitreport.JUnitReportTestRunner"
}
lintOptions {
// We do not want to abort the build due to lint errors
abortOnError false
}
sourceSets {
// Main is the default unless stated otherwise
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
// Testing
androidTest.setRoot('tests')
androidTest {
java.srcDirs = ['tests/src']
res.srcDirs = ['tests/res']
}
// Cannot add beta icons in here because custom flavour source sets are created
// during compilation and name duplication will result in a crash
}
signingConfigs {
debug {
storeFile file("**")
storePassword "***"
keyAlias "***"
keyPassword "***"
}
release {
storeFile file("***")
storePassword "***"
keyAlias "***"
keyPassword "***"
}
}
buildTypes {
// Development configuration
debug {
debuggable true
jniDebugBuild true
signingConfig signingConfigs.debug
runProguard false
}
// Release configuration
release {
debuggable false
jniDebugBuild false
signingConfig signingConfigs.release
// COMMENTED PROGUARD OUT FOR NOW TO SEE IF IT WILL HELP
// // Configure ProGuard
// runProguard true
// // General configuration
// proguardFile 'proguard/proguard.cfg'
// // Add all of our component-specific configurations (excluding the Android generic, as we want it to be last)
// FileTree tree = fileTree(dir: 'proguard', include: '*.txt', exclude: 'Android.txt')
// tree.each {File file ->
// proguardFile file.getCanonicalPath()
// }
// // Add a fallback configuration for all Android apps
// proguardFile 'proguard/Android.txt'
}
// Release configuration, but debuggable and without ProGuard
// Used for testing features like G+ and in-app billing where a release config is required
staging {
debuggable true
jniDebugBuild true
signingConfig signingConfigs.release
runProguard false
}
}
productFlavors {
production {
applicationId "my.package.name"
}
internalBeta {
applicationId "my.internalbetapackage.name"
// Beta icons
sourceSets.internalBeta.res.srcDirs = ['res-beta/internal']
}
externalBeta {
applicationId "my.externalbetapackage.name"
// Beta icons
sourceSets.externalBeta.res.srcDirs = ['res-beta/external']
}
testing{
applicationId "my.package.name"
}
}
// Without this, gradle will complain that duplicate files were added to the APK, see:
// http://stackoverflow.com/questions/20673888/duplicate-files-copied-android-studio-0-4-0
packagingOptions {
exclude 'META-INF/LICENSE.txt' // twitter4j
exclude 'META-INF/ASL2.0' // jackson
exclude 'META-INF/LICENSE' // jackson
exclude 'META-INF/NOTICE' // jackson
}
}
task makeTestApks {
dependsOn "assembleProductionRelease"
dependsOn "assembleProductionTest"
}
Portable Manifeste
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="my.package.name">
<uses-feature android:name="android.hardware.type.watch" android:required="false"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@android:style/Theme.DeviceDefault" >
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
<activity
android:name=".WearReaderActivity"
android:label="MyApp" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="my.package.name.READ"/>
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
android:name=".wear.DataLayerListenerService" >
<intent-filter>
<action android:name="com.google.android.gms.wearable.BIND_LISTENER" />
</intent-filter>
</service>
</application>
</manifest>
construction portable.gradle
repositories {
mavenCentral()
}
apply plugin: 'com.android.application'
apply plugin: 'newrelic'
android {
compileSdkVersion 19
buildToolsVersion '20.0.0'
defaultConfig {
minSdkVersion 19
targetSdkVersion 19
versionCode 259
versionName "4.6.1"
}
signingConfigs {
debug {
keyAlias '***'
keyPassword '***'
storeFile file('sameAsHandset/debug.keystore')
storePassword '***'
}
release {
storeFile file("sameAsHandset/android.keystore")
storePassword "***"
keyAlias "***"
keyPassword "***"
}
}
buildTypes {
release {
debuggable true
jniDebugBuild false
signingConfig signingConfigs.release
}
}
productFlavors {
production {
applicationId "my.package.name"
}
internalBeta {
applicationId "my.internalBetaPackage.name"
// Beta icons
sourceSets.internalBeta.res.srcDirs = ['res-beta/internal']
}
externalBeta {
applicationId "my.externalBetaPackage.name"
// Beta icons
sourceSets.externalBeta.res.srcDirs = ['res-beta/external']
}
testing{
applicationId "my.package.name"
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile project(':GooglePlay')
compile 'com.newrelic.agent.android:android-agent:3.+'
}
8 réponses
pour Répondre À @odiggity plus précisément, dans l' construire.gradle fichier de votre application téléphonique, vous devriez mentionner le nom exact du dossier de l'application d'usure. Si vous avez créé le projet Android Studio, puis votre.gradle devrait ressembler à ceci:
wearApp project(':wear')
Cela peut se produire pour les raisons suivantes:
- d'Usure Et d'application Mobile
"permissions"
ne sont pas les mêmes.
ceci n'est documenté nulle part sur developers website, cependant j'ai trouvé cela avec mon expérience personnelle. La raison pour laquelle je peux penser à derrière cette restriction est, Google veulent prévenir sournois développeurs pour exploiter les utilisateurs et leur vie privée.
Application ID
(construire.gradle file) de Mobile & wear app ne correspondent pas.- Compression Des Ressources
Si vous utilisez Eclipse pour le développement, assurez-vous que vous éteignez l' "Actif"Compression autrement ".le fichier apk dans le dossier raw aura double compressed
et phone won't be able to recognize
si l'application Mobile empaquette l'application wear ou non.
Meilleure Solution:
Utilisez Android Studio.
- Créer Un Projet Android
- Sélectionnez Téléphone Et de Porter le projet
- suivez les étapes de la création du projet
- copier toutes les permissions utilisées dans L'application Wear vers Mobile Manifeste de l'application ou vice versa
j'ai eu ussue avec porter des parfums de produits. J'avais des saveurs dans les applications portables et de vêtements. Pour résoudre mon problème j'ai utilisé le code suivant dans la construction.Grad fichier d'application portable:
freeWearApp project(path: ':wear', configuration: 'wearfreeRelease')
fullWearApp project(path: ':wear', configuration: 'wearfullRelease')
où gratuit et sont des saveurs à partir de l'ordinateur de poche module, wearfree et wearfull sont les saveurs de l'usure totale par module, Libération est le nom du module d'usure buildtype.
Et ne pas oublierpublishNonDefault true
dans le bloc androïde de l'Échoppe d'usure.
j'ai eu ce problème même après avoir vérifié les noms de paquets, Les Id d'application, et m'être assuré que le module wear n'avait pas les permissions que le module portable n'avait pas.
mon problème était que je demandais la permission android.permission.BIND_NOTIFICATION_LISTENER_SERVICE
dans AndroidManifest.xml pour le module portable. Il semble que cela ne devrait être demandé que pour le module portatif.
autant que je sache, les saveurs de produits ne sont pas prises en charge pour le moment, soit utiliser la construction manuelle (actif ou brut), soit supprimer les saveurs de produits.
D'après mon expérience, cela ne fonctionne que lors de la construction d'une version signée. Lors du déploiement d'une construction de débogage, il n'a jamais installé l'application wear pour moi. Avec signed release, il a fonctionné avec buildToolsVersion "19.1.0".
dans ce cas précis, je peux voir que vous utilisez "compiler project(':GooglePlay')". C'est que la dernière version? (compilation com.Google.Android.gms:jouer-services-portable:+')
j'ai eu ce problème récemment, et à la fin de la suivante, il fixe;
- Désinstaller l'application précédente
- Redémarrez Le Téléphone
- redémarrez l'usure
- déconnecter et reconnecter l'usure
- Re-Sync apps dans Android Wear application
et puis il est apparu sur la montre. Avant cela, j'ai tout essayé et j'étais convaincu que la construction ne fonctionnait pas correctement!--1-->
je voulais juste ajouter quelque chose que je n'ai pas vu dans beaucoup de réponses.
Vous devez faire correspondre le applicationId
dans votre application portative.
j'ai déjà pensé que vous avez besoin de <uses-feature android:name="android.hardware.type.watch" />
dans le Manifeste des appareils portatifs et de montre, avec add:android:required="true"
pour le manifeste portable et android:required="false"
pour le périphérique.
C'EST FAUX. Vous n'avez pas besoin de ce qui précède dans le manifeste portatif. En fait, avec Wear 2.0 à venir Google a fait quelques changements que ne vous permettra pas de télécharger l'apk avec minSdk inférieur à 23 si <uses-feature android:name="android.hardware.type.watch" />
est dans votre application portable. Désolé pour toute confusion.
Eu le même problème, il s'est avéré que newrelic est instrumentant le Android Wear App. Essayez de commenter la ligne: // appliquer le plugin: 'newrelic'
Je n'ai pas pu trouver un moyen de dire à newrelic de se tenir à l'écart de l'application the wear...