Androidハンドセットの「Android Studioメソッド付きのパッケージ)が見つかりました here apkがウェアラブルデバイスにインストールされることはありません。これはlogcatの出力です。
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) }
補足として、手動でパッケージ化することもでき(上記のリンクにも記載されています)、APKをハンドセットで実行すると、ウェアラブルデバイスにインストールされます。私はbuildToolsVersion 20.0.0を使用していますが、Android Studio 0.8.2を実行しており、ハンドセットモジュールのbuild.gradleに次の行があります。
wearApp project(':wearable')
これをデバッグする方法のアイデアが足りなくなりました。ログはかなり役に立たないようです。何か案は?
編集:ハンドセットとウェアラブルモジュールの両方のマニフェストとbuild.gradleの関連セクションを投稿します。
ハンドセットマニフェスト
<?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>
ハンドセットbuild.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"
}
ウェアラブルマニフェスト
<?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>
ウェアラブルbuild.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.+'
}
@odiggityに具体的に回答するには、電話アプリのbuild.gradleファイルで、 Wearアプリの正確な名前を言及する必要がありますフォルダ。 Android Studio でプロジェクトを作成した場合、build.gradleは次のようになります。
wearApp project(':wear')
これは、次の理由で発生する可能性があります。
"permissions"
は同じではありません(Wearアプリの権限はモバイルアプリの権限のサブセットである必要があります)。これは開発者のWebサイトのどこにも文書化されていませんが、個人的な経験でこれを見つけました。この制限の背後で私が考えることができる理由は、Googleが卑劣な開発者がユーザーとそのプライバシーを悪用することを防止したいということです。
Package name
のWearアプリとモバイルアプリが一致していません。VersionNumber
とVersionName
のWearアプリとモバイルアプリの両方が一致しませんApplication ID
(build.gradleファイル)のMobile&Wearアプリが一致しません。release
ビルドにのみ含まれていますsigned
である必要がありますtest only builds
着用時のインストールを許可していません(returnCode -15、 この情報 を参照)開発にEclipseを使用している場合は、必ず "Asset Compression"をオフにしてください。オフにしないと、rawフォルダーの ".apk"ファイルがdouble compressed
&phone won't be able to recognize
モバイルアプリがウェアアプリをパッケージ化しているかどうか。
最適なソリューション:
Use Android Studio.
デバッグ
ウェアラブルでWearアプリが見つからない場合は、常に両方のデバイスのログを調べて、何が起こっているかを確認できます。 WearablePkgInstaller
でフィルタリングして、ウェアラブルパッケージのインストールに関連するすべてのログを見つけることができます。
デバイスのWear OSアプリで、[詳細設定]の[アプリの再同期]オプションをトリガーし、ログを確認します。アプリのウェアラブルのみを同期する別の方法は、アプリを再インストールすることです。その時点で、ウェアラブルもパッケージと同期されます。
デバイスのログには次のように表示されます。
11-07 14:58:53.127 3330-8739/? I/WearablePkgInstaller: Setting DataItem to install wearable apps for com.spotify.music
アプリIDはcom.spotify.musicです。これはSpotifyの単なる例です。
時計(ブルートゥースまたはUSB経由のデバッグ)では、この同じフィルターを使用してログに記録され、問題または成功を示しています。
11-07 15:00:02.533 1032-1048/? I/WearablePkgInstaller: Package com.spotify.music was installed.
ほとんどのエラーメッセージは自明です。これらのエラーの多くの例は WearPackageInstallerServiceクラスのソースコード にあります。ただし、一部は単なるreturnCodeです。これらの戻りコードについては、 このPackageManagerソースコード の値を確認してください。
ウェア製品のフレーバーで問題を解決しました。ハンドヘルドアプリとウェアアプリの両方に味がありました。私の問題を解決するために、build.gradleハンドヘルドアプリファイルの次のコードを使用しました。
freeWearApp project(path: ':wear', configuration: 'wearfreeRelease')
fullWearApp project(path: ':wear', configuration: 'wearfullRelease')
ここで、freeおよびfullは、ハンドヘルドモジュールからのフレーバー、wearfreeおよびwearfullは、wear muduleのフレーバーですReleaseはウェアモジュールビルドタイプの名前です。
そしてお忘れなくpublishNonDefault true
=Android Wear Gradleのブロック。
パッケージ名、アプリケーションIDを確認し、wearモジュールにハンドヘルドモジュールが持っていた権限がないことを確認した後でも、この問題がありました。
私の問題は、私が許可を要求していたことでしたAndroid.permission.BIND_NOTIFICATION_LISTENER_SERVICE
ウェアラブルモジュールのAndroidManifest.xml。これは、ハンドヘルドモジュールに対してのみ要求されるようです。
私の経験では、署名付きリリースビルドをビルドする場合にのみ機能します。デバッグビルドをデプロイするときに、wearアプリをインストールしませんでした。署名付きリリースでは、buildToolsVersion "19.1.0"で動作しました。
この特定のケースでは、「compile project( ':GooglePlay')」を使用していることがわかります。それは最新バージョンですか? (「com.google.Android.gms:play-services-wearable:+」をコンパイルしてください)
現在のところ、製品フレーバーがサポートされていない限り、手動ビルド(assetまたはraw)を使用するか、製品フレーバーを削除してください。
多くの回答で見たことのないものを追加したかっただけです。
ハンドヘルドアプリとWearアプリのapplicationId
を一致させる必要があります。
以前は<uses-feature Android:name="Android.hardware.type.watch" />
ハンドヘルドとウォッチマニフェストの両方で、次のように追加します:Android:required="true"
はウェアラブルマニフェスト、Android:required="false"
デバイス用。
これはIS FALSEです。ハンドヘルドマニフェストでは上記は必要ありません。実際に、Wear 2.0が登場すると、23未満のminSdkでapkをアップロードできないようにする変更がGoogleで行われました。もし<uses-feature Android:name="Android.hardware.type.watch" />
がハンドヘルドアプリにあります。混乱してすみません。
私は最近この問題を抱えていて、結局次のように修正しました。
そしてそれが時計に現れた。これの前に私はすべてを試してみて、ビルドが正しく機能していないと確信しました
同じ問題が発生し、newrelicがAndroid Wear Appを実装していることがわかりました。次の行にコメントしてみてください。
Wearアプリから離れるようにnewrelicに指示する方法が見つかりませんでした...