Android Wear app pas l'installation par le biais du combiné
Je vais essayer d'obtenir un portable application installée par un Androïde appareil en utilisant le Paquet avec Android Studio méthode " trouvés ici mais cela ne fonctionne pas. L'apk est jamais installé dans l'appareil 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 une note de côté, je suis en mesure de package manuellement (également décrite dans le lien ci-dessus) et de l'apk est installée sur le portable quand je le lance sur le combiné. Je suis à l'aide de buildToolsVersion 20.0.0, je suis en cours d'exécution Android Studio 0.8.2 et avoir cette ligne dans mon combiné du module de construire.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.gradle pour fois sur le téléphone et portable module.
Combiné Manifeste
<?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>
Combiné construire.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>
Portable construire.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.+'
}
- Avez-vous essayé le DataLayer de l'échantillon qui vient de le SDK Manager? Il montre comment construire et assembler une demande à la fois du téléphone et de l'usure, vous devriez vérifier pour vous assurer qu'il fonctionne. Ensuite, vous pouvez comparer les fichiers XML pour voir ce qui pourrait être différent avec votre application.
- oui je l'ai et il fonctionne très bien. J'ai essayé de les comparer à la mienne et tout à l'air bien, mais mon application est plus complexe qu'il avec des saveurs différentes, donc il y a assez peu de différences
- Je ne suis pas sûr que vous pouvez compiler avec l'api 19 au lieu de l'api 20. Aussi à l'usure et une application mobile doit avoir les mêmes autorisations.
- l'échantillon DataLayer compile avec 19. Il a essayé avec 20 de toute façon et il ne fonctionne toujours pas. Je crois que votre deuxième suggestion est incorrect, le portable ne peut pas avoir une permission que le combiné n'a pas, mais c'est bien que le combiné dispose des autorisations le portable ne fonctionne pas. Mon portable ne dispose pas de toutes les autorisations.
- vous avez raison sur le second point! Mon erreur.
- Je vous remarquerez que de déclarer le numéro de version dans AndroidManifest.xml pour le combiné, mais dans la construction.gradle pour le portable. Pouvez-vous faire à la fois dans la construction.gradle fichier, tout comme le DataLayer échantillon n'? Il est important que ces données sont identiques, et vous voulez juste être sûr sur ce point.
- Je suis sûr que le numéro de version pour le portable ne doit pas être le même que le numéro de version pour le combiné. J'ai essayé de faire en sorte qu'ils étaient les mêmes et le déplacement de la version pour le construire.gradle sur le combiné app de toute façon et il ne fonctionne toujours pas.
- découvrez la mise à jour de réponse.
- J'ai eu de travail. Les saveurs étaient tout gâcher. J'avais créé à l'origine de l'usure de l'application avec une version bêta de la saveur, et a ensuite essayé de la construire avec une production de saveur. J'ai dû créer un nouveau projet avec la production de la saveur et de copier tout le code. Je dois également utiliser Build -> Générer signé apk et sélectionnez la Clé du chemin d'accès au magasin, en précisant les chemins vers le même magasin de clés dans la construction.gradle fichier qui ne fonctionne pas pour une raison quelconque. Espérons que cela aide 🙂
- Je crois que j'ai suivi tout ce qui est suggéré ici, dans le post, mais encore le mobile apk intégré avec l'usure apk est installé sur mon appareil mobile, alors qu'une notification (numérisé menace pour la sécurité) apparaît sur mon usure émulateur virtuel au plus... Pourriez-vous m'aider ici? Voici mon post dans plus de détails: stackoverflow.com/questions/36266770/...
- Pour l'erreur -103, c'est parce que gradle est pas la signature de l'usure de l'application. J'étais en train de dans cette et il s'avère que j'ai dû reproduire une signature config pour le porter app dans mon construire.gradle comme elle n'était pas signée à tous.
Vous devez vous connecter pour publier un commentaire.
Pour Répondre à @odiggity plus précisément, dans construire.gradle fichier de votre application téléphone, vous devez mentionner le nom exact de l'usure dossier app. Si vous avez créé le projet dans Android Studio, alors votre.gradle devrait ressembler à ceci:
Cela peut se produire pour les raisons suivantes:
"permissions"
ne sont pas les mêmes (Usure de l'Application, l'autorisation doit être un sous-ensemble de l'Application Mobile autorisations).Ce n'est pas documentée n'importe où sur le site web des développeurs, cependant, j'ai trouvé ce avec mon expérience personnelle. La raison pour laquelle je peux penser derrière cette restriction est, Google voulez empêcher sournois développeurs à exploiter ses utilisateurs & protection de leur vie privée.
Package name
de Porter & Mobile apps ne correspondent pas.VersionNumber
&VersionName
à la fois de Porter & Mobile app ne correspondant pas à laApplication ID
(construire.gradle fichier) de Mobile & porter une application ne correspondent pas.release
construitsigned
avec la même clétest only builds
que ne pas permettre l'installation sur l'usure (code_retour -15, voir cette information)Si vous utilisez Eclipse pour le développement, assurez-vous de désactiver le "Actif" Compression de la sinon l' ".apk" fichier en raw dossier obtiendrez
double compressed
& laphone won't be able to recognize
si cette application Mobile est l'emballage d'usure app ou pas.Meilleure Solution:
Utiliser Android Studio.
De débogage
Lorsque vous ne trouvez pas de porter l'application sur le portable, vous pouvez toujours regarder dans les journaux de ces deux dispositifs de voir ce qui se passe. Vous pouvez filtrer sur
WearablePkgInstaller
pour trouver toutes les traces liées à la portable de l'installation de paquets.De l'Usure de l'OS app sur votre appareil déclencher le "resync apps" option "paramètres avancés" et vérifiez les journaux. Autre moyen de synchroniser le portable de votre application est de réinstaller votre application. À ce point, le portable est également synchronisées de votre colis.
Périphérique de journalisation doit liste quelque chose comme:
Avec com.spotify.la musique étant l'Id de votre appli. C'est juste un exemple pour Spotify.
Et sur la montre (débogage via bluetooth ou USB) vous pouvez trouver la journalisation à ce même filtre montrant des questions ou de succès:
La plupart des messages d'erreur sont explicites. Vous pouvez trouver de nombreux exemples de ces erreurs dans le code source de la classe WearPackageInstallerService. Quelques-uns cependant sont juste un code_retour. Pour ces codes de retour vérifier les valeurs dans cette PackageManager code source.
J'avais ussue avec l'usure du produit saveurs. J'ai eu des saveurs à la fois de l'ordinateur de poche et l'usure des apps. Pour résoudre mon problème j'ai utilisé le code suivant dans la construction.gradle de poche app fichier:
où, gratuit et plein 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 de l'usure module buildtype.
Et n'oubliez pas
publishNonDefault true
dans l'android bloc de l'usure gradle.J'ai eu ce problème, même après vérification les noms des paquets, des Id d'application, et de s'assurer l'usure module n'ai pas eu toutes les autorisations que l'ordinateur de poche module n'a pas.
Mon problème est que j'ai été d'obtenir la permission
android.permission.BIND_NOTIFICATION_LISTENER_SERVICE
dans AndroidManifest.xml pour le portable module. Il semble que ce devrait être demandée pour l'ordinateur de poche module.autant que je sache produit saveurs ne sont pas supportés pour le moment, soit utiliser le manuel de construire (actif ou raw) ou retirer le produit de saveurs.
De mon expérience, il ne fonctionne que lors de la construction d'un communiqué signé de construire. Lors du déploiement d'une version de débogage il n'a jamais installé de l'usure de l'application pour moi. Avec communiqué signé, il a travaillé avec buildToolsVersion "19.1.0".
Dans ce cas précis, je peux voir que vous êtes à l'aide de "compiler le projet(':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;
Et puis il a sauté sur la montre. Avant cela, j'ai tout essayé et était convaincu que le build n'a pas le droit de travailler
Voulais juste ajouter quelque chose que je n'ai pas vu dans beaucoup de réponses.
Vous devez faire correspondre le
applicationId
dans votre ordinateur de poche app et l'usure de l'app.J'ai déjà pensé que vous avez besoin de
<uses-feature android:name="android.hardware.type.watch" />
dans l'ordinateur de poche et de montres manifeste ajouter:android:required="true"
pour le portable manifeste etandroid:required="false"
pour le périphérique.C'EST FAUX. Vous ne devez pas au-dessus dans la poche manifeste. En fait, avec l'Usure 2.0 à venir de Google a apporté quelques modifications qui ne vous permettra pas de télécharger les apk avec minSdk inférieur à 23 si
<uses-feature android:name="android.hardware.type.watch" />
est dans votre ordinateur de poche app. Désolé pour la confusion.<uses-feature android:name="android.hardware.type.watch" />
sur le poche?!<uses-feature android:name="android.hardware.type.watch" />
dans l'ordinateur de poche manifeste, uniquement sur le portable.Eu le même problème, il s'est avéré que newrelic est instrumentant le Android Wear App. Essayez de commenter la ligne:
//on applique plugin: 'newrelic'
Je ne pouvais pas trouver un moyen de dire newrelic à conserver à l'abri de l'usure de l'application...